0000: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 20 43 -----------. * C
0050: 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 39 opyright (C) 199
0060: 37 2d 32 30 30 30 20 4d 61 74 74 20 4e 65 77 6d 7-2000 Matt Newm
0070: 61 6e 20 3c 6d 61 74 74 40 6e 6f 76 61 64 69 67 an <matt@novadig
0080: 6d 2e 63 6f 6d 3e 0a 20 2a 0a 20 2a 09 4d 61 63 m.com>. *. *.Mac
0090: 72 6f 20 61 6e 64 20 73 74 72 75 63 74 75 72 65 ro and structure
00a0: 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 20 2a 0a definitions. *.
00b0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
00c0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
00d0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
00e0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
00f0: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0100: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0110: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0120: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0130: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0140: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0150: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0160: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0170: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0180: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
0190: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
01a0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
01b0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
01c0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 2d 0a 20 this "right":-.
01d0: 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 *.tclSSL (Colin
01e0: 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 McCormack, Share
01f0: 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a d Technology). *
0200: 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 .SSLtcl (Peter A
0210: 6e 74 6d 61 6e 29 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ntman). *-------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0260: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 54 4c 53 */.#ifndef _TLS
0270: 49 4e 54 5f 48 0a 23 64 65 66 69 6e 65 20 5f 54 INT_H.#define _T
0280: 4c 53 49 4e 54 5f 48 0a 0a 2f 2a 20 50 6c 61 74 LSINT_H../* Plat
0290: 66 6f 72 6d 20 75 6e 69 71 75 65 20 64 65 66 69 form unique defi
02a0: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 28 nitions */.#if (
02b0: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 (defined(_WIN32)
02c0: 29 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 5f 5f ) || (defined(__
02d0: 4d 49 4e 47 57 33 32 5f 5f 29 29 20 7c 7c 20 28 MINGW32__)) || (
02e0: 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 36 defined(__MINGW6
02f0: 34 5f 5f 29 29 29 0a 23 69 66 6e 64 65 66 20 57 4__))).#ifndef W
0300: 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e 44 5f 4d 45 IN32_LEAN_AND_ME
0310: 41 4e 0a 23 64 65 66 69 6e 65 20 57 49 4e 33 32 AN.#define WIN32
0320: 5f 4c 45 41 4e 5f 41 4e 44 5f 4d 45 41 4e 0a 23 _LEAN_AND_MEAN.#
0330: 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c endif.#include <
0340: 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 69 6e 63 6c windows.h>.#incl
0350: 75 64 65 20 3c 77 69 6e 63 72 79 70 74 2e 68 3e ude <wincrypt.h>
0360: 20 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 65 65 64 /* OpenSSL need
0370: 73 20 74 68 69 73 20 6f 6e 20 57 69 6e 64 6f 77 s this on Window
0380: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 6e s */.#endif..#in
0390: 63 6c 75 64 65 20 22 74 6c 73 2e 68 22 0a 23 69 clude "tls.h".#i
03a0: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e nclude <errno.h>
03b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e .#include <strin
03c0: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 g.h>.#include <s
03d0: 74 64 69 6e 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 tdint.h>.#includ
03e0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 e <openssl/ssl.h
03f0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e >.#include <open
0400: 73 73 6c 2f 65 72 72 2e 68 3e 0a 23 69 6e 63 6c ssl/err.h>.#incl
0410: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 61 6e ude <openssl/ran
0420: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f d.h>.#include <o
0430: 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 76 2e penssl/opensslv.
0440: 68 3e 0a 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 6e h>../* Windows n
0450: 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 69 eeds to know whi
0460: 63 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20 65 78 ch symbols to ex
0470: 70 6f 72 74 2e 20 2a 2f 0a 23 69 66 64 65 66 20 port. */.#ifdef
0480: 42 55 49 4c 44 5f 74 6c 73 0a 23 75 6e 64 65 66 BUILD_tls.#undef
0490: 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 TCL_STORAGE_CLA
04a0: 53 53 0a 23 64 65 66 69 6e 65 20 54 43 4c 5f 53 SS.#define TCL_S
04b0: 54 4f 52 41 47 45 5f 43 4c 41 53 53 20 44 4c 4c TORAGE_CLASS DLL
04c0: 45 58 50 4f 52 54 0a 23 65 6e 64 69 66 20 2f 2a EXPORT.#endif /*
04d0: 20 42 55 49 4c 44 5f 75 64 70 20 2a 2f 0a 0a 2f BUILD_udp */../
04e0: 2a 20 48 61 6e 64 6c 65 20 54 43 4c 20 38 2e 36 * Handle TCL 8.6
04f0: 20 43 4f 4e 53 54 20 63 68 61 6e 67 65 73 20 2a CONST changes *
0500: 2f 0a 23 69 66 6e 64 65 66 20 43 4f 4e 53 54 38 /.#ifndef CONST8
0510: 36 0a 23 20 20 20 69 66 20 54 43 4c 5f 4d 41 4a 6.# if TCL_MAJ
0520: 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 OR_VERSION > 8.#
0530: 09 64 65 66 69 6e 65 20 43 4f 4e 53 54 38 36 20 .define CONST86
0540: 63 6f 6e 73 74 0a 23 20 20 20 65 6c 73 65 0a 23 const.# else.#
0550: 09 64 65 66 69 6e 65 20 43 4f 4e 53 54 38 36 0a .define CONST86.
0560: 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 # endif.#endif
0570: 0a 0a 2f 2a 0a 20 2a 20 42 61 63 6b 77 61 72 64 ../*. * Backward
0580: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 s compatibility
0590: 66 6f 72 20 73 69 7a 65 20 74 79 70 65 20 63 68 for size type ch
05a0: 61 6e 67 65 0a 20 2a 2f 0a 23 69 66 20 54 43 4c ange. */.#if TCL
05b0: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MAJOR_VERSION <
05c0: 20 39 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 9 && TCL_MINOR_
05d0: 56 45 52 53 49 4f 4e 20 3c 20 37 0a 23 69 6e 63 VERSION < 7.#inc
05e0: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a lude <limits.h>.
05f0: 23 69 66 6e 64 65 66 20 54 43 4c 5f 53 49 5a 45 #ifndef TCL_SIZE
0600: 5f 4d 41 58 0a 23 64 65 66 69 6e 65 20 54 43 4c _MAX.#define TCL
0610: 5f 53 49 5a 45 5f 4d 41 58 20 49 4e 54 5f 4d 41 _SIZE_MAX INT_MA
0620: 58 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 X.#endif..#ifnde
0630: 66 20 54 63 6c 5f 53 69 7a 65 0a 20 20 20 20 74 f Tcl_Size. t
0640: 79 70 65 64 65 66 20 69 6e 74 20 54 63 6c 5f 53 ypedef int Tcl_S
0650: 69 7a 65 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 ize;.#endif..#de
0660: 66 69 6e 65 20 54 43 4c 5f 53 49 5a 45 5f 4d 4f fine TCL_SIZE_MO
0670: 44 49 46 49 45 52 20 22 22 0a 23 64 65 66 69 6e DIFIER "".#defin
0680: 65 20 54 63 6c 5f 47 65 74 53 69 7a 65 49 6e 74 e Tcl_GetSizeInt
0690: 46 72 6f 6d 4f 62 6a 20 54 63 6c 5f 47 65 74 49 FromObj Tcl_GetI
06a0: 6e 74 46 72 6f 6d 4f 62 6a 0a 23 64 65 66 69 6e ntFromObj.#defin
06b0: 65 20 54 63 6c 5f 4e 65 77 53 69 7a 65 49 6e 74 e Tcl_NewSizeInt
06c0: 4f 62 6a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 Obj Tcl_NewI
06d0: 6e 74 4f 62 6a 0a 23 64 65 66 69 6e 65 20 54 63 ntObj.#define Tc
06e0: 6c 5f 4e 65 77 53 69 7a 65 49 6e 74 46 72 6f 6d l_NewSizeIntFrom
06f0: 4f 62 6a 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 Obj Tcl_NewWideI
0700: 6e 74 4f 62 6a 0a 23 65 6e 64 69 66 0a 0a 2f 2a ntObj.#endif../*
0710: 20 44 65 66 69 6e 65 20 6d 69 73 73 69 6e 67 20 Define missing
0720: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 POSIX error code
0730: 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 45 43 4f s */.#ifndef ECO
0740: 4e 4e 41 42 4f 52 54 45 44 0a 23 64 65 66 69 6e NNABORTED.#defin
0750: 65 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 09 31 e ECONNABORTED.1
0760: 33 30 09 2f 2a 20 53 6f 66 74 77 61 72 65 20 63 30./* Software c
0770: 61 75 73 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e aused connection
0780: 20 61 62 6f 72 74 20 2a 2f 0a 23 65 6e 64 69 66 abort */.#endif
0790: 0a 23 69 66 6e 64 65 66 20 45 43 4f 4e 4e 52 45 .#ifndef ECONNRE
07a0: 53 45 54 0a 23 64 65 66 69 6e 65 20 45 43 4f 4e SET.#define ECON
07b0: 4e 52 45 53 45 54 09 31 33 31 09 2f 2a 20 43 6f NRESET.131./* Co
07c0: 6e 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 20 62 nnection reset b
07d0: 79 20 70 65 65 72 20 2a 2f 0a 23 65 6e 64 69 66 y peer */.#endif
07e0: 0a 0a 2f 2a 20 44 65 62 75 67 20 61 6e 64 20 65 ../* Debug and e
07f0: 72 72 6f 72 20 6d 61 63 72 6f 73 20 2a 2f 0a 23 rror macros */.#
0800: 69 66 64 65 66 20 54 43 4c 45 58 54 5f 54 43 4c ifdef TCLEXT_TCL
0810: 54 4c 53 5f 44 45 42 55 47 0a 23 69 6e 63 6c 75 TLS_DEBUG.#inclu
0820: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 64 65 de <ctype.h>.#de
0830: 66 69 6e 65 20 64 70 72 69 6e 74 66 28 2e 2e 2e fine dprintf(...
0840: 29 20 7b 20 5c 0a 09 63 68 61 72 20 64 70 72 69 ) { \..char dpri
0850: 6e 74 66 42 75 66 66 65 72 5b 38 31 39 32 5d 2c ntfBuffer[8192],
0860: 20 2a 64 70 72 69 6e 74 66 42 75 66 66 65 72 5f *dprintfBuffer_
0870: 70 3b 20 5c 0a 09 64 70 72 69 6e 74 66 42 75 66 p; \..dprintfBuf
0880: 66 65 72 5f 70 20 3d 20 26 64 70 72 69 6e 74 66 fer_p = &dprintf
0890: 42 75 66 66 65 72 5b 30 5d 3b 20 5c 0a 09 64 70 Buffer[0]; \..dp
08a0: 72 69 6e 74 66 42 75 66 66 65 72 5f 70 20 2b 3d rintfBuffer_p +=
08b0: 20 73 70 72 69 6e 74 66 28 64 70 72 69 6e 74 66 sprintf(dprintf
08c0: 42 75 66 66 65 72 5f 70 2c 20 22 25 73 3a 25 69 Buffer_p, "%s:%i
08d0: 3a 25 73 28 29 3a 22 2c 20 5f 5f 46 49 4c 45 5f :%s():", __FILE_
08e0: 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 5f 5f 66 _, __LINE__, __f
08f0: 75 6e 63 5f 5f 29 3b 20 5c 0a 09 64 70 72 69 6e unc__); \..dprin
0900: 74 66 42 75 66 66 65 72 5f 70 20 2b 3d 20 73 70 tfBuffer_p += sp
0910: 72 69 6e 74 66 28 64 70 72 69 6e 74 66 42 75 66 rintf(dprintfBuf
0920: 66 65 72 5f 70 2c 20 5f 5f 56 41 5f 41 52 47 53 fer_p, __VA_ARGS
0930: 5f 5f 29 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 __); \..fprintf(
0940: 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 stderr, "%s\n",
0950: 64 70 72 69 6e 74 66 42 75 66 66 65 72 29 3b 20 dprintfBuffer);
0960: 5c 0a 7d 0a 23 64 65 66 69 6e 65 20 64 70 72 69 \.}.#define dpri
0970: 6e 74 42 75 66 66 65 72 28 62 75 66 66 65 72 4e ntBuffer(bufferN
0980: 61 6d 65 2c 20 62 75 66 66 65 72 4c 65 6e 67 74 ame, bufferLengt
0990: 68 29 20 7b 20 5c 0a 09 69 6e 74 20 64 70 72 69 h) { \..int dpri
09a0: 6e 74 42 75 66 66 65 72 49 64 78 3b 20 5c 0a 09 ntBufferIdx; \..
09b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 70 unsigned char dp
09c0: 72 69 6e 74 42 75 66 66 65 72 43 68 61 72 3b 20 rintBufferChar;
09d0: 5c 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 \..fprintf(stder
09e0: 72 2c 20 22 25 73 3a 25 69 3a 25 73 28 29 3a 25 r, "%s:%i:%s():%
09f0: 73 5b 25 6c 6c 75 5d 3d 7b 22 2c 20 5f 5f 46 49 s[%llu]={", __FI
0a00: 4c 45 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 LE__, __LINE__,
0a10: 5f 5f 66 75 6e 63 5f 5f 2c 20 23 62 75 66 66 65 __func__, #buffe
0a20: 72 4e 61 6d 65 2c 20 28 75 6e 73 69 67 6e 65 64 rName, (unsigned
0a30: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 62 75 66 66 long long) buff
0a40: 65 72 4c 65 6e 67 74 68 29 3b 20 5c 0a 09 66 6f erLength); \..fo
0a50: 72 20 28 64 70 72 69 6e 74 42 75 66 66 65 72 49 r (dprintBufferI
0a60: 64 78 20 3d 20 30 3b 20 64 70 72 69 6e 74 42 75 dx = 0; dprintBu
0a70: 66 66 65 72 49 64 78 20 3c 20 62 75 66 66 65 72 fferIdx < buffer
0a80: 4c 65 6e 67 74 68 3b 20 64 70 72 69 6e 74 42 75 Length; dprintBu
0a90: 66 66 65 72 49 64 78 2b 2b 29 20 7b 20 5c 0a 09 fferIdx++) { \..
0aa0: 09 64 70 72 69 6e 74 42 75 66 66 65 72 43 68 61 .dprintBufferCha
0ab0: 72 20 3d 20 62 75 66 66 65 72 4e 61 6d 65 5b 64 r = bufferName[d
0ac0: 70 72 69 6e 74 42 75 66 66 65 72 49 64 78 5d 3b printBufferIdx];
0ad0: 20 5c 0a 09 09 69 66 20 28 69 73 61 6c 70 68 61 \...if (isalpha
0ae0: 28 64 70 72 69 6e 74 42 75 66 66 65 72 43 68 61 (dprintBufferCha
0af0: 72 29 20 7c 7c 20 69 73 64 69 67 69 74 28 64 70 r) || isdigit(dp
0b00: 72 69 6e 74 42 75 66 66 65 72 43 68 61 72 29 29 rintBufferChar))
0b10: 20 7b 20 5c 0a 09 09 09 66 70 72 69 6e 74 66 28 { \....fprintf(
0b20: 73 74 64 65 72 72 2c 20 22 27 25 63 27 20 22 2c stderr, "'%c' ",
0b30: 20 64 70 72 69 6e 74 42 75 66 66 65 72 43 68 61 dprintBufferCha
0b40: 72 29 3b 20 5c 0a 09 09 7d 20 65 6c 73 65 20 7b r); \...} else {
0b50: 20 5c 0a 09 09 09 66 70 72 69 6e 74 66 28 73 74 \....fprintf(st
0b60: 64 65 72 72 2c 20 22 25 30 32 78 20 22 2c 20 28 derr, "%02x ", (
0b70: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 64 70 unsigned int) dp
0b80: 72 69 6e 74 42 75 66 66 65 72 43 68 61 72 29 3b rintBufferChar);
0b90: 20 5c 0a 09 09 7d 3b 20 5c 0a 09 7d 3b 20 5c 0a \...}; \..}; \.
0ba0: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c .fprintf(stderr,
0bb0: 20 22 7d 5c 6e 22 29 3b 20 5c 0a 7d 0a 23 64 65 "}\n"); \.}.#de
0bc0: 66 69 6e 65 20 64 70 72 69 6e 74 46 6c 61 67 73 fine dprintFlags
0bd0: 28 73 74 61 74 65 50 74 72 29 20 7b 20 5c 0a 09 (statePtr) { \..
0be0: 63 68 61 72 20 64 70 72 69 6e 74 66 42 75 66 66 char dprintfBuff
0bf0: 65 72 5b 38 31 39 32 5d 2c 20 2a 64 70 72 69 6e er[8192], *dprin
0c00: 74 66 42 75 66 66 65 72 5f 70 3b 20 5c 0a 09 64 tfBuffer_p; \..d
0c10: 70 72 69 6e 74 66 42 75 66 66 65 72 5f 70 20 3d printfBuffer_p =
0c20: 20 26 64 70 72 69 6e 74 66 42 75 66 66 65 72 5b &dprintfBuffer[
0c30: 30 5d 3b 20 5c 0a 09 64 70 72 69 6e 74 66 42 75 0]; \..dprintfBu
0c40: 66 66 65 72 5f 70 20 2b 3d 20 73 70 72 69 6e 74 ffer_p += sprint
0c50: 66 28 64 70 72 69 6e 74 66 42 75 66 66 65 72 5f f(dprintfBuffer_
0c60: 70 2c 20 22 25 73 3a 25 69 3a 25 73 28 29 3a 25 p, "%s:%i:%s():%
0c70: 73 2d 3e 66 6c 61 67 73 3d 30 22 2c 20 5f 5f 46 s->flags=0", __F
0c80: 49 4c 45 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c ILE__, __LINE__,
0c90: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 23 73 74 61 74 __func__, #stat
0ca0: 65 50 74 72 29 3b 20 5c 0a 09 69 66 20 28 28 28 ePtr); \..if (((
0cb0: 73 74 61 74 65 50 74 72 29 2d 3e 66 6c 61 67 73 statePtr)->flags
0cc0: 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 & TLS_TCL_ASYNC
0cd0: 29 20 3d 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 ) == TLS_TCL_ASY
0ce0: 4e 43 29 20 7b 20 64 70 72 69 6e 74 66 42 75 66 NC) { dprintfBuf
0cf0: 66 65 72 5f 70 20 2b 3d 20 73 70 72 69 6e 74 66 fer_p += sprintf
0d00: 28 64 70 72 69 6e 74 66 42 75 66 66 65 72 5f 70 (dprintfBuffer_p
0d10: 2c 20 22 7c 54 4c 53 5f 54 43 4c 5f 41 53 59 4e , "|TLS_TCL_ASYN
0d20: 43 22 29 3b 20 7d 3b 20 5c 0a 09 69 66 20 28 28 C"); }; \..if ((
0d30: 28 73 74 61 74 65 50 74 72 29 2d 3e 66 6c 61 67 (statePtr)->flag
0d40: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 s & TLS_TCL_SERV
0d50: 45 52 29 20 3d 3d 20 54 4c 53 5f 54 43 4c 5f 53 ER) == TLS_TCL_S
0d60: 45 52 56 45 52 29 20 7b 20 64 70 72 69 6e 74 66 ERVER) { dprintf
0d70: 42 75 66 66 65 72 5f 70 20 2b 3d 20 73 70 72 69 Buffer_p += spri
0d80: 6e 74 66 28 64 70 72 69 6e 74 66 42 75 66 66 65 ntf(dprintfBuffe
0d90: 72 5f 70 2c 20 22 7c 54 4c 53 5f 54 43 4c 5f 53 r_p, "|TLS_TCL_S
0da0: 45 52 56 45 52 22 29 3b 20 7d 3b 20 5c 0a 09 69 ERVER"); }; \..i
0db0: 66 20 28 28 28 73 74 61 74 65 50 74 72 29 2d 3e f (((statePtr)->
0dc0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
0dd0: 49 4e 49 54 29 20 3d 3d 20 54 4c 53 5f 54 43 4c INIT) == TLS_TCL
0de0: 5f 49 4e 49 54 29 20 7b 20 64 70 72 69 6e 74 66 _INIT) { dprintf
0df0: 42 75 66 66 65 72 5f 70 20 2b 3d 20 73 70 72 69 Buffer_p += spri
0e00: 6e 74 66 28 64 70 72 69 6e 74 66 42 75 66 66 65 ntf(dprintfBuffe
0e10: 72 5f 70 2c 20 22 7c 54 4c 53 5f 54 43 4c 5f 49 r_p, "|TLS_TCL_I
0e20: 4e 49 54 22 29 3b 20 7d 3b 20 5c 0a 09 69 66 20 NIT"); }; \..if
0e30: 28 28 28 73 74 61 74 65 50 74 72 29 2d 3e 66 6c (((statePtr)->fl
0e40: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 44 45 ags & TLS_TCL_DE
0e50: 42 55 47 29 20 3d 3d 20 54 4c 53 5f 54 43 4c 5f BUG) == TLS_TCL_
0e60: 44 45 42 55 47 29 20 7b 20 64 70 72 69 6e 74 66 DEBUG) { dprintf
0e70: 42 75 66 66 65 72 5f 70 20 2b 3d 20 73 70 72 69 Buffer_p += spri
0e80: 6e 74 66 28 64 70 72 69 6e 74 66 42 75 66 66 65 ntf(dprintfBuffe
0e90: 72 5f 70 2c 20 22 7c 54 4c 53 5f 54 43 4c 5f 44 r_p, "|TLS_TCL_D
0ea0: 45 42 55 47 22 29 3b 20 7d 3b 20 5c 0a 09 69 66 EBUG"); }; \..if
0eb0: 20 28 28 28 73 74 61 74 65 50 74 72 29 2d 3e 66 (((statePtr)->f
0ec0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 lags & TLS_TCL_C
0ed0: 41 4c 4c 42 41 43 4b 29 20 3d 3d 20 54 4c 53 5f ALLBACK) == TLS_
0ee0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 20 TCL_CALLBACK) {
0ef0: 64 70 72 69 6e 74 66 42 75 66 66 65 72 5f 70 20 dprintfBuffer_p
0f00: 2b 3d 20 73 70 72 69 6e 74 66 28 64 70 72 69 6e += sprintf(dprin
0f10: 74 66 42 75 66 66 65 72 5f 70 2c 20 22 7c 54 4c tfBuffer_p, "|TL
0f20: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 22 29 S_TCL_CALLBACK")
0f30: 3b 20 7d 3b 20 5c 0a 09 69 66 20 28 28 28 73 74 ; }; \..if (((st
0f40: 61 74 65 50 74 72 29 2d 3e 66 6c 61 67 73 20 26 atePtr)->flags &
0f50: 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 TLS_TCL_HANDSHA
0f60: 4b 45 5f 46 41 49 4c 45 44 29 20 3d 3d 20 54 4c KE_FAILED) == TL
0f70: 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f S_TCL_HANDSHAKE_
0f80: 46 41 49 4c 45 44 29 20 7b 20 64 70 72 69 6e 74 FAILED) { dprint
0f90: 66 42 75 66 66 65 72 5f 70 20 2b 3d 20 73 70 72 fBuffer_p += spr
0fa0: 69 6e 74 66 28 64 70 72 69 6e 74 66 42 75 66 66 intf(dprintfBuff
0fb0: 65 72 5f 70 2c 20 22 7c 54 4c 53 5f 54 43 4c 5f er_p, "|TLS_TCL_
0fc0: 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 HANDSHAKE_FAILED
0fd0: 22 29 3b 20 7d 3b 20 5c 0a 09 69 66 20 28 28 28 "); }; \..if (((
0fe0: 73 74 61 74 65 50 74 72 29 2d 3e 66 6c 61 67 73 statePtr)->flags
0ff0: 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 & TLS_TCL_FASTP
1000: 41 54 48 29 20 3d 3d 20 54 4c 53 5f 54 43 4c 5f ATH) == TLS_TCL_
1010: 46 41 53 54 50 41 54 48 29 20 7b 20 64 70 72 69 FASTPATH) { dpri
1020: 6e 74 66 42 75 66 66 65 72 5f 70 20 2b 3d 20 73 ntfBuffer_p += s
1030: 70 72 69 6e 74 66 28 64 70 72 69 6e 74 66 42 75 printf(dprintfBu
1040: 66 66 65 72 5f 70 2c 20 22 7c 54 4c 53 5f 54 43 ffer_p, "|TLS_TC
1050: 4c 5f 46 41 53 54 50 41 54 48 22 29 3b 20 7d 3b L_FASTPATH"); };
1060: 20 5c 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 \..fprintf(stde
1070: 72 72 2c 20 22 25 73 5c 6e 22 2c 20 64 70 72 69 rr, "%s\n", dpri
1080: 6e 74 66 42 75 66 66 65 72 29 3b 20 5c 0a 7d 0a ntfBuffer); \.}.
1090: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 64 70 #else.#define dp
10a0: 72 69 6e 74 66 28 2e 2e 2e 29 20 69 66 20 28 30 rintf(...) if (0
10b0: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 ) { fprintf(stde
10c0: 72 72 2c 20 5f 5f 56 41 5f 41 52 47 53 5f 5f 29 rr, __VA_ARGS__)
10d0: 3b 20 7d 0a 23 64 65 66 69 6e 65 20 64 70 72 69 ; }.#define dpri
10e0: 6e 74 42 75 66 66 65 72 28 62 75 66 66 65 72 4e ntBuffer(bufferN
10f0: 61 6d 65 2c 20 62 75 66 66 65 72 4c 65 6e 67 74 ame, bufferLengt
1100: 68 29 20 2f 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 h) /**/.#define
1110: 64 70 72 69 6e 74 46 6c 61 67 73 28 73 74 61 74 dprintFlags(stat
1120: 65 50 74 72 29 20 2f 2a 2a 2f 0a 23 65 6e 64 69 ePtr) /**/.#endi
1130: 66 0a 0a 23 64 65 66 69 6e 65 20 47 45 54 5f 45 f..#define GET_E
1140: 52 52 5f 52 45 41 53 4f 4e 28 29 09 45 52 52 5f RR_REASON().ERR_
1150: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
1160: 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f ing(ERR_get_erro
1170: 72 28 29 29 0a 0a 2f 2a 20 43 6f 6d 6d 6f 6e 20 r())../* Common
1180: 6c 69 73 74 20 61 70 70 65 6e 64 20 6d 61 63 72 list append macr
1190: 6f 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 41 os */.#define LA
11a0: 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
11b0: 65 72 70 2c 20 6f 62 6a 2c 20 74 65 78 74 2c 20 erp, obj, text,
11c0: 76 61 6c 75 65 2c 20 73 69 7a 65 29 20 7b 5c 0a value, size) {\.
11d0: 20 20 20 20 69 66 20 28 74 65 78 74 20 21 3d 20 if (text !=
11e0: 4e 55 4c 4c 29 20 54 63 6c 5f 4c 69 73 74 4f 62 NULL) Tcl_ListOb
11f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1200: 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 54 63 6c 5f nterp, obj, Tcl_
1210: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 65 78 NewStringObj(tex
1220: 74 2c 20 2d 31 29 29 3b 20 5c 0a 20 20 20 20 54 t, -1)); \. T
1230: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1240: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1250: 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 obj, Tcl_NewByte
1260: 41 72 72 61 79 4f 62 6a 28 76 61 6c 75 65 2c 20 ArrayObj(value,
1270: 73 69 7a 65 29 29 3b 20 5c 0a 7d 0a 23 64 65 66 size)); \.}.#def
1280: 69 6e 65 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 ine LAPPEND_STR(
1290: 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 74 65 78 interp, obj, tex
12a0: 74 2c 20 76 61 6c 75 65 2c 20 73 69 7a 65 29 20 t, value, size)
12b0: 7b 5c 0a 20 20 20 20 69 66 20 28 74 65 78 74 20 {\. if (text
12c0: 21 3d 20 4e 55 4c 4c 29 20 54 63 6c 5f 4c 69 73 != NULL) Tcl_Lis
12d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
12e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 54 t(interp, obj, T
12f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1300: 74 65 78 74 2c 20 2d 31 29 29 3b 20 5c 0a 20 20 text, -1)); \.
1310: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1320: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1330: 70 2c 20 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 p, obj, Tcl_NewS
1340: 74 72 69 6e 67 4f 62 6a 28 76 61 6c 75 65 2c 20 tringObj(value,
1350: 73 69 7a 65 29 29 3b 20 5c 0a 7d 0a 23 64 65 66 size)); \.}.#def
1360: 69 6e 65 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 ine LAPPEND_INT(
1370: 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 74 65 78 interp, obj, tex
1380: 74 2c 20 76 61 6c 75 65 29 20 7b 5c 0a 20 20 20 t, value) {\.
1390: 20 69 66 20 28 74 65 78 74 20 21 3d 20 4e 55 4c if (text != NUL
13a0: 4c 29 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 L) Tcl_ListObjAp
13b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
13c0: 72 70 2c 20 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 rp, obj, Tcl_New
13d0: 53 74 72 69 6e 67 4f 62 6a 28 74 65 78 74 2c 20 StringObj(text,
13e0: 2d 31 29 29 3b 20 5c 0a 20 20 20 20 54 63 6c 5f -1)); \. Tcl_
13f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1400: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
1410: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
1420: 76 61 6c 75 65 29 29 3b 20 5c 0a 7d 0a 23 64 65 value)); \.}.#de
1430: 66 69 6e 65 20 4c 41 50 50 45 4e 44 5f 4c 4f 4e fine LAPPEND_LON
1440: 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 74 G(interp, obj, t
1450: 65 78 74 2c 20 76 61 6c 75 65 29 20 7b 5c 0a 20 ext, value) {\.
1460: 20 20 20 69 66 20 28 74 65 78 74 20 21 3d 20 4e if (text != N
1470: 55 4c 4c 29 20 54 63 6c 5f 4c 69 73 74 4f 62 6a ULL) Tcl_ListObj
1480: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1490: 74 65 72 70 2c 20 6f 62 6a 2c 20 54 63 6c 5f 4e terp, obj, Tcl_N
14a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 65 78 74 ewStringObj(text
14b0: 2c 20 2d 31 29 29 3b 20 5c 0a 20 20 20 20 54 63 , -1)); \. Tc
14c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
14d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
14e0: 62 6a 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f bj, Tcl_NewLongO
14f0: 62 6a 28 76 61 6c 75 65 29 29 3b 20 5c 0a 7d 0a bj(value)); \.}.
1500: 23 64 65 66 69 6e 65 20 4c 41 50 50 45 4e 44 5f #define LAPPEND_
1510: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
1520: 2c 20 74 65 78 74 2c 20 76 61 6c 75 65 29 20 7b , text, value) {
1530: 5c 0a 20 20 20 20 69 66 20 28 74 65 78 74 20 21 \. if (text !
1540: 3d 20 4e 55 4c 4c 29 20 54 63 6c 5f 4c 69 73 74 = NULL) Tcl_List
1550: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1560: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 54 63 (interp, obj, Tc
1570: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 l_NewStringObj(t
1580: 65 78 74 2c 20 2d 31 29 29 3b 20 5c 0a 20 20 20 ext, -1)); \.
1590: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
15a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
15b0: 2c 20 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 42 6f , obj, Tcl_NewBo
15c0: 6f 6c 65 61 6e 4f 62 6a 28 76 61 6c 75 65 29 29 oleanObj(value))
15d0: 3b 20 5c 0a 7d 0a 23 64 65 66 69 6e 65 20 4c 41 ; \.}.#define LA
15e0: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
15f0: 2c 20 6f 62 6a 2c 20 74 65 78 74 2c 20 74 63 6c , obj, text, tcl
1600: 4f 62 6a 29 20 7b 5c 0a 20 20 20 20 69 66 20 28 Obj) {\. if (
1610: 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 54 63 text != NULL) Tc
1620: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1630: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
1640: 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e bj, Tcl_NewStrin
1650: 67 4f 62 6a 28 74 65 78 74 2c 20 2d 31 29 29 3b gObj(text, -1));
1660: 20 5c 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f \. Tcl_ListO
1670: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1680: 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 28 74 63 interp, obj, (tc
1690: 6c 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 3f 20 lObj != NULL) ?
16a0: 74 63 6c 4f 62 6a 20 3a 20 54 63 6c 5f 4e 65 77 tclObj : Tcl_New
16b0: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 StringObj("", 0)
16c0: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 0a 20 2a 20 44 65 ); \.}../*. * De
16d0: 66 69 6e 65 73 20 66 6f 72 20 53 74 61 74 65 2e fines for State.
16e0: 66 6c 61 67 73 0a 20 2a 2f 0a 23 64 65 66 69 6e flags. */.#defin
16f0: 65 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 09 e TLS_TCL_ASYNC.
1700: 09 28 31 3c 3c 30 29 09 2f 2a 20 6e 6f 6e 2d 62 .(1<<0)./* non-b
1710: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 2a 2f 0a locking mode */.
1720: 23 64 65 66 69 6e 65 20 54 4c 53 5f 54 43 4c 5f #define TLS_TCL_
1730: 53 45 52 56 45 52 09 09 28 31 3c 3c 31 29 09 2f SERVER..(1<<1)./
1740: 2a 20 53 65 72 76 65 72 2d 53 69 64 65 20 2a 2f * Server-Side */
1750: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 54 43 4c .#define TLS_TCL
1760: 5f 49 4e 49 54 09 09 28 31 3c 3c 32 29 09 2f 2a _INIT..(1<<2)./*
1770: 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 63 6f Initializing co
1780: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 nnection */.#def
1790: 69 6e 65 20 54 4c 53 5f 54 43 4c 5f 44 45 42 55 ine TLS_TCL_DEBU
17a0: 47 09 09 28 31 3c 3c 33 29 09 2f 2a 20 53 68 6f G..(1<<3)./* Sho
17b0: 77 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 w debug tracing
17c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 54 */.#define TLS_T
17d0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 09 28 31 3c 3c CL_CALLBACK.(1<<
17e0: 34 29 09 2f 2a 20 49 6e 20 61 20 63 61 6c 6c 62 4)./* In a callb
17f0: 61 63 6b 2c 20 70 72 65 76 65 6e 74 20 75 70 64 ack, prevent upd
1800: 61 74 65 0a 09 09 09 09 09 20 2a 20 6c 6f 6f 70 ate...... * loop
1810: 69 6e 67 20 70 72 6f 62 6c 65 6d 2e 20 5b 42 75 ing problem. [Bu
1820: 67 20 31 36 35 32 33 38 30 5d 20 2a 2f 0a 23 64 g 1652380] */.#d
1830: 65 66 69 6e 65 20 54 4c 53 5f 54 43 4c 5f 48 41 efine TLS_TCL_HA
1840: 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 20 28 NDSHAKE_FAILED (
1850: 31 3c 3c 35 29 20 2f 2a 20 53 65 74 20 6f 6e 20 1<<5) /* Set on
1860: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 75 72 handshake failur
1870: 65 73 20 61 6e 64 20 6f 6e 63 65 20 73 65 74 2c es and once set,
1880: 20 61 6c 6c 0a 09 09 09 09 09 20 2a 20 66 75 72 all...... * fur
1890: 74 68 65 72 20 49 2f 4f 20 77 69 6c 6c 20 72 65 ther I/O will re
18a0: 73 75 6c 74 20 69 6e 20 45 43 4f 4e 4e 41 42 4f sult in ECONNABO
18b0: 52 54 45 44 20 65 72 72 6f 72 73 2e 20 2a 2f 0a RTED errors. */.
18c0: 23 64 65 66 69 6e 65 20 54 4c 53 5f 54 43 4c 5f #define TLS_TCL_
18d0: 46 41 53 54 50 41 54 48 20 09 28 31 3c 3c 36 29 FASTPATH .(1<<6)
18e0: 09 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 63 ./* The parent c
18f0: 68 61 6e 6e 65 6c 20 69 73 20 62 65 69 6e 67 20 hannel is being
1900: 75 73 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 used directly by
1910: 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 the SSL library
1920: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f */.#define TLS_
1930: 54 43 4c 5f 44 45 4c 41 59 20 28 35 29 0a 0a 2f TCL_DELAY (5)../
1940: 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63 74 *. * This struct
1950: 75 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68 ure describes th
1960: 65 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 e per-instance s
1970: 74 61 74 65 20 6f 66 20 61 6e 20 53 53 4c 20 63 tate of an SSL c
1980: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 54 68 hannel.. *. * Th
1990: 65 20 53 53 4c 20 70 72 6f 63 65 73 73 69 6e 67 e SSL processing
19a0: 20 63 6f 6e 74 65 78 74 20 69 73 20 6d 61 69 6e context is main
19b0: 74 61 69 6e 65 64 20 68 65 72 65 2c 20 69 6e 20 tained here, in
19c0: 74 68 65 20 43 6c 69 65 6e 74 44 61 74 61 0a 20 the ClientData.
19d0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 */.typedef struc
19e0: 74 20 53 74 61 74 65 20 7b 0a 09 54 63 6c 5f 43 t State {..Tcl_C
19f0: 68 61 6e 6e 65 6c 20 73 65 6c 66 3b 09 2f 2a 20 hannel self;./*
1a00: 74 68 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e this socket chan
1a10: 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f 54 69 6d 65 nel */..Tcl_Time
1a20: 72 54 6f 6b 65 6e 20 74 69 6d 65 72 3b 0a 0a 09 rToken timer;...
1a30: 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 73 int flags;../* s
1a40: 65 65 20 53 74 61 74 65 2e 66 6c 61 67 73 20 61 ee State.flags a
1a50: 62 6f 76 65 20 20 2a 2f 0a 09 69 6e 74 20 77 61 bove */..int wa
1a60: 74 63 68 4d 61 73 6b 3b 09 09 2f 2a 20 63 75 72 tchMask;../* cur
1a70: 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20 6d rent WatchProc m
1a80: 61 73 6b 20 2a 2f 0a 09 69 6e 74 20 77 61 6e 74 ask */..int want
1a90: 3b 09 09 2f 2a 20 70 65 6e 64 69 6e 67 20 77 61 ;../* pending wa
1aa0: 6e 74 73 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c nts from OpenSSL
1ab0: 20 2a 2f 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 */..int mode;..
1ac0: 2f 2a 20 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 /* current mode
1ad0: 6f 66 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 of parent channe
1ae0: 6c 20 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 74 65 72 l */...Tcl_Inter
1af0: 70 20 2a 69 6e 74 65 72 70 3b 09 2f 2a 20 69 6e p *interp;./* in
1b00: 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 terpreter in whi
1b10: 63 68 20 74 68 69 73 20 72 65 73 69 64 65 73 20 ch this resides
1b20: 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 61 6c */..Tcl_Obj *cal
1b30: 6c 62 61 63 6b 3b 09 2f 2a 20 73 63 72 69 70 74 lback;./* script
1b40: 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 72 61 63 called for trac
1b50: 69 6e 67 2c 20 69 6e 66 6f 2c 20 61 6e 64 20 65 ing, info, and e
1b60: 72 72 6f 72 73 20 2a 2f 0a 09 54 63 6c 5f 4f 62 rrors */..Tcl_Ob
1b70: 6a 20 2a 70 61 73 73 77 6f 72 64 3b 09 2f 2a 20 j *password;./*
1b80: 73 63 72 69 70 74 20 63 61 6c 6c 65 64 20 66 6f script called fo
1b90: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 70 61 r certificate pa
1ba0: 73 73 77 6f 72 64 20 2a 2f 0a 09 54 63 6c 5f 4f ssword */..Tcl_O
1bb0: 62 6a 20 2a 76 63 6d 64 3b 09 09 2f 2a 20 73 63 bj *vcmd;../* sc
1bc0: 72 69 70 74 20 63 61 6c 6c 65 64 20 74 6f 20 76 ript called to v
1bd0: 65 72 69 66 79 20 6f 72 20 76 61 6c 69 64 61 74 erify or validat
1be0: 65 20 70 72 6f 74 6f 63 6f 6c 20 63 6f 6e 66 69 e protocol confi
1bf0: 67 20 2a 2f 0a 0a 09 69 6e 74 20 76 66 6c 61 67 g */...int vflag
1c00: 73 3b 09 09 2f 2a 20 76 65 72 69 66 79 20 66 6c s;../* verify fl
1c10: 61 67 73 20 2a 2f 0a 09 53 53 4c 20 2a 73 73 6c ags */..SSL *ssl
1c20: 3b 09 09 2f 2a 20 53 74 72 75 63 74 20 66 6f 72 ;../* Struct for
1c30: 20 53 53 4c 20 70 72 6f 63 65 73 73 69 6e 67 20 SSL processing
1c40: 2a 2f 0a 09 53 53 4c 5f 43 54 58 20 2a 63 74 78 */..SSL_CTX *ctx
1c50: 3b 09 09 2f 2a 20 53 53 4c 20 43 6f 6e 74 65 78 ;../* SSL Contex
1c60: 74 20 2a 2f 0a 09 42 49 4f 20 2a 62 69 6f 3b 09 t */..BIO *bio;.
1c70: 09 2f 2a 20 53 74 72 75 63 74 20 66 6f 72 20 53 ./* Struct for S
1c80: 53 4c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f SL processing */
1c90: 0a 09 42 49 4f 20 2a 70 5f 62 69 6f 3b 09 09 2f ..BIO *p_bio;../
1ca0: 2a 20 50 61 72 65 6e 74 20 42 49 4f 20 28 74 68 * Parent BIO (th
1cb0: 61 74 20 69 73 20 6c 61 79 65 72 65 64 20 6f 6e at is layered on
1cc0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 2a 2f Tcl_Channel) */
1cd0: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ...unsigned int
1ce0: 70 72 6f 74 6f 73 5f 6c 65 6e 3b 20 2f 2a 20 4c protos_len; /* L
1cf0: 65 6e 67 74 68 20 6f 66 20 70 72 6f 74 6f 73 20 ength of protos
1d00: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 */..unsigned cha
1d10: 72 20 2a 70 72 6f 74 6f 73 3b 09 2f 2a 20 4c 69 r *protos;./* Li
1d20: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 st of supported
1d30: 70 72 6f 74 6f 63 6f 6c 73 20 69 6e 20 70 72 6f protocols in pro
1d40: 74 6f 63 6f 6c 20 66 6f 72 6d 61 74 20 2a 2f 0a tocol format */.
1d50: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 ..const char *er
1d60: 72 3b 0a 7d 20 53 74 61 74 65 3b 0a 0a 23 69 66 r;.} State;..#if
1d70: 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 def USE_TCL_STUB
1d80: 53 0a 23 69 66 6e 64 65 66 20 54 63 6c 5f 53 74 S.#ifndef Tcl_St
1d90: 61 63 6b 43 68 61 6e 6e 65 6c 0a 23 65 72 72 6f ackChannel.#erro
1da0: 72 20 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6d r "Unable to com
1db0: 70 69 6c 65 20 6f 6e 20 74 68 69 73 20 76 65 72 pile on this ver
1dc0: 73 69 6f 6e 20 6f 66 20 54 63 6c 22 0a 23 65 6e sion of Tcl".#en
1dd0: 64 69 66 20 2f 2a 20 54 63 6c 5f 47 65 74 53 74 dif /* Tcl_GetSt
1de0: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 20 2a 2f 0a ackedChannel */.
1df0: 23 65 6e 64 69 66 20 2f 2a 20 55 53 45 5f 54 43 #endif /* USE_TC
1e00: 4c 5f 53 54 55 42 53 20 2a 2f 0a 0a 23 69 66 20 L_STUBS */..#if
1e10: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
1e20: 4e 20 3c 20 39 0a 20 20 20 20 74 79 70 65 64 65 N < 9. typede
1e30: 66 20 63 68 61 72 20 74 6c 73 5f 66 72 65 65 5f f char tls_free_
1e40: 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 type;.#else.
1e50: 74 79 70 65 64 65 66 20 76 6f 69 64 20 74 6c 73 typedef void tls
1e60: 5f 66 72 65 65 5f 74 79 70 65 3b 0a 23 65 6e 64 _free_type;.#end
1e70: 69 66 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 if../*. * Forwar
1e80: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 d declarations.
1e90: 2a 2f 0a 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 */.const Tcl_Cha
1ea0: 6e 6e 65 6c 54 79 70 65 20 2a 54 6c 73 5f 43 68 nnelType *Tls_Ch
1eb0: 61 6e 6e 65 6c 54 79 70 65 28 76 6f 69 64 29 3b annelType(void);
1ec0: 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 .Tcl_Channel
1ed0: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 53 Tls_GetParent(S
1ee0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
1ef0: 69 6e 74 20 6d 61 73 6b 46 6c 61 67 73 29 3b 0a int maskFlags);.
1f00: 0a 54 63 6c 5f 4f 62 6a 20 20 20 20 20 20 20 20 .Tcl_Obj
1f10: 20 2a 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a *Tls_NewX509Obj
1f20: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
1f30: 65 72 70 2c 20 58 35 30 39 20 2a 63 65 72 74 2c erp, X509 *cert,
1f40: 20 69 6e 74 20 61 6c 6c 29 3b 0a 54 63 6c 5f 4f int all);.Tcl_O
1f50: 62 6a 09 09 2a 54 6c 73 5f 4e 65 77 43 41 4f 62 bj..*Tls_NewCAOb
1f60: 6a 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e j(Tcl_Interp *in
1f70: 74 65 72 70 2c 20 63 6f 6e 73 74 20 53 53 4c 20 terp, const SSL
1f80: 2a 73 73 6c 2c 20 69 6e 74 20 70 65 65 72 29 3b *ssl, int peer);
1f90: 0a 76 6f 69 64 20 20 20 20 20 20 20 20 20 20 20 .void
1fa0: 20 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 Tls_Error(State
1fb0: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 *statePtr, cons
1fc0: 74 20 63 68 61 72 20 2a 6d 73 67 29 3b 0a 76 6f t char *msg);.vo
1fd0: 69 64 20 20 20 20 20 20 20 20 20 20 20 20 54 6c id Tl
1fe0: 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 65 65 5f s_Free(tls_free_
1ff0: 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 72 29 3b type *blockPtr);
2000: 0a 76 6f 69 64 20 20 20 20 20 20 20 20 20 20 20 .void
2010: 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 Tls_Clean(State
2020: 20 2a 73 74 61 74 65 50 74 72 29 3b 0a 69 6e 74 *statePtr);.int
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 Tls
2040: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 _WaitForConnect(
2050: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
2060: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
2070: 74 72 2c 20 69 6e 74 20 68 61 6e 64 73 68 61 6b tr, int handshak
2080: 65 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61 6e eFailureIsPerman
2090: 65 6e 74 29 3b 0a 0a 42 49 4f 20 20 20 20 20 20 ent);..BIO
20a0: 20 20 20 20 20 20 20 2a 42 49 4f 5f 6e 65 77 5f *BIO_new_
20b0: 74 63 6c 28 53 74 61 74 65 2a 20 73 74 61 74 65 tcl(State* state
20c0: 50 74 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b Ptr, int flags);
20d0: 0a 69 6e 74 09 09 42 49 4f 5f 63 6c 65 61 6e 75 .int..BIO_cleanu
20e0: 70 28 29 3b 0a 0a 23 64 65 66 69 6e 65 20 50 54 p();..#define PT
20f0: 52 32 49 4e 54 28 78 29 20 28 28 69 6e 74 29 20 R2INT(x) ((int)
2100: 28 28 69 6e 74 70 74 72 5f 74 29 20 28 78 29 29 ((intptr_t) (x))
2110: 29 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 54 4c )..#endif /* _TL
2120: 53 49 4e 54 5f 48 20 2a 2f 0a SINT_H */.