Hex Artifact Content

Artifact 30eb8c78b014ba49511014a79a9f3ff8c7c8599489aa80276f33d929c3cd51eb:


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 20 20 20 20 74 63 6c 53 53 4c 20 28  :. *    tclSSL (
0250: 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c  Colin McCormack,
0260: 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f   Shared Technolo
0270: 67 79 29 0a 20 2a 20 20 20 20 53 53 4c 74 63 6c  gy). *    SSLtcl
0280: 20 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a   (Peter Antman).
0290: 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65   *. */..#include
02a0: 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63   "tlsInt.h".#inc
02b0: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a  lude <errno.h>..
02c0: 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65  /*. * Forward de
02d0: 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 73  clarations. */.s
02e0: 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 68  tatic void TlsCh
02f0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65  annelHandlerTime
0300: 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  r(ClientData cli
0310: 65 6e 74 44 61 74 61 29 3b 0a 0a 2f 2a 0a 20 2a  entData);../*. *
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 42 6c 6f  ---. *. * TlsBlo
0370: 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a  ckModeProc --. *
0380: 0a 20 2a 20 20 20 20 54 68 69 73 20 70 72 6f 63  . *    This proc
0390: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
03a0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
03b0: 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20  IO level. *     
03c0: 20 20 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e    to set blockin
03d0: 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e  g and nonblockin
03e0: 67 20 6d 6f 64 65 73 0a 20 2a 0a 20 2a 20 52 65  g modes. *. * Re
03f0: 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 30 20 69  sults:. *    0 i
0400: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
0410: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65  POSIX error code
0420: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20   if failed.. *. 
0430: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0440: 20 2a 20 20 20 20 53 65 74 73 20 74 68 65 20 64   *    Sets the d
0450: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b  evice into block
0460: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69  ing or nonblocki
0470: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d  ng mode.. *. *--
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04c0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
04d0: 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f   TlsBlockModePro
04e0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
04f0: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d  tanceData, int m
0500: 6f 64 65 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ode) {.    State
0510: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
0520: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
0530: 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f  ata;..    if (mo
0540: 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e  de == TCL_MODE_N
0550: 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73  ONBLOCKING) {..s
0560: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
0570: 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b  = TLS_TCL_ASYNC;
0580: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
0590: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
05a0: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  = ~(TLS_TCL_ASYN
05b0: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  C);.    }.    re
05c0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 20  turn(0);.}../*. 
05d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c  ----. *. * TlsCl
0620: 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  oseProc --. *. *
0630: 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 64 75      This procedu
0640: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  re is invoked by
0650: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20   the generic IO 
0660: 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d  level to perform
0670: 0a 20 2a 20 20 20 20 63 68 61 6e 6e 65 6c 2d 74  . *    channel-t
0680: 79 70 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65  ype-specific cle
0690: 61 6e 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  anup when a SSL 
06a0: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
06b0: 6e 6e 65 6c 0a 20 2a 20 20 20 20 69 73 20 63 6c  nnel. *    is cl
06c0: 6f 73 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 4e  osed.. *. *    N
06d0: 6f 74 65 3a 20 77 65 20 6c 65 61 76 65 20 74 68  ote: we leave th
06e0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 6f 63  e underlying soc
06f0: 6b 65 74 20 61 6c 6f 6e 65 2c 20 69 73 20 74 68  ket alone, is th
0700: 69 73 20 72 69 67 68 74 3f 0a 20 2a 0a 20 2a 20  is right?. *. * 
0710: 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 30  Results:. *    0
0720: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
0730: 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f  r POSIX error co
0740: 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a  de if failed.. *
0750: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
0760: 3a 0a 20 2a 20 20 20 20 43 6c 6f 73 65 73 20 74  :. *    Closes t
0770: 68 65 20 73 6f 63 6b 65 74 20 6f 66 20 74 68 65  he socket of the
0780: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
07e0: 74 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 43  t TlsCloseProc(C
07f0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
0800: 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ceData, Tcl_Inte
0810: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp *interp) {.  
0820: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
0830: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e  r = (State *) in
0840: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20  stanceData;.    
0850: 28 76 6f 69 64 29 20 69 6e 74 65 72 70 3b 0a 0a  (void) interp;..
0860: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73      dprintf("Tls
0870: 43 6c 6f 73 65 50 72 6f 63 28 25 70 29 22 2c 20  CloseProc(%p)", 
0880: 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74  (void *) statePt
0890: 72 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65  r);..    Tls_Cle
08a0: 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  an(statePtr);.  
08b0: 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79    Tcl_Eventually
08c0: 46 72 65 65 28 28 43 6c 69 65 6e 74 44 61 74 61  Free((ClientData
08d0: 29 73 74 61 74 65 50 74 72 2c 20 54 6c 73 5f 46  )statePtr, Tls_F
08e0: 72 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ree);.    return
08f0: 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  (0);.}..static i
0900: 6e 74 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63  nt TlsClose2Proc
0910: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
0920: 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a 20  anceData,    /* 
0930: 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 65  The socket state
0940: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74  . */.    Tcl_Int
0950: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a  erp *interp,../*
0960: 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 61   For errors - ca
0970: 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  n be NULL. */.  
0980: 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09 09 2f    int flags).../
0990: 2a 20 46 6c 61 67 73 20 74 6f 20 63 6c 6f 73 65  * Flags to close
09a0: 20 72 65 61 64 20 61 6e 64 2f 6f 72 20 77 72 69   read and/or wri
09b0: 74 65 20 73 69 64 65 20 6f 66 20 63 68 61 6e 6e  te side of chann
09c0: 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74  el */.{.    Stat
09d0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
09e0: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65  tate *) instance
09f0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
0a00: 74 66 28 22 54 6c 73 43 6c 6f 73 65 32 50 72 6f  tf("TlsClose2Pro
0a10: 63 28 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29  c(%p)", (void *)
0a20: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
0a30: 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 28 54   if ((flags & (T
0a40: 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 7c 54 43  CL_CLOSE_READ|TC
0a50: 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 29 20  L_CLOSE_WRITE)) 
0a60: 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 6e 20  == 0) {..return 
0a70: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73  TlsCloseProc(ins
0a80: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 65 72  tanceData, inter
0a90: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  p);.    }.    re
0aa0: 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a  turn EINVAL;.}..
0ab0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
0af0: 20 2a 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f   * Tls_WaitForCo
0b00: 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a 20 2a 20 52  nnect --. *. * R
0b10: 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 30 20 69  esult:. *    0 i
0b20: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2d 31  f successful, -1
0b30: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20   if failed.. *. 
0b40: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0b50: 20 2a 20 20 20 20 49 73 73 75 65 73 20 53 53 4c   *    Issues SSL
0b60: 5f 61 63 63 65 70 74 20 6f 72 20 53 53 4c 5f 63  _accept or SSL_c
0b70: 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  onnect. *. *----
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bb0: 2d 2d 2a 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f  --*. */.int Tls_
0bc0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 53  WaitForConnect(S
0bd0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
0be0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
0bf0: 72 2c 20 69 6e 74 20 68 61 6e 64 73 68 61 6b 65  r, int handshake
0c00: 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61 6e 65  FailureIsPermane
0c10: 6e 74 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e  nt) {.    unsign
0c20: 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 45  ed long backingE
0c30: 72 72 6f 72 3b 0a 20 20 20 20 69 6e 74 20 65 72  rror;.    int er
0c40: 72 2c 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 62  r, rc;.    int b
0c50: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 3b 0a 20  ioShouldRetry;. 
0c60: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
0c70: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
0c80: 74 66 28 22 57 61 69 74 46 6f 72 43 6f 6e 6e 65  tf("WaitForConne
0c90: 63 74 28 25 70 29 22 2c 20 28 76 6f 69 64 20 2a  ct(%p)", (void *
0ca0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
0cb0: 20 64 70 72 69 6e 74 46 6c 61 67 73 28 73 74 61   dprintFlags(sta
0cc0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20  tePtr);..    if 
0cd0: 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  (!(statePtr->fla
0ce0: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  gs & TLS_TCL_INI
0cf0: 54 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  T)) {..dprintf("
0d00: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
0d10: 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 72  ct called on alr
0d20: 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
0d30: 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72 65 74 75   channel -- retu
0d40: 72 6e 69 6e 67 20 77 69 74 68 20 69 6d 6d 65 64  rning with immed
0d50: 69 61 74 65 20 73 75 63 63 65 73 73 22 29 3b 0a  iate success");.
0d60: 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20  .return(0);.    
0d70: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
0d80: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
0d90: 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46  _TCL_HANDSHAKE_F
0da0: 41 49 4c 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a  AILED) {../*.. *
0db0: 20 44 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   Different types
0dc0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 68   of operations h
0dd0: 61 76 65 20 64 69 66 66 65 72 65 6e 74 20 72 65  ave different re
0de0: 71 75 69 72 65 6d 65 6e 74 73 0a 09 20 2a 20 53  quirements.. * S
0df0: 53 4c 20 62 65 69 6e 67 20 65 73 74 61 62 6c 69  SL being establi
0e00: 73 68 65 64 0a 09 20 2a 2f 0a 09 69 66 20 28 68  shed.. */..if (h
0e10: 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65 49  andshakeFailureI
0e20: 73 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 20  sPermanent) {.. 
0e30: 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65     dprintf("Aske
0e40: 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20  d to wait for a 
0e50: 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68  TLS handshake th
0e60: 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66  at has already f
0e70: 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e  ailed.  Returnin
0e80: 67 20 66 61 74 61 6c 20 65 72 72 6f 72 22 29 3b  g fatal error");
0e90: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
0ea0: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54  Ptr = ECONNABORT
0eb0: 45 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ED;..} else {.. 
0ec0: 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65     dprintf("Aske
0ed0: 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20  d to wait for a 
0ee0: 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68  TLS handshake th
0ef0: 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66  at has already f
0f00: 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e  ailed.  Returnin
0f10: 67 20 73 6f 66 74 20 65 72 72 6f 72 22 29 3b 0a  g soft error");.
0f20: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
0f30: 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b  tr = ECONNRESET;
0f40: 0a 09 7d 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b  ..}..return(-1);
0f50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20  .    }..    for 
0f60: 28 3b 3b 29 20 7b 0a 09 2f 2a 20 4e 6f 74 20 69  (;;) {../* Not i
0f70: 6e 69 74 69 61 6c 69 7a 65 64 20 79 65 74 21 20  nitialized yet! 
0f80: 41 6c 73 6f 20 63 61 6c 6c 73 20 53 53 4c 5f 64  Also calls SSL_d
0f90: 6f 5f 68 61 6e 64 73 68 61 6b 65 2e 20 2a 2f 0a  o_handshake. */.
0fa0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66  .if (statePtr->f
0fb0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53  lags & TLS_TCL_S
0fc0: 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 64 70  ERVER) {..    dp
0fd0: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53  rintf("Calling S
0fe0: 53 4c 5f 61 63 63 65 70 74 28 29 22 29 3b 0a 09  SL_accept()");..
0ff0: 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 61 63      err = SSL_ac
1000: 63 65 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73  cept(statePtr->s
1010: 73 6c 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a  sl);...} else {.
1020: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
1030: 6c 6c 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e 65 63  lling SSL_connec
1040: 74 28 29 22 29 3b 0a 09 20 20 20 20 65 72 72 20  t()");..    err 
1050: 3d 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 73 74  = SSL_connect(st
1060: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d  atePtr->ssl);..}
1070: 0a 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29 20  ...if (err > 0) 
1080: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
1090: 54 68 61 74 20 73 65 65 6d 73 20 74 6f 20 68 61  That seems to ha
10a0: 76 65 20 67 6f 6e 65 20 6f 6b 61 79 22 29 3b 0a  ve gone okay");.
10b0: 0a 09 20 20 20 20 65 72 72 20 3d 20 42 49 4f 5f  ..    err = BIO_
10c0: 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e  flush(statePtr->
10d0: 62 69 6f 29 3b 0a 09 20 20 20 20 69 66 20 28 65  bio);..    if (e
10e0: 72 72 20 3c 3d 20 30 29 20 7b 0a 09 09 64 70 72  rr <= 0) {...dpr
10f0: 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 74  intf("Flushing t
1100: 68 65 20 6c 6f 77 65 72 20 6c 61 79 65 72 73 20  he lower layers 
1110: 66 61 69 6c 65 64 2c 20 74 68 69 73 20 77 69 6c  failed, this wil
1120: 6c 20 70 72 6f 62 61 62 6c 79 20 74 65 72 6d 69  l probably termi
1130: 6e 61 74 65 20 74 68 69 73 20 73 65 73 73 69 6f  nate this sessio
1140: 6e 22 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  n");..    }..}..
1150: 09 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72  .rc = SSL_get_er
1160: 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ror(statePtr->ss
1170: 6c 2c 20 65 72 72 29 3b 0a 0a 09 64 70 72 69 6e  l, err);...dprin
1180: 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a 20 25  tf("Got error: %
1190: 69 20 28 72 63 20 3d 20 25 69 29 22 2c 20 65 72  i (rc = %i)", er
11a0: 72 2c 20 72 63 29 3b 0a 09 64 70 72 69 6e 74 66  r, rc);..dprintf
11b0: 28 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 73 22  ("Got error: %s"
11c0: 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72  , ERR_reason_err
11d0: 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65  or_string(ERR_ge
11e0: 74 5f 65 72 72 6f 72 28 29 29 29 3b 0a 0a 09 62  t_error()));...b
11f0: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20  ioShouldRetry = 
1200: 30 3b 0a 09 69 66 20 28 65 72 72 20 3c 3d 20 30  0;..if (err <= 0
1210: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 72 63 20  ) {..    if (rc 
1220: 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  == SSL_ERROR_WAN
1230: 54 5f 43 4f 4e 4e 45 43 54 20 7c 7c 20 72 63 20  T_CONNECT || rc 
1240: 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  == SSL_ERROR_WAN
1250: 54 5f 41 43 43 45 50 54 20 7c 7c 20 72 63 20 3d  T_ACCEPT || rc =
1260: 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  = SSL_ERROR_WANT
1270: 5f 52 45 41 44 20 7c 7c 20 72 63 20 3d 3d 20 53  _READ || rc == S
1280: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52  SL_ERROR_WANT_WR
1290: 49 54 45 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75  ITE) {...bioShou
12a0: 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20  ldRetry = 1;..  
12b0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 42 49 4f    } else if (BIO
12c0: 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 74  _should_retry(st
12d0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a  atePtr->bio)) {.
12e0: 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79  ..bioShouldRetry
12f0: 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73   = 1;..    } els
1300: 65 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f  e if (rc == SSL_
1310: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 20 26 26  ERROR_SYSCALL &&
1320: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 20   Tcl_GetErrno() 
1330: 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 09 62  == EAGAIN) {...b
1340: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20  ioShouldRetry = 
1350: 31 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73  1;..    }..} els
1360: 65 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53  e {..    if (!SS
1370: 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68  L_is_init_finish
1380: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
1390: 29 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64  )) {...bioShould
13a0: 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20  Retry = 1;..    
13b0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 62 69 6f 53 68  }..}...if (bioSh
13c0: 6f 75 6c 64 52 65 74 72 79 29 20 7b 0a 09 20 20  ouldRetry) {..  
13d0: 20 20 64 70 72 69 6e 74 66 28 22 54 68 65 20 49    dprintf("The I
13e0: 2f 4f 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c  /O did not compl
13f0: 65 74 65 20 2d 2d 20 62 75 74 20 77 65 20 73 68  ete -- but we sh
1400: 6f 75 6c 64 20 74 72 79 20 69 74 20 61 67 61 69  ould try it agai
1410: 6e 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 73  n");...    if (s
1420: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
1430: 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20   TLS_TCL_ASYNC) 
1440: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 52 65 74  {...dprintf("Ret
1450: 75 72 6e 69 6e 67 20 45 41 47 41 49 4e 20 73 6f  urning EAGAIN so
1460: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
1470: 72 65 74 72 69 65 64 20 6c 61 74 65 72 22 29 3b  retried later");
1480: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
1490: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 09 72 65 74   = EAGAIN;...ret
14a0: 75 72 6e 28 2d 31 29 3b 0a 09 20 20 20 20 7d 20  urn(-1);..    } 
14b0: 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66  else {...dprintf
14c0: 28 22 44 6f 69 6e 67 20 73 6f 20 6e 6f 77 22 29  ("Doing so now")
14d0: 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20  ;...continue;.. 
14e0: 20 20 20 7d 0a 09 7d 0a 0a 09 64 70 72 69 6e 74     }..}...dprint
14f0: 66 28 22 57 65 20 68 61 76 65 20 65 69 74 68 65  f("We have eithe
1500: 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 73 74  r completely est
1510: 61 62 6c 69 73 68 65 64 20 74 68 65 20 73 65 73  ablished the ses
1520: 73 69 6f 6e 20 6f 72 20 63 6f 6d 70 6c 65 74 65  sion or complete
1530: 6c 79 20 66 61 69 6c 65 64 20 69 74 20 2d 2d 20  ly failed it -- 
1540: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65  there is no more
1550: 20 6e 65 65 64 20 74 6f 20 65 76 65 72 20 72 65   need to ever re
1560: 74 72 79 20 69 74 20 74 68 6f 75 67 68 22 29 3b  try it though");
1570: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
1580: 20 20 20 20 73 77 69 74 63 68 20 28 72 63 29 20      switch (rc) 
1590: 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  {..case SSL_ERRO
15a0: 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20  R_NONE:..    /* 
15b0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  The connection i
15c0: 73 20 75 70 2c 20 77 65 20 61 72 65 20 64 6f 6e  s up, we are don
15d0: 65 20 68 65 72 65 20 2a 2f 0a 09 20 20 20 20 64  e here */..    d
15e0: 70 72 69 6e 74 66 28 22 54 68 65 20 63 6f 6e 6e  printf("The conn
15f0: 65 63 74 69 6f 6e 20 69 73 20 75 70 22 29 3b 0a  ection is up");.
1600: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1610: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 72 65  tr = 0;..    bre
1620: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
1630: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e  RROR_ZERO_RETURN
1640: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  :..    dprintf("
1650: 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52  SSL_ERROR_ZERO_R
1660: 45 54 55 52 4e 3a 20 43 6f 6e 6e 65 63 74 20 72  ETURN: Connect r
1670: 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
1680: 69 64 20 76 61 6c 75 65 2e 2e 2e 22 29 3b 0a 09  id value...");..
1690: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
16a0: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20  r = EINVAL;..   
16b0: 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 0a 09 63   return(-1);...c
16c0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59  ase SSL_ERROR_SY
16d0: 53 43 41 4c 4c 3a 0a 09 20 20 20 20 62 61 63 6b  SCALL:..    back
16e0: 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67  ingError = ERR_g
16f0: 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 20 20  et_error();...  
1700: 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72    if (backingErr
1710: 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20 3d  or == 0 && err =
1720: 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66  = 0) {...dprintf
1730: 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a  ("EOF reached").
1740: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
1750: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 20  = ECONNRESET;.. 
1760: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61     } else if (ba
1770: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20  ckingError == 0 
1780: 26 26 20 65 72 72 20 3d 3d 20 2d 31 29 20 7b 0a  && err == -1) {.
1790: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65  ..dprintf("I/O e
17a0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65  rror occurred (e
17b0: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75  rrno = %lu)", (u
17c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63  nsigned long) Tc
17d0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09  l_GetErrno());..
17e0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
17f0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b   Tcl_GetErrno();
1800: 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64  ...if (*errorCod
1810: 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53  ePtr == ECONNRES
1820: 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72  ET) {...    *err
1830: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e  orCodePtr = ECON
1840: 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 20  NABORTED;...}.. 
1850: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70     } else {...dp
1860: 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72  rintf("I/O error
1870: 20 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b 69   occurred (backi
1880: 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c  ngError = %lu)",
1890: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a   backingError);.
18a0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
18b0: 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a  = backingError;.
18c0: 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65  ..if (*errorCode
18d0: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45  Ptr == ECONNRESE
18e0: 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 6f  T) {...    *erro
18f0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e  rCodePtr = ECONN
1900: 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 20 20  ABORTED;...}..  
1910: 20 20 7d 0a 0a 09 20 20 20 20 73 74 61 74 65 50    }...    stateP
1920: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
1930: 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46  _TCL_HANDSHAKE_F
1940: 41 49 4c 45 44 3b 0a 09 20 20 20 20 72 65 74 75  AILED;..    retu
1950: 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 73 65 20 53  rn(-1);...case S
1960: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20  SL_ERROR_SSL:.. 
1970: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
1980: 70 65 72 6d 61 6e 65 6e 74 20 66 61 74 61 6c 20  permanent fatal 
1990: 53 53 4c 20 65 72 72 6f 72 2c 20 61 62 6f 72 74  SSL error, abort
19a0: 69 6e 67 20 69 6d 6d 65 64 69 61 74 65 6c 79 22  ing immediately"
19b0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  );..    Tls_Erro
19c0: 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 61  r(statePtr, (cha
19d0: 72 20 2a 29 45 52 52 5f 72 65 61 73 6f 6e 5f 65  r *)ERR_reason_e
19e0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f  rror_string(ERR_
19f0: 67 65 74 5f 65 72 72 6f 72 28 29 29 29 3b 0a 09  get_error()));..
1a00: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
1a10: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48  ags |= TLS_TCL_H
1a20: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b  ANDSHAKE_FAILED;
1a30: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
1a40: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54  Ptr = ECONNABORT
1a50: 45 44 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28  ED;..    return(
1a60: 2d 31 29 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  -1);...case SSL_
1a70: 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45  ERROR_WANT_CONNE
1a80: 43 54 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  CT:..case SSL_ER
1a90: 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 3a  ROR_WANT_ACCEPT:
1aa0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
1ab0: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55  _WANT_X509_LOOKU
1ac0: 50 3a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  P:..default:..  
1ad0: 20 20 64 70 72 69 6e 74 66 28 22 57 65 20 67 6f    dprintf("We go
1ae0: 74 20 61 20 63 6f 6e 66 75 73 69 6e 67 20 72 65  t a confusing re
1af0: 70 6c 79 3a 20 25 69 22 2c 20 72 63 29 3b 0a 09  ply: %i", rc);..
1b00: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
1b10: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  r = Tcl_GetErrno
1b20: 28 29 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ();..    dprintf
1b30: 28 22 45 52 52 28 25 64 2c 20 25 64 29 20 22 2c  ("ERR(%d, %d) ",
1b40: 20 72 63 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50   rc, *errorCodeP
1b50: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
1b60: 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  (-1);.    }..#if
1b70: 20 30 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   0.    if (state
1b80: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
1b90: 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09  _TCL_SERVER) {..
1ba0: 64 70 72 69 6e 74 66 28 22 54 68 69 73 20 69 73  dprintf("This is
1bb0: 20 61 6e 20 54 4c 53 20 73 65 72 76 65 72 2c 20   an TLS server, 
1bc0: 63 68 65 63 6b 69 6e 67 20 74 68 65 20 63 65 72  checking the cer
1bd0: 74 69 66 69 63 61 74 65 20 66 6f 72 20 74 68 65  tificate for the
1be0: 20 70 65 65 72 22 29 3b 0a 0a 09 65 72 72 20 3d   peer");...err =
1bf0: 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
1c00: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
1c10: 3e 73 73 6c 29 3b 0a 09 69 66 20 28 65 72 72 20  >ssl);..if (err 
1c20: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a  != X509_V_OK) {.
1c30: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 49 6e  .    dprintf("In
1c40: 76 61 6c 69 64 20 63 65 72 74 69 66 69 63 61 74  valid certificat
1c50: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
1c60: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 20 20 20  failure");...   
1c70: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65   Tls_Error(state
1c80: 50 74 72 2c 20 28 63 68 61 72 20 2a 29 58 35 30  Ptr, (char *)X50
1c90: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
1ca0: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 29  ror_string(err))
1cb0: 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
1cc0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
1cd0: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c  L_HANDSHAKE_FAIL
1ce0: 45 44 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ED;..    *errorC
1cf0: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42  odePtr = ECONNAB
1d00: 4f 52 54 45 44 3b 0a 09 20 20 20 20 72 65 74 75  ORTED;..    retu
1d10: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d  rn(-1);..}.    }
1d20: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 64 70 72  .#endif..    dpr
1d30: 69 6e 74 66 28 22 52 65 6d 6f 76 69 6e 67 20 74  intf("Removing t
1d40: 68 65 20 5c 22 54 4c 53 5f 54 43 4c 5f 49 4e 49  he \"TLS_TCL_INI
1d50: 54 5c 22 20 66 6c 61 67 20 73 69 6e 63 65 20 77  T\" flag since w
1d60: 65 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64  e have completed
1d70: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 22 29   the handshake")
1d80: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
1d90: 66 6c 61 67 73 20 26 3d 20 7e 54 4c 53 5f 54 43  flags &= ~TLS_TC
1da0: 4c 5f 49 4e 49 54 3b 0a 0a 20 20 20 20 64 70 72  L_INIT;..    dpr
1db0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
1dc0: 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 20 20  in success");.  
1dd0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
1de0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 28  = 0;.    return(
1df0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  0);.}../*. *----
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1e40: 20 2a 0a 20 2a 20 54 6c 73 49 6e 70 75 74 50 72   *. * TlsInputPr
1e50: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54  oc --. *. *    T
1e60: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
1e70: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
1e80: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c  generic IO level
1e90: 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 72 65 61  . *       to rea
1ea0: 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 20 53  d input from a S
1eb0: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
1ec0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52  channel.. *. * R
1ed0: 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 52 65  esults:. *    Re
1ee0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
1ef0: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 6f   of bytes read o
1f00: 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 53  r -1 on error. S
1f10: 65 74 73 20 65 72 72 6f 72 43 6f 64 65 50 74 72  ets errorCodePtr
1f20: 0a 20 2a 20 20 20 20 74 6f 20 61 20 50 4f 53 49  . *    to a POSI
1f30: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  X error code if 
1f40: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
1f50: 64 2c 20 6f 72 20 30 20 69 66 20 6e 6f 6e 65 2e  d, or 0 if none.
1f60: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
1f70: 63 74 73 3a 0a 20 2a 20 20 20 20 52 65 61 64 73  cts:. *    Reads
1f80: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
1f90: 69 6e 70 75 74 20 64 65 76 69 63 65 20 6f 66 20  input device of 
1fa0: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  the channel.. *.
1fb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
2000: 20 69 6e 74 20 54 6c 73 49 6e 70 75 74 50 72 6f   int TlsInputPro
2010: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
2020: 74 61 6e 63 65 44 61 74 61 2c 20 63 68 61 72 20  tanceData, char 
2030: 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 53 69 7a  *buf, int bufSiz
2040: 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  e, int *errorCod
2050: 65 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69  ePtr) {.    unsi
2060: 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e  gned long backin
2070: 67 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74  gError;.    Stat
2080: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
2090: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65  tate *) instance
20a0: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79  Data;.    int by
20b0: 74 65 73 52 65 61 64 3b 0a 20 20 20 20 69 6e 74  tesRead;.    int
20c0: 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 20 20 20   tlsConnect;.   
20d0: 20 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 20 2a   int err;..    *
20e0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
20f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
2100: 42 49 4f 5f 72 65 61 64 28 25 64 29 22 2c 20 62  BIO_read(%d)", b
2110: 75 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  ufSize);..    if
2120: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
2130: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  s & TLS_TCL_CALL
2140: 42 41 43 4b 29 20 7b 0a 09 2f 2a 20 64 6f 6e 27  BACK) {../* don'
2150: 74 20 70 72 6f 63 65 73 73 20 61 6e 79 20 62 79  t process any by
2160: 74 65 73 20 77 68 69 6c 65 20 76 65 72 69 66 79  tes while verify
2170: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e   callback is run
2180: 6e 69 6e 67 20 2a 2f 0a 09 64 70 72 69 6e 74 66  ning */..dprintf
2190: 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 72 75  ("Callback is ru
21a0: 6e 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 20 30  nning, reading 0
21b0: 20 62 79 74 65 73 22 29 3b 0a 09 72 65 74 75 72   bytes");..retur
21c0: 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n(0);.    }..   
21d0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e   dprintf("Callin
21e0: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  g Tls_WaitForCon
21f0: 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c 73 43  nect");.    tlsC
2200: 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69  onnect = Tls_Wai
2210: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74  tForConnect(stat
2220: 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50  ePtr, errorCodeP
2230: 74 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28  tr, 0);.    if (
2240: 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20  tlsConnect < 0) 
2250: 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20  {..dprintf("Got 
2260: 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67  an error waiting
2270: 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73   to connect (tls
2280: 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65  Connect = %i, *e
2290: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69  rrorCodePtr = %i
22a0: 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20  )", tlsConnect, 
22b0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a  *errorCodePtr);.
22c0: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65  .Tls_Error(state
22d0: 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28 2a 65  Ptr, strerror(*e
22e0: 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a  rrorCodePtr));..
22f0: 09 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b  .bytesRead = -1;
2300: 0a 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65  ..if (*errorCode
2310: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45  Ptr == ECONNRESE
2320: 54 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  T) {..    dprint
2330: 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f  f("Got connectio
2340: 6e 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 20  n reset");..    
2350: 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09  /* Soft EOF */..
2360: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2370: 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 65  r = 0;..    byte
2380: 73 52 65 61 64 20 3d 20 30 3b 0a 09 7d 0a 09 72  sRead = 0;..}..r
2390: 65 74 75 72 6e 28 62 79 74 65 73 52 65 61 64 29  eturn(bytesRead)
23a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
23b0: 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74       * We need t
23c0: 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20  o clear the SSL 
23d0: 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20  error stack now 
23e0: 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74  because we somet
23f0: 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 20  imes reach.     
2400: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2410: 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72  with leftover er
2420: 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63  rors in the stac
2430: 6b 2e 20 20 49 66 20 42 49 4f 5f 72 65 61 64 0a  k.  If BIO_read.
2440: 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d       * returns -
2450: 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41  1 and intends EA
2460: 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61  GAIN, there is a
2470: 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c   leftover error,
2480: 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20   it will be.    
2490: 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20   * misconstrued 
24a0: 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74  as an error, not
24b0: 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a   EAGAIN..     *.
24c0: 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69       * Alternati
24d0: 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e  vely, we may wan
24e0: 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  t to handle the 
24f0: 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  <0 return codes 
2500: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f  from.     * BIO_
2510: 72 65 61 64 20 73 70 65 63 69 61 6c 6c 79 20 28  read specially (
2520: 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 68  as advised in th
2530: 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c  e RSA docs).  TL
2540: 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 20  S's lower level 
2550: 42 49 4f 0a 20 20 20 20 20 2a 20 66 75 6e 63 74  BIO.     * funct
2560: 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 74  ions play with t
2570: 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 74  he retry flags t
2580: 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 20  hough, and this 
2590: 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 0a 20 20  seems to work.  
25a0: 20 20 20 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20     * correctly. 
25b0: 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e 20   Similar fix in 
25c0: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e 20 2d  TlsOutputProc. -
25d0: 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20   hobbs.     */. 
25e0: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
25f0: 6f 72 28 29 3b 0a 20 20 20 20 62 79 74 65 73 52  or();.    bytesR
2600: 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73  ead = BIO_read(s
2610: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75  tatePtr->bio, bu
2620: 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20  f, bufSize);.   
2630: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65   dprintf("BIO_re
2640: 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73  ad -> %d", bytes
2650: 52 65 61 64 29 3b 0a 0a 20 20 20 20 65 72 72 20  Read);..    err 
2660: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28  = SSL_get_error(
2670: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62  statePtr->ssl, b
2680: 79 74 65 73 52 65 61 64 29 3b 0a 0a 23 69 66 20  ytesRead);..#if 
2690: 30 0a 20 20 20 20 69 66 20 28 62 79 74 65 73 52  0.    if (bytesR
26a0: 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 69 66 20  ead <= 0) {..if 
26b0: 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72  (BIO_should_retr
26c0: 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  y(statePtr->bio)
26d0: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
26e0: 28 22 49 2f 4f 20 66 61 69 6c 65 64 2c 20 77 69  ("I/O failed, wi
26f0: 6c 6c 20 72 65 74 72 79 20 62 61 73 65 64 20 6f  ll retry based o
2700: 6e 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20  n EAGAIN");..   
2710: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
2720: 20 45 41 47 41 49 4e 3b 0a 09 7d 0a 20 20 20 20   EAGAIN;..}.    
2730: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77  }.#endif..    sw
2740: 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 63 61  itch (err) {..ca
2750: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e  se SSL_ERROR_NON
2760: 45 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 42 75  E:..    dprintBu
2770: 66 66 65 72 28 62 75 66 2c 20 62 79 74 65 73 52  ffer(buf, bytesR
2780: 65 61 64 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  ead);..    break
2790: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
27a0: 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 64 70 72  OR_SSL:..    dpr
27b0: 69 6e 74 66 28 22 53 53 4c 20 6e 65 67 6f 74 69  intf("SSL negoti
27c0: 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 69 6e 64  ation error, ind
27d0: 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
27e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
27f0: 62 65 65 6e 20 61 62 6f 72 74 65 64 22 29 3b 0a  been aborted");.
2800: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28  ..    Tls_Error(
2810: 73 74 61 74 65 50 74 72 2c 20 54 43 4c 54 4c 53  statePtr, TCLTLS
2820: 5f 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 65  _SSL_ERROR(state
2830: 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52  Ptr->ssl, bytesR
2840: 65 61 64 29 29 3b 0a 09 20 20 20 20 2a 65 72 72  ead));..    *err
2850: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e  orCodePtr = ECON
2860: 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 62  NABORTED;..    b
2870: 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09  ytesRead = -1;..
2880: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
2890: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43  e SSL_ERROR_SYSC
28a0: 41 4c 4c 3a 0a 09 20 20 20 20 62 61 63 6b 69 6e  ALL:..    backin
28b0: 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74  gError = ERR_get
28c0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 20 20 20 20  _error();...    
28d0: 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  if (backingError
28e0: 20 3d 3d 20 30 20 26 26 20 62 79 74 65 73 52 65   == 0 && bytesRe
28f0: 61 64 20 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72  ad == 0) {...dpr
2900: 69 6e 74 66 28 22 45 4f 46 20 72 65 61 63 68 65  intf("EOF reache
2910: 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65  d")...*errorCode
2920: 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73  Ptr = 0;...bytes
2930: 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d  Read = 0;..    }
2940: 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e   else if (backin
2950: 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 62  gError == 0 && b
2960: 79 74 65 73 52 65 61 64 20 3d 3d 20 2d 31 29 20  ytesRead == -1) 
2970: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f  {...dprintf("I/O
2980: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2990: 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20  (errno = %lu)", 
29a0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
29b0: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b  Tcl_GetErrno());
29c0: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
29d0: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28   = Tcl_GetErrno(
29e0: 29 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d  );...bytesRead =
29f0: 20 2d 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65   -1;..    } else
2a00: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f   {...dprintf("I/
2a10: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  O error occurred
2a20: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d   (backingError =
2a30: 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45   %lu)", backingE
2a40: 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43  rror);...*errorC
2a50: 6f 64 65 50 74 72 20 3d 20 62 61 63 6b 69 6e 67  odePtr = backing
2a60: 45 72 72 6f 72 3b 0a 09 09 62 79 74 65 73 52 65  Error;...bytesRe
2a70: 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 0a  ad = -1;..    }.
2a80: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
2a90: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52  se SSL_ERROR_ZER
2aa0: 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 64  O_RETURN:..    d
2ab0: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f  printf("Got SSL_
2ac0: 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52  ERROR_ZERO_RETUR
2ad0: 4e 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e  N, this means an
2ae0: 20 45 4f 46 20 68 61 73 20 62 65 65 6e 20 72 65   EOF has been re
2af0: 61 63 68 65 64 22 29 3b 0a 09 20 20 20 20 62 79  ached");..    by
2b00: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20  tesRead = 0;..  
2b10: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
2b20: 3d 20 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  = 0;..    break;
2b30: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
2b40: 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20  R_WANT_READ:..  
2b50: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53    dprintf("Got S
2b60: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
2b70: 41 44 2c 20 6d 61 70 70 69 6e 67 20 74 68 69 73  AD, mapping this
2b80: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20   to EAGAIN");.. 
2b90: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d     bytesRead = -
2ba0: 31 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  1;..    *errorCo
2bb0: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
2bc0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64 65  .    break;...de
2bd0: 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 69  fault:..    dpri
2be0: 6e 74 66 28 22 55 6e 6b 6e 6f 77 6e 20 65 72 72  ntf("Unknown err
2bf0: 6f 72 20 28 65 72 72 20 3d 20 25 69 29 2c 20 6d  or (err = %i), m
2c00: 61 70 70 69 6e 67 20 74 6f 20 45 4f 46 22 2c 20  apping to EOF", 
2c10: 65 72 72 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  err);..    *erro
2c20: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20  rCodePtr = 0;.. 
2c30: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 30     bytesRead = 0
2c40: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
2c50: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 2a 65 72    }..    if (*er
2c60: 72 6f 72 43 6f 64 65 50 74 72 20 3c 20 30 29 20  rorCodePtr < 0) 
2c70: 7b 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  {..Tls_Error(sta
2c80: 74 65 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28  tePtr, strerror(
2c90: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b  *errorCodePtr));
2ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 70 72 69 6e  .    }.    dprin
2cb0: 74 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d 3e  tf("Input(%d) ->
2cc0: 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 69   %d [%d]", bufSi
2cd0: 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20 2a  ze, bytesRead, *
2ce0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20  errorCodePtr);. 
2cf0: 20 20 20 72 65 74 75 72 6e 28 62 79 74 65 73 52     return(bytesR
2d00: 65 61 64 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ead);.}../*. *--
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70 75  -. *. * TlsOutpu
2d60: 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20  tProc --. *. *  
2d70: 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65    This procedure
2d80: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74   is invoked by t
2d90: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65  he generic IO le
2da0: 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20  vel. *       to 
2db0: 77 72 69 74 65 20 6f 75 74 70 75 74 20 74 6f 20  write output to 
2dc0: 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
2dd0: 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  ed channel.. *. 
2de0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20  * Results:. *   
2df0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   Returns the num
2e00: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
2e10: 74 74 65 6e 20 6f 72 20 2d 31 20 6f 6e 20 65 72  tten or -1 on er
2e20: 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72 43  ror. Sets errorC
2e30: 6f 64 65 50 74 72 0a 20 2a 20 20 20 20 74 6f 20  odePtr. *    to 
2e40: 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f  a POSIX error co
2e50: 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  de if an error o
2e60: 63 63 75 72 72 65 64 2c 20 6f 72 20 30 20 69 66  ccurred, or 0 if
2e70: 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64   none.. *. * Sid
2e80: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20  e effects:. *   
2e90: 20 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 6f   Writes output o
2ea0: 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 65 76  n the output dev
2eb0: 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e  ice of the chann
2ec0: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4f  .static int TlsO
2f20: 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74  utputProc(Client
2f30: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
2f40: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62  a, const char *b
2f50: 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 2c  uf, int toWrite,
2f60: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
2f70: 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e  tr) {.    unsign
2f80: 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 45  ed long backingE
2f90: 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65 20  rror;.    State 
2fa0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
2fb0: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61  te *) instanceDa
2fc0: 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 72 69 74  ta;.    int writ
2fd0: 74 65 6e 2c 20 65 72 72 3b 0a 20 20 20 20 69 6e  ten, err;.    in
2fe0: 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 20  t tlsConnect;.. 
2ff0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
3000: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
3010: 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 70  tf("BIO_write(%p
3020: 2c 20 25 64 29 22 2c 20 28 76 6f 69 64 20 2a 29  , %d)", (void *)
3030: 20 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72 69   statePtr, toWri
3040: 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 42  te);.    dprintB
3050: 75 66 66 65 72 28 62 75 66 2c 20 74 6f 57 72 69  uffer(buf, toWri
3060: 74 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  te);..    if (st
3070: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
3080: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
3090: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 44 6f  ) {..dprintf("Do
30a0: 6e 27 74 20 70 72 6f 63 65 73 73 20 6f 75 74 70  n't process outp
30b0: 75 74 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63  ut while callbac
30c0: 6b 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 22 29  ks are running")
30d0: 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b  ;..written = -1;
30e0: 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
30f0: 3d 20 45 41 47 41 49 4e 3b 0a 09 72 65 74 75 72  = EAGAIN;..retur
3100: 6e 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  n(-1);.    }..  
3110: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69    dprintf("Calli
3120: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
3130: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c 73  nnect");.    tls
3140: 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61  Connect = Tls_Wa
3150: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61  itForConnect(sta
3160: 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65  tePtr, errorCode
3170: 50 74 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  Ptr, 1);.    if 
3180: 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29  (tlsConnect < 0)
3190: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74   {..dprintf("Got
31a0: 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e   an error waitin
31b0: 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c  g to connect (tl
31c0: 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a  sConnect = %i, *
31d0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25  errorCodePtr = %
31e0: 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c  i)", tlsConnect,
31f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b   *errorCodePtr);
3200: 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
3210: 65 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28 2a  ePtr, strerror(*
3220: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a  errorCodePtr));.
3230: 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a  ..written = -1;.
3240: 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50  .if (*errorCodeP
3250: 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54  tr == ECONNRESET
3260: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
3270: 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  ("Got connection
3280: 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 20 2f   reset");..    /
3290: 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 20  * Soft EOF */.. 
32a0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
32b0: 20 3d 20 30 3b 0a 09 20 20 20 20 77 72 69 74 74   = 0;..    writt
32c0: 65 6e 20 3d 20 30 3b 0a 09 7d 0a 09 72 65 74 75  en = 0;..}..retu
32d0: 72 6e 28 77 72 69 74 74 65 6e 29 3b 0a 20 20 20  rn(written);.   
32e0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f 57 72   }..    if (toWr
32f0: 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 72  ite == 0) {..dpr
3300: 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69 74 65  intf("zero-write
3310: 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f 5f 66  ");..err = BIO_f
3320: 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e 62  lush(statePtr->b
3330: 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 3c  io);...if (err <
3340: 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69  = 0) {..    dpri
3350: 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 66 61  ntf("Flushing fa
3360: 69 6c 65 64 22 29 3b 0a 0a 09 20 20 20 20 2a 65  iled");...    *e
3370: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
3380: 4f 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  O;..    written 
3390: 3d 20 30 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  = 0;..    return
33a0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 77 72 69 74 74  (-1);..}...writt
33b0: 65 6e 20 3d 20 30 3b 0a 09 2a 65 72 72 6f 72 43  en = 0;..*errorC
33c0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 72 65 74  odePtr = 0;..ret
33d0: 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  urn(0);.    }.. 
33e0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20     /*.     * We 
33f0: 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68  need to clear th
3400: 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63  e SSL error stac
3410: 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65  k now because we
3420: 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68   sometimes reach
3430: 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e  .     * this fun
3440: 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f  ction with lefto
3450: 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68  ver errors in th
3460: 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f  e stack.  If BIO
3470: 5f 77 72 69 74 65 0a 20 20 20 20 20 2a 20 72 65  _write.     * re
3480: 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74  turns -1 and int
3490: 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65  ends EAGAIN, the
34a0: 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72  re is a leftover
34b0: 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20   error, it will 
34c0: 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e  be.     * miscon
34d0: 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 72  strued as an err
34e0: 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a  or, not EAGAIN..
34f0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c       *.     * Al
3500: 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20  ternatively, we 
3510: 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64  may want to hand
3520: 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e  le the <0 return
3530: 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 20   codes from.    
3540: 20 2a 20 42 49 4f 5f 77 72 69 74 65 20 73 70 65   * BIO_write spe
3550: 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73  cially (as advis
3560: 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f  ed in the RSA do
3570: 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65  cs).  TLS's lowe
3580: 72 20 6c 65 76 65 6c 0a 20 20 20 20 20 2a 20 42  r level.     * B
3590: 49 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61  IO functions pla
35a0: 79 20 77 69 74 68 20 74 68 65 20 72 65 74 72 79  y with the retry
35b0: 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61   flags though, a
35c0: 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f  nd this seems to
35d0: 0a 20 20 20 20 20 2a 20 77 6f 72 6b 20 63 6f 72  .     * work cor
35e0: 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72  rectly.  Similar
35f0: 20 66 69 78 20 69 6e 20 54 6c 73 49 6e 70 75 74   fix in TlsInput
3600: 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20  Proc. - hobbs.  
3610: 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c     */.    ERR_cl
3620: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20  ear_error();.   
3630: 20 77 72 69 74 74 65 6e 20 3d 20 42 49 4f 5f 77   written = BIO_w
3640: 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62  rite(statePtr->b
3650: 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69 74 65  io, buf, toWrite
3660: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
3670: 42 49 4f 5f 77 72 69 74 65 28 25 70 2c 20 25 64  BIO_write(%p, %d
3680: 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28 76 6f 69  ) -> [%d]", (voi
3690: 64 20 2a 29 20 73 74 61 74 65 50 74 72 2c 20 74  d *) statePtr, t
36a0: 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29  oWrite, written)
36b0: 3b 0a 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c  ;..    err = SSL
36c0: 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65  _get_error(state
36d0: 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65  Ptr->ssl, writte
36e0: 6e 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28  n);.    switch (
36f0: 65 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53 4c  err) {..case SSL
3700: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20  _ERROR_NONE:..  
3710: 20 20 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20    if (written < 
3720: 30 29 20 7b 0a 09 09 77 72 69 74 74 65 6e 20 3d  0) {...written =
3730: 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20   0;..    }..    
3740: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
3750: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49  L_ERROR_WANT_WRI
3760: 54 45 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66  TE:..    dprintf
3770: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
3780: 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d 61 70 70  WANT_WRITE, mapp
3790: 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e  ing it to EAGAIN
37a0: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
37b0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
37c0: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ..    written = 
37d0: 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -1;..    break;.
37e0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
37f0: 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20  _WANT_READ:..   
3800: 20 64 70 72 69 6e 74 66 28 22 20 77 72 69 74 65   dprintf(" write
3810: 20 52 20 42 4c 4f 43 4b 22 29 3b 0a 09 20 20 20   R BLOCK");..   
3820: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
3830: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
3840: 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20  09_LOOKUP:..    
3850: 64 70 72 69 6e 74 66 28 22 20 77 72 69 74 65 20  dprintf(" write 
3860: 58 20 42 4c 4f 43 4b 22 29 3b 0a 09 20 20 20 20  X BLOCK");..    
3870: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
3880: 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54  L_ERROR_ZERO_RET
3890: 55 52 4e 3a 0a 09 20 20 20 20 64 70 72 69 6e 74  URN:..    dprint
38a0: 66 28 22 20 63 6c 6f 73 65 64 22 29 3b 0a 09 20  f(" closed");.. 
38b0: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a     written = 0;.
38c0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
38d0: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 72 65  tr = 0;..    bre
38e0: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
38f0: 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20  RROR_SYSCALL:.. 
3900: 20 20 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 20     backingError 
3910: 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28  = ERR_get_error(
3920: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63  );...    if (bac
3930: 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26  kingError == 0 &
3940: 26 20 77 72 69 74 74 65 6e 20 3d 3d 20 30 29 20  & written == 0) 
3950: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46  {...dprintf("EOF
3960: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72   reached")...*er
3970: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
3980: 09 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09  ..written = 0;..
3990: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62      } else if (b
39a0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30  ackingError == 0
39b0: 20 26 26 20 77 72 69 74 74 65 6e 20 3d 3d 20 2d   && written == -
39c0: 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  1) {...dprintf("
39d0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72  I/O error occurr
39e0: 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29  ed (errno = %lu)
39f0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
3a00: 67 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28  g) Tcl_GetErrno(
3a10: 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65  ));...*errorCode
3a20: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72  Ptr = Tcl_GetErr
3a30: 6e 6f 28 29 3b 0a 09 09 77 72 69 74 74 65 6e 20  no();...written 
3a40: 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73  = -1;..    } els
3a50: 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49  e {...dprintf("I
3a60: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
3a70: 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  d (backingError 
3a80: 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67  = %lu)", backing
3a90: 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72  Error);...*error
3aa0: 43 6f 64 65 50 74 72 20 3d 20 62 61 63 6b 69 6e  CodePtr = backin
3ab0: 67 45 72 72 6f 72 3b 0a 09 09 77 72 69 74 74 65  gError;...writte
3ac0: 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09  n = -1;..    }..
3ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
3ae0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a  e SSL_ERROR_SSL:
3af0: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28  ..    Tls_Error(
3b00: 73 74 61 74 65 50 74 72 2c 20 54 43 4c 54 4c 53  statePtr, TCLTLS
3b10: 5f 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 65  _SSL_ERROR(state
3b20: 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65  Ptr->ssl, writte
3b30: 6e 29 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  n));..    *error
3b40: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41  CodePtr = ECONNA
3b50: 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 77 72 69  BORTED;..    wri
3b60: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20  tten = -1;..    
3b70: 62 72 65 61 6b 3b 0a 0a 09 64 65 66 61 75 6c 74  break;...default
3b80: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  :..    dprintf("
3b90: 20 75 6e 6b 6e 6f 77 6e 20 65 72 72 3a 20 25 64   unknown err: %d
3ba0: 22 2c 20 65 72 72 29 3b 0a 09 20 20 20 20 62 72  ", err);..    br
3bb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
3bc0: 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74  if (*errorCodePt
3bd0: 72 20 3c 20 30 29 20 7b 0a 09 54 6c 73 5f 45 72  r < 0) {..Tls_Er
3be0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 73 74  ror(statePtr, st
3bf0: 72 65 72 72 6f 72 28 2a 65 72 72 6f 72 43 6f 64  rerror(*errorCod
3c00: 65 50 74 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ePtr));.    }.  
3c10: 20 20 64 70 72 69 6e 74 66 28 22 4f 75 74 70 75    dprintf("Outpu
3c20: 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f  t(%d) -> %d", to
3c30: 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 3b  Write, written);
3c40: 0a 20 20 20 20 72 65 74 75 72 6e 28 77 72 69 74  .    return(writ
3c50: 74 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ten);.}../*. *--
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ca0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 74 4f 70  -. *. * TlsSetOp
3cb0: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tionProc --. *. 
3cc0: 2a 20 20 20 20 53 65 74 73 20 61 6e 20 6f 70 74  *    Sets an opt
3cd0: 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ion value for a 
3ce0: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
3cf0: 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a 20   channel, or a. 
3d00: 2a 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c 6c  *    list of all
3d10: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65   options and the
3d20: 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a  ir values.. *. *
3d30: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20   Results:. *    
3d40: 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  TCL_OK if succes
3d50: 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f  sful or TCL_ERRO
3d60: 52 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a  R if failed.. *.
3d70: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3d80: 0a 20 2a 20 20 20 20 55 70 64 61 74 65 73 20 63  . *    Updates c
3d90: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f  hannel option to
3da0: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20   new value.. *. 
3db0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3df0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3e00: 69 6e 74 0a 54 6c 73 53 65 74 4f 70 74 69 6f 6e  int.TlsSetOption
3e10: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
3e20: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20  instanceData,   
3e30: 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65   /* Socket state
3e40: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74  . */.    Tcl_Int
3e50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a  erp *interp,../*
3e60: 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 61   For errors - ca
3e70: 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  n be NULL. */.  
3e80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70    const char *op
3e90: 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d  tionName,./* Nam
3ea0: 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20  e of the option 
3eb0: 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
3ec0: 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20   for, or..... * 
3ed0: 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20  NULL to get all 
3ee0: 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69  options and thei
3ef0: 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20  r values. */.   
3f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74   const char *opt
3f10: 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61 6c  ionValue)./* Val
3f20: 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20 2a  ue for option. *
3f30: 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  /.{.    State *s
3f40: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
3f50: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
3f60: 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  ;..    Tcl_Chann
3f70: 65 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c  el downChan = Tl
3f80: 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74  s_GetParent(stat
3f90: 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41  ePtr, TLS_TCL_FA
3fa0: 53 54 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c  STPATH);.    Tcl
3fb0: 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e  _DriverSetOption
3fc0: 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50  Proc *setOptionP
3fd0: 72 6f 63 3b 0a 0a 20 20 20 20 73 65 74 4f 70 74  roc;..    setOpt
3fe0: 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68  ionProc = Tcl_Ch
3ff0: 61 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72  annelSetOptionPr
4000: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  oc(Tcl_GetChanne
4010: 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29  lType(downChan))
4020: 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f 70 74  ;.    if (setOpt
4030: 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29  ionProc != NULL)
4040: 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73 65 74   {..return (*set
4050: 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f  OptionProc)(Tcl_
4060: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
4070: 63 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29  ceData(downChan)
4080: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  , interp, option
4090: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75  Name, optionValu
40a0: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  e);.    } else i
40b0: 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d  f (optionName ==
40c0: 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b   (char*) NULL) {
40d0: 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73 74  ../*.. * Request
40e0: 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c   is query for al
40f0: 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20  l options, this 
4100: 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65 74  is ok... */..ret
4110: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
4120: 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  }.    /*.     * 
4130: 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 70  Request for a sp
4140: 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61  ecific option ha
4150: 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f  s to fail, we do
4160: 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20  n't have any..  
4170: 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
4180: 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f   Tcl_BadChannelO
4190: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70  ption(interp, op
41a0: 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d  tionName, "");.}
41b0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4200: 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f   TlsGetOptionPro
4210: 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 47 65  c --. *. *    Ge
4220: 74 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61 6c  ts an option val
4230: 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63  ue for a SSL soc
4240: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
4250: 6c 2c 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69  l, or a. *    li
4260: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e  st of all option
4270: 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75  s and their valu
4280: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  es.. *. * Result
4290: 73 3a 0a 20 2a 20 20 20 20 41 20 73 74 61 6e 64  s:. *    A stand
42a0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20  ard Tcl result. 
42b0: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
42c0: 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 69 6f   specified optio
42d0: 6e 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69 73  n or a. *    lis
42e0: 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73  t of all options
42f0: 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65   and their value
4300: 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  s is returned in
4310: 20 74 68 65 0a 20 2a 20 20 20 20 73 75 70 70 6c   the. *    suppl
4320: 69 65 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a  ied DString.. *.
4330: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4340: 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a  . *    None.. *.
4350: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
43a0: 20 69 6e 74 0a 54 6c 73 47 65 74 4f 70 74 69 6f   int.TlsGetOptio
43b0: 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61  nProc(ClientData
43c0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20   instanceData,  
43d0: 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74    /* Socket stat
43e0: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  e. */.    Tcl_In
43f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
4400: 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63  * For errors - c
4410: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  an be NULL. */. 
4420: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f     const char *o
4430: 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61  ptionName,./* Na
4440: 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e  me of the option
4450: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
4460: 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 0a 09   value for, or..
4470: 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 67 65  ... * NULL to ge
4480: 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e  t all options an
4490: 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20  d their values. 
44a0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
44b0: 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29  ng *optionValue)
44c0: 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f  ./* Where to sto
44d0: 72 65 20 74 68 65 20 63 6f 6d 70 75 74 65 64 20  re the computed 
44e0: 76 61 6c 75 65 20 69 6e 69 74 69 61 6c 69 7a 65  value initialize
44f0: 64 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a  d by caller. */.
4500: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
4510: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
4520: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
4530: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
4540: 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c 73 5f   downChan = Tls_
4550: 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50  GetParent(stateP
4560: 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54  tr, TLS_TCL_FAST
4570: 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44  PATH);.    Tcl_D
4580: 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 72  riverGetOptionPr
4590: 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f  oc *getOptionPro
45a0: 63 3b 0a 0a 20 20 20 20 67 65 74 4f 70 74 69 6f  c;..    getOptio
45b0: 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e  nProc = Tcl_Chan
45c0: 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  nelGetOptionProc
45d0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
45e0: 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b 0a  ype(downChan));.
45f0: 20 20 20 20 69 66 20 28 67 65 74 4f 70 74 69 6f      if (getOptio
4600: 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b  nProc != NULL) {
4610: 0a 09 72 65 74 75 72 6e 20 28 2a 67 65 74 4f 70  ..return (*getOp
4620: 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65  tionProc)(Tcl_Ge
4630: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
4640: 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20  Data(downChan), 
4650: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61  interp, optionNa
4660: 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29  me, optionValue)
4670: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4680: 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28  (optionName == (
4690: 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09  char*) NULL) {..
46a0: 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73 74 20 69  /*.. * Request i
46b0: 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20  s query for all 
46c0: 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73  options, this is
46d0: 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65 74 75 72   ok... */..retur
46e0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
46f0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65      /*.     * Re
4700: 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65 63  quest for a spec
4710: 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 20  ific option has 
4720: 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27  to fail, we don'
4730: 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 20 20  t have any..    
4740: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 54   */.    return T
4750: 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74  cl_BadChannelOpt
4760: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 69  ion(interp, opti
4770: 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d 0a 0a  onName, "");.}..
4780: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
47d0: 6c 73 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20  lsWatchProc --. 
47e0: 2a 0a 20 2a 20 20 20 20 49 6e 69 74 69 61 6c 69  *. *    Initiali
47f0: 7a 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  ze the notifier 
4800: 74 6f 20 77 61 74 63 68 20 54 63 6c 5f 46 69 6c  to watch Tcl_Fil
4810: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68 61  es from this cha
4820: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nnel.. *. * Resu
4830: 6c 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e  lts:. *    None.
4840: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4850: 63 74 73 3a 0a 20 2a 20 20 20 20 53 65 74 73 20  cts:. *    Sets 
4860: 75 70 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  up the notifier 
4870: 73 6f 20 74 68 61 74 20 61 20 66 75 74 75 72 65  so that a future
4880: 20 65 76 65 6e 74 20 6f 6e 20 74 68 65 20 63 68   event on the ch
4890: 61 6e 6e 65 6c 0a 20 2a 20 20 20 20 77 69 6c 6c  annel. *    will
48a0: 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c 2e   be seen by Tcl.
48b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
4900: 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 57 61 74  atic void.TlsWat
4910: 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  chProc(ClientDat
4920: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
4930: 20 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74     /* The socket
4940: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69   state. */.    i
4950: 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 45 76  nt mask).../* Ev
4960: 65 6e 74 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ents of interest
4970: 3b 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69  ; an OR-ed combi
4980: 6e 61 74 69 6f 6e 20 6f 66 0a 09 09 09 09 20 2a  nation of..... *
4990: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 54   TCL_READABLE, T
49a0: 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64 20  CL_WRITABLE and 
49b0: 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 2e 20 2a  TCL_EXCEPTION. *
49c0: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  /.{.    Tcl_Chan
49d0: 6e 65 6c 20 20 20 20 20 64 6f 77 6e 43 68 61 6e  nel     downChan
49e0: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  ;.    State *sta
49f0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
4a00: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
4a10: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61      Tcl_DriverWa
4a20: 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72  tchProc *watchPr
4a30: 6f 63 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  oc;..    dprintf
4a40: 28 22 54 6c 73 57 61 74 63 68 50 72 6f 63 28 30  ("TlsWatchProc(0
4a50: 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20  x%x)", mask);.. 
4a60: 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 74 6f     /* Pretend to
4a70: 20 62 65 20 64 65 61 64 20 61 73 20 6c 6f 6e 67   be dead as long
4a80: 20 61 73 20 74 68 65 20 76 65 72 69 66 79 20 63   as the verify c
4a90: 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e 69  allback is runni
4aa0: 6e 67 2e 0a 20 20 20 20 20 2a 20 4f 74 68 65 72  ng..     * Other
4ab0: 77 69 73 65 20 74 68 61 74 20 63 61 6c 6c 62 61  wise that callba
4ac0: 63 6b 20 63 6f 75 6c 64 20 62 65 20 69 6e 76 6f  ck could be invo
4ad0: 6b 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ked recursively.
4ae0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
4af0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c  ePtr->flags & TL
4b00: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20  S_TCL_CALLBACK) 
4b10: 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c  {..dprintf("Call
4b20: 62 61 63 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e 67  back is on-going
4b30: 2c 20 64 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 22  , doing nothing"
4b40: 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  );..return;.    
4b50: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 46 6c 61  }..    dprintFla
4b60: 67 73 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  gs(statePtr);.. 
4b70: 20 20 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c     downChan = Tl
4b80: 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74  s_GetParent(stat
4b90: 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41  ePtr, TLS_TCL_FA
4ba0: 53 54 50 41 54 48 29 3b 0a 0a 20 20 20 20 69 66  STPATH);..    if
4bb0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
4bc0: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44  s & TLS_TCL_HAND
4bd0: 53 48 41 4b 45 5f 46 41 49 4c 45 44 29 20 7b 0a  SHAKE_FAILED) {.
4be0: 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20  .dprintf("Asked 
4bf0: 74 6f 20 77 61 74 63 68 20 61 20 73 6f 63 6b 65  to watch a socke
4c00: 74 20 77 69 74 68 20 61 20 66 61 69 6c 65 64 20  t with a failed 
4c10: 68 61 6e 64 73 68 61 6b 65 20 2d 2d 20 6e 6f 74  handshake -- not
4c20: 68 69 6e 67 20 63 61 6e 20 68 61 70 70 65 6e 20  hing can happen 
4c30: 68 65 72 65 22 29 3b 0a 09 64 70 72 69 6e 74 66  here");..dprintf
4c40: 28 22 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20  ("Unregistering 
4c50: 69 6e 74 65 72 65 73 74 20 69 6e 20 74 68 65 20  interest in the 
4c60: 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 22 29 3b  lower channel");
4c70: 0a 0a 09 77 61 74 63 68 50 72 6f 63 20 3d 20 54  ...watchProc = T
4c80: 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50  cl_ChannelWatchP
4c90: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
4ca0: 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29  elType(downChan)
4cb0: 29 3b 0a 09 77 61 74 63 68 50 72 6f 63 28 54 63  );..watchProc(Tc
4cc0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
4cd0: 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 61  anceData(downCha
4ce0: 6e 29 2c 20 30 29 3b 0a 09 73 74 61 74 65 50 74  n), 0);..statePt
4cf0: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 30  r->watchMask = 0
4d00: 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  ;..return;.    }
4d10: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
4d20: 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b  watchMask = mask
4d30: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61  ;..    /* No cha
4d40: 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 61 6e  nnel handlers an
4d50: 79 20 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c 20  y more. We will 
4d60: 62 65 20 6e 6f 74 69 66 69 65 64 20 61 75 74 6f  be notified auto
4d70: 6d 61 74 69 63 61 6c 6c 79 0a 20 20 20 20 20 2a  matically.     *
4d80: 20 61 62 6f 75 74 20 65 76 65 6e 74 73 20 6f 6e   about events on
4d90: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c   the channel bel
4da0: 6f 77 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f  ow via a call to
4db0: 20 6f 75 72 0a 20 20 20 20 20 2a 20 27 54 72 61   our.     * 'Tra
4dc0: 6e 73 66 6f 72 6d 4e 6f 74 69 66 79 50 72 6f 63  nsformNotifyProc
4dd0: 27 2e 20 42 75 74 20 77 65 20 68 61 76 65 20 74  '. But we have t
4de0: 6f 20 70 61 73 73 20 74 68 65 20 69 6e 74 65 72  o pass the inter
4df0: 65 73 74 20 64 6f 77 6e 20 6e 6f 77 2e 0a 20 20  est down now..  
4e00: 20 20 20 2a 20 57 65 20 61 72 65 20 61 6c 6c 6f     * We are allo
4e10: 77 65 64 20 74 6f 20 61 64 64 20 61 64 64 69 74  wed to add addit
4e20: 69 6f 6e 61 6c 20 27 69 6e 74 65 72 65 73 74 27  ional 'interest'
4e30: 20 74 6f 20 74 68 65 20 6d 61 73 6b 20 69 66 20   to the mask if 
4e40: 77 65 20 77 61 6e 74 0a 20 20 20 20 20 2a 20 74  we want.     * t
4e50: 6f 2e 20 42 75 74 20 74 68 69 73 20 74 72 61 6e  o. But this tran
4e60: 73 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20 6e  sformation has n
4e70: 6f 20 73 75 63 68 20 69 6e 74 65 72 65 73 74 2e  o such interest.
4e80: 20 49 74 20 6a 75 73 74 20 70 61 73 73 65 73 0a   It just passes.
4e90: 20 20 20 20 20 2a 20 74 68 65 20 72 65 71 75 65       * the reque
4ea0: 73 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61 6e 67  st down, unchang
4eb0: 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ed..     */.    
4ec0: 64 70 72 69 6e 74 66 28 22 52 65 67 69 73 74 65  dprintf("Registe
4ed0: 72 69 6e 67 20 6f 75 72 20 69 6e 74 65 72 65 73  ring our interes
4ee0: 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 63  t in the lower c
4ef0: 68 61 6e 6e 65 6c 20 28 63 68 61 6e 3d 25 70 29  hannel (chan=%p)
4f00: 22 2c 20 28 76 6f 69 64 20 2a 29 20 64 6f 77 6e  ", (void *) down
4f10: 43 68 61 6e 29 3b 0a 20 20 20 20 77 61 74 63 68  Chan);.    watch
4f20: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e  Proc = Tcl_Chann
4f30: 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f  elWatchProc(Tcl_
4f40: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64  GetChannelType(d
4f50: 6f 77 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 77  ownChan));.    w
4f60: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
4f70: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
4f80: 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 6d  ata(downChan), m
4f90: 61 73 6b 29 3b 0a 0a 0a 20 20 20 20 2f 2a 0a 20  ask);...    /*. 
4fa0: 20 20 20 20 2a 20 4d 61 6e 61 67 65 6d 65 6e 74      * Management
4fb0: 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   of the internal
4fc0: 20 74 69 6d 65 72 2e 0a 20 20 20 20 20 2a 2f 0a   timer..     */.
4fd0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4fe0: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
4ff0: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
5000: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 20  ) {..dprintf("A 
5010: 74 69 6d 65 72 20 77 61 73 20 66 6f 75 6e 64 2c  timer was found,
5020: 20 64 65 6c 65 74 69 6e 67 20 69 74 22 29 3b 0a   deleting it");.
5030: 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72  .Tcl_DeleteTimer
5040: 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
5050: 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65  ->timer);..state
5060: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63  Ptr->timer = (Tc
5070: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
5080: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
5090: 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52  f ((mask & TCL_R
50a0: 45 41 44 41 42 4c 45 29 20 26 26 0a 09 28 28 54  EADABLE) &&..((T
50b0: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
50c0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
50d0: 20 3e 20 30 29 20 7c 7c 20 28 42 49 4f 5f 63 74   > 0) || (BIO_ct
50e0: 72 6c 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65  rl_pending(state
50f0: 50 74 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29 29  Ptr->bio) > 0)))
5100: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 72 65   {../*.. * There
5110: 20 69 73 20 69 6e 74 65 72 65 73 74 20 69 6e 20   is interest in 
5120: 72 65 61 64 61 62 6c 65 20 65 76 65 6e 74 73 20  readable events 
5130: 61 6e 64 20 77 65 20 61 63 74 75 61 6c 6c 79 20  and we actually 
5140: 68 61 76 65 0a 09 20 2a 20 64 61 74 61 20 77 61  have.. * data wa
5150: 69 74 69 6e 67 2c 20 73 6f 20 67 65 6e 65 72 61  iting, so genera
5160: 74 65 20 61 20 74 69 6d 65 72 20 74 6f 20 66 6c  te a timer to fl
5170: 75 73 68 20 74 68 61 74 2e 0a 09 20 2a 2f 0a 09  ush that... */..
5180: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 69 6e  dprintf("Creatin
5190: 67 20 61 20 6e 65 77 20 74 69 6d 65 72 20 73 69  g a new timer si
51a0: 6e 63 65 20 64 61 74 61 20 61 70 70 65 61 72 73  nce data appears
51b0: 20 74 6f 20 62 65 20 77 61 69 74 69 6e 67 22 29   to be waiting")
51c0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
51d0: 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54  er = Tcl_CreateT
51e0: 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f  imerHandler(TLS_
51f0: 54 43 4c 5f 44 45 4c 41 59 2c 20 54 6c 73 43 68  TCL_DELAY, TlsCh
5200: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65  annelHandlerTime
5210: 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  r, (ClientData) 
5220: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d  statePtr);.    }
5230: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5280: 20 2a 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50   * TlsGetHandleP
5290: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20  roc --. *. *    
52a0: 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f  Called from Tcl_
52b0: 47 65 74 43 68 61 6e 6e 65 6c 46 69 6c 65 20 74  GetChannelFile t
52c0: 6f 20 72 65 74 72 69 65 76 65 20 6f 2f 73 20 66  o retrieve o/s f
52d0: 69 6c 65 20 68 61 6e 64 6c 65 72 0a 20 2a 20 20  ile handler. *  
52e0: 20 20 66 72 6f 6d 20 74 68 65 20 53 53 4c 20 73    from the SSL s
52f0: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
5300: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  nel.. *. * Resul
5310: 74 73 3a 0a 20 2a 20 20 20 20 54 68 65 20 61 70  ts:. *    The ap
5320: 70 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69  propriate Tcl_Fi
5330: 6c 65 20 68 61 6e 64 6c 65 20 6f 72 20 4e 55 4c  le handle or NUL
5340: 4c 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a  L if none.. *. *
5350: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5360: 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  *    None.. *. *
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53b0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
53c0: 6e 74 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50  nt TlsGetHandleP
53d0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
53e0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20  nstanceData,    
53f0: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e  /* Socket state.
5400: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 69 72 65   */.    int dire
5410: 63 74 69 6f 6e 2c 09 09 2f 2a 20 54 43 4c 5f 52  ction,../* TCL_R
5420: 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57  EADABLE or TCL_W
5430: 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 43  RITABLE */.    C
5440: 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c  lientData *handl
5450: 65 50 74 72 29 09 2f 2a 20 48 61 6e 64 6c 65 20  ePtr)./* Handle 
5460: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5470: 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 7b  the channel */.{
5480: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5490: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
54a0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a   instanceData;..
54b0: 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 47      return(Tcl_G
54c0: 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28  etChannelHandle(
54d0: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74  Tls_GetParent(st
54e0: 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f  atePtr, TLS_TCL_
54f0: 46 41 53 54 50 41 54 48 29 2c 20 64 69 72 65 63  FASTPATH), direc
5500: 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29  tion, handlePtr)
5510: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5560: 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72  *. * TlsNotifyPr
5570: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 48  oc --. *. *    H
5580: 61 6e 64 6c 65 72 20 63 61 6c 6c 65 64 20 62 79  andler called by
5590: 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75   Tcl to inform u
55a0: 73 20 6f 66 20 61 63 74 69 76 69 74 79 0a 20 2a  s of activity. *
55b0: 20 20 20 20 6f 6e 20 74 68 65 20 75 6e 64 65 72      on the under
55c0: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20  lying channel.. 
55d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
55e0: 20 20 20 20 54 79 70 65 20 6f 66 20 65 76 65 6e      Type of even
55f0: 74 20 6f 72 20 30 20 69 66 20 66 61 69 6c 65 64  t or 0 if failed
5600: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5610: 63 74 73 3a 0a 20 2a 20 20 20 20 4d 61 79 20 70  cts:. *    May p
5620: 72 6f 63 65 73 73 20 74 68 65 20 69 6e 63 6f 6d  rocess the incom
5630: 69 6e 67 20 65 76 65 6e 74 20 62 79 20 69 74 73  ing event by its
5640: 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  elf.. *. *------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5690: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73  /.static int Tls
56a0: 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e  NotifyProc(Clien
56b0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
56c0: 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74  ta,    /* Socket
56d0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69   state. */.    i
56e0: 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 74 79  nt mask).../* ty
56f0: 70 65 20 6f 66 20 65 76 65 6e 74 20 74 68 61 74  pe of event that
5700: 20 6f 63 63 75 72 72 65 64 3a 0a 09 09 09 09 20   occurred:..... 
5710: 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  * OR-ed combinat
5720: 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41  ion of TCL_READA
5730: 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41  BLE or TCL_WRITA
5740: 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61  BLE */.{.    Sta
5750: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
5760: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
5770: 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 65  eData;.    int e
5780: 72 72 6f 72 43 6f 64 65 3b 0a 0a 20 20 20 20 2f  rrorCode;..    /
5790: 2a 0a 20 20 20 20 20 2a 20 41 6e 20 65 76 65 6e  *.     * An even
57a0: 74 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68  t occurred in th
57b0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61  e underlying cha
57c0: 6e 6e 65 6c 2e 20 20 54 68 69 73 0a 20 20 20 20  nnel.  This.    
57d0: 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f   * transformatio
57e0: 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f 63 65 73  n doesn't proces
57f0: 73 20 73 75 63 68 20 65 76 65 6e 74 73 20 74 68  s such events th
5800: 75 73 20 72 65 74 75 72 6e 73 20 74 68 65 0a 20  us returns the. 
5810: 20 20 20 20 2a 20 69 6e 63 6f 6d 69 6e 67 20 6d      * incoming m
5820: 61 73 6b 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ask unchanged.. 
5830: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73      */.    if (s
5840: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
5850: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
5860: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  n) NULL) {../*..
5870: 20 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 78 69   * Delete an exi
5880: 73 74 69 6e 67 20 74 69 6d 65 72 2e 20 49 74 20  sting timer. It 
5890: 77 61 73 20 6e 6f 74 20 66 69 72 65 64 2c 20 79  was not fired, y
58a0: 65 74 20 77 65 20 61 72 65 0a 09 20 2a 20 68 65  et we are.. * he
58b0: 72 65 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 6e  re, so the chann
58c0: 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  el below generat
58d0: 65 64 20 73 75 63 68 20 61 6e 20 65 76 65 6e 74  ed such an event
58e0: 20 61 6e 64 20 77 65 0a 09 20 2a 20 64 6f 6e 27   and we.. * don'
58f0: 74 20 68 61 76 65 20 74 6f 2e 20 54 68 65 20 72  t have to. The r
5900: 65 6e 65 77 61 6c 20 6f 66 20 74 68 65 20 69 6e  enewal of the in
5910: 74 65 72 65 73 74 20 61 66 74 65 72 20 74 68 65  terest after the
5920: 0a 09 20 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  .. * execution o
5930: 66 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65  f channel handle
5940: 72 73 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  rs will eventual
5950: 6c 79 20 63 61 75 73 65 20 75 73 20 74 6f 0a 09  ly cause us to..
5960: 20 2a 20 72 65 63 72 65 61 74 65 20 74 68 65 20   * recreate the 
5970: 74 69 6d 65 72 20 28 69 6e 20 57 61 74 63 68 50  timer (in WatchP
5980: 72 6f 63 29 2e 0a 09 20 2a 2f 0a 09 54 63 6c 5f  roc)... */..Tcl_
5990: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
59a0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
59b0: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
59c0: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
59d0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20  erToken) NULL;. 
59e0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
59f0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
5a00: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
5a10: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 52 65  ) {..dprintf("Re
5a20: 74 75 72 6e 69 6e 67 20 30 20 64 75 65 20 74 6f  turning 0 due to
5a30: 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 09 72 65   callback");..re
5a40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
5a50: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
5a60: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  ing Tls_WaitForC
5a70: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 65 72  onnect");.    er
5a80: 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  rorCode = 0;.   
5a90: 20 69 66 20 28 54 6c 73 5f 57 61 69 74 46 6f 72   if (Tls_WaitFor
5aa0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
5ab0: 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c 20 31 29  , &errorCode, 1)
5ac0: 20 3c 20 30 29 20 7b 0a 09 54 6c 73 5f 45 72 72   < 0) {..Tls_Err
5ad0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 73 74 72  or(statePtr, str
5ae0: 65 72 72 6f 72 28 65 72 72 6f 72 43 6f 64 65 29  error(errorCode)
5af0: 29 3b 0a 09 69 66 20 28 65 72 72 6f 72 43 6f 64  );..if (errorCod
5b00: 65 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09  e == EAGAIN) {..
5b10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 79      dprintf("Asy
5b20: 6e 63 20 66 6c 61 67 20 63 6f 75 6c 64 20 62 65  nc flag could be
5b30: 20 73 65 74 20 28 64 69 64 6e 27 74 20 63 68 65   set (didn't che
5b40: 63 6b 29 20 61 6e 64 20 65 72 72 6f 72 43 6f 64  ck) and errorCod
5b50: 65 20 3d 3d 20 45 41 47 41 49 4e 3a 20 20 52 65  e == EAGAIN:  Re
5b60: 74 75 72 6e 69 6e 67 20 30 22 29 3b 0a 0a 09 20  turning 0");... 
5b70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a     return 0;..}.
5b80: 0a 09 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57  ..dprintf("Tls_W
5b90: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65  aitForConnect re
5ba0: 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 22  turned an error"
5bb0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  );.    }..    dp
5bc0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
5bd0: 20 25 69 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20   %i", mask);..  
5be0: 20 20 72 65 74 75 72 6e 28 6d 61 73 6b 29 3b 0a    return(mask);.
5bf0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
5c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
5c30: 20 2a 0a 20 2a 20 20 20 20 54 6c 73 43 68 61 6e   *. *    TlsChan
5c40: 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20  nelHandlerTimer 
5c50: 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 2d 2d 2d 2d  --. *. *    ----
5c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
5c90: 20 20 20 20 43 61 6c 6c 65 64 20 62 79 20 74 68      Called by th
5ca0: 65 20 6e 6f 74 69 66 69 65 72 20 28 2d 3e 20 74  e notifier (-> t
5cb0: 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 68 20 6f  imer) to flush o
5cc0: 75 74 0a 20 2a 20 20 20 20 69 6e 66 6f 72 6d 61  ut. *    informa
5cd0: 74 69 6f 6e 20 77 61 69 74 69 6e 67 20 69 6e 20  tion waiting in 
5ce0: 63 68 61 6e 6e 65 6c 20 62 75 66 66 65 72 73 2e  channel buffers.
5cf0: 0a 20 2a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *    ---------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20  -------*. *. *  
5d30: 20 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a    Side effects:.
5d40: 20 2a 20 20 20 20 20 20 20 20 41 73 20 6f 66 20   *        As of 
5d50: 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c  'TlsChannelHandl
5d60: 65 72 27 2e 0a 20 2a 0a 20 2a 20 20 20 20 52 65  er'.. *. *    Re
5d70: 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20 20  sult:. *        
5d80: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dc0: 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  -*. */.static vo
5dd0: 69 64 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e  id TlsChannelHan
5de0: 64 6c 65 72 54 69 6d 65 72 28 43 6c 69 65 6e 74  dlerTimer(Client
5df0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29  Data clientData)
5e00: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
5e10: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
5e20: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
5e30: 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b     int mask = 0;
5e40: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
5e50: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 74  alled");..    st
5e60: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
5e70: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
5e80: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28   NULL;..    if (
5e90: 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61  BIO_wpending(sta
5ea0: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09  tePtr->bio)) {..
5eb0: 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25  dprintf("[chan=%
5ec0: 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c 65 22  p] BIO writable"
5ed0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
5ee0: 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c  );...mask |= TCL
5ef0: 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d  _WRITABLE;.    }
5f00: 0a 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 70 65  ..    if (BIO_pe
5f10: 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e  nding(statePtr->
5f20: 62 69 6f 29 29 20 7b 0a 09 64 70 72 69 6e 74 66  bio)) {..dprintf
5f30: 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49 4f 20  ("[chan=%p] BIO 
5f40: 72 65 61 64 61 62 6c 65 22 2c 20 73 74 61 74 65  readable", state
5f50: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61  Ptr->self);...ma
5f60: 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42  sk |= TCL_READAB
5f70: 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  LE;.    }..    d
5f80: 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79 69 6e  printf("Notifyin
5f90: 67 20 6f 75 72 73 65 6c 76 65 73 22 29 3b 0a 20  g ourselves");. 
5fa0: 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61     Tcl_NotifyCha
5fb0: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73  nnel(statePtr->s
5fc0: 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20  elf, mask);..   
5fd0: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
5fe0: 69 6e 67 22 29 3b 0a 0a 20 20 20 20 72 65 74 75  ing");..    retu
5ff0: 72 6e 3b 0a 7d 0a 0a 54 63 6c 5f 43 68 61 6e 6e  rn;.}..Tcl_Chann
6000: 65 6c 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74  el Tls_GetParent
6010: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
6020: 2c 20 69 6e 74 20 6d 61 73 6b 46 6c 61 67 73 29  , int maskFlags)
6030: 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
6040: 52 65 71 75 65 73 74 65 64 20 74 6f 20 67 65 74  Requested to get
6050: 20 70 61 72 65 6e 74 20 6f 66 20 63 68 61 6e 6e   parent of chann
6060: 65 6c 20 25 70 22 2c 20 73 74 61 74 65 50 74 72  el %p", statePtr
6070: 2d 3e 73 65 6c 66 29 3b 0a 0a 20 20 20 20 69 66  ->self);..    if
6080: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61   ((statePtr->fla
6090: 67 73 20 26 20 7e 6d 61 73 6b 46 6c 61 67 73 29  gs & ~maskFlags)
60a0: 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50   & TLS_TCL_FASTP
60b0: 41 54 48 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  ATH) {..dprintf(
60c0: 22 41 73 6b 65 64 20 74 6f 20 67 65 74 20 74 68  "Asked to get th
60d0: 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c  e parent channel
60e0: 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 75 73   while we are us
60f0: 69 6e 67 20 46 61 73 74 50 61 74 68 20 2d 2d 20  ing FastPath -- 
6100: 72 65 74 75 72 6e 69 6e 67 20 4e 55 4c 4c 22 29  returning NULL")
6110: 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ;..return(NULL);
6120: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
6130: 6e 28 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64  n(Tcl_GetStacked
6140: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72  Channel(statePtr
6150: 2d 3e 73 65 6c 66 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ->self));.}../*.
6160: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61a0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
61b0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a 20  ChannelType --. 
61c0: 2a 0a 20 2a 20 20 20 20 52 65 74 75 72 6e 20 74  *. *    Return t
61d0: 68 65 20 63 6f 72 72 65 63 74 20 54 4c 53 20 63  he correct TLS c
61e0: 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 20 69 6e  hannel driver in
61f0: 66 6f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  fo. *. * Results
6200: 3a 0a 20 2a 20 20 20 20 54 68 65 20 63 6f 72 72  :. *    The corr
6210: 65 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 76  ect channel driv
6220: 65 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  er for the curre
6230: 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 63  nt version of Tc
6240: 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  l.. *. * Side ef
6250: 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e  fects:. *    Non
6260: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
6270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
62b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c  static const Tcl
62c0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c 73  _ChannelType tls
62d0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
62e0: 20 20 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a 20      "tls",.../* 
62f0: 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  Type name */.   
6300: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
6310: 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68  SION_5,./* v5 ch
6320: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73  annel */.    Tls
6330: 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43  CloseProc,../* C
6340: 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20  lose proc */.   
6350: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09 09   TlsInputProc,..
6360: 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f  /* Input proc */
6370: 0a 20 20 20 20 54 6c 73 4f 75 74 70 75 74 50 72  .    TlsOutputPr
6380: 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70  oc,../* Output p
6390: 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c  roc */.    NULL,
63a0: 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20  .../* Seek proc 
63b0: 2a 2f 0a 20 20 20 20 54 6c 73 53 65 74 4f 70 74  */.    TlsSetOpt
63c0: 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74  ionProc,../* Set
63d0: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a   option proc */.
63e0: 20 20 20 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e      TlsGetOption
63f0: 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 6f 70  Proc,../* Get op
6400: 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20  tion proc */.   
6410: 20 54 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 09   TlsWatchProc,..
6420: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f  /* Initialize no
6430: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 54 6c  tifier */.    Tl
6440: 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09  sGetHandleProc,.
6450: 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c  ./* Get OS handl
6460: 65 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65  es out of channe
6470: 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73  l */.    TlsClos
6480: 65 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73  e2Proc,../* clos
6490: 65 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c  e2proc */.    Tl
64a0: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09  sBlockModeProc,.
64b0: 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67  ./* Set blocking
64c0: 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64  /nonblocking mod
64d0: 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09  e*/.    NULL,...
64e0: 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f  /* Flush proc */
64f0: 0a 20 20 20 20 54 6c 73 4e 6f 74 69 66 79 50 72  .    TlsNotifyPr
6500: 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67  oc,../* Handling
6510: 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c   of events bubbl
6520: 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55  ing up */.    NU
6530: 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65  LL,.../* Wide se
6540: 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e  ek proc */.    N
6550: 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64  ULL,.../* Thread
6560: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e   action */.    N
6570: 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74  ULL.../* Truncat
6580: 65 20 2a 2f 0a 7d 3b 0a 0a 54 63 6c 5f 43 68 61  e */.};..Tcl_Cha
6590: 6e 6e 65 6c 54 79 70 65 20 2a 54 6c 73 5f 43 68  nnelType *Tls_Ch
65a0: 61 6e 6e 65 6c 54 79 70 65 28 76 6f 69 64 29 20  annelType(void) 
65b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 74 6c  {.    return &tl
65c0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d 0a  sChannelType;.}.