Hex Artifact Content

Artifact 683e0380e98a5538747b8bddac151568c394da4a857e702774170988c7ac7b1a:


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 */.