Hex Artifact Content

Artifact 89e9d74f31965d521374604f74cec38a216a508da07cd8809d43fec74c0f64f8:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 4d 61  (C) 1997-2000 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32   Copyright (C) 2
0050: 30 30 30 20 41 6a 75 62 61 20 53 6f 6c 75 74 69  000 Ajuba Soluti
0060: 6f 6e 73 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  ons. *. * TLS (a
0070: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0080: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0090: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
00a0: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
00b0: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
00c0: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
00d0: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
00e0: 20 77 61 73 20 62 75 69 6c 74 20 66 72 6f 6d 20   was built from 
00f0: 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75 70  scratch based up
0100: 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f  on observation o
0110: 66 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42  f OpenSSL 0.9.2B
0120: 0a 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20  . *. * Addition 
0130: 63 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f  credit is due fo
0140: 72 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65  r Andreas Kuprie
0150: 73 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73  s (a.kupries@wes
0160: 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20  tend.com), for. 
0170: 2a 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20  * providing the 
0180: 54 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e  Tcl_ReplaceChann
0190: 65 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64  el mechanism and
01a0: 20 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79   working closely
01b0: 20 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65   with me. * to e
01c0: 6e 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70  nhance it to sup
01d0: 70 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76  port full fileev
01e0: 65 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20  ent semantics.. 
01f0: 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64  *. * Also work d
0200: 6f 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  one by the follo
0210: 77 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65  w people provide
0220: 64 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f  d the impetus to
0230: 20 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22   do this "right"
0240: 3a 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c  :. *.tclSSL (Col
0250: 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68  in McCormack, Sh
0260: 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29  ared Technology)
0270: 0a 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65  . *.SSLtcl (Pete
0280: 72 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f  r Antman). *. */
0290: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49  ..#include "tlsI
02a0: 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 20 2a 20 46 6f  nt.h".../*. * Fo
02b0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
02c0: 6e 73 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns. */.static in
02d0: 74 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50  t  TlsBlockModeP
02e0: 72 6f 63 20 28 43 6c 69 65 6e 74 44 61 74 61 20  roc (ClientData 
02f0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
0300: 74 20 6d 6f 64 65 29 3b 0a 23 69 66 20 54 43 4c  t mode);.#if TCL
0310: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MAJOR_VERSION <
0320: 20 39 0a 73 74 61 74 69 63 20 69 6e 74 20 20 54   9.static int  T
0330: 6c 73 43 6c 6f 73 65 50 72 6f 63 20 28 43 6c 69  lsCloseProc (Cli
0340: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
0350: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
0360: 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65   *interp);.#else
0370: 0a 73 74 61 74 69 63 20 69 6e 74 20 20 54 6c 73  .static int  Tls
0380: 43 6c 6f 73 65 32 50 72 6f 63 20 28 43 6c 69 65  Close2Proc (Clie
0390: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
03a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
03b0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
03c0: 67 73 29 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74  gs);.#endif.stat
03d0: 69 63 20 69 6e 74 20 20 54 6c 73 49 6e 70 75 74  ic int  TlsInput
03e0: 50 72 6f 63 20 28 43 6c 69 65 6e 74 44 61 74 61  Proc (ClientData
03f0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 63   instanceData, c
0400: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75  har *buf, int bu
0410: 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f  fSize, int *erro
0420: 72 43 6f 64 65 50 74 72 29 3b 0a 73 74 61 74 69  rCodePtr);.stati
0430: 63 20 69 6e 74 20 20 54 6c 73 4f 75 74 70 75 74  c int  TlsOutput
0440: 50 72 6f 63 20 28 43 6c 69 65 6e 74 44 61 74 61  Proc (ClientData
0450: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 63   instanceData, c
0460: 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c 20  onst char *buf, 
0470: 69 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74  int toWrite, int
0480: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b   *errorCodePtr);
0490: 0a 73 74 61 74 69 63 20 69 6e 74 20 20 54 6c 73  .static int  Tls
04a0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 28 43  GetOptionProc (C
04b0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
04c0: 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ceData, Tcl_Inte
04d0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73  rp *interp, cons
04e0: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61  t char *optionNa
04f0: 6d 65 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  me, Tcl_DString 
0500: 2a 64 73 50 74 72 29 3b 0a 73 74 61 74 69 63 20  *dsPtr);.static 
0510: 76 6f 69 64 20 54 6c 73 57 61 74 63 68 50 72 6f  void TlsWatchPro
0520: 63 20 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  c (ClientData in
0530: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20  stanceData, int 
0540: 6d 61 73 6b 29 3b 0a 73 74 61 74 69 63 20 69 6e  mask);.static in
0550: 74 20 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50  t  TlsGetHandleP
0560: 72 6f 63 20 28 43 6c 69 65 6e 74 44 61 74 61 20  roc (ClientData 
0570: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
0580: 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69  t direction, Cli
0590: 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50  entData *handleP
05a0: 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  tr);.static int 
05b0: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 28   TlsNotifyProc (
05c0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
05d0: 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d 61 73  nceData, int mas
05e0: 6b 29 3b 0a 23 69 66 20 30 0a 73 74 61 74 69 63  k);.#if 0.static
05f0: 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e 65 6c   void TlsChannel
0600: 48 61 6e 64 6c 65 72 20 28 43 6c 69 65 6e 74 44  Handler (ClientD
0610: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
0620: 69 6e 74 20 6d 61 73 6b 29 3b 0a 23 65 6e 64 69  int mask);.#endi
0630: 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 6c  f.static void Tl
0640: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54  sChannelHandlerT
0650: 69 6d 65 72 20 28 43 6c 69 65 6e 74 44 61 74 61  imer (ClientData
0660: 20 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 0a 2f   clientData);../
0670: 2a 0a 20 2a 20 54 4c 53 20 43 68 61 6e 6e 65 6c  *. * TLS Channel
0680: 20 54 79 70 65 0a 20 2a 2f 0a 73 74 61 74 69 63   Type. */.static
0690: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tcl_ChannelType
06a0: 20 2a 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65   *tlsChannelType
06b0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 20 2a 2d   = NULL;../*. *-
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 68 61  --. *. * Tls_Cha
0710: 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a 20  nnelType --. *. 
0720: 2a 09 52 65 74 75 72 6e 20 74 68 65 20 63 6f 72  *.Return the cor
0730: 72 65 63 74 20 54 4c 53 20 63 68 61 6e 6e 65 6c  rect TLS channel
0740: 20 64 72 69 76 65 72 20 69 6e 66 6f 0a 20 2a 0a   driver info. *.
0750: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
0760: 68 65 20 63 6f 72 72 65 63 74 20 63 68 61 6e 6e  he correct chann
0770: 65 6c 20 64 72 69 76 65 72 20 66 6f 72 20 74 68  el driver for th
0780: 65 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f  e current versio
0790: 6e 20 6f 66 20 54 63 6c 2e 0a 20 2a 0a 20 2a 20  n of Tcl.. *. * 
07a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
07b0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0800: 20 2a 2f 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 54   */.Tcl_ChannelT
0810: 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c  ype *Tls_Channel
0820: 54 79 70 65 28 76 6f 69 64 29 20 7b 0a 09 75 6e  Type(void) {..un
0830: 73 69 67 6e 65 64 20 69 6e 74 20 73 69 7a 65 3b  signed int size;
0840: 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69 74 69 61  .../*.. * Initia
0850: 6c 69 7a 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  lize the channel
0860: 20 74 79 70 65 20 69 66 20 6e 65 63 65 73 73 61   type if necessa
0870: 72 79 0a 09 20 2a 2f 0a 09 69 66 20 28 74 6c 73  ry.. */..if (tls
0880: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 3d 20 4e  ChannelType == N
0890: 55 4c 4c 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a  ULL) {.../*... *
08a0: 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61   Allocation of a
08b0: 20 6e 65 77 20 63 68 61 6e 6e 65 6c 74 79 70 65   new channeltype
08c0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6e 6f   structure is no
08d0: 74 20 65 61 73 79 2c 20 62 65 63 61 75 73 65 20  t easy, because 
08e0: 6f 66 0a 09 09 20 2a 20 74 68 65 20 76 61 72 69  of... * the vari
08f0: 6f 75 73 20 76 65 72 73 6f 6e 20 6f 66 20 74 68  ous verson of th
0900: 65 20 63 6f 72 65 20 61 6e 64 20 73 75 62 73 65  e core and subse
0910: 71 75 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f  quent changes to
0920: 20 74 68 65 0a 09 09 20 2a 20 73 74 72 75 63 74   the... * struct
0930: 75 72 65 2e 20 54 68 65 20 6d 61 69 6e 20 63 68  ure. The main ch
0940: 61 6c 6c 65 6e 67 65 20 69 73 20 74 6f 20 61 6c  allenge is to al
0950: 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65  locate enough me
0960: 6d 6f 72 79 20 66 6f 72 0a 09 09 20 2a 20 6d 6f  mory for... * mo
0970: 64 65 72 6e 20 76 65 72 73 69 6f 6e 73 20 65 76  dern versions ev
0980: 65 6e 20 69 66 20 74 68 69 73 20 65 78 74 73 65  en if this extse
0990: 6e 73 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65  nsion is compile
09a0: 64 20 61 67 61 69 6e 73 74 20 6f 6e 65 0a 09 09  d against one...
09b0: 20 2a 20 6f 66 20 74 68 65 20 6f 6c 64 65 72 20   * of the older 
09c0: 76 61 72 69 61 6e 74 21 0a 09 09 20 2a 0a 09 09  variant!... *...
09d0: 20 2a 20 28 31 29 20 56 65 72 73 69 6f 6e 73 20   * (1) Versions 
09e0: 62 65 66 6f 72 65 20 73 74 75 62 73 20 28 38 2e  before stubs (8.
09f0: 30 2e 78 29 20 61 72 65 20 73 69 6d 70 6c 65 2c  0.x) are simple,
0a00: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72   because they ar
0a10: 65 0a 09 09 20 2a 20 20 20 20 20 73 75 70 70 6f  e... *     suppo
0a20: 72 74 65 64 20 6f 6e 6c 79 20 69 66 20 74 68 65  rted only if the
0a30: 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 6f   extension is co
0a40: 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 65  mpiled against e
0a50: 78 61 63 74 6c 79 0a 09 09 20 2a 20 20 20 20 20  xactly... *     
0a60: 74 68 61 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  that version of 
0a70: 74 68 65 20 63 6f 72 65 2e 0a 09 09 20 2a 0a 09  the core.... *..
0a80: 09 20 2a 20 28 32 29 20 57 69 74 68 20 73 74 75  . * (2) With stu
0a90: 62 73 20 77 65 20 6a 75 73 74 20 64 65 74 65 72  bs we just deter
0aa0: 6d 69 6e 65 20 74 68 65 20 64 69 66 66 65 72 65  mine the differe
0ab0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
0ac0: 6f 6c 64 65 72 0a 09 09 20 2a 20 20 20 20 20 61  older... *     a
0ad0: 6e 64 20 6d 6f 64 65 72 6e 20 76 61 72 69 61 6e  nd modern varian
0ae0: 74 20 61 6e 64 20 6f 76 65 72 61 6c 6c 6f 63 61  t and overalloca
0af0: 74 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 69  te accordingly i
0b00: 66 20 63 6f 6d 70 69 6c 65 64 0a 09 09 20 2a 20  f compiled... * 
0b10: 20 20 20 20 61 67 61 69 6e 73 74 20 61 6e 20 6f      against an o
0b20: 6c 64 65 72 20 76 61 72 69 61 6e 74 2e 0a 09 09  lder variant....
0b30: 20 2a 2f 0a 09 09 73 69 7a 65 20 3d 20 73 69 7a   */...size = siz
0b40: 65 6f 66 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 54  eof(Tcl_ChannelT
0b50: 79 70 65 29 3b 20 2f 2a 20 42 61 73 65 20 73 69  ype); /* Base si
0b60: 7a 65 20 2a 2f 0a 0a 09 09 74 6c 73 43 68 61 6e  ze */....tlsChan
0b70: 6e 65 6c 54 79 70 65 20 3d 20 28 54 63 6c 5f 43  nelType = (Tcl_C
0b80: 68 61 6e 6e 65 6c 54 79 70 65 20 2a 29 20 63 6b  hannelType *) ck
0b90: 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 09 09 6d  alloc(size);...m
0ba0: 65 6d 73 65 74 28 28 76 6f 69 64 20 2a 29 20 74  emset((void *) t
0bb0: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 30  lsChannelType, 0
0bc0: 2c 20 73 69 7a 65 29 3b 0a 0a 09 09 2f 2a 0a 09  , size);..../*..
0bd0: 09 20 2a 20 43 6f 6d 6d 6f 6e 20 65 6c 65 6d 65  . * Common eleme
0be0: 6e 74 73 20 6f 66 20 74 68 65 20 73 74 72 75 63  nts of the struc
0bf0: 74 75 72 65 20 28 6e 6f 20 63 68 61 6e 67 65 73  ture (no changes
0c00: 20 69 6e 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20   in location or 
0c10: 6e 61 6d 65 29 0a 09 09 20 2a 20 63 6c 6f 73 65  name)... * close
0c20: 32 50 72 6f 63 2c 20 73 65 65 6b 50 72 6f 63 2c  2Proc, seekProc,
0c30: 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 73   setOptionProc s
0c40: 74 61 79 20 4e 55 4c 4c 2e 0a 09 09 20 2a 2f 0a  tay NULL.... */.
0c50: 0a 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70  ...tlsChannelTyp
0c60: 65 2d 3e 74 79 70 65 4e 61 6d 65 09 3d 20 22 74  e->typeName.= "t
0c70: 6c 73 22 3b 0a 23 69 66 20 54 43 4c 5f 4d 41 4a  ls";.#if TCL_MAJ
0c80: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 39 0a 09  OR_VERSION < 9..
0c90: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d  .tlsChannelType-
0ca0: 3e 63 6c 6f 73 65 50 72 6f 63 09 3d 20 54 6c 73  >closeProc.= Tls
0cb0: 43 6c 6f 73 65 50 72 6f 63 3b 0a 23 65 6c 73 65  CloseProc;.#else
0cc0: 0a 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70  ...tlsChannelTyp
0cd0: 65 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 09 3d 20  e->close2Proc.= 
0ce0: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 3b 0a 23  TlsClose2Proc;.#
0cf0: 65 6e 64 69 66 0a 09 09 74 6c 73 43 68 61 6e 6e  endif...tlsChann
0d00: 65 6c 54 79 70 65 2d 3e 69 6e 70 75 74 50 72 6f  elType->inputPro
0d10: 63 09 3d 20 54 6c 73 49 6e 70 75 74 50 72 6f 63  c.= TlsInputProc
0d20: 3b 0a 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79  ;...tlsChannelTy
0d30: 70 65 2d 3e 6f 75 74 70 75 74 50 72 6f 63 09 3d  pe->outputProc.=
0d40: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 3b 0a   TlsOutputProc;.
0d50: 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  ..tlsChannelType
0d60: 2d 3e 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 09  ->getOptionProc.
0d70: 3d 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72  = TlsGetOptionPr
0d80: 6f 63 3b 0a 09 09 74 6c 73 43 68 61 6e 6e 65 6c  oc;...tlsChannel
0d90: 54 79 70 65 2d 3e 77 61 74 63 68 50 72 6f 63 09  Type->watchProc.
0da0: 3d 20 54 6c 73 57 61 74 63 68 50 72 6f 63 3b 0a  = TlsWatchProc;.
0db0: 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  ..tlsChannelType
0dc0: 2d 3e 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 09  ->getHandleProc.
0dd0: 3d 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72  = TlsGetHandlePr
0de0: 6f 63 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 43  oc;..../*... * C
0df0: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
0e00: 38 2e 33 2e 32 2b 2e 20 44 69 72 65 63 74 20 61  8.3.2+. Direct a
0e10: 63 63 65 73 73 20 74 6f 20 61 6c 6c 20 65 6c 65  ccess to all ele
0e20: 6d 65 6e 74 73 20 70 6f 73 73 69 62 6c 65 2e 20  ments possible. 
0e30: 55 73 65 0a 09 09 20 2a 20 63 68 61 6e 6e 65 6c  Use... * channel
0e40: 54 79 70 65 56 65 72 73 69 6f 6e 20 69 6e 66 6f  TypeVersion info
0e50: 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 6c 65 63  rmation to selec
0e60: 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
0e70: 75 73 65 2e 0a 09 09 20 2a 2f 0a 0a 09 09 2f 2a  use.... */..../*
0e80: 0a 09 09 20 2a 20 46 6f 72 20 74 68 65 20 38 2e  ... * For the 8.
0e90: 33 2e 32 20 63 6f 72 65 20 77 65 20 70 72 65 73  3.2 core we pres
0ea0: 65 6e 74 20 6f 75 72 73 65 6c 76 65 73 20 61 73  ent ourselves as
0eb0: 20 61 20 76 65 72 73 69 6f 6e 20 32 0a 09 09 20   a version 2... 
0ec0: 2a 20 64 72 69 76 65 72 2e 20 54 68 69 73 20 6d  * driver. This m
0ed0: 65 61 6e 73 20 61 20 73 70 65 63 69 61 6c 20 76  eans a special v
0ee0: 61 6c 75 65 20 69 6e 20 76 65 72 73 69 6f 6e 20  alue in version 
0ef0: 28 65 78 0a 09 09 20 2a 20 62 6c 6f 63 6b 4d 6f  (ex... * blockMo
0f00: 64 65 50 72 6f 63 29 2c 20 62 6c 6f 63 6b 4d 6f  deProc), blockMo
0f10: 64 65 50 72 6f 63 20 69 6e 20 61 20 64 69 66 66  deProc in a diff
0f20: 65 72 65 6e 74 20 70 6c 61 63 65 20 61 6e 64 20  erent place and 
0f30: 6f 66 0a 09 09 20 2a 20 63 6f 75 72 73 65 20 75  of... * course u
0f40: 73 61 67 65 20 6f 66 20 74 68 65 20 68 61 6e 64  sage of the hand
0f50: 6c 65 72 50 72 6f 63 2e 0a 09 09 20 2a 2f 0a 09  lerProc.... */..
0f60: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d  .tlsChannelType-
0f70: 3e 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 3d  >version       =
0f80: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
0f90: 53 49 4f 4e 5f 35 3b 0a 09 09 74 6c 73 43 68 61  SION_5;...tlsCha
0fa0: 6e 6e 65 6c 54 79 70 65 2d 3e 62 6c 6f 63 6b 4d  nnelType->blockM
0fb0: 6f 64 65 50 72 6f 63 20 3d 20 54 6c 73 42 6c 6f  odeProc = TlsBlo
0fc0: 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a 09 09 74 6c  ckModeProc;...tl
0fd0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 68 61  sChannelType->ha
0fe0: 6e 64 6c 65 72 50 72 6f 63 20 20 20 3d 20 54 6c  ndlerProc   = Tl
0ff0: 73 4e 6f 74 69 66 79 50 72 6f 63 3b 0a 09 7d 0a  sNotifyProc;..}.
1000: 0a 09 72 65 74 75 72 6e 28 74 6c 73 43 68 61 6e  ..return(tlsChan
1010: 6e 65 6c 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a  nelType);.}../*.
1020: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 42  -----. *. * TlsB
1070: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a  lockModeProc --.
1080: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
1090: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
10a0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
10b0: 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20  O level. *      
10c0: 20 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e 67   to set blocking
10d0: 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67   and nonblocking
10e0: 20 6d 6f 64 65 73 0a 20 2a 20 52 65 73 75 6c 74   modes. * Result
10f0: 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65  s:. *.0 if succe
1100: 73 73 66 75 6c 2c 20 65 72 72 6e 6f 20 77 68 65  ssful, errno whe
1110: 6e 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20  n failed.. *. * 
1120: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
1130: 09 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65  .Sets the device
1140: 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f   into blocking o
1150: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f  r nonblocking mo
1160: 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  de.. *. *-------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
11b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42  .static int TlsB
11c0: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69  lockModeProc(Cli
11d0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
11e0: 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20  Data, int mode) 
11f0: 7b 0a 09 53 74 61 74 65 20 2a 73 74 61 74 65 50  {..State *stateP
1200: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69  tr = (State *) i
1210: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 09 69  nstanceData;...i
1220: 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d  f (mode == TCL_M
1230: 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29  ODE_NONBLOCKING)
1240: 20 7b 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 66   {...statePtr->f
1250: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
1260: 41 53 59 4e 43 3b 0a 09 7d 20 65 6c 73 65 20 7b  ASYNC;..} else {
1270: 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  ...statePtr->fla
1280: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
1290: 41 53 59 4e 43 29 3b 0a 09 7d 0a 0a 09 72 65 74  ASYNC);..}...ret
12a0: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  urn(0);.}../*. *
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f  ---. *. * TlsClo
1300: 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  seProc --. *. *.
1310: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
1320: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  s invoked by the
1330: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65   generic IO leve
1340: 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09  l to perform. *.
1350: 63 68 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65  channel-type-spe
1360: 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68  cific cleanup wh
1370: 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20  en a SSL socket 
1380: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a  based channel. *
1390: 09 69 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20  .is closed.. *. 
13a0: 2a 09 4e 6f 74 65 3a 20 77 65 20 6c 65 61 76 65  *.Note: we leave
13b0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
13c0: 73 6f 63 6b 65 74 20 61 6c 6f 6e 65 2c 20 69 73  socket alone, is
13d0: 20 74 68 69 73 20 72 69 67 68 74 3f 0a 20 2a 0a   this right?. *.
13e0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30   * Results:. *.0
13f0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1400: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 54 63 6c  the value of Tcl
1410: 5f 47 65 74 45 72 72 6e 6f 28 29 20 69 66 20 66  _GetErrno() if f
1420: 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64  ailed.. *. * Sid
1430: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6c  e effects:. *.Cl
1440: 6f 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20  oses the socket 
1450: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a  of the channel..
1460: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
14b0: 74 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65  tic int TlsClose
14c0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
14d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63  instanceData, Tc
14e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14f0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
1500: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
1510: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
1520: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
1530: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 25 70 29  TlsCloseProc(%p)
1540: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74  ", (void *) stat
1550: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 6c 73 5f  ePtr);..    Tls_
1560: 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b  Clean(statePtr);
1570: 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61  .    Tcl_Eventua
1580: 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44  llyFree((ClientD
1590: 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c  ata)statePtr, Tl
15a0: 73 5f 46 72 65 65 29 3b 0a 0a 20 20 20 20 64 70  s_Free);..    dp
15b0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
15c0: 20 54 43 4c 5f 4f 4b 22 29 3b 0a 0a 20 20 20 20   TCL_OK");..    
15d0: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
15e0: 0a 20 20 20 20 2f 2a 20 49 6e 74 65 72 70 20 69  .    /* Interp i
15f0: 73 20 75 6e 75 73 65 64 2e 20 2a 2f 0a 20 20 20  s unused. */.   
1600: 20 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70   interp = interp
1610: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1620: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c  TlsClose2Proc(Cl
1630: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1640: 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  eData, Tcl_Inter
1650: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
1660: 6c 61 67 73 29 20 7b 0a 20 20 20 20 69 66 20 28  lags) {.    if (
1670: 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c  (flags & (TCL_CL
1680: 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 4c 4f  OSE_READ|TCL_CLO
1690: 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29  SE_WRITE)) == 0)
16a0: 20 7b 0a 09 53 74 61 74 65 20 2a 73 74 61 74 65   {..State *state
16b0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
16c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 09  instanceData;...
16d0: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73  dprintf("TlsClos
16e0: 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f 69  eProc(%p)", (voi
16f0: 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  d *) statePtr);.
1700: 0a 09 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74  ..Tls_Clean(stat
1710: 65 50 74 72 29 3b 0a 09 54 63 6c 5f 45 76 65 6e  ePtr);..Tcl_Even
1720: 74 75 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 65  tuallyFree((Clie
1730: 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72 2c  ntData)statePtr,
1740: 20 54 6c 73 5f 46 72 65 65 29 3b 0a 0a 09 64 70   Tls_Free);...dp
1750: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
1760: 20 54 43 4c 5f 4f 4b 22 29 3b 0a 0a 09 72 65 74   TCL_OK");...ret
1770: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20  urn(TCL_OK);.   
1780: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 74 65 72   }..    /* Inter
1790: 70 20 69 73 20 75 6e 75 73 65 64 2e 20 2a 2f 0a  p is unused. */.
17a0: 20 20 20 20 69 6e 74 65 72 70 20 3d 20 69 6e 74      interp = int
17b0: 65 72 70 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  erp;.}../*. *---
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 57  ---*. *. *.Tls_W
1800: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d 2d  aitForConnect --
1810: 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63  . *. *.Sideeffec
1820: 74 73 3a 0a 20 2a 09 09 49 73 73 75 65 73 20 53  ts:. *..Issues S
1830: 53 4c 5f 61 63 63 65 70 74 20 6f 72 20 53 53 4c  SL_accept or SSL
1840: 5f 63 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 09 52  _connect. *. *.R
1850: 65 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e  esult:. *..None.
1860: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
18a0: 2f 0a 69 6e 74 20 54 6c 73 5f 57 61 69 74 46 6f  /.int Tls_WaitFo
18b0: 72 43 6f 6e 6e 65 63 74 28 53 74 61 74 65 20 2a  rConnect(State *
18c0: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 2a 65  statePtr, int *e
18d0: 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 69 6e 74  rrorCodePtr, int
18e0: 20 68 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72   handshakeFailur
18f0: 65 49 73 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a  eIsPermanent) {.
1900: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62  .unsigned long b
1910: 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 09 69 6e  ackingError;..in
1920: 74 20 65 72 72 2c 20 72 63 3b 0a 09 69 6e 74 20  t err, rc;..int 
1930: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 3b 0a  bioShouldRetry;.
1940: 0a 09 64 70 72 69 6e 74 66 28 22 57 61 69 74 46  ..dprintf("WaitF
1950: 6f 72 43 6f 6e 6e 65 63 74 28 25 70 29 22 2c 20  orConnect(%p)", 
1960: 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74  (void *) statePt
1970: 72 29 3b 0a 09 64 70 72 69 6e 74 46 6c 61 67 73  r);..dprintFlags
1980: 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 09 69 66  (statePtr);...if
1990: 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c   (!(statePtr->fl
19a0: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e  ags & TLS_TCL_IN
19b0: 49 54 29 29 20 7b 0a 09 09 64 70 72 69 6e 74 66  IT)) {...dprintf
19c0: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  ("Tls_WaitForCon
19d0: 6e 65 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20 61  nect called on a
19e0: 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a  lready initializ
19f0: 65 64 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72 65  ed channel -- re
1a00: 74 75 72 6e 69 6e 67 20 77 69 74 68 20 69 6d 6d  turning with imm
1a10: 65 64 69 61 74 65 20 73 75 63 63 65 73 73 22 29  ediate success")
1a20: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ;...*errorCodePt
1a30: 72 20 3d 20 30 3b 0a 09 09 72 65 74 75 72 6e 28  r = 0;...return(
1a40: 30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61  0);..}...if (sta
1a50: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
1a60: 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45  LS_TCL_HANDSHAKE
1a70: 5f 46 41 49 4c 45 44 29 20 7b 0a 09 09 2f 2a 0a  _FAILED) {.../*.
1a80: 09 09 20 2a 20 44 69 66 66 65 72 65 6e 74 20 74  .. * Different t
1a90: 79 70 65 73 20 6f 66 20 6f 70 65 72 61 74 69 6f  ypes of operatio
1aa0: 6e 73 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ns have differen
1ab0: 74 20 72 65 71 75 69 72 65 6d 65 6e 74 73 0a 09  t requirements..
1ac0: 09 20 2a 20 53 53 4c 20 62 65 69 6e 67 20 65 73  . * SSL being es
1ad0: 74 61 62 6c 69 73 68 65 64 0a 09 09 20 2a 2f 0a  tablished... */.
1ae0: 09 09 69 66 20 28 68 61 6e 64 73 68 61 6b 65 46  ..if (handshakeF
1af0: 61 69 6c 75 72 65 49 73 50 65 72 6d 61 6e 65 6e  ailureIsPermanen
1b00: 74 29 20 7b 0a 09 09 09 64 70 72 69 6e 74 66 28  t) {....dprintf(
1b10: 22 41 73 6b 65 64 20 74 6f 20 77 61 69 74 20 66  "Asked to wait f
1b20: 6f 72 20 61 20 54 4c 53 20 68 61 6e 64 73 68 61  or a TLS handsha
1b30: 6b 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ke that has alre
1b40: 61 64 79 20 66 61 69 6c 65 64 2e 20 20 52 65 74  ady failed.  Ret
1b50: 75 72 6e 69 6e 67 20 66 61 74 61 6c 20 65 72 72  urning fatal err
1b60: 6f 72 22 29 3b 0a 09 09 09 2a 65 72 72 6f 72 43  or");....*errorC
1b70: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42  odePtr = ECONNAB
1b80: 4f 52 54 45 44 3b 0a 09 09 7d 20 65 6c 73 65 20  ORTED;...} else 
1b90: 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 22 41 73  {....dprintf("As
1ba0: 6b 65 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20  ked to wait for 
1bb0: 61 20 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20  a TLS handshake 
1bc0: 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1bd0: 20 66 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e   failed.  Return
1be0: 69 6e 67 20 73 6f 66 74 20 65 72 72 6f 72 22 29  ing soft error")
1bf0: 3b 0a 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  ;....*errorCodeP
1c00: 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b  tr = ECONNRESET;
1c10: 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 28 2d 31  ...}...return(-1
1c20: 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 3b 3b 29  );..}...for (;;)
1c30: 20 7b 0a 09 09 2f 2a 20 4e 6f 74 20 69 6e 69 74   {.../* Not init
1c40: 69 61 6c 69 7a 65 64 20 79 65 74 21 20 2a 2f 0a  ialized yet! */.
1c50: 09 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
1c60: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
1c70: 53 45 52 56 45 52 29 20 7b 0a 09 09 09 64 70 72  SERVER) {....dpr
1c80: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 53  intf("Calling SS
1c90: 4c 5f 61 63 63 65 70 74 28 29 22 29 3b 0a 0a 09  L_accept()");...
1ca0: 09 09 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 65  ..err = SSL_acce
1cb0: 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  pt(statePtr->ssl
1cc0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
1cd0: 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e  .dprintf("Callin
1ce0: 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 29 22  g SSL_connect()"
1cf0: 29 3b 0a 0a 09 09 09 65 72 72 20 3d 20 53 53 4c  );.....err = SSL
1d00: 5f 63 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  _connect(statePt
1d10: 72 2d 3e 73 73 6c 29 3b 0a 09 09 7d 0a 0a 09 09  r->ssl);...}....
1d20: 69 66 20 28 65 72 72 20 3e 20 30 29 20 7b 0a 09  if (err > 0) {..
1d30: 09 09 64 70 72 69 6e 74 66 28 22 54 68 61 74 20  ..dprintf("That 
1d40: 73 65 65 6d 73 20 74 6f 20 68 61 76 65 20 67 6f  seems to have go
1d50: 6e 65 20 6f 6b 61 79 22 29 3b 0a 0a 09 09 09 65  ne okay");.....e
1d60: 72 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73  rr = BIO_flush(s
1d70: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a  tatePtr->bio);..
1d80: 09 09 09 69 66 20 28 65 72 72 20 3c 3d 20 30 29  ...if (err <= 0)
1d90: 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22   {.....dprintf("
1da0: 46 6c 75 73 68 69 6e 67 20 74 68 65 20 6c 6f 77  Flushing the low
1db0: 65 72 20 6c 61 79 65 72 73 20 66 61 69 6c 65 64  er layers failed
1dc0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 70 72 6f 62  , this will prob
1dd0: 61 62 6c 79 20 74 65 72 6d 69 6e 61 74 65 20 74  ably terminate t
1de0: 68 69 73 20 73 65 73 73 69 6f 6e 22 29 3b 0a 09  his session");..
1df0: 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 63 20 3d 20  ..}...}....rc = 
1e00: 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74  SSL_get_error(st
1e10: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65 72 72  atePtr->ssl, err
1e20: 29 3b 0a 0a 09 09 64 70 72 69 6e 74 66 28 22 47  );....dprintf("G
1e30: 6f 74 20 65 72 72 6f 72 3a 20 25 69 20 28 72 63  ot error: %i (rc
1e40: 20 3d 20 25 69 29 22 2c 20 65 72 72 2c 20 72 63   = %i)", err, rc
1e50: 29 3b 0a 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52  );....bioShouldR
1e60: 65 74 72 79 20 3d 20 30 3b 0a 09 09 69 66 20 28  etry = 0;...if (
1e70: 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 09 09 69  err <= 0) {....i
1e80: 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52  f (rc == SSL_ERR
1e90: 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 20  OR_WANT_CONNECT 
1ea0: 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52  || rc == SSL_ERR
1eb0: 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 20 7c  OR_WANT_ACCEPT |
1ec0: 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f  | rc == SSL_ERRO
1ed0: 52 5f 57 41 4e 54 5f 52 45 41 44 20 7c 7c 20 72  R_WANT_READ || r
1ee0: 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57  c == SSL_ERROR_W
1ef0: 41 4e 54 5f 57 52 49 54 45 29 20 7b 0a 09 09 09  ANT_WRITE) {....
1f00: 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20  .bioShouldRetry 
1f10: 3d 20 31 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69  = 1;....} else i
1f20: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65  f (BIO_should_re
1f30: 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69  try(statePtr->bi
1f40: 6f 29 29 20 7b 0a 09 09 09 09 62 69 6f 53 68 6f  o)) {.....bioSho
1f50: 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 09  uldRetry = 1;...
1f60: 09 7d 20 65 6c 73 65 20 69 66 20 28 72 63 20 3d  .} else if (rc =
1f70: 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43  = SSL_ERROR_SYSC
1f80: 41 4c 4c 20 26 26 20 54 63 6c 5f 47 65 74 45 72  ALL && Tcl_GetEr
1f90: 72 6e 6f 28 29 20 3d 3d 20 45 41 47 41 49 4e 29  rno() == EAGAIN)
1fa0: 20 7b 0a 09 09 09 09 62 69 6f 53 68 6f 75 6c 64   {.....bioShould
1fb0: 52 65 74 72 79 20 3d 20 31 3b 0a 09 09 09 7d 0a  Retry = 1;....}.
1fc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 66  ..} else {....if
1fd0: 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66   (!SSL_is_init_f
1fe0: 69 6e 69 73 68 65 64 28 73 74 61 74 65 50 74 72  inished(statePtr
1ff0: 2d 3e 73 73 6c 29 29 20 7b 0a 09 09 09 09 62 69  ->ssl)) {.....bi
2000: 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31  oShouldRetry = 1
2010: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
2020: 20 28 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79   (bioShouldRetry
2030: 29 20 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 22  ) {....dprintf("
2040: 54 68 65 20 49 2f 4f 20 64 69 64 20 6e 6f 74 20  The I/O did not 
2050: 63 6f 6d 70 6c 65 74 65 20 2d 2d 20 62 75 74 20  complete -- but 
2060: 77 65 20 73 68 6f 75 6c 64 20 74 72 79 20 69 74  we should try it
2070: 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09 09 69 66   again");.....if
2080: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
2090: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  s & TLS_TCL_ASYN
20a0: 43 29 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66  C) {.....dprintf
20b0: 28 22 52 65 74 75 72 6e 69 6e 67 20 45 41 47 41  ("Returning EAGA
20c0: 49 4e 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  IN so that it ca
20d0: 6e 20 62 65 20 72 65 74 72 69 65 64 20 6c 61 74  n be retried lat
20e0: 65 72 22 29 3b 0a 0a 09 09 09 09 2a 65 72 72 6f  er");......*erro
20f0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
2100: 4e 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  N;......return(-
2110: 31 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  1);....} else {.
2120: 09 09 09 09 64 70 72 69 6e 74 66 28 22 44 6f 69  ....dprintf("Doi
2130: 6e 67 20 73 6f 20 6e 6f 77 22 29 3b 0a 0a 09 09  ng so now");....
2140: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
2150: 0a 09 09 7d 0a 0a 09 09 64 70 72 69 6e 74 66 28  ...}....dprintf(
2160: 22 57 65 20 68 61 76 65 20 65 69 74 68 65 72 20  "We have either 
2170: 63 6f 6d 70 6c 65 74 65 6c 79 20 65 73 74 61 62  completely estab
2180: 6c 69 73 68 65 64 20 74 68 65 20 73 65 73 73 69  lished the sessi
2190: 6f 6e 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79  on or completely
21a0: 20 66 61 69 6c 65 64 20 69 74 20 2d 2d 20 74 68   failed it -- th
21b0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 6e  ere is no more n
21c0: 65 65 64 20 74 6f 20 65 76 65 72 20 72 65 74 72  eed to ever retr
21d0: 79 20 69 74 20 74 68 6f 75 67 68 22 29 3b 0a 09  y it though");..
21e0: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 0a 09 2a 65  .break;..}....*e
21f0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
2200: 4e 56 41 4c 3b 0a 0a 09 73 77 69 74 63 68 20 28  NVAL;...switch (
2210: 72 63 29 20 7b 0a 09 09 63 61 73 65 20 53 53 4c  rc) {...case SSL
2220: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 09 09  _ERROR_NONE:....
2230: 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
2240: 6e 20 69 73 20 75 70 2c 20 77 65 20 61 72 65 20  n is up, we are 
2250: 64 6f 6e 65 20 68 65 72 65 20 2a 2f 0a 09 09 09  done here */....
2260: 64 70 72 69 6e 74 66 28 22 54 68 65 20 63 6f 6e  dprintf("The con
2270: 6e 65 63 74 69 6f 6e 20 69 73 20 75 70 22 29 3b  nection is up");
2280: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
2290: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f  e SSL_ERROR_ZERO
22a0: 5f 52 45 54 55 52 4e 3a 0a 09 09 09 64 70 72 69  _RETURN:....dpri
22b0: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 5a  ntf("SSL_ERROR_Z
22c0: 45 52 4f 5f 52 45 54 55 52 4e 3a 20 43 6f 6e 6e  ERO_RETURN: Conn
22d0: 65 63 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ect returned an 
22e0: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 2e 2e  invalid value...
22f0: 22 29 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ")....return(-1)
2300: 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
2310: 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 09 09 62  OR_SYSCALL:....b
2320: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52  ackingError = ER
2330: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a  R_get_error();..
2340: 09 09 09 69 66 20 28 62 61 63 6b 69 6e 67 45 72  ...if (backingEr
2350: 72 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20  ror == 0 && err 
2360: 3d 3d 20 30 29 20 7b 0a 09 09 09 09 64 70 72 69  == 0) {.....dpri
2370: 6e 74 66 28 22 45 4f 46 20 72 65 61 63 68 65 64  ntf("EOF reached
2380: 22 29 0a 09 09 09 09 2a 65 72 72 6f 72 43 6f 64  ").....*errorCod
2390: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45  ePtr = ECONNRESE
23a0: 54 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  T;....} else if 
23b0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d  (backingError ==
23c0: 20 30 20 26 26 20 65 72 72 20 3d 3d 20 2d 31 29   0 && err == -1)
23d0: 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22   {.....dprintf("
23e0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 65  I/O error occure
23f0: 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22  d (errno = %lu)"
2400: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2410: 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  ) Tcl_GetErrno()
2420: 29 3b 0a 09 09 09 09 2a 65 72 72 6f 72 43 6f 64  );.....*errorCod
2430: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72  ePtr = Tcl_GetEr
2440: 72 6e 6f 28 29 3b 0a 09 09 09 09 69 66 20 28 2a  rno();.....if (*
2450: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20  errorCodePtr == 
2460: 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09  ECONNRESET) {...
2470: 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
2480: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b   = ECONNABORTED;
2490: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
24a0: 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22   {.....dprintf("
24b0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 65  I/O error occure
24c0: 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  d (backingError 
24d0: 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67  = %lu)", backing
24e0: 45 72 72 6f 72 29 3b 0a 09 09 09 09 2a 65 72 72  Error);.....*err
24f0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 62 61 63 6b  orCodePtr = back
2500: 69 6e 67 45 72 72 6f 72 3b 0a 09 09 09 09 69 66  ingError;.....if
2510: 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20   (*errorCodePtr 
2520: 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b  == ECONNRESET) {
2530: 0a 09 09 09 09 09 2a 65 72 72 6f 72 43 6f 64 65  ......*errorCode
2540: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54  Ptr = ECONNABORT
2550: 45 44 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ED;.....}....}..
2560: 09 09 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  ...statePtr->fla
2570: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41  gs |= TLS_TCL_HA
2580: 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a  NDSHAKE_FAILED;.
2590: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
25a0: 09 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
25b0: 5f 53 53 4c 3a 0a 09 09 09 64 70 72 69 6e 74 66  _SSL:....dprintf
25c0: 28 22 47 6f 74 20 70 65 72 6d 61 6e 65 6e 74 20  ("Got permanent 
25d0: 66 61 74 61 6c 20 53 53 4c 20 65 72 72 6f 72 2c  fatal SSL error,
25e0: 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d 65 64 69   aborting immedi
25f0: 61 74 65 6c 79 22 29 3b 0a 09 09 09 54 6c 73 5f  ately");....Tls_
2600: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
2610: 28 63 68 61 72 20 2a 29 45 52 52 5f 72 65 61 73  (char *)ERR_reas
2620: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  on_error_string(
2630: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29  ERR_get_error())
2640: 29 3b 0a 09 09 09 73 74 61 74 65 50 74 72 2d 3e  );....statePtr->
2650: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
2660: 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45  _HANDSHAKE_FAILE
2670: 44 3b 0a 09 09 09 2a 65 72 72 6f 72 43 6f 64 65  D;....*errorCode
2680: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54  Ptr = ECONNABORT
2690: 45 44 3b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  ED;....return(-1
26a0: 29 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52  );...case SSL_ER
26b0: 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54  ROR_WANT_CONNECT
26c0: 3a 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52 52  :...case SSL_ERR
26d0: 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 3a 0a  OR_WANT_ACCEPT:.
26e0: 09 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
26f0: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55  _WANT_X509_LOOKU
2700: 50 3a 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  P:...default:...
2710: 09 64 70 72 69 6e 74 66 28 22 57 65 20 67 6f 74  .dprintf("We got
2720: 20 61 20 63 6f 6e 66 75 73 69 6e 67 20 72 65 70   a confusing rep
2730: 6c 79 3a 20 25 69 22 2c 20 72 63 29 3b 0a 09 09  ly: %i", rc);...
2740: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
2750: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b   Tcl_GetErrno();
2760: 0a 09 09 09 64 70 72 69 6e 74 66 28 22 45 52 52  ....dprintf("ERR
2770: 28 25 64 2c 20 25 64 29 20 22 2c 20 72 63 2c 20  (%d, %d) ", rc, 
2780: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a  *errorCodePtr);.
2790: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
27a0: 7d 0a 0a 23 69 66 20 30 0a 09 69 66 20 28 73 74  }..#if 0..if (st
27b0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
27c0: 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20  TLS_TCL_SERVER) 
27d0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 54 68 69  {...dprintf("Thi
27e0: 73 20 69 73 20 61 6e 20 54 4c 53 20 73 65 72 76  s is an TLS serv
27f0: 65 72 2c 20 63 68 65 63 6b 69 6e 67 20 74 68 65  er, checking the
2800: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72   certificate for
2810: 20 74 68 65 20 70 65 65 72 22 29 3b 0a 0a 09 09   the peer");....
2820: 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65  err = SSL_get_ve
2830: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
2840: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 09 69 66  ePtr->ssl);...if
2850: 20 28 65 72 72 20 21 3d 20 58 35 30 39 5f 56 5f   (err != X509_V_
2860: 4f 4b 29 20 7b 0a 09 09 09 64 70 72 69 6e 74 66  OK) {....dprintf
2870: 28 22 49 6e 76 61 6c 69 64 20 63 65 72 74 69 66  ("Invalid certif
2880: 69 63 61 74 65 2c 20 72 65 74 75 72 6e 69 6e 67  icate, returning
2890: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
28a0: 09 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
28b0: 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29 58  tePtr, (char *)X
28c0: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f  509_verify_cert_
28d0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72  error_string(err
28e0: 29 29 3b 0a 09 09 09 73 74 61 74 65 50 74 72 2d  ));....statePtr-
28f0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
2900: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c  L_HANDSHAKE_FAIL
2910: 45 44 3b 0a 09 09 09 2a 65 72 72 6f 72 43 6f 64  ED;....*errorCod
2920: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
2930: 54 45 44 3b 0a 09 09 09 72 65 74 75 72 6e 28 2d  TED;....return(-
2940: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 23 65 6e 64 69  1);...}..}.#endi
2950: 66 0a 0a 09 64 70 72 69 6e 74 66 28 22 52 65 6d  f...dprintf("Rem
2960: 6f 76 69 6e 67 20 74 68 65 20 5c 22 54 4c 53 5f  oving the \"TLS_
2970: 54 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67 20  TCL_INIT\" flag 
2980: 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 63 6f  since we have co
2990: 6d 70 6c 65 74 65 64 20 74 68 65 20 68 61 6e 64  mpleted the hand
29a0: 73 68 61 6b 65 22 29 3b 0a 09 73 74 61 74 65 50  shake");..stateP
29b0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 4c  tr->flags &= ~TL
29c0: 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a 09 64 70  S_TCL_INIT;...dp
29d0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
29e0: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 09   in success");..
29f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2a00: 30 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  0;...return(0);.
2a10: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2a60: 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d  * TlsInputProc -
2a70: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
2a80: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
2a90: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
2aa0: 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20   IO level. *    
2ab0: 20 20 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74     to read input
2ac0: 20 66 72 6f 6d 20 61 20 53 53 4c 20 73 6f 63 6b   from a SSL sock
2ad0: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
2ae0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
2af0: 0a 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f  . *.The number o
2b00: 66 20 62 79 74 65 73 20 72 65 61 64 20 69 73 20  f bytes read is 
2b10: 72 65 74 75 72 6e 65 64 20 6f 72 20 2d 31 20 6f  returned or -1 o
2b20: 6e 20 65 72 72 6f 72 2e 20 41 6e 20 6f 75 74 70  n error. An outp
2b30: 75 74 0a 20 2a 09 61 72 67 75 6d 65 6e 74 20 63  ut. *.argument c
2b40: 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 4f 53 49  ontains the POSI
2b50: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  X error code on 
2b60: 65 72 72 6f 72 2c 20 6f 72 20 7a 65 72 6f 20 69  error, or zero i
2b70: 66 20 6e 6f 0a 20 2a 09 65 72 72 6f 72 20 6f 63  f no. *.error oc
2b80: 63 75 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 53 69  curred.. *. * Si
2b90: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52  de effects:. *.R
2ba0: 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f 6d 20  eads input from 
2bb0: 74 68 65 20 69 6e 70 75 74 20 64 65 76 69 63 65  the input device
2bc0: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e   of the channel.
2bd0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
2c20: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 49 6e 70  tatic int TlsInp
2c30: 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  utProc(ClientDat
2c40: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
2c50: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 62  char *buf, int b
2c60: 75 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72  ufSize, int *err
2c70: 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 09 75 6e  orCodePtr) {..un
2c80: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b  signed long back
2c90: 69 6e 67 45 72 72 6f 72 3b 0a 09 53 74 61 74 65  ingError;..State
2ca0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
2cb0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
2cc0: 61 74 61 3b 0a 09 69 6e 74 20 62 79 74 65 73 52  ata;..int bytesR
2cd0: 65 61 64 3b 0a 09 69 6e 74 20 74 6c 73 43 6f 6e  ead;..int tlsCon
2ce0: 6e 65 63 74 3b 0a 09 69 6e 74 20 65 72 72 3b 0a  nect;..int err;.
2cf0: 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
2d00: 3d 20 30 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22  = 0;...dprintf("
2d10: 42 49 4f 5f 72 65 61 64 28 25 64 29 22 2c 20 62  BIO_read(%d)", b
2d20: 75 66 53 69 7a 65 29 3b 0a 0a 09 69 66 20 28 73  ufSize);...if (s
2d30: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
2d40: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43   TLS_TCL_CALLBAC
2d50: 4b 29 20 7b 0a 09 09 2f 2a 20 64 6f 6e 27 74 20  K) {.../* don't 
2d60: 70 72 6f 63 65 73 73 20 61 6e 79 20 62 79 74 65  process any byte
2d70: 73 20 77 68 69 6c 65 20 76 65 72 69 66 79 20 63  s while verify c
2d80: 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e 69  allback is runni
2d90: 6e 67 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28  ng */...dprintf(
2da0: 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e  "Callback is run
2db0: 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 20 30 20  ning, reading 0 
2dc0: 62 79 74 65 73 22 29 3b 0a 09 09 72 65 74 75 72  bytes");...retur
2dd0: 6e 28 30 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e  n(0);..}...dprin
2de0: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f  tf("Calling Tls_
2df0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29  WaitForConnect")
2e00: 3b 0a 09 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20  ;..tlsConnect = 
2e10: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
2e20: 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 72  ct(statePtr, err
2e30: 6f 72 43 6f 64 65 50 74 72 2c 20 30 29 3b 0a 09  orCodePtr, 0);..
2e40: 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c  if (tlsConnect <
2e50: 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28   0) {...dprintf(
2e60: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 61  "Got an error wa
2e70: 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74  iting to connect
2e80: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25   (tlsConnect = %
2e90: 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  i, *errorCodePtr
2ea0: 20 3d 20 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e   = %i)", tlsConn
2eb0: 65 63 74 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50  ect, *errorCodeP
2ec0: 74 72 29 3b 0a 0a 09 09 62 79 74 65 73 52 65 61  tr);....bytesRea
2ed0: 64 20 3d 20 2d 31 3b 0a 09 09 69 66 20 28 2a 65  d = -1;...if (*e
2ee0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45  rrorCodePtr == E
2ef0: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 09  CONNRESET) {....
2f00: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e  dprintf("Got con
2f10: 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b  nection reset");
2f20: 0a 09 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20  ..../* Soft EOF 
2f30: 2a 2f 0a 09 09 09 2a 65 72 72 6f 72 43 6f 64 65  */....*errorCode
2f40: 50 74 72 20 3d 20 30 3b 0a 09 09 09 62 79 74 65  Ptr = 0;....byte
2f50: 73 52 65 61 64 20 3d 20 30 3b 0a 09 09 7d 0a 0a  sRead = 0;...}..
2f60: 09 09 72 65 74 75 72 6e 28 62 79 74 65 73 52 65  ..return(bytesRe
2f70: 61 64 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ad);..}.../*.. *
2f80: 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61   We need to clea
2f90: 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20  r the SSL error 
2fa0: 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73  stack now becaus
2fb0: 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72  e we sometimes r
2fc0: 65 61 63 68 0a 09 20 2a 20 74 68 69 73 20 66 75  each.. * this fu
2fd0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74  nction with left
2fe0: 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74  over errors in t
2ff0: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49  he stack.  If BI
3000: 4f 5f 72 65 61 64 0a 09 20 2a 20 72 65 74 75 72  O_read.. * retur
3010: 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64  ns -1 and intend
3020: 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20  s EAGAIN, there 
3030: 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72  is a leftover er
3040: 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ror, it will be.
3050: 09 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64  . * misconstrued
3060: 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f   as an error, no
3070: 74 20 45 41 47 41 49 4e 2e 0a 09 20 2a 0a 09 20  t EAGAIN... *.. 
3080: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
3090: 20 77 65 20 6d 61 79 20 77 61 6e 74 20 74 6f 20   we may want to 
30a0: 68 61 6e 64 6c 65 20 74 68 65 20 3c 30 20 72 65  handle the <0 re
30b0: 74 75 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a  turn codes from.
30c0: 09 20 2a 20 42 49 4f 5f 72 65 61 64 20 73 70 65  . * BIO_read spe
30d0: 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73  cially (as advis
30e0: 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f  ed in the RSA do
30f0: 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65  cs).  TLS's lowe
3100: 72 20 6c 65 76 65 6c 20 42 49 4f 0a 09 20 2a 20  r level BIO.. * 
3110: 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77  functions play w
3120: 69 74 68 20 74 68 65 20 72 65 74 72 79 20 66 6c  ith the retry fl
3130: 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20  ags though, and 
3140: 74 68 69 73 20 73 65 65 6d 73 20 74 6f 20 77 6f  this seems to wo
3150: 72 6b 0a 09 20 2a 20 63 6f 72 72 65 63 74 6c 79  rk.. * correctly
3160: 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69  .  Similar fix i
3170: 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e  n TlsOutputProc.
3180: 20 2d 20 68 6f 62 62 73 0a 09 20 2a 2f 0a 09 45   - hobbs.. */..E
3190: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
31a0: 3b 0a 09 62 79 74 65 73 52 65 61 64 20 3d 20 42  ;..bytesRead = B
31b0: 49 4f 5f 72 65 61 64 28 73 74 61 74 65 50 74 72  IO_read(statePtr
31c0: 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 62 75 66 53  ->bio, buf, bufS
31d0: 69 7a 65 29 3b 0a 09 64 70 72 69 6e 74 66 28 22  ize);..dprintf("
31e0: 42 49 4f 5f 72 65 61 64 20 2d 3e 20 25 64 22 2c  BIO_read -> %d",
31f0: 20 62 79 74 65 73 52 65 61 64 29 3b 0a 0a 09 65   bytesRead);...e
3200: 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72  rr = SSL_get_err
3210: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  or(statePtr->ssl
3220: 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a 0a 23  , bytesRead);..#
3230: 69 66 20 30 0a 09 69 66 20 28 62 79 74 65 73 52  if 0..if (bytesR
3240: 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 09 69 66  ead <= 0) {...if
3250: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74   (BIO_should_ret
3260: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ry(statePtr->bio
3270: 29 29 20 7b 0a 09 09 09 64 70 72 69 6e 74 66 28  )) {....dprintf(
3280: 22 49 2f 4f 20 66 61 69 6c 65 64 2c 20 77 69 6c  "I/O failed, wil
3290: 6c 20 72 65 74 72 79 20 62 61 73 65 64 20 6f 6e  l retry based on
32a0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 09 09 2a 65   EAGAIN");....*e
32b0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
32c0: 47 41 49 4e 3b 0a 09 09 7d 0a 09 7d 0a 23 65 6e  GAIN;...}..}.#en
32d0: 64 69 66 0a 0a 09 73 77 69 74 63 68 20 28 65 72  dif...switch (er
32e0: 72 29 20 7b 0a 09 09 63 61 73 65 20 53 53 4c 5f  r) {...case SSL_
32f0: 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 09 09 64  ERROR_NONE:....d
3300: 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c  printBuffer(buf,
3310: 20 62 79 74 65 73 52 65 61 64 29 3b 0a 09 09 09   bytesRead);....
3320: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 53  break;...case SS
3330: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 09 09  L_ERROR_SSL:....
3340: 64 70 72 69 6e 74 66 28 22 53 53 4c 20 6e 65 67  dprintf("SSL neg
3350: 6f 74 69 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20  otiation error, 
3360: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
3370: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  the connection h
3380: 61 73 20 62 65 65 6e 20 61 62 6f 72 74 65 64 22  as been aborted"
3390: 29 3b 0a 0a 09 09 09 54 6c 73 5f 45 72 72 6f 72  );.....Tls_Error
33a0: 28 73 74 61 74 65 50 74 72 2c 20 54 43 4c 54 4c  (statePtr, TCLTL
33b0: 53 5f 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74  S_SSL_ERROR(stat
33c0: 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73  ePtr->ssl, bytes
33d0: 52 65 61 64 29 29 3b 0a 09 09 09 2a 65 72 72 6f  Read));....*erro
33e0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e  rCodePtr = ECONN
33f0: 41 42 4f 52 54 45 44 3b 0a 09 09 09 62 79 74 65  ABORTED;....byte
3400: 73 52 65 61 64 20 3d 20 2d 31 3b 0a 0a 09 09 09  sRead = -1;.....
3410: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 53  break;...case SS
3420: 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a  L_ERROR_SYSCALL:
3430: 0a 09 09 09 62 61 63 6b 69 6e 67 45 72 72 6f 72  ....backingError
3440: 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72   = ERR_get_error
3450: 28 29 3b 0a 0a 09 09 09 69 66 20 28 62 61 63 6b  ();.....if (back
3460: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26  ingError == 0 &&
3470: 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20 30 29   bytesRead == 0)
3480: 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22   {.....dprintf("
3490: 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09  EOF reached")...
34a0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
34b0: 3d 20 30 3b 0a 09 09 09 09 62 79 74 65 73 52 65  = 0;.....bytesRe
34c0: 61 64 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73  ad = 0;....} els
34d0: 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72  e if (backingErr
34e0: 6f 72 20 3d 3d 20 30 20 26 26 20 62 79 74 65 73  or == 0 && bytes
34f0: 52 65 61 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09  Read == -1) {...
3500: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65  ..dprintf("I/O e
3510: 72 72 6f 72 20 6f 63 63 75 72 65 64 20 28 65 72  rror occured (er
3520: 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e  rno = %lu)", (un
3530: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c  signed long) Tcl
3540: 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09  _GetErrno());...
3550: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
3560: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  = Tcl_GetErrno()
3570: 3b 0a 09 09 09 09 62 79 74 65 73 52 65 61 64 20  ;.....bytesRead 
3580: 3d 20 2d 31 3b 0a 09 09 09 7d 20 65 6c 73 65 20  = -1;....} else 
3590: 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22 49  {.....dprintf("I
35a0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  /O error occured
35b0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d   (backingError =
35c0: 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45   %lu)", backingE
35d0: 72 72 6f 72 29 3b 0a 09 09 09 09 2a 65 72 72 6f  rror);.....*erro
35e0: 72 43 6f 64 65 50 74 72 20 3d 20 62 61 63 6b 69  rCodePtr = backi
35f0: 6e 67 45 72 72 6f 72 3b 0a 09 09 09 09 62 79 74  ngError;.....byt
3600: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 09  esRead = -1;....
3610: 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  }.....break;...c
3620: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45  ase SSL_ERROR_ZE
3630: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 09 09 64 70  RO_RETURN:....dp
3640: 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45  rintf("Got SSL_E
3650: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e  RROR_ZERO_RETURN
3660: 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20  , this means an 
3670: 45 4f 46 20 68 61 73 20 62 65 65 6e 20 72 65 61  EOF has been rea
3680: 63 68 65 64 22 29 3b 0a 09 09 09 62 79 74 65 73  ched");....bytes
3690: 52 65 61 64 20 3d 20 30 3b 0a 09 09 09 2a 65 72  Read = 0;....*er
36a0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
36b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
36c0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
36d0: 52 45 41 44 3a 0a 09 09 09 64 70 72 69 6e 74 66  READ:....dprintf
36e0: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
36f0: 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69  WANT_READ, mappi
3700: 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49  ng this to EAGAI
3710: 4e 22 29 3b 0a 09 09 09 62 79 74 65 73 52 65 61  N");....bytesRea
3720: 64 20 3d 20 2d 31 3b 0a 09 09 09 2a 65 72 72 6f  d = -1;....*erro
3730: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
3740: 4e 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64  N;....break;...d
3750: 65 66 61 75 6c 74 3a 0a 09 09 09 64 70 72 69 6e  efault:....dprin
3760: 74 66 28 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f  tf("Unknown erro
3770: 72 20 28 65 72 72 20 3d 20 25 69 29 2c 20 6d 61  r (err = %i), ma
3780: 70 70 69 6e 67 20 74 6f 20 45 4f 46 22 2c 20 65  pping to EOF", e
3790: 72 72 29 3b 0a 09 09 09 2a 65 72 72 6f 72 43 6f  rr);....*errorCo
37a0: 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 09 62 79  dePtr = 0;....by
37b0: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 09 09  tesRead = 0;....
37c0: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 64 70 72 69  break;..}...dpri
37d0: 6e 74 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d  ntf("Input(%d) -
37e0: 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53  > %d [%d]", bufS
37f0: 69 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20  ize, bytesRead, 
3800: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a  *errorCodePtr);.
3810: 09 72 65 74 75 72 6e 28 62 79 74 65 73 52 65 61  .return(bytesRea
3820: 64 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  d);.}../*. *----
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3870: 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70 75 74 50   *. * TlsOutputP
3880: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
3890: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
38a0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65  nvoked by the ge
38b0: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20  neric IO level. 
38c0: 2a 20 20 20 20 20 20 20 74 6f 20 77 72 69 74 65  *       to write
38d0: 20 6f 75 74 70 75 74 20 74 6f 20 61 20 53 53 4c   output to a SSL
38e0: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
38f0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73  annel.. *. * Res
3900: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 75 6d  ults:. *.The num
3910: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
3920: 74 74 65 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tten is returned
3930: 2e 20 41 6e 20 6f 75 74 70 75 74 20 61 72 67 75  . An output argu
3940: 6d 65 6e 74 20 69 73 0a 20 2a 09 73 65 74 20 74  ment is. *.set t
3950: 6f 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20  o a POSIX error 
3960: 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
3970: 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 7a 65   occurred, or ze
3980: 72 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ro.. *. * Side e
3990: 66 66 65 63 74 73 3a 0a 20 2a 09 57 72 69 74 65  ffects:. *.Write
39a0: 73 20 6f 75 74 70 75 74 20 6f 6e 20 74 68 65 20  s output on the 
39b0: 6f 75 74 70 75 74 20 64 65 76 69 63 65 20 6f 66  output device of
39c0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a   the channel.. *
39d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
3a20: 69 63 20 69 6e 74 20 54 6c 73 4f 75 74 70 75 74  ic int TlsOutput
3a30: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
3a40: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 63 6f  instanceData, co
3a50: 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c 20 69  nst char *buf, i
3a60: 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20  nt toWrite, int 
3a70: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b  *errorCodePtr) {
3a80: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3a90: 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 09 53  backingError;..S
3aa0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
3ab0: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61   (State *) insta
3ac0: 6e 63 65 44 61 74 61 3b 0a 09 69 6e 74 20 77 72  nceData;..int wr
3ad0: 69 74 74 65 6e 2c 20 65 72 72 3b 0a 09 69 6e 74  itten, err;..int
3ae0: 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 09 2a   tlsConnect;...*
3af0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
3b00: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  ;...dprintf("BIO
3b10: 5f 77 72 69 74 65 28 25 70 2c 20 25 64 29 22 2c  _write(%p, %d)",
3b20: 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50   (void *) stateP
3b30: 74 72 2c 20 74 6f 57 72 69 74 65 29 3b 0a 09 64  tr, toWrite);..d
3b40: 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c  printBuffer(buf,
3b50: 20 74 6f 57 72 69 74 65 29 3b 0a 0a 09 69 66 20   toWrite);...if 
3b60: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
3b70: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42   & TLS_TCL_CALLB
3b80: 41 43 4b 29 20 7b 0a 09 09 64 70 72 69 6e 74 66  ACK) {...dprintf
3b90: 28 22 44 6f 6e 27 74 20 70 72 6f 63 65 73 73 20  ("Don't process 
3ba0: 6f 75 74 70 75 74 20 77 68 69 6c 65 20 63 61 6c  output while cal
3bb0: 6c 62 61 63 6b 73 20 61 72 65 20 72 75 6e 6e 69  lbacks are runni
3bc0: 6e 67 22 29 0a 09 09 77 72 69 74 74 65 6e 20 3d  ng")...written =
3bd0: 20 2d 31 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64   -1;...*errorCod
3be0: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09  ePtr = EAGAIN;..
3bf0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
3c00: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69  ..dprintf("Calli
3c10: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
3c20: 6e 6e 65 63 74 22 29 3b 0a 09 74 6c 73 43 6f 6e  nnect");..tlsCon
3c30: 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 46  nect = Tls_WaitF
3c40: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50  orConnect(stateP
3c50: 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72  tr, errorCodePtr
3c60: 2c 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f  , 1);..if (tlsCo
3c70: 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09 09 64  nnect < 0) {...d
3c80: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65  printf("Got an e
3c90: 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f 20  rror waiting to 
3ca0: 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e  connect (tlsConn
3cb0: 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72  ect = %i, *error
3cc0: 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c 20  CodePtr = %i)", 
3cd0: 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72  tlsConnect, *err
3ce0: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a 09 09 77  orCodePtr);....w
3cf0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 69  ritten = -1;...i
3d00: 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  f (*errorCodePtr
3d10: 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20   == ECONNRESET) 
3d20: 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 22 47 6f  {....dprintf("Go
3d30: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 73  t connection res
3d40: 65 74 22 29 3b 0a 09 09 09 2f 2a 20 53 6f 66 74  et");..../* Soft
3d50: 20 45 4f 46 20 2a 2f 0a 09 09 09 2a 65 72 72 6f   EOF */....*erro
3d60: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09  rCodePtr = 0;...
3d70: 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09  .written = 0;...
3d80: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 77 72 69 74  }....return(writ
3d90: 74 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 74  ten);..}...if (t
3da0: 6f 57 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09  oWrite == 0) {..
3db0: 09 64 70 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77  .dprintf("zero-w
3dc0: 72 69 74 65 22 29 3b 0a 09 09 65 72 72 20 3d 20  rite");...err = 
3dd0: 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50  BIO_flush(stateP
3de0: 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 09 69 66 20  tr->bio);....if 
3df0: 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 09 09  (err <= 0) {....
3e00: 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e  dprintf("Flushin
3e10: 67 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 09 09  g failed");.....
3e20: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3e30: 45 49 4f 3b 0a 09 09 09 77 72 69 74 74 65 6e 20  EIO;....written 
3e40: 3d 20 30 3b 0a 09 09 09 72 65 74 75 72 6e 28 2d  = 0;....return(-
3e50: 31 29 3b 0a 09 09 7d 0a 0a 09 09 77 72 69 74 74  1);...}....writt
3e60: 65 6e 20 3d 20 30 3b 0a 09 09 2a 65 72 72 6f 72  en = 0;...*error
3e70: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 72  CodePtr = 0;...r
3e80: 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 2f  eturn(0);..}.../
3e90: 2a 0a 09 20 2a 20 57 65 20 6e 65 65 64 20 74 6f  *.. * We need to
3ea0: 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65   clear the SSL e
3eb0: 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62  rror stack now b
3ec0: 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69  ecause we someti
3ed0: 6d 65 73 20 72 65 61 63 68 0a 09 20 2a 20 74 68  mes reach.. * th
3ee0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
3ef0: 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 73   leftover errors
3f00: 20 69 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   in the stack.  
3f10: 49 66 20 42 49 4f 5f 77 72 69 74 65 0a 09 20 2a  If BIO_write.. *
3f20: 20 72 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20   returns -1 and 
3f30: 69 6e 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20  intends EAGAIN, 
3f40: 74 68 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f  there is a lefto
3f50: 76 65 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69  ver error, it wi
3f60: 6c 6c 20 62 65 0a 09 20 2a 20 6d 69 73 63 6f 6e  ll be.. * miscon
3f70: 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 72  strued as an err
3f80: 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a  or, not EAGAIN..
3f90: 09 20 2a 0a 09 20 2a 20 41 6c 74 65 72 6e 61 74  . *.. * Alternat
3fa0: 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61  ively, we may wa
3fb0: 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  nt to handle the
3fc0: 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73   <0 return codes
3fd0: 20 66 72 6f 6d 0a 09 20 2a 20 42 49 4f 5f 77 72   from.. * BIO_wr
3fe0: 69 74 65 20 73 70 65 63 69 61 6c 6c 79 20 28 61  ite specially (a
3ff0: 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 68 65  s advised in the
4000: 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c 53   RSA docs).  TLS
4010: 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 0a 09  's lower level..
4020: 20 2a 20 42 49 4f 20 66 75 6e 63 74 69 6f 6e 73   * BIO functions
4030: 20 70 6c 61 79 20 77 69 74 68 20 74 68 65 20 72   play with the r
4040: 65 74 72 79 20 66 6c 61 67 73 20 74 68 6f 75 67  etry flags thoug
4050: 68 2c 20 61 6e 64 20 74 68 69 73 20 73 65 65 6d  h, and this seem
4060: 73 20 74 6f 0a 09 20 2a 20 77 6f 72 6b 20 63 6f  s to.. * work co
4070: 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61  rrectly.  Simila
4080: 72 20 66 69 78 20 69 6e 20 54 6c 73 49 6e 70 75  r fix in TlsInpu
4090: 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 09  tProc. - hobbs..
40a0: 20 2a 2f 0a 09 45 52 52 5f 63 6c 65 61 72 5f 65   */..ERR_clear_e
40b0: 72 72 6f 72 28 29 3b 0a 09 77 72 69 74 74 65 6e  rror();..written
40c0: 20 3d 20 42 49 4f 5f 77 72 69 74 65 28 73 74 61   = BIO_write(sta
40d0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c  tePtr->bio, buf,
40e0: 20 74 6f 57 72 69 74 65 29 3b 0a 09 64 70 72 69   toWrite);..dpri
40f0: 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25  ntf("BIO_write(%
4100: 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c  p, %d) -> [%d]",
4110: 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50   (void *) stateP
4120: 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69  tr, toWrite, wri
4130: 74 74 65 6e 29 3b 0a 0a 09 65 72 72 20 3d 20 53  tten);...err = S
4140: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61  SL_get_error(sta
4150: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74  tePtr->ssl, writ
4160: 74 65 6e 29 3b 0a 09 73 77 69 74 63 68 20 28 65  ten);..switch (e
4170: 72 72 29 20 7b 0a 09 09 63 61 73 65 20 53 53 4c  rr) {...case SSL
4180: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 09 09  _ERROR_NONE:....
4190: 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20 30 29  if (written < 0)
41a0: 20 7b 0a 09 09 09 09 77 72 69 74 74 65 6e 20 3d   {.....written =
41b0: 20 30 3b 0a 09 09 09 7d 0a 09 09 09 62 72 65 61   0;....}....brea
41c0: 6b 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
41d0: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a  ROR_WANT_WRITE:.
41e0: 09 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20  ...dprintf("Got 
41f0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57  SSL_ERROR_WANT_W
4200: 52 49 54 45 2c 20 6d 61 70 70 69 6e 67 20 69 74  RITE, mapping it
4210: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 09   to EAGAIN");...
4220: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
4230: 20 45 41 47 41 49 4e 3b 0a 09 09 09 77 72 69 74   EAGAIN;....writ
4240: 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 09 62 72 65  ten = -1;....bre
4250: 61 6b 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
4260: 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a  RROR_WANT_READ:.
4270: 09 09 09 64 70 72 69 6e 74 66 28 22 20 77 72 69  ...dprintf(" wri
4280: 74 65 20 52 20 42 4c 4f 43 4b 22 29 3b 0a 09 09  te R BLOCK");...
4290: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53  .break;...case S
42a0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
42b0: 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 09 09 64 70  09_LOOKUP:....dp
42c0: 72 69 6e 74 66 28 22 20 77 72 69 74 65 20 58 20  rintf(" write X 
42d0: 42 4c 4f 43 4b 22 29 3b 0a 09 09 09 62 72 65 61  BLOCK");....brea
42e0: 6b 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
42f0: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a  ROR_ZERO_RETURN:
4300: 0a 09 09 09 64 70 72 69 6e 74 66 28 22 20 63 6c  ....dprintf(" cl
4310: 6f 73 65 64 22 29 3b 0a 09 09 09 77 72 69 74 74  osed");....writt
4320: 65 6e 20 3d 20 30 3b 0a 09 09 09 2a 65 72 72 6f  en = 0;....*erro
4330: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09  rCodePtr = 0;...
4340: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53  .break;...case S
4350: 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c  SL_ERROR_SYSCALL
4360: 3a 0a 09 09 09 62 61 63 6b 69 6e 67 45 72 72 6f  :....backingErro
4370: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f  r = ERR_get_erro
4380: 72 28 29 3b 0a 0a 09 09 09 69 66 20 28 62 61 63  r();.....if (bac
4390: 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26  kingError == 0 &
43a0: 26 20 77 72 69 74 74 65 6e 20 3d 3d 20 30 29 20  & written == 0) 
43b0: 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22 45  {.....dprintf("E
43c0: 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 09  OF reached")....
43d0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
43e0: 20 30 3b 0a 09 09 09 09 77 72 69 74 74 65 6e 20   0;.....written 
43f0: 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69  = 0;....} else i
4400: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  f (backingError 
4410: 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e 20  == 0 && written 
4420: 3d 3d 20 2d 31 29 20 7b 0a 09 09 09 09 64 70 72  == -1) {.....dpr
4430: 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20  intf("I/O error 
4440: 6f 63 63 75 72 65 64 20 28 65 72 72 6e 6f 20 3d  occured (errno =
4450: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
4460: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45  d long) Tcl_GetE
4470: 72 72 6e 6f 28 29 29 3b 0a 09 09 09 09 2a 65 72  rrno());.....*er
4480: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c  rorCodePtr = Tcl
4490: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 09  _GetErrno();....
44a0: 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09  .written = -1;..
44b0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 64  ..} else {.....d
44c0: 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f  printf("I/O erro
44d0: 72 20 6f 63 63 75 72 65 64 20 28 62 61 63 6b 69  r occured (backi
44e0: 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c  ngError = %lu)",
44f0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a   backingError);.
4500: 09 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ....*errorCodePt
4510: 72 20 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  r = backingError
4520: 3b 0a 09 09 09 09 77 72 69 74 74 65 6e 20 3d 20  ;.....written = 
4530: 2d 31 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  -1;....}.....bre
4540: 61 6b 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
4550: 52 52 4f 52 5f 53 53 4c 3a 0a 09 09 09 54 6c 73  RROR_SSL:....Tls
4560: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
4570: 20 54 43 4c 54 4c 53 5f 53 53 4c 5f 45 52 52 4f   TCLTLS_SSL_ERRO
4580: 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  R(statePtr->ssl,
4590: 20 77 72 69 74 74 65 6e 29 29 3b 0a 09 09 09 2a   written));....*
45a0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
45b0: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 09  CONNABORTED;....
45c0: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09  written = -1;...
45d0: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
45e0: 74 3a 0a 09 09 09 64 70 72 69 6e 74 66 28 22 20  t:....dprintf(" 
45f0: 75 6e 6b 6e 6f 77 6e 20 65 72 72 3a 20 25 64 22  unknown err: %d"
4600: 2c 20 65 72 72 29 3b 0a 09 09 09 62 72 65 61 6b  , err);....break
4610: 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22  ;..}...dprintf("
4620: 4f 75 74 70 75 74 28 25 64 29 20 2d 3e 20 25 64  Output(%d) -> %d
4630: 22 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74  ", toWrite, writ
4640: 74 65 6e 29 3b 0a 09 72 65 74 75 72 6e 28 77 72  ten);..return(wr
4650: 69 74 74 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  itten);.}../*. *
4660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74  ---. *. * TlsGet
46b0: 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a  OptionProc --. *
46c0: 0a 20 2a 09 43 6f 6d 70 75 74 65 73 20 61 6e 20  . *.Computes an 
46d0: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72  option value for
46e0: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
46f0: 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20  sed channel, or 
4700: 61 0a 20 2a 09 6c 69 73 74 20 6f 66 20 61 6c 6c  a. *.list of all
4710: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65   options and the
4720: 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a  ir values.. *. *
4730: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
4740: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
4750: 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66  lt. The value of
4760: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
4770: 70 74 69 6f 6e 20 6f 72 20 61 0a 20 2a 09 6c 69  ption or a. *.li
4780: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e  st of all option
4790: 73 20 61 6e 64 09 74 68 65 69 72 20 76 61 6c 75  s and.their valu
47a0: 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  es is returned i
47b0: 6e 20 74 68 65 0a 20 2a 09 73 75 70 70 6c 69 65  n the. *.supplie
47c0: 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a  d DString.. *. *
47d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
47e0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4830: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
4840: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  TlsGetOptionProc
4850: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
4860: 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63  anceData,./* Soc
4870: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 09 54  ket state. */..T
4880: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4890: 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72  p,../* For error
48a0: 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  s - can be NULL.
48b0: 20 2a 2f 0a 09 63 6f 6e 73 74 20 63 68 61 72 20   */..const char 
48c0: 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 09 2f 2a  *optionName,../*
48d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74   Name of the opt
48e0: 69 6f 6e 20 74 6f 0a 09 09 09 09 09 20 2a 20 72  ion to...... * r
48f0: 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c 75  etrieve the valu
4900: 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 09 20  e for, or...... 
4910: 2a 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c  * NULL to get al
4920: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 0a 09 09  l options and...
4930: 09 09 09 20 2a 20 74 68 65 69 72 20 76 61 6c 75  ... * their valu
4940: 65 73 2e 20 2a 2f 0a 09 54 63 6c 5f 44 53 74 72  es. */..Tcl_DStr
4950: 69 6e 67 20 2a 64 73 50 74 72 29 09 09 2f 2a 20  ing *dsPtr)../* 
4960: 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74  Where to store t
4970: 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75  he computed valu
4980: 65 0a 09 09 09 09 09 20 2a 20 69 6e 69 74 69 61  e...... * initia
4990: 6c 69 7a 65 64 20 62 79 20 63 61 6c 6c 65 72 2e  lized by caller.
49a0: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20   */.{.    State 
49b0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
49c0: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61  te *) instanceDa
49d0: 74 61 3b 0a 0a 20 20 20 54 63 6c 5f 43 68 61 6e  ta;..   Tcl_Chan
49e0: 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54  nel downChan = T
49f0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61  ls_GetParent(sta
4a00: 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46  tePtr, TLS_TCL_F
4a10: 41 53 54 50 41 54 48 29 3b 0a 20 20 20 54 63 6c  ASTPATH);.   Tcl
4a20: 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e  _DriverGetOption
4a30: 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50  Proc *getOptionP
4a40: 72 6f 63 3b 0a 0a 20 20 20 20 67 65 74 4f 70 74  roc;..    getOpt
4a50: 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68  ionProc = Tcl_Ch
4a60: 61 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72  annelGetOptionPr
4a70: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  oc(Tcl_GetChanne
4a80: 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29  lType(downChan))
4a90: 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f 70 74  ;.    if (getOpt
4aa0: 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29  ionProc != NULL)
4ab0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
4ac0: 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f  n (*getOptionPro
4ad0: 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  c)(Tcl_GetChanne
4ae0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f  lInstanceData(do
4af0: 77 6e 43 68 61 6e 29 2c 20 69 6e 74 65 72 70 2c  wnChan), interp,
4b00: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 64 73 50   optionName, dsP
4b10: 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  tr);.    } else 
4b20: 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d  if (optionName =
4b30: 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20  = (char*) NULL) 
4b40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20  {.        /*.   
4b50: 20 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 20        * Request 
4b60: 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c  is query for all
4b70: 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69   options, this i
4b80: 73 20 6f 6b 2e 0a 20 20 20 20 20 20 20 20 20 2a  s ok..         *
4b90: 2f 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  /.         retur
4ba0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
4bb0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65      /*.     * Re
4bc0: 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65 63  quest for a spec
4bd0: 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 20  ific option has 
4be0: 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27  to fail, we don'
4bf0: 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 20 20  t have any..    
4c00: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 54   */.    return T
4c10: 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
4c20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c60: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57  -----. *. * TlsW
4c70: 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  atchProc --. *. 
4c80: 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  *.Initialize the
4c90: 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74   notifier to wat
4ca0: 63 68 20 54 63 6c 5f 46 69 6c 65 73 20 66 72 6f  ch Tcl_Files fro
4cb0: 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a  m this channel..
4cc0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4cd0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  *.None.. *. * Si
4ce0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
4cf0: 65 74 73 20 75 70 20 74 68 65 20 6e 6f 74 69 66  ets up the notif
4d00: 69 65 72 20 73 6f 20 74 68 61 74 20 61 20 66 75  ier so that a fu
4d10: 74 75 72 65 20 65 76 65 6e 74 20 6f 6e 20 74 68  ture event on th
4d20: 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 77 69 6c  e channel. *.wil
4d30: 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c  l be seen by Tcl
4d40: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
4d90: 73 74 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 57  static void.TlsW
4da0: 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44  atchProc(ClientD
4db0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
4dc0: 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20  ,./* The socket 
4dd0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  state. */.      
4de0: 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 29         int mask)
4df0: 09 09 09 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20  .../* Events of 
4e00: 69 6e 74 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d  interest; an OR-
4e10: 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 63 6f              * co
4e40: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c  mbination of TCL
4e50: 5f 52 45 41 44 41 42 4c 45 2c 0a 20 20 20 20 20  _READABLE,.     
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 20 20 20 20 2a 20 54 43 4c 5f 57 52 49 54 41 42      * TCL_WRITAB
4e90: 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50  LE and TCL_EXCEP
4ea0: 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54  TION. */.{.    T
4eb0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64  cl_Channel     d
4ec0: 6f 77 6e 43 68 61 6e 3b 0a 20 20 20 20 53 74 61  ownChan;.    Sta
4ed0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
4ee0: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
4ef0: 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  eData;..    dpri
4f00: 6e 74 66 28 22 54 6c 73 57 61 74 63 68 50 72 6f  ntf("TlsWatchPro
4f10: 63 28 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b  c(0x%x)", mask);
4f20: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64  ..    /* Pretend
4f30: 20 74 6f 20 62 65 20 64 65 61 64 20 61 73 20 6c   to be dead as l
4f40: 6f 6e 67 20 61 73 20 74 68 65 20 76 65 72 69 66  ong as the verif
4f50: 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75  y callback is ru
4f60: 6e 6e 69 6e 67 2e 20 0a 20 20 20 20 20 2a 20 4f  nning. .     * O
4f70: 74 68 65 72 77 69 73 65 20 74 68 61 74 20 63 61  therwise that ca
4f80: 6c 6c 62 61 63 6b 20 63 6f 75 6c 64 20 62 65 20  llback could be 
4f90: 69 6e 76 6f 6b 65 64 20 72 65 63 75 72 73 69 76  invoked recursiv
4fa0: 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  ely. */.    if (
4fb0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
4fc0: 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41  & TLS_TCL_CALLBA
4fd0: 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 64 70  CK) {.        dp
4fe0: 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b 20  rintf("Callback 
4ff0: 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20 64 6f 69  is on-going, doi
5000: 6e 67 20 6e 6f 74 68 69 6e 67 22 29 3b 0a 20 20  ng nothing");.  
5010: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5020: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 46    }..    dprintF
5030: 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 3b 0a  lags(statePtr);.
5040: 0a 20 20 20 20 64 6f 77 6e 43 68 61 6e 20 3d 20  .    downChan = 
5050: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74  Tls_GetParent(st
5060: 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f  atePtr, TLS_TCL_
5070: 46 41 53 54 50 41 54 48 29 3b 0a 0a 20 20 20 20  FASTPATH);..    
5080: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  if (statePtr->fl
5090: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 48 41  ags & TLS_TCL_HA
50a0: 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 29 20  NDSHAKE_FAILED) 
50b0: 7b 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74  {.        dprint
50c0: 66 28 22 41 73 6b 65 64 20 74 6f 20 77 61 74 63  f("Asked to watc
50d0: 68 20 61 20 73 6f 63 6b 65 74 20 77 69 74 68 20  h a socket with 
50e0: 61 20 66 61 69 6c 65 64 20 68 61 6e 64 73 68 61  a failed handsha
50f0: 6b 65 20 2d 2d 20 6e 6f 74 68 69 6e 67 20 63 61  ke -- nothing ca
5100: 6e 20 68 61 70 70 65 6e 20 68 65 72 65 22 29 3b  n happen here");
5110: 0a 0a 09 64 70 72 69 6e 74 66 28 22 55 6e 72 65  ...dprintf("Unre
5120: 67 69 73 74 65 72 69 6e 67 20 69 6e 74 65 72 65  gistering intere
5130: 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20  st in the lower 
5140: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 28 54 63 6c  channel");..(Tcl
5150: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
5160: 64 6f 77 6e 43 68 61 6e 29 29 2d 3e 77 61 74 63  downChan))->watc
5170: 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61  hProc(Tcl_GetCha
5180: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
5190: 28 64 6f 77 6e 43 68 61 6e 29 2c 20 30 29 3b 0a  (downChan), 0);.
51a0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63  ..statePtr->watc
51b0: 68 4d 61 73 6b 20 3d 20 30 3b 0a 0a 20 20 20 20  hMask = 0;..    
51c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
51d0: 7d 0a 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61  }...statePtr->wa
51e0: 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a  tchMask = mask;.
51f0: 0a 09 2f 2a 20 4e 6f 20 63 68 61 6e 6e 65 6c 20  ../* No channel 
5200: 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d 6f 72  handlers any mor
5210: 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20 6e 6f  e. We will be no
5220: 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74 69 63  tified automatic
5230: 61 6c 6c 79 0a 09 20 2a 20 61 62 6f 75 74 20 65  ally.. * about e
5240: 76 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61  vents on the cha
5250: 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69 61 20 61  nnel below via a
5260: 20 63 61 6c 6c 20 74 6f 20 6f 75 72 0a 09 20 2a   call to our.. *
5270: 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 66   'TransformNotif
5280: 79 50 72 6f 63 27 2e 20 42 75 74 20 77 65 20 68  yProc'. But we h
5290: 61 76 65 20 74 6f 20 70 61 73 73 20 74 68 65 20  ave to pass the 
52a0: 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20 6e 6f  interest down no
52b0: 77 2e 0a 09 20 2a 20 57 65 20 61 72 65 20 61 6c  w... * We are al
52c0: 6c 6f 77 65 64 20 74 6f 20 61 64 64 20 61 64 64  lowed to add add
52d0: 69 74 69 6f 6e 61 6c 20 27 69 6e 74 65 72 65 73  itional 'interes
52e0: 74 27 20 74 6f 20 74 68 65 20 6d 61 73 6b 20 69  t' to the mask i
52f0: 66 20 77 65 20 77 61 6e 74 0a 09 20 2a 20 74 6f  f we want.. * to
5300: 2e 20 42 75 74 20 74 68 69 73 20 74 72 61 6e 73  . But this trans
5310: 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20 6e 6f  formation has no
5320: 20 73 75 63 68 20 69 6e 74 65 72 65 73 74 2e 20   such interest. 
5330: 49 74 20 6a 75 73 74 20 70 61 73 73 65 73 0a 09  It just passes..
5340: 20 2a 20 74 68 65 20 72 65 71 75 65 73 74 20 64   * the request d
5350: 6f 77 6e 2c 20 75 6e 63 68 61 6e 67 65 64 2e 0a  own, unchanged..
5360: 09 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 64  . */...        d
5370: 70 72 69 6e 74 66 28 22 52 65 67 69 73 74 65 72  printf("Register
5380: 69 6e 67 20 6f 75 72 20 69 6e 74 65 72 65 73 74  ing our interest
5390: 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68   in the lower ch
53a0: 61 6e 6e 65 6c 20 28 63 68 61 6e 3d 25 70 29 22  annel (chan=%p)"
53b0: 2c 20 28 76 6f 69 64 20 2a 29 20 64 6f 77 6e 43  , (void *) downC
53c0: 68 61 6e 29 3b 0a 09 28 54 63 6c 5f 47 65 74 43  han);..(Tcl_GetC
53d0: 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43  hannelType(downC
53e0: 68 61 6e 29 29 0a 09 20 20 20 20 2d 3e 77 61 74  han))..    ->wat
53f0: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  chProc(Tcl_GetCh
5400: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
5410: 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 6d 61 73  a(downChan), mas
5420: 6b 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6e  k);.../*.. * Man
5430: 61 67 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 69  agement of the i
5440: 6e 74 65 72 6e 61 6c 20 74 69 6d 65 72 2e 0a 09  nternal timer...
5450: 20 2a 2f 0a 0a 09 69 66 20 28 73 74 61 74 65 50   */...if (stateP
5460: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
5470: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
5480: 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL) {.          
5490: 20 20 64 70 72 69 6e 74 66 28 22 41 20 74 69 6d    dprintf("A tim
54a0: 65 72 20 77 61 73 20 66 6f 75 6e 64 2c 20 64 65  er was found, de
54b0: 6c 65 74 69 6e 67 20 69 74 22 29 3b 0a 09 20 20  leting it");..  
54c0: 20 20 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65    Tcl_DeleteTime
54d0: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
54e0: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 20 20 20 20  r->timer);..    
54f0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
5500: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
5510: 6e 29 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66  n) NULL;..}...if
5520: 20 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41   (mask & TCL_REA
5530: 44 41 42 4c 45 29 20 7b 0a 09 09 69 66 20 28 54  DABLE) {...if (T
5540: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
5550: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
5560: 20 3e 20 30 20 7c 7c 20 42 49 4f 5f 63 74 72 6c   > 0 || BIO_ctrl
5570: 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74  _pending(statePt
5580: 72 2d 3e 62 69 6f 29 20 3e 20 30 29 20 7b 0a 09  r->bio) > 0) {..
5590: 09 09 2f 2a 0a 09 09 09 20 2a 20 54 68 65 72 65  ../*.... * There
55a0: 20 69 73 20 69 6e 74 65 72 65 73 74 20 69 6e 20   is interest in 
55b0: 72 65 61 64 61 62 6c 65 20 65 76 65 6e 74 73 20  readable events 
55c0: 61 6e 64 20 77 65 20 61 63 74 75 61 6c 6c 79 20  and we actually 
55d0: 68 61 76 65 0a 09 09 09 20 2a 20 64 61 74 61 20  have.... * data 
55e0: 77 61 69 74 69 6e 67 2c 20 73 6f 20 67 65 6e 65  waiting, so gene
55f0: 72 61 74 65 20 61 20 74 69 6d 65 72 20 74 6f 20  rate a timer to 
5600: 66 6c 75 73 68 20 74 68 61 74 2e 0a 09 09 09 20  flush that..... 
5610: 2a 2f 0a 09 09 09 64 70 72 69 6e 74 66 28 22 43  */....dprintf("C
5620: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 69  reating a new ti
5630: 6d 65 72 20 73 69 6e 63 65 20 64 61 74 61 20 61  mer since data a
5640: 70 70 65 61 72 73 20 74 6f 20 62 65 20 77 61 69  ppears to be wai
5650: 74 69 6e 67 22 29 3b 0a 09 09 09 73 74 61 74 65  ting");....state
5660: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c  Ptr->timer = Tcl
5670: 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64  _CreateTimerHand
5680: 6c 65 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41  ler(TLS_TCL_DELA
5690: 59 2c 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e  Y, TlsChannelHan
56a0: 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 65  dlerTimer, (Clie
56b0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
56c0: 29 3b 0a 09 09 7d 0a 09 7d 0a 7d 0a 0a 2f 2a 0a  );...}..}.}../*.
56d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47  -----. *. * TlsG
5720: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a  etHandleProc --.
5730: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f   *. *.Called fro
5740: 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  m Tcl_GetChannel
5750: 46 69 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65  File to retrieve
5760: 20 6f 2f 73 20 66 69 6c 65 20 68 61 6e 64 6c 65   o/s file handle
5770: 72 0a 20 2a 09 66 72 6f 6d 20 74 68 65 20 53 53  r. *.from the SS
5780: 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
5790: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
57a0: 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 70  sults:. *.The ap
57b0: 70 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69  propriate Tcl_Fi
57c0: 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  le or NULL if no
57d0: 74 20 70 72 65 73 65 6e 74 2e 20 0a 20 2a 0a 20  t present. . *. 
57e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
57f0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5840: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
5850: 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f   TlsGetHandlePro
5860: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
5870: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 64  tanceData, int d
5880: 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74  irection, Client
5890: 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29  Data *handlePtr)
58a0: 20 7b 0a 09 53 74 61 74 65 20 2a 73 74 61 74 65   {..State *state
58b0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
58c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 09  instanceData;...
58d0: 72 65 74 75 72 6e 28 54 63 6c 5f 47 65 74 43 68  return(Tcl_GetCh
58e0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 6c 73 5f  annelHandle(Tls_
58f0: 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50  GetParent(stateP
5900: 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54  tr, TLS_TCL_FAST
5910: 50 41 54 48 29 2c 20 64 69 72 65 63 74 69 6f 6e  PATH), direction
5920: 2c 20 68 61 6e 64 6c 65 50 74 72 29 29 3b 0a 7d  , handlePtr));.}
5930: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
5980: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 2d   TlsNotifyProc -
5990: 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20  -. *. *.Handler 
59a0: 63 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 6f  called by Tcl to
59b0: 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63   inform us of ac
59c0: 74 69 76 69 74 79 0a 20 2a 09 6f 6e 20 74 68 65  tivity. *.on the
59d0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e   underlying chan
59e0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  nel.. *. * Resul
59f0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
5a00: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5a10: 0a 20 2a 09 4d 61 79 20 70 72 6f 63 65 73 73 20  . *.May process 
5a20: 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 65 76 65  the incoming eve
5a30: 6e 74 20 62 79 20 69 74 73 65 6c 66 2e 0a 20 2a  nt by itself.. *
5a40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
5a90: 69 63 20 69 6e 74 20 54 6c 73 4e 6f 74 69 66 79  ic int TlsNotify
5aa0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
5ab0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
5ac0: 74 20 6d 61 73 6b 29 20 7b 0a 09 53 74 61 74 65  t mask) {..State
5ad0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
5ae0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
5af0: 61 74 61 3b 0a 09 69 6e 74 20 65 72 72 6f 72 43  ata;..int errorC
5b00: 6f 64 65 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 41 6e  ode;.../*.. * An
5b10: 20 65 76 65 6e 74 20 6f 63 63 75 72 65 64 20 69   event occured i
5b20: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  n the underlying
5b30: 20 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a   channel.  This.
5b40: 09 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  . * transformati
5b50: 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f 63 65  on doesn't proce
5b60: 73 73 20 73 75 63 68 20 65 76 65 6e 74 73 20 74  ss such events t
5b70: 68 75 73 20 72 65 74 75 72 6e 73 20 74 68 65 0a  hus returns the.
5b80: 09 20 2a 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73  . * incoming mas
5b90: 6b 20 75 6e 63 68 61 6e 67 65 64 2e 0a 09 20 2a  k unchanged... *
5ba0: 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  /..if (statePtr-
5bb0: 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54  >timer != (Tcl_T
5bc0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29  imerToken) NULL)
5bd0: 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 44 65 6c   {.../*... * Del
5be0: 65 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ete an existing 
5bf0: 74 69 6d 65 72 2e 20 49 74 20 77 61 73 20 6e 6f  timer. It was no
5c00: 74 20 66 69 72 65 64 2c 20 79 65 74 20 77 65 20  t fired, yet we 
5c10: 61 72 65 0a 09 09 20 2a 20 68 65 72 65 2c 20 73  are... * here, s
5c20: 6f 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65  o the channel be
5c30: 6c 6f 77 20 67 65 6e 65 72 61 74 65 64 20 73 75  low generated su
5c40: 63 68 20 61 6e 20 65 76 65 6e 74 20 61 6e 64 20  ch an event and 
5c50: 77 65 0a 09 09 20 2a 20 64 6f 6e 27 74 20 68 61  we... * don't ha
5c60: 76 65 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77  ve to. The renew
5c70: 61 6c 20 6f 66 20 74 68 65 20 69 6e 74 65 72 65  al of the intere
5c80: 73 74 20 61 66 74 65 72 20 74 68 65 0a 09 09 20  st after the... 
5c90: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63  * execution of c
5ca0: 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20  hannel handlers 
5cb0: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
5cc0: 63 61 75 73 65 20 75 73 20 74 6f 0a 09 09 20 2a  cause us to... *
5cd0: 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74 69   recreate the ti
5ce0: 6d 65 72 20 28 69 6e 20 57 61 74 63 68 50 72 6f  mer (in WatchPro
5cf0: 63 29 2e 0a 09 09 20 2a 2f 0a 09 09 54 63 6c 5f  c).... */...Tcl_
5d00: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
5d10: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
5d20: 65 72 29 3b 0a 09 09 73 74 61 74 65 50 74 72 2d  er);...statePtr-
5d30: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69  >timer = (Tcl_Ti
5d40: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a  merToken) NULL;.
5d50: 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 65 50 74  .}...if (statePt
5d60: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
5d70: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09  CL_CALLBACK) {..
5d80: 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e  .dprintf("Return
5d90: 69 6e 67 20 30 20 64 75 65 20 74 6f 20 63 61 6c  ing 0 due to cal
5da0: 6c 62 61 63 6b 22 29 3b 0a 09 09 72 65 74 75 72  lback");...retur
5db0: 6e 20 30 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74  n 0;..}...dprint
5dc0: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57  f("Calling Tls_W
5dd0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b  aitForConnect");
5de0: 0a 09 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b  ..errorCode = 0;
5df0: 0a 0a 09 69 66 20 28 54 6c 73 5f 57 61 69 74 46  ...if (Tls_WaitF
5e00: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50  orConnect(stateP
5e10: 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c 20  tr, &errorCode, 
5e20: 31 29 20 3c 20 30 29 20 7b 0a 09 09 69 66 20 28  1) < 0) {...if (
5e30: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47  errorCode == EAG
5e40: 41 49 4e 29 20 7b 0a 09 09 09 64 70 72 69 6e 74  AIN) {....dprint
5e50: 66 28 22 41 73 79 6e 63 20 66 6c 61 67 20 63 6f  f("Async flag co
5e60: 75 6c 64 20 62 65 20 73 65 74 20 28 64 69 64 6e  uld be set (didn
5e70: 27 74 20 63 68 65 63 6b 29 20 61 6e 64 20 65 72  't check) and er
5e80: 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 41 49  rorCode == EAGAI
5e90: 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67 20 30 22  N:  Returning 0"
5ea0: 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 30 3b 0a  );....return 0;.
5eb0: 09 09 7d 0a 09 09 64 70 72 69 6e 74 66 28 22 54  ..}...dprintf("T
5ec0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
5ed0: 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  t returned an er
5ee0: 72 6f 72 22 29 3b 0a 09 7d 0a 0a 09 64 70 72 69  ror");..}...dpri
5ef0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25  ntf("Returning %
5f00: 69 22 2c 20 6d 61 73 6b 29 3b 0a 0a 09 72 65 74  i", mask);...ret
5f10: 75 72 6e 28 6d 61 73 6b 29 3b 0a 7d 0a 0a 23 69  urn(mask);.}..#i
5f20: 66 20 30 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  f 0./*. *-------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
5f60: 0a 20 2a 0a 20 2a 20 20 20 20 20 20 54 6c 73 43  . *. *      TlsC
5f70: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 2d  hannelHandler --
5f80: 0a 20 2a 0a 20 2a 20 20 20 20 20 20 2d 2d 2d 2d  . *. *      ----
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
5fc0: 20 20 20 20 20 20 48 61 6e 64 6c 65 72 20 63 61        Handler ca
5fd0: 6c 6c 65 64 20 62 79 20 54 63 6c 20 61 73 20 61  lled by Tcl as a
5fe0: 20 72 65 73 75 6c 74 20 6f 66 0a 20 2a 20 20 20   result of. *   
5ff0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61     Tcl_CreateCha
6000: 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 20 74 6f  nnelHandler - to
6010: 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63   inform us of ac
6020: 74 69 76 69 74 79 0a 20 2a 20 20 20 20 20 20 6f  tivity. *      o
6030: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  n the underlying
6040: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20 20 20   channel.. *    
6050: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6080: 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 53  --*. *. *      S
6090: 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 20 20  ideeffects:. *  
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 79 20              May 
60b0: 67 65 6e 65 72 61 74 65 20 73 75 62 73 65 71 75  generate subsequ
60c0: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 20 2a 20  ent calls to. * 
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
60e0: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 2e 0a  _NotifyChannel..
60f0: 20 2a 0a 20 2a 20 20 20 20 20 20 52 65 73 75 6c   *. *      Resul
6100: 74 3a 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20  t:. *           
6110: 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d     None.. *. *--
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74 69  ----*. */..stati
6160: 63 20 76 6f 69 64 0a 54 6c 73 43 68 61 6e 6e 65  c void.TlsChanne
6170: 6c 48 61 6e 64 6c 65 72 20 28 63 6c 69 65 6e 74  lHandler (client
6180: 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20 20  Data, mask).    
6190: 43 6c 69 65 6e 74 44 61 74 61 20 20 20 20 20 63  ClientData     c
61a0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 69  lientData;.    i
61b0: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 6d 61  nt            ma
61c0: 73 6b 3b 0a 7b 0a 20 20 20 20 53 74 61 74 65 20  sk;.{.    State 
61d0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
61e0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
61f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
6200: 48 41 4e 44 4c 45 52 28 30 78 25 78 29 22 2c 20  HANDLER(0x%x)", 
6210: 6d 61 73 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 50  mask);.    Tcl_P
6220: 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74  reserve( (Client
6230: 44 61 74 61 29 73 74 61 74 65 50 74 72 29 3b 0a  Data)statePtr);.
6240: 0a 20 20 20 20 69 66 20 28 6d 61 73 6b 20 26 20  .    if (mask & 
6250: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 7b 0a  TCL_READABLE) {.
6260: 09 42 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 73  .BIO_set_flags(s
6270: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20  tatePtr->p_bio, 
6280: 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41 44 29 3b  BIO_FLAGS_READ);
6290: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42  .    } else {..B
62a0: 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 73 28 73  IO_clear_flags(s
62b0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20  tatePtr->p_bio, 
62c0: 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41 44 29 3b  BIO_FLAGS_READ);
62d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
62e0: 6d 61 73 6b 20 26 20 54 43 4c 5f 57 52 49 54 41  mask & TCL_WRITA
62f0: 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 65 74 5f  BLE) {..BIO_set_
6300: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e  flags(statePtr->
6310: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53  p_bio, BIO_FLAGS
6320: 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 7d 20 65  _WRITE);.    } e
6330: 6c 73 65 20 7b 0a 09 42 49 4f 5f 63 6c 65 61 72  lse {..BIO_clear
6340: 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d  _flags(statePtr-
6350: 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47  >p_bio, BIO_FLAG
6360: 53 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 7d 0a  S_WRITE);.    }.
6370: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  .    mask = 0;. 
6380: 20 20 20 69 66 20 28 42 49 4f 5f 77 70 65 6e 64     if (BIO_wpend
6390: 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ing(statePtr->bi
63a0: 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54  o)) {..mask |= T
63b0: 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20  CL_WRITABLE;.   
63c0: 20 7d 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 70   }.    if (BIO_p
63d0: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d  ending(statePtr-
63e0: 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c  >bio)) {..mask |
63f0: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a  = TCL_READABLE;.
6400: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
6410: 20 20 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69     * The followi
6420: 6e 67 20 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c  ng NotifyChannel
6430: 20 63 61 6c 6c 73 20 73 65 65 6d 73 20 74 6f 20   calls seems to 
6440: 62 65 20 69 6d 70 6f 72 74 61 6e 74 2c 20 62 75  be important, bu
6450: 74 0a 20 20 20 20 20 2a 20 77 65 20 64 6f 6e 27  t.     * we don'
6460: 74 20 6b 6e 6f 77 20 77 68 79 2e 20 20 49 74 20  t know why.  It 
6470: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 69 66 20 74 68  looks like if th
6480: 65 20 6d 61 73 6b 20 69 73 20 65 76 65 72 20 6e  e mask is ever n
6490: 6f 6e 2d 7a 65 72 6f 0a 20 20 20 20 20 2a 20 74  on-zero.     * t
64a0: 68 61 74 20 69 74 20 77 69 6c 6c 20 65 6e 74 65  hat it will ente
64b0: 72 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f  r an infinite lo
64c0: 6f 70 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  op..     *.     
64d0: 2a 20 4e 6f 74 69 66 79 20 74 68 65 20 75 70 70  * Notify the upp
64e0: 65 72 20 63 68 61 6e 6e 65 6c 20 6f 66 20 74 68  er channel of th
64f0: 65 20 63 75 72 72 65 6e 74 20 42 49 4f 20 73 74  e current BIO st
6500: 61 74 65 20 73 6f 20 74 68 65 20 65 76 65 6e 74  ate so the event
6510: 0a 20 20 20 20 20 2a 20 63 6f 6e 74 69 6e 75 65  .     * continue
6520: 73 20 74 6f 20 70 72 6f 70 61 67 61 74 65 20 75  s to propagate u
6530: 70 20 74 68 65 20 63 68 61 69 6e 2e 0a 20 20 20  p the chain..   
6540: 20 20 2a 0a 20 20 20 20 20 2a 20 73 74 61 6e 74    *.     * stant
6550: 6f 6e 3a 20 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b  on: It looks lik
6560: 65 20 74 68 69 73 20 63 6f 75 6c 64 20 72 65 73  e this could res
6570: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 66 69 6e 69  ult in an infini
6580: 74 65 20 6c 6f 6f 70 20 69 66 0a 20 20 20 20 20  te loop if.     
6590: 2a 20 74 68 65 20 75 70 70 65 72 20 63 68 61 6e  * the upper chan
65a0: 6e 65 6c 20 64 6f 65 73 6e 27 74 20 63 61 75 73  nel doesn't caus
65b0: 65 20 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72  e ChannelHandler
65c0: 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 0a 20   to be removed. 
65d0: 20 20 20 20 2a 20 62 65 66 6f 72 65 20 54 63 6c      * before Tcl
65e0: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 20 63  _NotifyChannel c
65f0: 61 6c 6c 73 20 63 68 61 6e 6e 65 6c 20 68 61 6e  alls channel han
6600: 64 6c 65 72 73 20 6f 6e 20 74 68 65 20 6c 6f 77  dlers on the low
6610: 65 72 20 63 68 61 6e 6e 65 6c 2e 0a 20 20 20 20  er channel..    
6620: 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 54 63 6c   */.    .    Tcl
6630: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73  _NotifyChannel(s
6640: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 6d  tatePtr->self, m
6650: 61 73 6b 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  ask);.    .    i
6660: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
6670: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
6680: 54 6f 6b 65 6e 29 4e 55 4c 4c 29 20 7b 0a 09 54  Token)NULL) {..T
6690: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
66a0: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
66b0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
66c0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f  r->timer = (Tcl_
66d0: 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b  TimerToken)NULL;
66e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
66f0: 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41  mask & TCL_READA
6700: 42 4c 45 29 20 26 26 20 54 63 6c 5f 49 6e 70 75  BLE) && Tcl_Inpu
6710: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50  tBuffered(stateP
6720: 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20 7b  tr->self) > 0) {
6730: 0a 09 2f 2a 0a 09 20 2a 20 44 61 74 61 20 69 73  ../*.. * Data is
6740: 20 77 61 69 74 69 6e 67 2c 20 66 6c 75 73 68 20   waiting, flush 
6750: 69 74 20 6f 75 74 20 69 6e 20 73 68 6f 72 74 20  it out in short 
6760: 74 69 6d 65 0a 09 20 2a 2f 0a 09 73 74 61 74 65  time.. */..state
6770: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c  Ptr->timer = Tcl
6780: 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64  _CreateTimerHand
6790: 6c 65 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41  ler(TLS_TCL_DELA
67a0: 59 2c 0a 09 09 54 6c 73 43 68 61 6e 6e 65 6c 48  Y,...TlsChannelH
67b0: 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 6c  andlerTimer, (Cl
67c0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
67d0: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  tr);.    }.    T
67e0: 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69  cl_Release( (Cli
67f0: 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72  entData)statePtr
6800: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
6810: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6840: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
6850: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  TlsChannelHandle
6860: 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09  rTimer --. *. *.
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68a0: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74  *. *.Called by t
68b0: 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d 3e 20  he notifier (-> 
68c0: 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 68 20  timer) to flush 
68d0: 6f 75 74 0a 20 2a 09 69 6e 66 6f 72 6d 61 74 69  out. *.informati
68e0: 6f 6e 20 77 61 69 74 69 6e 67 20 69 6e 20 63 68  on waiting in ch
68f0: 61 6e 6e 65 6c 20 62 75 66 66 65 72 73 2e 0a 20  annel buffers.. 
6900: 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6930: 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66  --*. *. *.Sideef
6940: 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66  fects:. *..As of
6950: 20 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64   'TlsChannelHand
6960: 6c 65 72 27 2e 0a 20 2a 0a 20 2a 09 52 65 73 75  ler'.. *. *.Resu
6970: 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a  lt:. *..None.. *
6980: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a  ---------*. */..
69c0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43  static void TlsC
69d0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d  hannelHandlerTim
69e0: 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  er(ClientData cl
69f0: 69 65 6e 74 44 61 74 61 29 20 7b 0a 09 53 74 61  ientData) {..Sta
6a00: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
6a10: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
6a20: 61 74 61 3b 0a 09 69 6e 74 20 6d 61 73 6b 20 3d  ata;..int mask =
6a30: 20 30 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43   0;...dprintf("C
6a40: 61 6c 6c 65 64 22 29 3b 0a 0a 09 73 74 61 74 65  alled");...state
6a50: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63  Ptr->timer = (Tc
6a60: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
6a70: 4c 4c 3b 0a 0a 09 69 66 20 28 42 49 4f 5f 77 70  LL;...if (BIO_wp
6a80: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d  ending(statePtr-
6a90: 3e 62 69 6f 29 29 20 7b 0a 09 09 64 70 72 69 6e  >bio)) {...dprin
6aa0: 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49  tf("[chan=%p] BI
6ab0: 4f 20 77 72 69 74 61 62 6c 65 22 2c 20 73 74 61  O writable", sta
6ac0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09  tePtr->self);...
6ad0: 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49  .mask |= TCL_WRI
6ae0: 54 41 42 4c 45 3b 0a 09 7d 0a 0a 09 69 66 20 28  TABLE;..}...if (
6af0: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74  BIO_pending(stat
6b00: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09  ePtr->bio)) {...
6b10: 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25  dprintf("[chan=%
6b20: 70 5d 20 42 49 4f 20 72 65 61 64 61 62 6c 65 22  p] BIO readable"
6b30: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
6b40: 29 3b 0a 0a 09 09 6d 61 73 6b 20 7c 3d 20 54 43  );....mask |= TC
6b50: 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 7d 0a 0a  L_READABLE;..}..
6b60: 09 64 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79  .dprintf("Notify
6b70: 69 6e 67 20 6f 75 72 73 65 6c 76 65 73 22 29 3b  ing ourselves");
6b80: 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e  ..Tcl_NotifyChan
6b90: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65  nel(statePtr->se
6ba0: 6c 66 2c 20 6d 61 73 6b 29 3b 0a 0a 09 64 70 72  lf, mask);...dpr
6bb0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22  intf("Returning"
6bc0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
6bd0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 54 6c 73 5f  Tcl_Channel Tls_
6be0: 47 65 74 50 61 72 65 6e 74 28 53 74 61 74 65 20  GetParent(State 
6bf0: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 6d  *statePtr, int m
6c00: 61 73 6b 46 6c 61 67 73 29 20 7b 0a 09 64 70 72  askFlags) {..dpr
6c10: 69 6e 74 66 28 22 52 65 71 75 65 73 74 65 64 20  intf("Requested 
6c20: 74 6f 20 67 65 74 20 70 61 72 65 6e 74 20 6f 66  to get parent of
6c30: 20 63 68 61 6e 6e 65 6c 20 25 70 22 2c 20 73 74   channel %p", st
6c40: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a  atePtr->self);..
6c50: 09 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e  .if ((statePtr->
6c60: 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 46 6c 61  flags & ~maskFla
6c70: 67 73 29 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41  gs) & TLS_TCL_FA
6c80: 53 54 50 41 54 48 29 20 7b 0a 09 09 64 70 72 69  STPATH) {...dpri
6c90: 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 67 65  ntf("Asked to ge
6ca0: 74 20 74 68 65 20 70 61 72 65 6e 74 20 63 68 61  t the parent cha
6cb0: 6e 6e 65 6c 20 77 68 69 6c 65 20 77 65 20 61 72  nnel while we ar
6cc0: 65 20 75 73 69 6e 67 20 46 61 73 74 50 61 74 68  e using FastPath
6cd0: 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 4e 55   -- returning NU
6ce0: 4c 4c 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 4e  LL");...return(N
6cf0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ULL);..}...retur
6d00: 6e 28 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64  n(Tcl_GetStacked
6d10: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72  Channel(statePtr
6d20: 2d 3e 73 65 6c 66 29 29 3b 0a 7d 0a              ->self));.}.