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 0a 20 20 20  stanceData;..   
0850: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f   dprintf("TlsClo
0860: 73 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f  seProc(%p)", (vo
0870: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  id *) statePtr);
0880: 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28  ..    Tls_Clean(
0890: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
08a0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
08b0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74  e((ClientData)st
08c0: 61 74 65 50 74 72 2c 20 54 6c 73 5f 46 72 65 65  atePtr, Tls_Free
08d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 30 29  );.    return(0)
08e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
08f0: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c  TlsClose2Proc(Cl
0900: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
0910: 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 54 68 65  eData,    /* The
0920: 20 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a   socket state. *
0930: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  /.    Tcl_Interp
0940: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f   *interp,../* Fo
0950: 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62  r errors - can b
0960: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 69  e NULL. */.    i
0970: 6e 74 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 46  nt flags).../* F
0980: 6c 61 67 73 20 74 6f 20 63 6c 6f 73 65 20 72 65  lags to close re
0990: 61 64 20 61 6e 64 2f 6f 72 20 77 72 69 74 65 20  ad and/or write 
09a0: 73 69 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c 20  side of channel 
09b0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
09c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
09d0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
09e0: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
09f0: 22 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 25  "TlsClose2Proc(%
0a00: 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74  p)", (void *) st
0a10: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66  atePtr);..    if
0a20: 20 28 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f   ((flags & (TCL_
0a30: 43 4c 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43  CLOSE_READ|TCL_C
0a40: 4c 4f 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20  LOSE_WRITE)) == 
0a50: 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73  0) {..return Tls
0a60: 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e  CloseProc(instan
0a70: 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b  ceData, interp);
0a80: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0a90: 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  n EINVAL;.}../*.
0aa0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0ab0: 2d 2d 2d 2d 2d 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 2a 0a 20 2a 0a 20 2a 20  --------*. *. * 
0ae0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
0af0: 63 74 20 2d 2d 0a 20 2a 0a 20 2a 20 52 65 73 75  ct --. *. * Resu
0b00: 6c 74 3a 0a 20 2a 20 20 20 20 30 20 69 66 20 73  lt:. *    0 if s
0b10: 75 63 63 65 73 73 66 75 6c 2c 20 2d 31 20 69 66  uccessful, -1 if
0b20: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53   failed.. *. * S
0b30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20  ide effects:. * 
0b40: 20 20 20 49 73 73 75 65 73 20 53 53 4c 5f 61 63     Issues SSL_ac
0b50: 63 65 70 74 20 6f 72 20 53 53 4c 5f 63 6f 6e 6e  cept or SSL_conn
0b60: 65 63 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ect. *. *-------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a  ---------------*
0ba0: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 57 61 69  . */.int Tls_Wai
0bb0: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 53 74 61 74  tForConnect(Stat
0bc0: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74  e *statePtr, int
0bd0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20   *errorCodePtr, 
0be0: 69 6e 74 20 68 61 6e 64 73 68 61 6b 65 46 61 69  int handshakeFai
0bf0: 6c 75 72 65 49 73 50 65 72 6d 61 6e 65 6e 74 29  lureIsPermanent)
0c00: 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20   {.    unsigned 
0c10: 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f  long backingErro
0c20: 72 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 2c 20  r;.    int err, 
0c30: 72 63 3b 0a 20 20 20 20 69 6e 74 20 62 69 6f 53  rc;.    int bioS
0c40: 68 6f 75 6c 64 52 65 74 72 79 3b 0a 20 20 20 20  houldRetry;.    
0c50: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
0c60: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
0c70: 22 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28  "WaitForConnect(
0c80: 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73  %p)", (void *) s
0c90: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 64 70  tatePtr);.    dp
0ca0: 72 69 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50  rintFlags(stateP
0cb0: 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 28  tr);..    if (!(
0cc0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
0cd0: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 29  & TLS_TCL_INIT))
0ce0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 54 6c 73   {..dprintf("Tls
0cf0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
0d00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 72 65 61 64  called on alread
0d10: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 68  y initialized ch
0d20: 61 6e 6e 65 6c 20 2d 2d 20 72 65 74 75 72 6e 69  annel -- returni
0d30: 6e 67 20 77 69 74 68 20 69 6d 6d 65 64 69 61 74  ng with immediat
0d40: 65 20 73 75 63 63 65 73 73 22 29 3b 0a 09 72 65  e success");..re
0d50: 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a  turn(0);.    }..
0d60: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
0d70: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
0d80: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c  L_HANDSHAKE_FAIL
0d90: 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 69  ED) {../*.. * Di
0da0: 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66  fferent types of
0db0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 68 61 76 65   operations have
0dc0: 20 64 69 66 66 65 72 65 6e 74 20 72 65 71 75 69   different requi
0dd0: 72 65 6d 65 6e 74 73 0a 09 20 2a 20 53 53 4c 20  rements.. * SSL 
0de0: 62 65 69 6e 67 20 65 73 74 61 62 6c 69 73 68 65  being establishe
0df0: 64 0a 09 20 2a 2f 0a 09 69 66 20 28 68 61 6e 64  d.. */..if (hand
0e00: 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65  shakeFailureIsPe
0e10: 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20 20 20  rmanent) {..    
0e20: 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74  dprintf("Asked t
0e30: 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53  o wait for a TLS
0e40: 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20   handshake that 
0e50: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c  has already fail
0e60: 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  ed.  Returning f
0e70: 61 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a 09 20  atal error");.. 
0e80: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
0e90: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b   = ECONNABORTED;
0ea0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
0eb0: 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74  dprintf("Asked t
0ec0: 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53  o wait for a TLS
0ed0: 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20   handshake that 
0ee0: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c  has already fail
0ef0: 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 73  ed.  Returning s
0f00: 6f 66 74 20 65 72 72 6f 72 22 29 3b 0a 09 20 20  oft error");..  
0f10: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
0f20: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 7d  = ECONNRESET;..}
0f30: 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
0f40: 65 50 74 72 2c 20 22 57 61 69 74 20 66 6f 72 20  ePtr, "Wait for 
0f50: 66 61 69 6c 65 64 20 68 61 6e 64 73 68 61 6b 65  failed handshake
0f60: 22 29 3b 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b  ");..return(-1);
0f70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20  .    }..    for 
0f80: 28 3b 3b 29 20 7b 0a 09 45 52 52 5f 63 6c 65 61  (;;) {..ERR_clea
0f90: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 2f 2a 20  r_error();.../* 
0fa0: 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  Not initialized 
0fb0: 79 65 74 21 20 41 6c 73 6f 20 63 61 6c 6c 73 20  yet! Also calls 
0fc0: 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65  SSL_do_handshake
0fd0: 2e 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50  . */..if (stateP
0fe0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
0ff0: 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20  TCL_SERVER) {.. 
1000: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
1010: 69 6e 67 20 53 53 4c 5f 61 63 63 65 70 74 28 29  ing SSL_accept()
1020: 22 29 3b 0a 09 20 20 20 20 65 72 72 20 3d 20 53  ");..    err = S
1030: 53 4c 5f 61 63 63 65 70 74 28 73 74 61 74 65 50  SL_accept(stateP
1040: 74 72 2d 3e 73 73 6c 29 3b 0a 0a 09 7d 20 65 6c  tr->ssl);...} el
1050: 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  se {..    dprint
1060: 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c 5f 63  f("Calling SSL_c
1070: 6f 6e 6e 65 63 74 28 29 22 29 3b 0a 09 20 20 20  onnect()");..   
1080: 20 65 72 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65   err = SSL_conne
1090: 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ct(statePtr->ssl
10a0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 65 72 72 20  );..}...if (err 
10b0: 3e 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69  > 0) {..    dpri
10c0: 6e 74 66 28 22 41 63 63 65 70 74 20 6f 72 20 63  ntf("Accept or c
10d0: 6f 6e 6e 65 63 74 20 77 61 73 20 73 75 63 63 65  onnect was succe
10e0: 73 73 66 75 6c 22 29 3b 0a 09 20 20 20 20 65 72  ssful");..    er
10f0: 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73 74  r = BIO_flush(st
1100: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20  atePtr->bio);.. 
1110: 20 20 20 69 66 20 28 65 72 72 20 3c 3d 20 30 29     if (err <= 0)
1120: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 46 6c   {...dprintf("Fl
1130: 75 73 68 69 6e 67 20 74 68 65 20 6c 6f 77 65 72  ushing the lower
1140: 20 6c 61 79 65 72 73 20 66 61 69 6c 65 64 2c 20   layers failed, 
1150: 74 68 69 73 20 77 69 6c 6c 20 70 72 6f 62 61 62  this will probab
1160: 6c 79 20 74 65 72 6d 69 6e 61 74 65 20 74 68 69  ly terminate thi
1170: 73 20 73 65 73 73 69 6f 6e 22 29 3b 0a 09 20 20  s session");..  
1180: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20    }..} else {.. 
1190: 20 20 20 64 70 72 69 6e 74 66 28 22 41 63 63 65     dprintf("Acce
11a0: 70 74 20 6f 72 20 63 6f 6e 6e 65 63 74 20 66 61  pt or connect fa
11b0: 69 6c 65 64 22 29 3b 0a 09 7d 0a 0a 09 72 63 20  iled");..}...rc 
11c0: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28  = SSL_get_error(
11d0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65  statePtr->ssl, e
11e0: 72 72 29 3b 0a 09 62 61 63 6b 69 6e 67 45 72 72  rr);..backingErr
11f0: 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72  or = ERR_get_err
1200: 6f 72 28 29 3b 0a 09 69 66 20 28 72 63 20 21 3d  or();..if (rc !=
1210: 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 29   SSL_ERROR_NONE)
1220: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
1230: 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 69 20 28  "Got error: %i (
1240: 72 63 20 3d 20 25 69 29 22 2c 20 65 72 72 2c 20  rc = %i)", err, 
1250: 72 63 29 3b 0a 09 20 20 20 20 64 70 72 69 6e 74  rc);..    dprint
1260: 66 28 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 73  f("Got error: %s
1270: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
1280: 4e 28 29 29 3b 0a 09 7d 0a 0a 09 62 69 6f 53 68  N());..}...bioSh
1290: 6f 75 6c 64 52 65 74 72 79 20 3d 20 30 3b 0a 09  ouldRetry = 0;..
12a0: 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a  if (err <= 0) {.
12b0: 09 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53  .    if (rc == S
12c0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f  SL_ERROR_WANT_CO
12d0: 4e 4e 45 43 54 20 7c 7c 20 72 63 20 3d 3d 20 53  NNECT || rc == S
12e0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43  SL_ERROR_WANT_AC
12f0: 43 45 50 54 20 7c 7c 20 72 63 20 3d 3d 20 53 53  CEPT || rc == SS
1300: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41  L_ERROR_WANT_REA
1310: 44 20 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45  D || rc == SSL_E
1320: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 29  RROR_WANT_WRITE)
1330: 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65   {...bioShouldRe
1340: 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20  try = 1;..    } 
1350: 65 6c 73 65 20 69 66 20 28 42 49 4f 5f 73 68 6f  else if (BIO_sho
1360: 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50  uld_retry(stateP
1370: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 62 69  tr->bio)) {...bi
1380: 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31  oShouldRetry = 1
1390: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
13a0: 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f   (rc == SSL_ERRO
13b0: 52 5f 53 59 53 43 41 4c 4c 20 26 26 20 54 63 6c  R_SYSCALL && Tcl
13c0: 5f 47 65 74 45 72 72 6e 6f 28 29 20 3d 3d 20 45  _GetErrno() == E
13d0: 41 47 41 49 4e 29 20 7b 0a 09 09 62 69 6f 53 68  AGAIN) {...bioSh
13e0: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09  ouldRetry = 1;..
13f0: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a      }..} else {.
1400: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73  .    if (!SSL_is
1410: 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73  _init_finished(s
1420: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b  tatePtr->ssl)) {
1430: 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72  ...bioShouldRetr
1440: 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d  y = 1;..    }..}
1450: 0a 0a 09 69 66 20 28 62 69 6f 53 68 6f 75 6c 64  ...if (bioShould
1460: 52 65 74 72 79 29 20 7b 0a 09 20 20 20 20 64 70  Retry) {..    dp
1470: 72 69 6e 74 66 28 22 54 68 65 20 49 2f 4f 20 64  rintf("The I/O d
1480: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  id not complete 
1490: 2d 2d 20 62 75 74 20 77 65 20 73 68 6f 75 6c 64  -- but we should
14a0: 20 74 72 79 20 69 74 20 61 67 61 69 6e 22 29 3b   try it again");
14b0: 0a 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65  ...    if (state
14c0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
14d0: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09  _TCL_ASYNC) {...
14e0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
14f0: 6e 67 20 45 41 47 41 49 4e 20 73 6f 20 74 68 61  ng EAGAIN so tha
1500: 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 74 72  t it can be retr
1510: 69 65 64 20 6c 61 74 65 72 22 29 3b 0a 09 09 2a  ied later");...*
1520: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
1530: 41 47 41 49 4e 3b 0a 09 09 72 65 74 75 72 6e 28  AGAIN;...return(
1540: 2d 31 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  -1);..    } else
1550: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 44 6f   {...dprintf("Do
1560: 69 6e 67 20 73 6f 20 6e 6f 77 22 29 3b 0a 09 09  ing so now");...
1570: 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d  continue;..    }
1580: 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 57  ..}...dprintf("W
1590: 65 20 68 61 76 65 20 65 69 74 68 65 72 20 63 6f  e have either co
15a0: 6d 70 6c 65 74 65 6c 79 20 65 73 74 61 62 6c 69  mpletely establi
15b0: 73 68 65 64 20 74 68 65 20 73 65 73 73 69 6f 6e  shed the session
15c0: 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 66   or completely f
15d0: 61 69 6c 65 64 20 69 74 20 2d 2d 20 74 68 65 72  ailed it -- ther
15e0: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 6e 65 65  e is no more nee
15f0: 64 20 74 6f 20 65 76 65 72 20 72 65 74 72 79 20  d to ever retry 
1600: 69 74 20 74 68 6f 75 67 68 22 29 3b 0a 09 62 72  it though");..br
1610: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1620: 73 77 69 74 63 68 20 28 72 63 29 20 7b 0a 09 63  switch (rc) {..c
1630: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f  ase SSL_ERROR_NO
1640: 4e 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20  NE:..    /* The 
1650: 54 4c 53 2f 53 53 4c 20 49 2f 4f 20 6f 70 65 72  TLS/SSL I/O oper
1660: 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20  ation completed 
1670: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
1680: 22 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  "The connection 
1690: 69 73 20 67 6f 6f 64 22 29 3b 0a 09 20 20 20 20  is good");..    
16a0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
16b0: 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  0;..    break;..
16c0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
16d0: 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20  ZERO_RETURN:..  
16e0: 20 20 2f 2a 20 54 68 65 20 54 4c 53 2f 53 53 4c    /* The TLS/SSL
16f0: 20 70 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64   peer has closed
1700: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1710: 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 73  for writing by s
1720: 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65  ending the close
1730: 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 20 2a 2f  _notify alert */
1740: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
1750: 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45  SL_ERROR_ZERO_RE
1760: 54 55 52 4e 3a 20 43 6f 6e 6e 65 63 74 20 72 65  TURN: Connect re
1770: 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
1780: 64 20 76 61 6c 75 65 2e 2e 2e 22 29 3b 0a 09 20  d value...");.. 
1790: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
17a0: 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20   = EINVAL;..    
17b0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
17c0: 74 72 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c  tr, "Peer has cl
17d0: 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74  osed the connect
17e0: 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ion for writing 
17f0: 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63  by sending the c
1800: 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72  lose_notify aler
1810: 74 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  t");..    return
1820: 28 2d 31 29 3b 0a 0a 09 63 61 73 65 20 53 53 4c  (-1);...case SSL
1830: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a  _ERROR_SYSCALL:.
1840: 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e  .    /* Some non
1850: 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61  -recoverable, fa
1860: 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63  tal I/O error oc
1870: 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 20 64  curred */..    d
1880: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f  printf("SSL_ERRO
1890: 52 5f 53 59 53 43 41 4c 4c 22 29 3b 0a 09 20 20  R_SYSCALL");..  
18a0: 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72    if (backingErr
18b0: 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20 3d  or == 0 && err =
18c0: 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66  = 0) {...dprintf
18d0: 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a  ("EOF reached").
18e0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
18f0: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09  = ECONNRESET;...
1900: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
1910: 74 72 2c 20 22 28 75 6e 65 78 70 65 63 74 65 64  tr, "(unexpected
1920: 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 29 3b  ) EOF reached");
1930: 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
1940: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d   (backingError =
1950: 3d 20 30 20 26 26 20 65 72 72 20 3d 3d 20 2d 31  = 0 && err == -1
1960: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49  ) {...dprintf("I
1970: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
1980: 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22  d (errno = %lu)"
1990: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19a0: 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  ) Tcl_GetErrno()
19b0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  );...*errorCodeP
19c0: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e  tr = Tcl_GetErrn
19d0: 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f  o();...if (*erro
19e0: 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e  rCodePtr == ECON
19f0: 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20  NRESET) {...    
1a00: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1a10: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09  ECONNABORTED;...
1a20: 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74  }...Tls_Error(st
1a30: 61 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29  atePtr, (char *)
1a40: 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 54 63   Tcl_ErrnoMsg(Tc
1a50: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 29 3b 0a  l_GetErrno()));.
1a60: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
1a70: 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72  .dprintf("I/O er
1a80: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 61  ror occurred (ba
1a90: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75  ckingError = %lu
1aa0: 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  )", backingError
1ab0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  );...*errorCodeP
1ac0: 74 72 20 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f  tr = backingErro
1ad0: 72 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43  r;...if (*errorC
1ae0: 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52  odePtr == ECONNR
1af0: 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65  ESET) {...    *e
1b00: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
1b10: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a  ONNABORTED;...}.
1b20: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
1b30: 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20 45  ePtr, (char *) E
1b40: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
1b50: 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72  string(backingEr
1b60: 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09  ror));..    }...
1b70: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
1b80: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48  ags |= TLS_TCL_H
1b90: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b  ANDSHAKE_FAILED;
1ba0: 0a 09 20 20 20 20 72 65 74 75 72 6e 28 2d 31 29  ..    return(-1)
1bb0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
1bc0: 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20  OR_SSL:..    /* 
1bd0: 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c  A non-recoverabl
1be0: 65 2c 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69  e, fatal error i
1bf0: 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72  n the SSL librar
1c00: 79 20 6f 63 63 75 72 72 65 64 2c 20 75 73 75 61  y occurred, usua
1c10: 6c 6c 79 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65  lly a protocol e
1c20: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 64 70 72  rror */..    dpr
1c30: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f  intf("SSL_ERROR_
1c40: 53 53 4c 3a 20 47 6f 74 20 70 65 72 6d 61 6e 65  SSL: Got permane
1c50: 6e 74 20 66 61 74 61 6c 20 53 53 4c 20 65 72 72  nt fatal SSL err
1c60: 6f 72 2c 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d  or, aborting imm
1c70: 65 64 69 61 74 65 6c 79 22 29 3b 0a 09 20 20 20  ediately");..   
1c80: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f   if (backingErro
1c90: 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f  r != 0) {...Tls_
1ca0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
1cb0: 28 63 68 61 72 20 2a 29 20 45 52 52 5f 72 65 61  (char *) ERR_rea
1cc0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  son_error_string
1cd0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b  (backingError));
1ce0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20  ..    }..    if 
1cf0: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
1d00: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
1d10: 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f  >ssl) != X509_V_
1d20: 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f  OK) {...Tls_Erro
1d30: 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 61  r(statePtr, (cha
1d40: 72 20 2a 29 20 58 35 30 39 5f 76 65 72 69 66 79  r *) X509_verify
1d50: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
1d60: 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
1d70: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
1d80: 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20  r->ssl)));..    
1d90: 7d 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
1da0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
1db0: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c  L_HANDSHAKE_FAIL
1dc0: 45 44 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ED;..    *errorC
1dd0: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42  odePtr = ECONNAB
1de0: 4f 52 54 45 44 3b 0a 09 20 20 20 20 72 65 74 75  ORTED;..    retu
1df0: 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 73 65 20 53  rn(-1);...case S
1e00: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
1e10: 41 44 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  AD:..case SSL_ER
1e20: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a  ROR_WANT_WRITE:.
1e30: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
1e40: 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50  WANT_X509_LOOKUP
1e50: 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  :..case SSL_ERRO
1e60: 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a  R_WANT_CONNECT:.
1e70: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
1e80: 57 41 4e 54 5f 41 43 43 45 50 54 3a 0a 09 63 61  WANT_ACCEPT:..ca
1e90: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  se SSL_ERROR_WAN
1ea0: 54 5f 41 53 59 4e 43 3a 0a 09 63 61 73 65 20 53  T_ASYNC:..case S
1eb0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53  SL_ERROR_WANT_AS
1ec0: 59 4e 43 5f 4a 4f 42 3a 0a 09 63 61 73 65 20 53  YNC_JOB:..case S
1ed0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4c  SL_ERROR_WANT_CL
1ee0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 43 42 3a 0a 09  IENT_HELLO_CB:..
1ef0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 2f 2a  default:..    /*
1f00: 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   The operation d
1f10: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  id not complete 
1f20: 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 72 65  and should be re
1f30: 74 72 69 65 64 20 6c 61 74 65 72 2e 20 2a 2f 0a  tried later. */.
1f40: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 70  .    dprintf("Op
1f50: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
1f60: 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66  complete, call f
1f70: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  unction again la
1f80: 74 65 72 3a 20 25 69 22 2c 20 72 63 29 3b 0a 09  ter: %i", rc);..
1f90: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
1fa0: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20  r = EAGAIN;..   
1fb0: 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 25 64   dprintf("ERR(%d
1fc0: 2c 20 25 64 29 20 22 2c 20 72 63 2c 20 2a 65 72  , %d) ", rc, *er
1fd0: 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 20  rorCodePtr);..  
1fe0: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74    Tls_Error(stat
1ff0: 65 50 74 72 2c 20 22 4f 70 65 72 61 74 69 6f 6e  ePtr, "Operation
2000: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
2010: 65 2c 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  e, call function
2020: 20 61 67 61 69 6e 20 6c 61 74 65 72 22 29 3b 0a   again later");.
2030: 09 20 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b  .    return(-1);
2040: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
2050: 6e 74 66 28 22 52 65 6d 6f 76 69 6e 67 20 74 68  ntf("Removing th
2060: 65 20 5c 22 54 4c 53 5f 54 43 4c 5f 49 4e 49 54  e \"TLS_TCL_INIT
2070: 5c 22 20 66 6c 61 67 20 73 69 6e 63 65 20 77 65  \" flag since we
2080: 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 20   have completed 
2090: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 22 29 3b  the handshake");
20a0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66  .    statePtr->f
20b0: 6c 61 67 73 20 26 3d 20 7e 54 4c 53 5f 54 43 4c  lags &= ~TLS_TCL
20c0: 5f 49 4e 49 54 3b 0a 0a 20 20 20 20 64 70 72 69  _INIT;..    dpri
20d0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 69  ntf("Returning i
20e0: 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 20 20 20  n success");.   
20f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
2100: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 30   0;.    return(0
2110: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2160: 2a 0a 20 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f  *. * TlsInputPro
2170: 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54 68  c --. *. *    Th
2180: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
2190: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67  invoked by the g
21a0: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a  eneric IO level.
21b0: 20 2a 20 20 20 20 20 20 20 74 6f 20 72 65 61 64   *       to read
21c0: 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 20 53 53   input from a SS
21d0: 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
21e0: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
21f0: 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 52 65 74  sults:. *    Ret
2200: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
2210: 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 6f 72  of bytes read or
2220: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65   -1 on error. Se
2230: 74 73 20 65 72 72 6f 72 43 6f 64 65 50 74 72 0a  ts errorCodePtr.
2240: 20 2a 20 20 20 20 74 6f 20 61 20 50 4f 53 49 58   *    to a POSIX
2250: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2260: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2270: 2c 20 6f 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a  , or 0 if none..
2280: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2290: 74 73 3a 0a 20 2a 20 20 20 20 52 65 61 64 73 20  ts:. *    Reads 
22a0: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 69  input from the i
22b0: 6e 70 75 74 20 64 65 76 69 63 65 20 6f 66 20 74  nput device of t
22c0: 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  he channel.. *. 
22d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
2320: 69 6e 74 20 54 6c 73 49 6e 70 75 74 50 72 6f 63  int TlsInputProc
2330: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
2340: 61 6e 63 65 44 61 74 61 2c 20 63 68 61 72 20 2a  anceData, char *
2350: 62 75 66 2c 20 69 6e 74 20 62 75 66 53 69 7a 65  buf, int bufSize
2360: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
2370: 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 67  Ptr) {.    unsig
2380: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67  ned long backing
2390: 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65  Error;.    State
23a0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
23b0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
23c0: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 74  ata;.    int byt
23d0: 65 73 52 65 61 64 3b 0a 20 20 20 20 69 6e 74 20  esRead;.    int 
23e0: 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 20 20 20 20  tlsConnect;.    
23f0: 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 20 2a 65  int err;..    *e
2400: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
2410: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42  ..    dprintf("B
2420: 49 4f 5f 72 65 61 64 28 25 64 29 22 2c 20 62 75  IO_read(%d)", bu
2430: 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 20  fSize);..    if 
2440: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
2450: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42   & TLS_TCL_CALLB
2460: 41 43 4b 29 20 7b 0a 09 2f 2a 20 64 6f 6e 27 74  ACK) {../* don't
2470: 20 70 72 6f 63 65 73 73 20 61 6e 79 20 62 79 74   process any byt
2480: 65 73 20 77 68 69 6c 65 20 76 65 72 69 66 79 20  es while verify 
2490: 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e  callback is runn
24a0: 69 6e 67 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28  ing */..dprintf(
24b0: 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e  "Callback is run
24c0: 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 20 30 20  ning, reading 0 
24d0: 62 79 74 65 73 22 29 3b 0a 09 72 65 74 75 72 6e  bytes");..return
24e0: 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (0);.    }..    
24f0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67  dprintf("Calling
2500: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
2510: 65 63 74 22 29 3b 0a 20 20 20 20 74 6c 73 43 6f  ect");.    tlsCo
2520: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74  nnect = Tls_Wait
2530: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
2540: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74  Ptr, errorCodePt
2550: 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 74  r, 0);.    if (t
2560: 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b  lsConnect < 0) {
2570: 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61  ..dprintf("Got a
2580: 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20  n error waiting 
2590: 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43  to connect (tlsC
25a0: 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72  onnect = %i, *er
25b0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29  rorCodePtr = %i)
25c0: 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a  ", tlsConnect, *
25d0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09  errorCodePtr);..
25e0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
25f0: 74 72 2c 20 73 74 72 65 72 72 6f 72 28 2a 65 72  tr, strerror(*er
2600: 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09  rorCodePtr));...
2610: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a  bytesRead = -1;.
2620: 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50  .if (*errorCodeP
2630: 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54  tr == ECONNRESET
2640: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
2650: 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  ("Got connection
2660: 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 20 2f   reset");..    /
2670: 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 20  * Soft EOF */.. 
2680: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
2690: 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73   = 0;..    bytes
26a0: 52 65 61 64 20 3d 20 30 3b 0a 09 7d 0a 09 72 65  Read = 0;..}..re
26b0: 74 75 72 6e 28 62 79 74 65 73 52 65 61 64 29 3b  turn(bytesRead);
26c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
26d0: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f      * We need to
26e0: 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65   clear the SSL e
26f0: 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62  rror stack now b
2700: 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69  ecause we someti
2710: 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 20 2a  mes reach.     *
2720: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2730: 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72 72  ith leftover err
2740: 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b  ors in the stack
2750: 2e 20 20 49 66 20 42 49 4f 5f 72 65 61 64 0a 20  .  If BIO_read. 
2760: 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d 31      * returns -1
2770: 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41 47   and intends EAG
2780: 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61 20  AIN, there is a 
2790: 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c 20  leftover error, 
27a0: 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  it will be.     
27b0: 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20 61  * misconstrued a
27c0: 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20  s an error, not 
27d0: 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a 20  EAGAIN..     *. 
27e0: 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69 76      * Alternativ
27f0: 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e 74  ely, we may want
2800: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 3c   to handle the <
2810: 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 66  0 return codes f
2820: 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f 72  rom.     * BIO_r
2830: 65 61 64 20 73 70 65 63 69 61 6c 6c 79 20 28 61  ead specially (a
2840: 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 68 65  s advised in the
2850: 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c 53   RSA docs).  TLS
2860: 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 20 42  's lower level B
2870: 49 4f 0a 20 20 20 20 20 2a 20 66 75 6e 63 74 69  IO.     * functi
2880: 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 74 68  ons play with th
2890: 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 74 68  e retry flags th
28a0: 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 20 73  ough, and this s
28b0: 65 65 6d 73 20 74 6f 20 77 6f 72 6b 0a 20 20 20  eems to work.   
28c0: 20 20 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20    * correctly.  
28d0: 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e 20 54  Similar fix in T
28e0: 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e 20 2d 20  lsOutputProc. - 
28f0: 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20 20  hobbs.     */.  
2900: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
2910: 72 28 29 3b 0a 20 20 20 20 62 79 74 65 73 52 65  r();.    bytesRe
2920: 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73 74  ad = BIO_read(st
2930: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66  atePtr->bio, buf
2940: 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20 20  , bufSize);.    
2950: 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 61  dprintf("BIO_rea
2960: 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52  d -> %d", bytesR
2970: 65 61 64 29 3b 0a 0a 20 20 20 20 65 72 72 20 3d  ead);..    err =
2980: 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73   SSL_get_error(s
2990: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79  tatePtr->ssl, by
29a0: 74 65 73 52 65 61 64 29 3b 0a 20 20 20 20 62 61  tesRead);.    ba
29b0: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52  ckingError = ERR
29c0: 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 23  _get_error();..#
29d0: 69 66 20 30 0a 20 20 20 20 69 66 20 28 62 79 74  if 0.    if (byt
29e0: 65 73 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09  esRead <= 0) {..
29f0: 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72  if (BIO_should_r
2a00: 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62  etry(statePtr->b
2a10: 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69  io)) {..    dpri
2a20: 6e 74 66 28 22 49 2f 4f 20 66 61 69 6c 65 64 2c  ntf("I/O failed,
2a30: 20 77 69 6c 6c 20 72 65 74 72 79 20 62 61 73 65   will retry base
2a40: 64 20 6f 6e 20 45 41 47 41 49 4e 22 29 3b 0a 09  d on EAGAIN");..
2a50: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2a60: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 7d 0a 20  r = EAGAIN;..}. 
2a70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2a80: 20 73 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a   switch (err) {.
2a90: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
2aa0: 4e 4f 4e 45 3a 0a 09 20 20 20 20 64 70 72 69 6e  NONE:..    dprin
2ab0: 74 42 75 66 66 65 72 28 62 75 66 2c 20 62 79 74  tBuffer(buf, byt
2ac0: 65 73 52 65 61 64 29 3b 0a 09 20 20 20 20 62 72  esRead);..    br
2ad0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
2ae0: 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20  ERROR_SSL:..    
2af0: 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72  /* A non-recover
2b00: 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72 72 6f  able, fatal erro
2b10: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62  r in the SSL lib
2b20: 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c 20 75  rary occurred, u
2b30: 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f 63 6f  sually a protoco
2b40: 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20  l error */..    
2b50: 64 70 72 69 6e 74 66 28 22 53 53 4c 20 65 72 72  dprintf("SSL err
2b60: 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  or, indicating t
2b70: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  hat the connecti
2b80: 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 62 6f 72  on has been abor
2b90: 74 65 64 22 29 3b 0a 09 20 20 20 20 69 66 20 28  ted");..    if (
2ba0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20  backingError != 
2bb0: 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72  0) {...Tls_Error
2bc0: 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 61 72  (statePtr, (char
2bd0: 20 2a 29 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65   *) ERR_reason_e
2be0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b  rror_string(back
2bf0: 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20  ingError));..   
2c00: 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f   }..    *errorCo
2c10: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f  dePtr = ECONNABO
2c20: 52 54 45 44 3b 0a 09 20 20 20 20 62 79 74 65 73  RTED;..    bytes
2c30: 52 65 61 64 20 3d 20 2d 31 3b 0a 0a 23 69 66 20  Read = -1;..#if 
2c40: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
2c50: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 30 30  NUMBER >= 0x3000
2c60: 30 30 30 30 4c 0a 09 20 20 20 20 2f 2a 20 55 6e  0000L..    /* Un
2c70: 65 78 70 65 63 74 65 64 20 45 4f 46 20 66 72 6f  expected EOF fro
2c80: 6d 20 74 68 65 20 70 65 65 72 20 66 6f 72 20 4f  m the peer for O
2c90: 70 65 6e 53 53 4c 20 33 2e 30 2b 20 2a 2f 0a 09  penSSL 3.0+ */..
2ca0: 20 20 20 20 69 66 20 28 45 52 52 5f 47 45 54 5f      if (ERR_GET_
2cb0: 52 45 41 53 4f 4e 28 62 61 63 6b 69 6e 67 45 72  REASON(backingEr
2cc0: 72 6f 72 29 20 3d 3d 20 53 53 4c 5f 52 5f 55 4e  ror) == SSL_R_UN
2cd0: 45 58 50 45 43 54 45 44 5f 45 4f 46 5f 57 48 49  EXPECTED_EOF_WHI
2ce0: 4c 45 5f 52 45 41 44 49 4e 47 29 20 7b 0a 09 09  LE_READING) {...
2cf0: 64 70 72 69 6e 74 66 28 22 28 55 6e 65 78 70 65  dprintf("(Unexpe
2d00: 63 74 65 64 29 20 45 4f 46 20 72 65 61 63 68 65  cted) EOF reache
2d10: 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65  d")...*errorCode
2d20: 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73  Ptr = 0;...bytes
2d30: 52 65 61 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f  Read = 0;...Tls_
2d40: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
2d50: 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a  "EOF reached");.
2d60: 09 20 20 20 20 7d 20 20 20 20 0a 23 65 6e 64 69  .    }    .#endi
2d70: 66 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  f..    break;...
2d80: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53  case SSL_ERROR_S
2d90: 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20  YSCALL:..    /* 
2da0: 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72  Some non-recover
2db0: 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20  able, fatal I/O 
2dc0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
2dd0: 2f 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69  /..    if (backi
2de0: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20  ngError == 0 && 
2df0: 62 79 74 65 73 52 65 61 64 20 3d 3d 20 30 29 20  bytesRead == 0) 
2e00: 7b 0a 09 09 2f 2a 20 55 6e 65 78 70 65 63 74 65  {.../* Unexpecte
2e10: 64 20 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70  d EOF from the p
2e20: 65 65 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20  eer for OpenSSL 
2e30: 31 2e 31 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66  1.1 */...dprintf
2e40: 28 22 28 55 6e 65 78 70 65 63 74 65 64 29 20 45  ("(Unexpected) E
2e50: 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a  OF reached")...*
2e60: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
2e70: 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20  ;...bytesRead = 
2e80: 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73  0;...Tls_Error(s
2e90: 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65  tatePtr, "EOF re
2ea0: 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d  ached");...    }
2eb0: 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e   else if (backin
2ec0: 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 62  gError == 0 && b
2ed0: 79 74 65 73 52 65 61 64 20 3d 3d 20 2d 31 29 20  ytesRead == -1) 
2ee0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f  {...dprintf("I/O
2ef0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2f00: 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20  (errno = %lu)", 
2f10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2f20: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b  Tcl_GetErrno());
2f30: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
2f40: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28   = Tcl_GetErrno(
2f50: 29 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d  );...bytesRead =
2f60: 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72   -1;...Tls_Error
2f70: 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 61 72  (statePtr, (char
2f80: 20 2a 29 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67   *) Tcl_ErrnoMsg
2f90: 28 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29  (Tcl_GetErrno())
2fa0: 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
2fb0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f  {...dprintf("I/O
2fc0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2fd0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20  (backingError = 
2fe0: 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 72  %lu)", backingEr
2ff0: 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f  ror);...*errorCo
3000: 64 65 50 74 72 20 3d 20 62 61 63 6b 69 6e 67 45  dePtr = backingE
3010: 72 72 6f 72 3b 0a 09 09 62 79 74 65 73 52 65 61  rror;...bytesRea
3020: 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72  d = -1;...Tls_Er
3030: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63  ror(statePtr, (c
3040: 68 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f  har *) ERR_reaso
3050: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62  n_error_string(b
3060: 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09  ackingError));..
3070: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b      }..    break
3080: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
3090: 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a  OR_ZERO_RETURN:.
30a0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
30b0: 74 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f  t SSL_ERROR_ZERO
30c0: 5f 52 45 54 55 52 4e 2c 20 74 68 69 73 20 6d 65  _RETURN, this me
30d0: 61 6e 73 20 61 6e 20 45 4f 46 20 68 61 73 20 62  ans an EOF has b
30e0: 65 65 6e 20 72 65 61 63 68 65 64 22 29 3b 0a 09  een reached");..
30f0: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20      bytesRead = 
3100: 30 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  0;..    *errorCo
3110: 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20  dePtr = 0;..    
3120: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
3130: 74 72 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c  tr, "Peer has cl
3140: 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74  osed the connect
3150: 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ion for writing 
3160: 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63  by sending the c
3170: 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72  lose_notify aler
3180: 74 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  t");..    break;
3190: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
31a0: 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20  R_WANT_READ:..  
31b0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53    dprintf("Got S
31c0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
31d0: 41 44 2c 20 6d 61 70 70 69 6e 67 20 74 68 69 73  AD, mapping this
31e0: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20   to EAGAIN");.. 
31f0: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d     bytesRead = -
3200: 31 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  1;..    *errorCo
3210: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
3220: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73  .    Tls_Error(s
3230: 74 61 74 65 50 74 72 2c 20 22 53 53 4c 5f 45 52  tatePtr, "SSL_ER
3240: 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 22 29 3b  ROR_WANT_READ");
3250: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64  ..    break;...d
3260: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72  efault:..    dpr
3270: 69 6e 74 66 28 22 55 6e 6b 6e 6f 77 6e 20 65 72  intf("Unknown er
3280: 72 6f 72 20 28 65 72 72 20 3d 20 25 69 29 2c 20  ror (err = %i), 
3290: 6d 61 70 70 69 6e 67 20 74 6f 20 45 4f 46 22 2c  mapping to EOF",
32a0: 20 65 72 72 29 3b 0a 09 20 20 20 20 2a 65 72 72   err);..    *err
32b0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09  orCodePtr = 0;..
32c0: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20      bytesRead = 
32d0: 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  0;..    break;. 
32e0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 2a 65     }..    if (*e
32f0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3c 20 30 29  rrorCodePtr < 0)
3300: 20 7b 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74   {..Tls_Error(st
3310: 61 74 65 50 74 72 2c 20 73 74 72 65 72 72 6f 72  atePtr, strerror
3320: 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29  (*errorCodePtr))
3330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 70 72 69  ;.    }.    dpri
3340: 6e 74 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d  ntf("Input(%d) -
3350: 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53  > %d [%d]", bufS
3360: 69 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20  ize, bytesRead, 
3370: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a  *errorCodePtr);.
3380: 20 20 20 20 72 65 74 75 72 6e 28 62 79 74 65 73      return(bytes
3390: 52 65 61 64 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  Read);.}../*. *-
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70  --. *. * TlsOutp
33f0: 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20  utProc --. *. * 
3400: 20 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72     This procedur
3410: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  e is invoked by 
3420: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
3430: 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f  evel. *       to
3440: 20 77 72 69 74 65 20 6f 75 74 70 75 74 20 74 6f   write output to
3450: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
3460: 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  sed channel.. *.
3470: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20   * Results:. *  
3480: 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75    Returns the nu
3490: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
34a0: 69 74 74 65 6e 20 6f 72 20 2d 31 20 6f 6e 20 65  itten or -1 on e
34b0: 72 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72  rror. Sets error
34c0: 43 6f 64 65 50 74 72 0a 20 2a 20 20 20 20 74 6f  CodePtr. *    to
34d0: 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63   a POSIX error c
34e0: 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ode if an error 
34f0: 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30 20 69  occurred, or 0 i
3500: 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  f none.. *. * Si
3510: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20  de effects:. *  
3520: 20 20 57 72 69 74 65 73 20 6f 75 74 70 75 74 20    Writes output 
3530: 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 65  on the output de
3540: 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e  vice of the chan
3550: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
35a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73  /.static int Tls
35b0: 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e  OutputProc(Clien
35c0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
35d0: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta, const char *
35e0: 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65  buf, int toWrite
35f0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
3600: 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 67  Ptr) {.    unsig
3610: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67  ned long backing
3620: 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65  Error;.    State
3630: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
3640: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
3650: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 72 69  ata;.    int wri
3660: 74 74 65 6e 2c 20 65 72 72 3b 0a 20 20 20 20 69  tten, err;.    i
3670: 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a  nt tlsConnect;..
3680: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
3690: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  r = 0;..    dpri
36a0: 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25  ntf("BIO_write(%
36b0: 70 2c 20 25 64 29 22 2c 20 28 76 6f 69 64 20 2a  p, %d)", (void *
36c0: 29 20 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72  ) statePtr, toWr
36d0: 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ite);.    dprint
36e0: 42 75 66 66 65 72 28 62 75 66 2c 20 74 6f 57 72  Buffer(buf, toWr
36f0: 69 74 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ite);..    if (s
3700: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
3710: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43   TLS_TCL_CALLBAC
3720: 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 44  K) {..dprintf("D
3730: 6f 6e 27 74 20 70 72 6f 63 65 73 73 20 6f 75 74  on't process out
3740: 70 75 74 20 77 68 69 6c 65 20 63 61 6c 6c 62 61  put while callba
3750: 63 6b 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 22  cks are running"
3760: 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31  );..written = -1
3770: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ;..*errorCodePtr
3780: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 72 65 74 75   = EAGAIN;..retu
3790: 72 6e 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  rn(-1);.    }.. 
37a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
37b0: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  ing Tls_WaitForC
37c0: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c  onnect");.    tl
37d0: 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57  sConnect = Tls_W
37e0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
37f0: 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64  atePtr, errorCod
3800: 65 50 74 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  ePtr, 1);.    if
3810: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30   (tlsConnect < 0
3820: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f  ) {..dprintf("Go
3830: 74 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69  t an error waiti
3840: 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74  ng to connect (t
3850: 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20  lsConnect = %i, 
3860: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3870: 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74  %i)", tlsConnect
3880: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  , *errorCodePtr)
3890: 3b 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ;..Tls_Error(sta
38a0: 74 65 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28  tePtr, strerror(
38b0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b  *errorCodePtr));
38c0: 0a 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b  ...written = -1;
38d0: 0a 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65  ..if (*errorCode
38e0: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45  Ptr == ECONNRESE
38f0: 54 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  T) {..    dprint
3900: 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f  f("Got connectio
3910: 6e 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 20  n reset");..    
3920: 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09  /* Soft EOF */..
3930: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
3940: 72 20 3d 20 30 3b 0a 09 20 20 20 20 77 72 69 74  r = 0;..    writ
3950: 74 65 6e 20 3d 20 30 3b 0a 09 7d 0a 09 72 65 74  ten = 0;..}..ret
3960: 75 72 6e 28 77 72 69 74 74 65 6e 29 3b 0a 20 20  urn(written);.  
3970: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f 57    }..    if (toW
3980: 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70  rite == 0) {..dp
3990: 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69 74  rintf("zero-writ
39a0: 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f 5f  e");..err = BIO_
39b0: 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e  flush(statePtr->
39c0: 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72 20  bio);...if (err 
39d0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72  <= 0) {..    dpr
39e0: 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 66  intf("Flushing f
39f0: 61 69 6c 65 64 22 29 3b 0a 0a 09 20 20 20 20 2a  ailed");...    *
3a00: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
3a10: 49 4f 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e  IO;..    written
3a20: 20 3d 20 30 3b 0a 09 20 20 20 20 72 65 74 75 72   = 0;..    retur
3a30: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 77 72 69 74  n(-1);..}...writ
3a40: 74 65 6e 20 3d 20 30 3b 0a 09 2a 65 72 72 6f 72  ten = 0;..*error
3a50: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 72 65  CodePtr = 0;..re
3a60: 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a  turn(0);.    }..
3a70: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
3a80: 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74   need to clear t
3a90: 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61  he SSL error sta
3aa0: 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77  ck now because w
3ab0: 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63  e sometimes reac
3ac0: 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75  h.     * this fu
3ad0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74  nction with left
3ae0: 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74  over errors in t
3af0: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49  he stack.  If BI
3b00: 4f 5f 77 72 69 74 65 0a 20 20 20 20 20 2a 20 72  O_write.     * r
3b10: 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e  eturns -1 and in
3b20: 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68  tends EAGAIN, th
3b30: 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65  ere is a leftove
3b40: 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c  r error, it will
3b50: 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f   be.     * misco
3b60: 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72  nstrued as an er
3b70: 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e  ror, not EAGAIN.
3b80: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41  .     *.     * A
3b90: 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65  lternatively, we
3ba0: 20 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e   may want to han
3bb0: 64 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75 72  dle the <0 retur
3bc0: 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20  n codes from.   
3bd0: 20 20 2a 20 42 49 4f 5f 77 72 69 74 65 20 73 70    * BIO_write sp
3be0: 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69  ecially (as advi
3bf0: 73 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64  sed in the RSA d
3c00: 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77  ocs).  TLS's low
3c10: 65 72 20 6c 65 76 65 6c 0a 20 20 20 20 20 2a 20  er level.     * 
3c20: 42 49 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c  BIO functions pl
3c30: 61 79 20 77 69 74 68 20 74 68 65 20 72 65 74 72  ay with the retr
3c40: 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20  y flags though, 
3c50: 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 74  and this seems t
3c60: 6f 0a 20 20 20 20 20 2a 20 77 6f 72 6b 20 63 6f  o.     * work co
3c70: 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61  rrectly.  Simila
3c80: 72 20 66 69 78 20 69 6e 20 54 6c 73 49 6e 70 75  r fix in TlsInpu
3c90: 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20  tProc. - hobbs. 
3ca0: 20 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63      */.    ERR_c
3cb0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20  lear_error();.  
3cc0: 20 20 77 72 69 74 74 65 6e 20 3d 20 42 49 4f 5f    written = BIO_
3cd0: 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e  write(statePtr->
3ce0: 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69 74  bio, buf, toWrit
3cf0: 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  e);.    dprintf(
3d00: 22 42 49 4f 5f 77 72 69 74 65 28 25 70 2c 20 25  "BIO_write(%p, %
3d10: 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28 76 6f  d) -> [%d]", (vo
3d20: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 2c 20  id *) statePtr, 
3d30: 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e  toWrite, written
3d40: 29 3b 0a 0a 20 20 20 20 65 72 72 20 3d 20 53 53  );..    err = SS
3d50: 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74  L_get_error(stat
3d60: 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74  ePtr->ssl, writt
3d70: 65 6e 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67  en);.    backing
3d80: 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f  Error = ERR_get_
3d90: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77  error();..    sw
3da0: 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 63 61  itch (err) {..ca
3db0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e  se SSL_ERROR_NON
3dc0: 45 3a 0a 09 20 20 20 20 69 66 20 28 77 72 69 74  E:..    if (writ
3dd0: 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09 77 72 69  ten < 0) {...wri
3de0: 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 7d  tten = 0;..    }
3df0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
3e00: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
3e10: 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 20 64  NT_WRITE:..    d
3e20: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f  printf("Got SSL_
3e30: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45  ERROR_WANT_WRITE
3e40: 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20  , mapping it to 
3e50: 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a  EAGAIN");..    *
3e60: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
3e70: 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74  AGAIN;..    writ
3e80: 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 54  ten = -1;..    T
3e90: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
3ea0: 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41  r, "SSL_ERROR_WA
3eb0: 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09 20 20 20  NT_WRITE");..   
3ec0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
3ed0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
3ee0: 41 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66  AD:..    dprintf
3ef0: 28 22 20 77 72 69 74 65 20 52 20 42 4c 4f 43 4b  (" write R BLOCK
3f00: 22 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72  ");..    Tls_Err
3f10: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 53  or(statePtr, "SS
3f20: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41  L_ERROR_WANT_REA
3f30: 44 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  D");..    break;
3f40: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
3f50: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b  R_WANT_X509_LOOK
3f60: 55 50 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66  UP:..    dprintf
3f70: 28 22 20 77 72 69 74 65 20 58 20 42 4c 4f 43 4b  (" write X BLOCK
3f80: 22 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72  ");..    Tls_Err
3f90: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 53  or(statePtr, "SS
3fa0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30  L_ERROR_WANT_X50
3fb0: 39 5f 4c 4f 4f 4b 55 50 22 29 3b 0a 09 20 20 20  9_LOOKUP");..   
3fc0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
3fd0: 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45  SL_ERROR_ZERO_RE
3fe0: 54 55 52 4e 3a 0a 09 20 20 20 20 64 70 72 69 6e  TURN:..    dprin
3ff0: 74 66 28 22 20 63 6c 6f 73 65 64 22 29 3b 0a 09  tf(" closed");..
4000: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b      written = 0;
4010: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
4020: 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c  Ptr = 0;..    Tl
4030: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
4040: 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f 73  , "Peer has clos
4050: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ed the connectio
4060: 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79  n for writing by
4070: 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f   sending the clo
4080: 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 22  se_notify alert"
4090: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  );..    break;..
40a0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
40b0: 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a  SYSCALL:..    /*
40c0: 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65   Some non-recove
40d0: 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f  rable, fatal I/O
40e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
40f0: 2a 2f 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b  */..    if (back
4100: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26  ingError == 0 &&
4110: 20 77 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b   written == 0) {
4120: 0a 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20  ...dprintf("EOF 
4130: 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72  reached")...*err
4140: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09  orCodePtr = 0;..
4150: 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09  .written = 0;...
4160: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
4170: 74 72 2c 20 22 45 4f 46 20 72 65 61 63 68 65 64  tr, "EOF reached
4180: 22 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65  ");...    } else
4190: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f   if (backingErro
41a0: 72 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65  r == 0 && writte
41b0: 6e 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72  n == -1) {...dpr
41c0: 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20  intf("I/O error 
41d0: 6f 63 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20  occurred (errno 
41e0: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
41f0: 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74  ed long) Tcl_Get
4200: 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72  Errno());...*err
4210: 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f  orCodePtr = Tcl_
4220: 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72  GetErrno();...wr
4230: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c  itten = -1;...Tl
4240: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
4250: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 45  , (char *) Tcl_E
4260: 72 72 6e 6f 4d 73 67 28 54 63 6c 5f 47 65 74 45  rrnoMsg(Tcl_GetE
4270: 72 72 6e 6f 28 29 29 29 3b 0a 0a 09 20 20 20 20  rrno()));...    
4280: 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e  } else {...dprin
4290: 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63  tf("I/O error oc
42a0: 63 75 72 72 65 64 20 28 62 61 63 6b 69 6e 67 45  curred (backingE
42b0: 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62 61  rror = %lu)", ba
42c0: 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a  ckingError);...*
42d0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 62  errorCodePtr = b
42e0: 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 09 09 77  ackingError;...w
42f0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54  ritten = -1;...T
4300: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4310: 72 2c 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f  r, (char *) ERR_
4320: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
4330: 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  ing(backingError
4340: 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ));..    }..    
4350: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
4360: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20  L_ERROR_SSL:..  
4370: 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76    /* A non-recov
4380: 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72  erable, fatal er
4390: 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  ror in the SSL l
43a0: 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c  ibrary occurred,
43b0: 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f   usually a proto
43c0: 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20  col error */..  
43d0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 20 65    dprintf("SSL e
43e0: 72 72 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e 67  rror, indicating
43f0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
4400: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 62  tion has been ab
4410: 6f 72 74 65 64 22 29 3b 0a 09 20 20 20 20 69 66  orted");..    if
4420: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21   (backingError !
4430: 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72  = 0) {...Tls_Err
4440: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68  or(statePtr, (ch
4450: 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f 6e  ar *) ERR_reason
4460: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61  _error_string(ba
4470: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20  ckingError));.. 
4480: 20 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72     }..    *error
4490: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41  CodePtr = ECONNA
44a0: 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 77 72 69  BORTED;..    wri
44b0: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20  tten = -1;..    
44c0: 62 72 65 61 6b 3b 0a 0a 09 64 65 66 61 75 6c 74  break;...default
44d0: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  :..    dprintf("
44e0: 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 3a 20 25  unknown error: %
44f0: 64 22 2c 20 65 72 72 29 3b 0a 09 20 20 20 20 62  d", err);..    b
4500: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4510: 20 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50   if (*errorCodeP
4520: 74 72 20 3c 20 30 29 20 7b 0a 09 54 6c 73 5f 45  tr < 0) {..Tls_E
4530: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 73  rror(statePtr, s
4540: 74 72 65 72 72 6f 72 28 2a 65 72 72 6f 72 43 6f  trerror(*errorCo
4550: 64 65 50 74 72 29 29 3b 0a 20 20 20 20 7d 0a 20  dePtr));.    }. 
4560: 20 20 20 64 70 72 69 6e 74 66 28 22 4f 75 74 70     dprintf("Outp
4570: 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74  ut(%d) -> %d", t
4580: 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29  oWrite, written)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 77 72 69  ;.    return(wri
45a0: 74 74 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  tten);.}../*. *-
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45f0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 74 4f  --. *. * TlsSetO
4600: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a  ptionProc --. *.
4610: 20 2a 20 20 20 20 53 65 74 73 20 61 6e 20 6f 70   *    Sets an op
4620: 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  tion value for a
4630: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
4640: 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a  d channel, or a.
4650: 20 2a 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c   *    list of al
4660: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68  l options and th
4670: 65 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20  eir values.. *. 
4680: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20  * Results:. *   
4690: 20 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65   TCL_OK if succe
46a0: 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52  ssful or TCL_ERR
46b0: 4f 52 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a  OR if failed.. *
46c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
46d0: 3a 0a 20 2a 20 20 20 20 55 70 64 61 74 65 73 20  :. *    Updates 
46e0: 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74  channel option t
46f0: 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a  o new value.. *.
4700: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
4750: 20 69 6e 74 0a 54 6c 73 53 65 74 4f 70 74 69 6f   int.TlsSetOptio
4760: 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61  nProc(ClientData
4770: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20   instanceData,  
4780: 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74    /* Socket stat
4790: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  e. */.    Tcl_In
47a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
47b0: 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63  * For errors - c
47c0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  an be NULL. */. 
47d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f     const char *o
47e0: 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61  ptionName,./* Na
47f0: 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e  me of the option
4800: 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
4810: 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a  e for, or..... *
4820: 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c   NULL to get all
4830: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65   options and the
4840: 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20  ir values. */.  
4850: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70    const char *op
4860: 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61  tionValue)./* Va
4870: 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20  lue for option. 
4880: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
4890: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
48a0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
48b0: 61 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  a;..    Tcl_Chan
48c0: 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54  nel downChan = T
48d0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61  ls_GetParent(sta
48e0: 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46  tePtr, TLS_TCL_F
48f0: 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20 54 63  ASTPATH);.    Tc
4900: 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f  l_DriverSetOptio
4910: 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e  nProc *setOption
4920: 50 72 6f 63 3b 0a 0a 20 20 20 20 73 65 74 4f 70  Proc;..    setOp
4930: 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43  tionProc = Tcl_C
4940: 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50  hannelSetOptionP
4950: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
4960: 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29  elType(downChan)
4970: 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f 70  );.    if (setOp
4980: 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c  tionProc != NULL
4990: 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73 65  ) {..return (*se
49a0: 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c  tOptionProc)(Tcl
49b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
49c0: 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e  nceData(downChan
49d0: 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f  ), interp, optio
49e0: 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c  nName, optionVal
49f0: 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ue);.    } else 
4a00: 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d  if (optionName =
4a10: 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20  = (char*) NULL) 
4a20: 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73  {../*.. * Reques
4a30: 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 61  t is query for a
4a40: 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73  ll options, this
4a50: 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65   is ok... */..re
4a60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
4a70: 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a   }.    /*.     *
4a80: 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73   Request for a s
4a90: 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68  pecific option h
4aa0: 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64  as to fail, we d
4ab0: 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20  on't have any.. 
4ac0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
4ad0: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
4ae0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
4af0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a  ptionName, "");.
4b00: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4b50: 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72  * TlsGetOptionPr
4b60: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 47  oc --. *. *    G
4b70: 65 74 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61  ets an option va
4b80: 6c 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f  lue for a SSL so
4b90: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
4ba0: 65 6c 2c 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c  el, or a. *    l
4bb0: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f  ist of all optio
4bc0: 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c  ns and their val
4bd0: 75 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ues.. *. * Resul
4be0: 74 73 3a 0a 20 2a 20 20 20 20 41 20 73 74 61 6e  ts:. *    A stan
4bf0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
4c00: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   The value of th
4c10: 65 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 69  e specified opti
4c20: 6f 6e 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69  on or a. *    li
4c30: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e  st of all option
4c40: 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75  s and their valu
4c50: 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  es is returned i
4c60: 6e 20 74 68 65 0a 20 2a 20 20 20 20 73 75 70 70  n the. *    supp
4c70: 6c 69 65 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a  lied DString.. *
4c80: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4c90: 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a  :. *    None.. *
4ca0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4cf0: 63 20 69 6e 74 0a 54 6c 73 47 65 74 4f 70 74 69  c int.TlsGetOpti
4d00: 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  onProc(ClientDat
4d10: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
4d20: 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61     /* Socket sta
4d30: 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  te. */.    Tcl_I
4d40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
4d50: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20  /* For errors - 
4d60: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  can be NULL. */.
4d70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4d80: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e  optionName,./* N
4d90: 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f  ame of the optio
4da0: 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  n to retrieve th
4db0: 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 0a  e value for, or.
4dc0: 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 67  .... * NULL to g
4dd0: 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61  et all options a
4de0: 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e  nd their values.
4df0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72   */.    Tcl_DStr
4e00: 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65  ing *optionValue
4e10: 29 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74  )./* Where to st
4e20: 6f 72 65 20 74 68 65 20 63 6f 6d 70 75 74 65 64  ore the computed
4e30: 20 76 61 6c 75 65 20 69 6e 69 74 69 61 6c 69 7a   value initializ
4e40: 65 64 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f  ed by caller. */
4e50: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
4e60: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
4e70: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
4e80: 0a 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ..    Tcl_Channe
4e90: 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c 73  l downChan = Tls
4ea0: 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65  _GetParent(state
4eb0: 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53  Ptr, TLS_TCL_FAS
4ec0: 54 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f  TPATH);.    Tcl_
4ed0: 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e 50  DriverGetOptionP
4ee0: 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72  roc *getOptionPr
4ef0: 6f 63 3b 0a 0a 20 20 20 20 67 65 74 4f 70 74 69  oc;..    getOpti
4f00: 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  onProc = Tcl_Cha
4f10: 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f  nnelGetOptionPro
4f20: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  c(Tcl_GetChannel
4f30: 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b  Type(downChan));
4f40: 0a 20 20 20 20 69 66 20 28 67 65 74 4f 70 74 69  .    if (getOpti
4f50: 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20  onProc != NULL) 
4f60: 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67 65 74 4f  {..return (*getO
4f70: 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47  ptionProc)(Tcl_G
4f80: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
4f90: 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c  eData(downChan),
4fa0: 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e   interp, optionN
4fb0: 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65  ame, optionValue
4fc0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
4fd0: 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20   (optionName == 
4fe0: 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a  (char*) NULL) {.
4ff0: 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73 74 20  ./*.. * Request 
5000: 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c  is query for all
5010: 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69   options, this i
5020: 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65 74 75  s ok... */..retu
5030: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
5040: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52  .    /*.     * R
5050: 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65  equest for a spe
5060: 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73  cific option has
5070: 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e   to fail, we don
5080: 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 20  't have any..   
5090: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
50a0: 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70  Tcl_BadChannelOp
50b0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74  tion(interp, opt
50c0: 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d 0a  ionName, "");.}.
50d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
5120: 54 6c 73 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a  TlsWatchProc --.
5130: 20 2a 0a 20 2a 20 20 20 20 49 6e 69 74 69 61 6c   *. *    Initial
5140: 69 7a 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72  ize the notifier
5150: 20 74 6f 20 77 61 74 63 68 20 54 63 6c 5f 46 69   to watch Tcl_Fi
5160: 6c 65 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68  les from this ch
5170: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73  annel.. *. * Res
5180: 75 6c 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65  ults:. *    None
5190: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
51a0: 65 63 74 73 3a 0a 20 2a 20 20 20 20 53 65 74 73  ects:. *    Sets
51b0: 20 75 70 20 74 68 65 20 6e 6f 74 69 66 69 65 72   up the notifier
51c0: 20 73 6f 20 74 68 61 74 20 61 20 66 75 74 75 72   so that a futur
51d0: 65 20 65 76 65 6e 74 20 6f 6e 20 74 68 65 20 63  e event on the c
51e0: 68 61 6e 6e 65 6c 0a 20 2a 20 20 20 20 77 69 6c  hannel. *    wil
51f0: 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c  l be seen by Tcl
5200: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
5250: 74 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 57 61  tatic void.TlsWa
5260: 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  tchProc(ClientDa
5270: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
5280: 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65      /* The socke
5290: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20  t state. */.    
52a0: 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 45  int mask).../* E
52b0: 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 72 65 73  vents of interes
52c0: 74 3b 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62  t; an OR-ed comb
52d0: 69 6e 61 74 69 6f 6e 20 6f 66 0a 09 09 09 09 20  ination of..... 
52e0: 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20  * TCL_READABLE, 
52f0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64  TCL_WRITABLE and
5300: 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 2e 20   TCL_EXCEPTION. 
5310: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  */.{.    Tcl_Cha
5320: 6e 6e 65 6c 20 20 20 20 20 64 6f 77 6e 43 68 61  nnel     downCha
5330: 6e 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  n;.    State *st
5340: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
5350: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
5360: 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57  .    Tcl_DriverW
5370: 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50  atchProc *watchP
5380: 72 6f 63 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  roc;..    dprint
5390: 66 28 22 54 6c 73 57 61 74 63 68 50 72 6f 63 28  f("TlsWatchProc(
53a0: 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b 0a 0a  0x%x)", mask);..
53b0: 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 74      /* Pretend t
53c0: 6f 20 62 65 20 64 65 61 64 20 61 73 20 6c 6f 6e  o be dead as lon
53d0: 67 20 61 73 20 74 68 65 20 76 65 72 69 66 79 20  g as the verify 
53e0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e  callback is runn
53f0: 69 6e 67 2e 0a 20 20 20 20 20 2a 20 4f 74 68 65  ing..     * Othe
5400: 72 77 69 73 65 20 74 68 61 74 20 63 61 6c 6c 62  rwise that callb
5410: 61 63 6b 20 63 6f 75 6c 64 20 62 65 20 69 6e 76  ack could be inv
5420: 6f 6b 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  oked recursively
5430: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  . */.    if (sta
5440: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
5450: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29  LS_TCL_CALLBACK)
5460: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c   {..dprintf("Cal
5470: 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e  lback is on-goin
5480: 67 2c 20 64 6f 69 6e 67 20 6e 6f 74 68 69 6e 67  g, doing nothing
5490: 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  ");..return;.   
54a0: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 46 6c   }..    dprintFl
54b0: 61 67 73 28 73 74 61 74 65 50 74 72 29 3b 0a 0a  ags(statePtr);..
54c0: 20 20 20 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54      downChan = T
54d0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61  ls_GetParent(sta
54e0: 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46  tePtr, TLS_TCL_F
54f0: 41 53 54 50 41 54 48 29 3b 0a 0a 20 20 20 20 69  ASTPATH);..    i
5500: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  f (statePtr->fla
5510: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e  gs & TLS_TCL_HAN
5520: 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 29 20 7b  DSHAKE_FAILED) {
5530: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64  ..dprintf("Asked
5540: 20 74 6f 20 77 61 74 63 68 20 61 20 73 6f 63 6b   to watch a sock
5550: 65 74 20 77 69 74 68 20 61 20 66 61 69 6c 65 64  et with a failed
5560: 20 68 61 6e 64 73 68 61 6b 65 20 2d 2d 20 6e 6f   handshake -- no
5570: 74 68 69 6e 67 20 63 61 6e 20 68 61 70 70 65 6e  thing can happen
5580: 20 68 65 72 65 22 29 3b 0a 09 64 70 72 69 6e 74   here");..dprint
5590: 66 28 22 55 6e 72 65 67 69 73 74 65 72 69 6e 67  f("Unregistering
55a0: 20 69 6e 74 65 72 65 73 74 20 69 6e 20 74 68 65   interest in the
55b0: 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 22 29   lower channel")
55c0: 3b 0a 0a 09 77 61 74 63 68 50 72 6f 63 20 3d 20  ;...watchProc = 
55d0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68  Tcl_ChannelWatch
55e0: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e  Proc(Tcl_GetChan
55f0: 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e  nelType(downChan
5600: 29 29 3b 0a 09 77 61 74 63 68 50 72 6f 63 28 54  ));..watchProc(T
5610: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
5620: 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68  tanceData(downCh
5630: 61 6e 29 2c 20 30 29 3b 0a 09 73 74 61 74 65 50  an), 0);..stateP
5640: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20  tr->watchMask = 
5650: 30 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  0;..return;.    
5660: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
5670: 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73  >watchMask = mas
5680: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 68  k;..    /* No ch
5690: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 61  annel handlers a
56a0: 6e 79 20 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c  ny more. We will
56b0: 20 62 65 20 6e 6f 74 69 66 69 65 64 20 61 75 74   be notified aut
56c0: 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 20 20 20  omatically.     
56d0: 2a 20 61 62 6f 75 74 20 65 76 65 6e 74 73 20 6f  * about events o
56e0: 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65  n the channel be
56f0: 6c 6f 77 20 76 69 61 20 61 20 63 61 6c 6c 20 74  low via a call t
5700: 6f 20 6f 75 72 0a 20 20 20 20 20 2a 20 27 54 72  o our.     * 'Tr
5710: 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 79 50 72 6f  ansformNotifyPro
5720: 63 27 2e 20 42 75 74 20 77 65 20 68 61 76 65 20  c'. But we have 
5730: 74 6f 20 70 61 73 73 20 74 68 65 20 69 6e 74 65  to pass the inte
5740: 72 65 73 74 20 64 6f 77 6e 20 6e 6f 77 2e 0a 20  rest down now.. 
5750: 20 20 20 20 2a 20 57 65 20 61 72 65 20 61 6c 6c      * We are all
5760: 6f 77 65 64 20 74 6f 20 61 64 64 20 61 64 64 69  owed to add addi
5770: 74 69 6f 6e 61 6c 20 27 69 6e 74 65 72 65 73 74  tional 'interest
5780: 27 20 74 6f 20 74 68 65 20 6d 61 73 6b 20 69 66  ' to the mask if
5790: 20 77 65 20 77 61 6e 74 0a 20 20 20 20 20 2a 20   we want.     * 
57a0: 74 6f 2e 20 42 75 74 20 74 68 69 73 20 74 72 61  to. But this tra
57b0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20  nsformation has 
57c0: 6e 6f 20 73 75 63 68 20 69 6e 74 65 72 65 73 74  no such interest
57d0: 2e 20 49 74 20 6a 75 73 74 20 70 61 73 73 65 73  . It just passes
57e0: 0a 20 20 20 20 20 2a 20 74 68 65 20 72 65 71 75  .     * the requ
57f0: 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61 6e  est down, unchan
5800: 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ged..     */.   
5810: 20 64 70 72 69 6e 74 66 28 22 52 65 67 69 73 74   dprintf("Regist
5820: 65 72 69 6e 67 20 6f 75 72 20 69 6e 74 65 72 65  ering our intere
5830: 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20  st in the lower 
5840: 63 68 61 6e 6e 65 6c 20 28 63 68 61 6e 3d 25 70  channel (chan=%p
5850: 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 64 6f 77  )", (void *) dow
5860: 6e 43 68 61 6e 29 3b 0a 20 20 20 20 77 61 74 63  nChan);.    watc
5870: 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e  hProc = Tcl_Chan
5880: 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c  nelWatchProc(Tcl
5890: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
58a0: 64 6f 77 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20  downChan));.    
58b0: 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65  watchProc(Tcl_Ge
58c0: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
58d0: 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20  Data(downChan), 
58e0: 6d 61 73 6b 29 3b 0a 0a 0a 20 20 20 20 2f 2a 0a  mask);...    /*.
58f0: 20 20 20 20 20 2a 20 4d 61 6e 61 67 65 6d 65 6e       * Managemen
5900: 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  t of the interna
5910: 6c 20 74 69 6d 65 72 2e 0a 20 20 20 20 20 2a 2f  l timer..     */
5920: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5930: 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c  r->timer != (Tcl
5940: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
5950: 4c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41  L) {..dprintf("A
5960: 20 74 69 6d 65 72 20 77 61 73 20 66 6f 75 6e 64   timer was found
5970: 2c 20 64 65 6c 65 74 69 6e 67 20 69 74 22 29 3b  , deleting it");
5980: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
5990: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
59a0: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
59b0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54  ePtr->timer = (T
59c0: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
59d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
59e0: 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f  if ((mask & TCL_
59f0: 52 45 41 44 41 42 4c 45 29 20 26 26 0a 09 28 28  READABLE) &&..((
5a00: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65  Tcl_InputBuffere
5a10: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  d(statePtr->self
5a20: 29 20 3e 20 30 29 20 7c 7c 20 28 42 49 4f 5f 63  ) > 0) || (BIO_c
5a30: 74 72 6c 5f 70 65 6e 64 69 6e 67 28 73 74 61 74  trl_pending(stat
5a40: 65 50 74 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29  ePtr->bio) > 0))
5a50: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 72  ) {../*.. * Ther
5a60: 65 20 69 73 20 69 6e 74 65 72 65 73 74 20 69 6e  e is interest in
5a70: 20 72 65 61 64 61 62 6c 65 20 65 76 65 6e 74 73   readable events
5a80: 20 61 6e 64 20 77 65 20 61 63 74 75 61 6c 6c 79   and we actually
5a90: 20 68 61 76 65 0a 09 20 2a 20 64 61 74 61 20 77   have.. * data w
5aa0: 61 69 74 69 6e 67 2c 20 73 6f 20 67 65 6e 65 72  aiting, so gener
5ab0: 61 74 65 20 61 20 74 69 6d 65 72 20 74 6f 20 66  ate a timer to f
5ac0: 6c 75 73 68 20 74 68 61 74 2e 0a 09 20 2a 2f 0a  lush that... */.
5ad0: 09 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 69  .dprintf("Creati
5ae0: 6e 67 20 61 20 6e 65 77 20 74 69 6d 65 72 20 73  ng a new timer s
5af0: 69 6e 63 65 20 64 61 74 61 20 61 70 70 65 61 72  ince data appear
5b00: 73 20 74 6f 20 62 65 20 77 61 69 74 69 6e 67 22  s to be waiting"
5b10: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
5b20: 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  mer = Tcl_Create
5b30: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53  TimerHandler(TLS
5b40: 5f 54 43 4c 5f 44 45 4c 41 59 2c 20 54 6c 73 43  _TCL_DELAY, TlsC
5b50: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d  hannelHandlerTim
5b60: 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  er, (ClientData)
5b70: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
5b80: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  }.}../*. *------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5bd0: 0a 20 2a 20 54 6c 73 47 65 74 48 61 6e 64 6c 65  . * TlsGetHandle
5be0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20  Proc --. *. *   
5bf0: 20 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c   Called from Tcl
5c00: 5f 47 65 74 43 68 61 6e 6e 65 6c 46 69 6c 65 20  _GetChannelFile 
5c10: 74 6f 20 72 65 74 72 69 65 76 65 20 6f 2f 73 20  to retrieve o/s 
5c20: 66 69 6c 65 20 68 61 6e 64 6c 65 72 0a 20 2a 20  file handler. * 
5c30: 20 20 20 66 72 6f 6d 20 74 68 65 20 53 53 4c 20     from the SSL 
5c40: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
5c50: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nnel.. *. * Resu
5c60: 6c 74 73 3a 0a 20 2a 20 20 20 20 54 68 65 20 61  lts:. *    The a
5c70: 70 70 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46  ppropriate Tcl_F
5c80: 69 6c 65 20 68 61 6e 64 6c 65 20 6f 72 20 4e 55  ile handle or NU
5c90: 4c 4c 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20  LL if none.. *. 
5ca0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5cb0: 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20   *    None.. *. 
5cc0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d00: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
5d10: 69 6e 74 20 54 6c 73 47 65 74 48 61 6e 64 6c 65  int TlsGetHandle
5d20: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
5d30: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20  instanceData,   
5d40: 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65   /* Socket state
5d50: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 69 72  . */.    int dir
5d60: 65 63 74 69 6f 6e 2c 09 09 2f 2a 20 54 43 4c 5f  ection,../* TCL_
5d70: 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f  READABLE or TCL_
5d80: 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  WRITABLE */.    
5d90: 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64  ClientData *hand
5da0: 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e 64 6c 65  lePtr)./* Handle
5db0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5dc0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a   the channel */.
5dd0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
5de0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
5df0: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
5e00: 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f  .    return(Tcl_
5e10: 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  GetChannelHandle
5e20: 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73  (Tls_GetParent(s
5e30: 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c  tatePtr, TLS_TCL
5e40: 5f 46 41 53 54 50 41 54 48 29 2c 20 64 69 72 65  _FASTPATH), dire
5e50: 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72  ction, handlePtr
5e60: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ));.}../*. *----
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5eb0: 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50   *. * TlsNotifyP
5ec0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20  roc --. *. *    
5ed0: 48 61 6e 64 6c 65 72 20 63 61 6c 6c 65 64 20 62  Handler called b
5ee0: 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20  y Tcl to inform 
5ef0: 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 0a 20  us of activity. 
5f00: 2a 20 20 20 20 6f 6e 20 74 68 65 20 75 6e 64 65  *    on the unde
5f10: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a  rlying channel..
5f20: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
5f30: 2a 20 20 20 20 54 79 70 65 20 6f 66 20 65 76 65  *    Type of eve
5f40: 6e 74 20 6f 72 20 30 20 69 66 20 66 61 69 6c 65  nt or 0 if faile
5f50: 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  d. *. * Side eff
5f60: 65 63 74 73 3a 0a 20 2a 20 20 20 20 4d 61 79 20  ects:. *    May 
5f70: 70 72 6f 63 65 73 73 20 74 68 65 20 69 6e 63 6f  process the inco
5f80: 6d 69 6e 67 20 65 76 65 6e 74 20 62 79 20 69 74  ming event by it
5f90: 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  self.. *. *-----
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c  */.static int Tl
5ff0: 73 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65  sNotifyProc(Clie
6000: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
6010: 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65  ata,    /* Socke
6020: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20  t state. */.    
6030: 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 74  int mask).../* t
6040: 79 70 65 20 6f 66 20 65 76 65 6e 74 20 74 68 61  ype of event tha
6050: 74 20 6f 63 63 75 72 72 65 64 3a 0a 09 09 09 09  t occurred:.....
6060: 20 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61   * OR-ed combina
6070: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44  tion of TCL_READ
6080: 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54  ABLE or TCL_WRIT
6090: 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 20 53 74  ABLE */.{.    St
60a0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
60b0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
60c0: 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  ceData;.    int 
60d0: 65 72 72 6f 72 43 6f 64 65 3b 0a 0a 20 20 20 20  errorCode;..    
60e0: 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20 65 76 65  /*.     * An eve
60f0: 6e 74 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74  nt occurred in t
6100: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68  he underlying ch
6110: 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a 20 20 20  annel.  This.   
6120: 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69    * transformati
6130: 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f 63 65  on doesn't proce
6140: 73 73 20 73 75 63 68 20 65 76 65 6e 74 73 20 74  ss such events t
6150: 68 75 73 20 72 65 74 75 72 6e 73 20 74 68 65 0a  hus returns the.
6160: 20 20 20 20 20 2a 20 69 6e 63 6f 6d 69 6e 67 20       * incoming 
6170: 6d 61 73 6b 20 75 6e 63 68 61 6e 67 65 64 2e 0a  mask unchanged..
6180: 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28       */.    if (
6190: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
61a0: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
61b0: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a  en) NULL) {../*.
61c0: 09 20 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 78  . * Delete an ex
61d0: 69 73 74 69 6e 67 20 74 69 6d 65 72 2e 20 49 74  isting timer. It
61e0: 20 77 61 73 20 6e 6f 74 20 66 69 72 65 64 2c 20   was not fired, 
61f0: 79 65 74 20 77 65 20 61 72 65 0a 09 20 2a 20 68  yet we are.. * h
6200: 65 72 65 2c 20 73 6f 20 74 68 65 20 63 68 61 6e  ere, so the chan
6210: 6e 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  nel below genera
6220: 74 65 64 20 73 75 63 68 20 61 6e 20 65 76 65 6e  ted such an even
6230: 74 20 61 6e 64 20 77 65 0a 09 20 2a 20 64 6f 6e  t and we.. * don
6240: 27 74 20 68 61 76 65 20 74 6f 2e 20 54 68 65 20  't have to. The 
6250: 72 65 6e 65 77 61 6c 20 6f 66 20 74 68 65 20 69  renewal of the i
6260: 6e 74 65 72 65 73 74 20 61 66 74 65 72 20 74 68  nterest after th
6270: 65 0a 09 20 2a 20 65 78 65 63 75 74 69 6f 6e 20  e.. * execution 
6280: 6f 66 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c  of channel handl
6290: 65 72 73 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  ers will eventua
62a0: 6c 6c 79 20 63 61 75 73 65 20 75 73 20 74 6f 0a  lly cause us to.
62b0: 09 20 2a 20 72 65 63 72 65 61 74 65 20 74 68 65  . * recreate the
62c0: 20 74 69 6d 65 72 20 28 69 6e 20 57 61 74 63 68   timer (in Watch
62d0: 50 72 6f 63 29 2e 0a 09 20 2a 2f 0a 09 54 63 6c  Proc)... */..Tcl
62e0: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
62f0: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
6300: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
6310: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69  >timer = (Tcl_Ti
6320: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a  merToken) NULL;.
6330: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
6340: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
6350: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43   TLS_TCL_CALLBAC
6360: 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 52  K) {..dprintf("R
6370: 65 74 75 72 6e 69 6e 67 20 30 20 64 75 65 20 74  eturning 0 due t
6380: 6f 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 09 72  o callback");..r
6390: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
63a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
63b0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
63c0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 65  Connect");.    e
63d0: 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  rrorCode = 0;.  
63e0: 20 20 69 66 20 28 54 6c 73 5f 57 61 69 74 46 6f    if (Tls_WaitFo
63f0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  rConnect(statePt
6400: 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c 20 31  r, &errorCode, 1
6410: 29 20 3c 20 30 29 20 7b 0a 09 54 6c 73 5f 45 72  ) < 0) {..Tls_Er
6420: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 73 74  ror(statePtr, st
6430: 72 65 72 72 6f 72 28 65 72 72 6f 72 43 6f 64 65  rerror(errorCode
6440: 29 29 3b 0a 09 69 66 20 28 65 72 72 6f 72 43 6f  ));..if (errorCo
6450: 64 65 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a  de == EAGAIN) {.
6460: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73  .    dprintf("As
6470: 79 6e 63 20 66 6c 61 67 20 63 6f 75 6c 64 20 62  ync flag could b
6480: 65 20 73 65 74 20 28 64 69 64 6e 27 74 20 63 68  e set (didn't ch
6490: 65 63 6b 29 20 61 6e 64 20 65 72 72 6f 72 43 6f  eck) and errorCo
64a0: 64 65 20 3d 3d 20 45 41 47 41 49 4e 3a 20 20 52  de == EAGAIN:  R
64b0: 65 74 75 72 6e 69 6e 67 20 30 22 29 3b 0a 0a 09  eturning 0");...
64c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d      return 0;..}
64d0: 0a 0a 09 64 70 72 69 6e 74 66 28 22 54 6c 73 5f  ...dprintf("Tls_
64e0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72  WaitForConnect r
64f0: 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
6500: 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  ");.    }..    d
6510: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
6520: 67 20 25 69 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20  g %i", mask);.. 
6530: 20 20 20 72 65 74 75 72 6e 28 6d 61 73 6b 29 3b     return(mask);
6540: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
6580: 0a 20 2a 0a 20 2a 20 20 20 20 54 6c 73 43 68 61  . *. *    TlsCha
6590: 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72  nnelHandlerTimer
65a0: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 2d 2d 2d   --. *. *    ---
65b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
65e0: 2a 20 20 20 20 43 61 6c 6c 65 64 20 62 79 20 74  *    Called by t
65f0: 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d 3e 20  he notifier (-> 
6600: 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 68 20  timer) to flush 
6610: 6f 75 74 0a 20 2a 20 20 20 20 69 6e 66 6f 72 6d  out. *    inform
6620: 61 74 69 6f 6e 20 77 61 69 74 69 6e 67 20 69 6e  ation waiting in
6630: 20 63 68 61 6e 6e 65 6c 20 62 75 66 66 65 72 73   channel buffers
6640: 2e 0a 20 2a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  .. *    --------
6650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20  --------*. *. * 
6680: 20 20 20 53 69 64 65 20 65 66 66 65 63 74 73 3a     Side effects:
6690: 0a 20 2a 20 20 20 20 20 20 20 20 41 73 20 6f 66  . *        As of
66a0: 20 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64   'TlsChannelHand
66b0: 6c 65 72 27 2e 0a 20 2a 0a 20 2a 20 20 20 20 52  ler'.. *. *    R
66c0: 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20  esult:. *       
66d0: 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   None.. *. *----
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6710: 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  --*. */.static v
6720: 6f 69 64 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61  oid TlsChannelHa
6730: 6e 64 6c 65 72 54 69 6d 65 72 28 43 6c 69 65 6e  ndlerTimer(Clien
6740: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
6750: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
6760: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
6770: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
6780: 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30      int mask = 0
6790: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
67a0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73  Called");..    s
67b0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
67c0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
67d0: 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20  ) NULL;..    if 
67e0: 28 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74  (BIO_wpending(st
67f0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a  atePtr->bio)) {.
6800: 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d  .dprintf("[chan=
6810: 25 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c 65  %p] BIO writable
6820: 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ", statePtr->sel
6830: 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43  f);...mask |= TC
6840: 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20  L_WRITABLE;.    
6850: 7d 0a 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 70  }..    if (BIO_p
6860: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d  ending(statePtr-
6870: 3e 62 69 6f 29 29 20 7b 0a 09 64 70 72 69 6e 74  >bio)) {..dprint
6880: 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49 4f  f("[chan=%p] BIO
6890: 20 72 65 61 64 61 62 6c 65 22 2c 20 73 74 61 74   readable", stat
68a0: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 6d  ePtr->self);...m
68b0: 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41  ask |= TCL_READA
68c0: 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  BLE;.    }..    
68d0: 64 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79 69  dprintf("Notifyi
68e0: 6e 67 20 6f 75 72 73 65 6c 76 65 73 22 29 3b 0a  ng ourselves");.
68f0: 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68      Tcl_NotifyCh
6900: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
6910: 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20  self, mask);..  
6920: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
6930: 6e 69 6e 67 22 29 3b 0a 0a 20 20 20 20 72 65 74  ning");..    ret
6940: 75 72 6e 3b 0a 7d 0a 0a 54 63 6c 5f 43 68 61 6e  urn;.}..Tcl_Chan
6950: 6e 65 6c 20 54 6c 73 5f 47 65 74 50 61 72 65 6e  nel Tls_GetParen
6960: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
6970: 72 2c 20 69 6e 74 20 6d 61 73 6b 46 6c 61 67 73  r, int maskFlags
6980: 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ) {.    dprintf(
6990: 22 52 65 71 75 65 73 74 65 64 20 74 6f 20 67 65  "Requested to ge
69a0: 74 20 70 61 72 65 6e 74 20 6f 66 20 63 68 61 6e  t parent of chan
69b0: 6e 65 6c 20 25 70 22 2c 20 73 74 61 74 65 50 74  nel %p", statePt
69c0: 72 2d 3e 73 65 6c 66 29 3b 0a 0a 20 20 20 20 69  r->self);..    i
69d0: 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  f ((statePtr->fl
69e0: 61 67 73 20 26 20 7e 6d 61 73 6b 46 6c 61 67 73  ags & ~maskFlags
69f0: 29 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54  ) & TLS_TCL_FAST
6a00: 50 41 54 48 29 20 7b 0a 09 64 70 72 69 6e 74 66  PATH) {..dprintf
6a10: 28 22 41 73 6b 65 64 20 74 6f 20 67 65 74 20 74  ("Asked to get t
6a20: 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  he parent channe
6a30: 6c 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 75  l while we are u
6a40: 73 69 6e 67 20 46 61 73 74 50 61 74 68 20 2d 2d  sing FastPath --
6a50: 20 72 65 74 75 72 6e 69 6e 67 20 4e 55 4c 4c 22   returning NULL"
6a60: 29 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  );..return(NULL)
6a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
6a80: 72 6e 28 54 63 6c 5f 47 65 74 53 74 61 63 6b 65  rn(Tcl_GetStacke
6a90: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
6aa0: 72 2d 3e 73 65 6c 66 29 29 3b 0a 7d 0a 0a 2f 2a  r->self));.}../*
6ab0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
6b00: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a  _ChannelType --.
6b10: 20 2a 0a 20 2a 20 20 20 20 52 65 74 75 72 6e 20   *. *    Return 
6b20: 74 68 65 20 63 6f 72 72 65 63 74 20 54 4c 53 20  the correct TLS 
6b30: 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 20 69  channel driver i
6b40: 6e 66 6f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nfo. *. * Result
6b50: 73 3a 0a 20 2a 20 20 20 20 54 68 65 20 63 6f 72  s:. *    The cor
6b60: 72 65 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69  rect channel dri
6b70: 76 65 72 20 66 6f 72 20 74 68 65 20 63 75 72 72  ver for the curr
6b80: 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54  ent version of T
6b90: 63 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  cl.. *. * Side e
6ba0: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f  ffects:. *    No
6bb0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
6c00: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63  .static const Tc
6c10: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c  l_ChannelType tl
6c20: 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b  sChannelType = {
6c30: 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a  .    "tls",.../*
6c40: 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   Type name */.  
6c50: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
6c60: 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63  RSION_5,./* v5 c
6c70: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c  hannel */.    Tl
6c80: 73 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20  sCloseProc,../* 
6c90: 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20  Close proc */.  
6ca0: 20 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09    TlsInputProc,.
6cb0: 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a  ./* Input proc *
6cc0: 2f 0a 20 20 20 20 54 6c 73 4f 75 74 70 75 74 50  /.    TlsOutputP
6cd0: 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20  roc,../* Output 
6ce0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c  proc */.    NULL
6cf0: 2c 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63  ,.../* Seek proc
6d00: 20 2a 2f 0a 20 20 20 20 54 6c 73 53 65 74 4f 70   */.    TlsSetOp
6d10: 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 53 65  tionProc,../* Se
6d20: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f  t option proc */
6d30: 0a 20 20 20 20 54 6c 73 47 65 74 4f 70 74 69 6f  .    TlsGetOptio
6d40: 6e 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 6f  nProc,../* Get o
6d50: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20  ption proc */.  
6d60: 20 20 54 6c 73 57 61 74 63 68 50 72 6f 63 2c 09    TlsWatchProc,.
6d70: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e  ./* Initialize n
6d80: 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 54  otifier */.    T
6d90: 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c  lsGetHandleProc,
6da0: 09 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64  ../* Get OS hand
6db0: 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e  les out of chann
6dc0: 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f  el */.    TlsClo
6dd0: 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f  se2Proc,../* clo
6de0: 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54  se2proc */.    T
6df0: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c  lsBlockModeProc,
6e00: 09 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e  ../* Set blockin
6e10: 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f  g/nonblocking mo
6e20: 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09  de*/.    NULL,..
6e30: 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63 20 2a  ./* Flush proc *
6e40: 2f 0a 20 20 20 20 54 6c 73 4e 6f 74 69 66 79 50  /.    TlsNotifyP
6e50: 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e  roc,../* Handlin
6e60: 67 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62  g of events bubb
6e70: 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e  ling up */.    N
6e80: 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73  ULL,.../* Wide s
6e90: 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  eek proc */.    
6ea0: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61  NULL,.../* Threa
6eb0: 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  d action */.    
6ec0: 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61  NULL.../* Trunca
6ed0: 74 65 20 2a 2f 0a 7d 3b 0a 0a 63 6f 6e 73 74 20  te */.};..const 
6ee0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20  Tcl_ChannelType 
6ef0: 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65  *Tls_ChannelType
6f00: 28 76 6f 69 64 29 20 7b 0a 20 20 20 20 72 65 74  (void) {.    ret
6f10: 75 72 6e 20 26 74 6c 73 43 68 61 6e 6e 65 6c 54  urn &tlsChannelT
6f20: 79 70 65 3b 0a 7d 0a                             ype;.}.