Hex Artifact Content

Artifact 41f450ae513aa4d5347d21c6dd855c57c36daa62ce24649dfc8a8c56e5b0dfa9:


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 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61  r(void *clientDa
0310: 74 61 29 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ta);../*. *-----
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 0a 20  --------------. 
0360: 2a 0a 20 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64  *. * TlsBlockMod
0370: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20  eProc --. *. *  
0380: 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65    This procedure
0390: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74   is invoked by t
03a0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65  he generic IO le
03b0: 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20  vel. *       to 
03c0: 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64  set blocking and
03d0: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64   nonblocking mod
03e0: 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  es. *. * Results
03f0: 3a 0a 20 2a 20 20 20 20 30 20 69 66 20 73 75 63  :. *    0 if suc
0400: 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58  cessful or POSIX
0410: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66   error code if f
0420: 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64  ailed.. *. * Sid
0430: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20  e effects:. *   
0440: 20 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65   Sets the device
0450: 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f   into blocking o
0460: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f  r nonblocking mo
0470: 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  de.. *. *-------
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 0a 20 2a 2f  ------------. */
04c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42  .static int TlsB
04d0: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 76 6f 69  lockModeProc(voi
04e0: 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  d *instanceData,
04f0: 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20   int mode) {.   
0500: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
0510: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
0520: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20  tanceData;..    
0530: 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f  if (mode == TCL_
0540: 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47  MODE_NONBLOCKING
0550: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66  ) {..statePtr->f
0560: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
0570: 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73  ASYNC;.    } els
0580: 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66  e {..statePtr->f
0590: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43  lags &= ~(TLS_TC
05a0: 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a  L_ASYNC);.    }.
05b0: 20 20 20 20 72 65 74 75 72 6e 28 30 29 3b 0a 7d      return(0);.}
05c0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
05d0: 2d 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 0a 20 2a 0a 20 2a  ----------. *. *
0610: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 2d 2d   TlsCloseProc --
0620: 0a 20 2a 0a 20 2a 20 20 20 20 54 68 69 73 20 70  . *. *    This p
0630: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
0640: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  ked by the gener
0650: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70  ic IO level to p
0660: 65 72 66 6f 72 6d 0a 20 2a 20 20 20 20 63 68 61  erform. *    cha
0670: 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 63 69 66  nnel-type-specif
0680: 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e 20  ic cleanup when 
0690: 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
06a0: 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 20 20 20  ed channel. *   
06b0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20   is closed.. *. 
06c0: 2a 20 20 20 20 4e 6f 74 65 3a 20 77 65 20 6c 65  *    Note: we le
06d0: 61 76 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ave the underlyi
06e0: 6e 67 20 73 6f 63 6b 65 74 20 61 6c 6f 6e 65 2c  ng socket alone,
06f0: 20 69 73 20 74 68 69 73 20 72 69 67 68 74 3f 0a   is this right?.
0700: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
0710: 2a 20 20 20 20 30 20 69 66 20 73 75 63 63 65 73  *    0 if succes
0720: 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72  sful or POSIX er
0730: 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c  ror code if fail
0740: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ed.. *. * Side e
0750: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 43 6c  ffects:. *    Cl
0760: 6f 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20  oses the socket 
0770: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a  of the channel..
0780: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
07d0: 74 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65  tic int TlsClose
07e0: 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a  Proc(.    void *
07f0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20  instanceData,.  
0800: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c    TCL_UNUSED(Tcl
0810: 5f 49 6e 74 65 72 70 20 2a 29 29 0a 7b 0a 20 20  _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 69 6e 73  r = (State *)ins
0840: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20  tanceData;..    
0850: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73  dprintf("TlsClos
0860: 65 50 72 6f 63 28 25 70 29 22 2c 20 73 74 61 74  eProc(%p)", stat
0870: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 6c 73 5f  ePtr);..    Tls_
0880: 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b  Clean(statePtr);
0890: 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61  .    Tcl_Eventua
08a0: 6c 6c 79 46 72 65 65 28 73 74 61 74 65 50 74 72  llyFree(statePtr
08b0: 2c 20 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20  , Tls_Free);.   
08c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
08d0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c  }..static int Tl
08e0: 73 43 6c 6f 73 65 32 50 72 6f 63 28 0a 20 20 20  sClose2Proc(.   
08f0: 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 44   void *instanceD
0900: 61 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 20 73  ata,    /* The s
0910: 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a  ocket state. */.
0920: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
0930: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20  interp,../* For 
0940: 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 20  errors - can be 
0950: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  NULL. */.    int
0960: 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 46 6c 61   flags).../* Fla
0970: 67 73 20 74 6f 20 63 6c 6f 73 65 20 72 65 61 64  gs to close read
0980: 20 61 6e 64 2f 6f 72 20 77 72 69 74 65 20 73 69   and/or write si
0990: 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f  de of channel */
09a0: 0a 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  .{.    dprintf("
09b0: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 25 70  TlsClose2Proc(%p
09c0: 29 22 2c 20 69 6e 73 74 61 6e 63 65 44 61 74 61  )", instanceData
09d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 28 66 6c  );..    if (!(fl
09e0: 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45  ags & (TCL_CLOSE
09f0: 5f 52 45 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f  _READ|TCL_CLOSE_
0a00: 57 52 49 54 45 29 29 29 20 7b 0a 09 72 65 74 75  WRITE))) {..retu
0a10: 72 6e 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28  rn TlsCloseProc(
0a20: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
0a30: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  terp);.    }.   
0a40: 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a   return EINVAL;.
0a50: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
0a90: 20 2a 0a 20 2a 20 54 6c 73 5f 57 61 69 74 46 6f   *. * Tls_WaitFo
0aa0: 72 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a 20  rConnect --. *. 
0ab0: 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20  * Result:. *    
0ac0: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  0 if successful,
0ad0: 20 2d 31 20 69 66 20 66 61 69 6c 65 64 2e 0a 20   -1 if failed.. 
0ae0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0af0: 73 3a 0a 20 2a 20 20 20 20 49 73 73 75 65 73 20  s:. *    Issues 
0b00: 53 53 4c 5f 61 63 63 65 70 74 20 6f 72 20 53 53  SSL_accept or SS
0b10: 4c 5f 63 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 2d  L_connect. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 69 6e 74 20 54  -----*. */.int T
0b60: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
0b70: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
0b80: 72 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  r, int *errorCod
0b90: 65 50 74 72 2c 20 69 6e 74 20 68 61 6e 64 73 68  ePtr, int handsh
0ba0: 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72 6d  akeFailureIsPerm
0bb0: 61 6e 65 6e 74 29 20 7b 0a 20 20 20 20 75 6e 73  anent) {.    uns
0bc0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69  igned long backi
0bd0: 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20 69 6e 74  ngError;.    int
0be0: 20 65 72 72 2c 20 72 63 3b 0a 20 20 20 20 69 6e   err, rc;.    in
0bf0: 74 20 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79  t bioShouldRetry
0c00: 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ;.    *errorCode
0c10: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70  Ptr = 0;..    dp
0c20: 72 69 6e 74 66 28 22 57 61 69 74 46 6f 72 43 6f  rintf("WaitForCo
0c30: 6e 6e 65 63 74 28 25 70 29 22 2c 20 73 74 61 74  nnect(%p)", stat
0c40: 65 50 74 72 29 3b 0a 20 20 20 20 64 70 72 69 6e  ePtr);.    dprin
0c50: 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29  tFlags(statePtr)
0c60: 3b 0a 0a 20 20 20 20 69 66 20 28 21 28 73 74 61  ;..    if (!(sta
0c70: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
0c80: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 29 20 7b 0a  LS_TCL_INIT)) {.
0c90: 09 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61  .dprintf("Tls_Wa
0ca0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 63 61 6c  itForConnect cal
0cb0: 6c 65 64 20 6f 6e 20 61 6c 72 65 61 64 79 20 69  led on already i
0cc0: 6e 69 74 69 61 6c 69 7a 65 64 20 63 68 61 6e 6e  nitialized chann
0cd0: 65 6c 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20  el -- returning 
0ce0: 77 69 74 68 20 69 6d 6d 65 64 69 61 74 65 20 73  with immediate s
0cf0: 75 63 63 65 73 73 22 29 3b 0a 09 72 65 74 75 72  uccess");..retur
0d00: 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n(0);.    }..   
0d10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
0d20: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 48  lags & TLS_TCL_H
0d30: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 29  ANDSHAKE_FAILED)
0d40: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 69 66 66 65   {../*.. * Diffe
0d50: 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 6f 70  rent types of op
0d60: 65 72 61 74 69 6f 6e 73 20 68 61 76 65 20 64 69  erations have di
0d70: 66 66 65 72 65 6e 74 20 72 65 71 75 69 72 65 6d  fferent requirem
0d80: 65 6e 74 73 0a 09 20 2a 20 53 53 4c 20 62 65 69  ents.. * SSL bei
0d90: 6e 67 20 65 73 74 61 62 6c 69 73 68 65 64 0a 09  ng established..
0da0: 20 2a 2f 0a 09 69 66 20 28 68 61 6e 64 73 68 61   */..if (handsha
0db0: 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61  keFailureIsPerma
0dc0: 6e 65 6e 74 29 20 7b 0a 09 20 20 20 20 64 70 72  nent) {..    dpr
0dd0: 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 77  intf("Asked to w
0de0: 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20 68 61  ait for a TLS ha
0df0: 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68 61 73  ndshake that has
0e00: 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 2e   already failed.
0e10: 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 74 61    Returning fata
0e20: 6c 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20  l error");..    
0e30: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
0e40: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 7d  ECONNABORTED;..}
0e50: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72   else {..    dpr
0e60: 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 77  intf("Asked to w
0e70: 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20 68 61  ait for a TLS ha
0e80: 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68 61 73  ndshake that has
0e90: 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 2e   already failed.
0ea0: 20 20 52 65 74 75 72 6e 69 6e 67 20 73 6f 66 74    Returning soft
0eb0: 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 2a   error");..    *
0ec0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
0ed0: 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 7d 0a 09 54  CONNRESET;..}..T
0ee0: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
0ef0: 72 2c 20 22 57 61 69 74 20 66 6f 72 20 66 61 69  r, "Wait for fai
0f00: 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 22 29 3b  led handshake");
0f10: 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 20 20  ..return(-1);.  
0f20: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 3b 3b    }..    for (;;
0f30: 29 20 7b 0a 09 45 52 52 5f 63 6c 65 61 72 5f 65  ) {..ERR_clear_e
0f40: 72 72 6f 72 28 29 3b 0a 0a 09 2f 2a 20 4e 6f 74  rror();.../* Not
0f50: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 79 65 74   initialized yet
0f60: 21 20 41 6c 73 6f 20 63 61 6c 6c 73 20 53 53 4c  ! Also calls SSL
0f70: 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 2e 20 2a  _do_handshake. *
0f80: 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  /..if (statePtr-
0f90: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
0fa0: 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20  _SERVER) {..    
0fb0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67  dprintf("Calling
0fc0: 20 53 53 4c 5f 61 63 63 65 70 74 28 29 22 29 3b   SSL_accept()");
0fd0: 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f  ..    err = SSL_
0fe0: 61 63 63 65 70 74 28 73 74 61 74 65 50 74 72 2d  accept(statePtr-
0ff0: 3e 73 73 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  >ssl);..} else {
1000: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
1010: 61 6c 6c 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e 65  alling SSL_conne
1020: 63 74 28 29 22 29 3b 0a 09 20 20 20 20 65 72 72  ct()");..    err
1030: 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 73   = SSL_connect(s
1040: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
1050: 7d 0a 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29  }...if (err > 0)
1060: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
1070: 22 41 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e 65  "Accept or conne
1080: 63 74 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ct was successfu
1090: 6c 22 29 3b 0a 0a 09 20 20 20 20 65 72 72 20 3d  l");...    err =
10a0: 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65   BIO_flush(state
10b0: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20  Ptr->bio);..    
10c0: 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a  if (err <= 0) {.
10d0: 09 09 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68  ..dprintf("Flush
10e0: 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 6c 61  ing the lower la
10f0: 79 65 72 73 20 66 61 69 6c 65 64 2c 20 74 68 69  yers failed, thi
1100: 73 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  s will probably 
1110: 74 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20 73  terminate this s
1120: 65 73 73 69 6f 6e 22 29 3b 0a 09 20 20 20 20 7d  ession");..    }
1130: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
1140: 64 70 72 69 6e 74 66 28 22 41 63 63 65 70 74 20  dprintf("Accept 
1150: 6f 72 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65  or connect faile
1160: 64 22 29 3b 0a 09 7d 0a 0a 09 72 63 20 3d 20 53  d");..}...rc = S
1170: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61  SL_get_error(sta
1180: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65 72 72 29  tePtr->ssl, err)
1190: 3b 0a 09 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  ;..backingError 
11a0: 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28  = ERR_get_error(
11b0: 29 3b 0a 09 69 66 20 28 72 63 20 21 3d 20 53 53  );..if (rc != SS
11c0: 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 29 20 7b 0a  L_ERROR_NONE) {.
11d0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
11e0: 74 20 65 72 72 6f 72 3a 20 25 69 20 28 72 63 20  t error: %i (rc 
11f0: 3d 20 25 69 29 22 2c 20 65 72 72 2c 20 72 63 29  = %i)", err, rc)
1200: 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
1210: 47 6f 74 20 65 72 72 6f 72 3a 20 25 73 22 2c 20  Got error: %s", 
1220: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
1230: 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45  _string(backingE
1240: 72 72 6f 72 29 29 3b 0a 09 7d 0a 0a 09 62 69 6f  rror));..}...bio
1250: 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 30 3b  ShouldRetry = 0;
1260: 0a 09 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20  ..if (err <= 0) 
1270: 7b 0a 09 20 20 20 20 69 66 20 28 72 63 20 3d 3d  {..    if (rc ==
1280: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
1290: 43 4f 4e 4e 45 43 54 20 7c 7c 20 72 63 20 3d 3d  CONNECT || rc ==
12a0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
12b0: 41 43 43 45 50 54 20 7c 7c 20 72 63 20 3d 3d 20  ACCEPT || rc == 
12c0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52  SSL_ERROR_WANT_R
12d0: 45 41 44 20 7c 7c 20 72 63 20 3d 3d 20 53 53 4c  EAD || rc == SSL
12e0: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54  _ERROR_WANT_WRIT
12f0: 45 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64  E) {...bioShould
1300: 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20  Retry = 1;..    
1310: 7d 20 65 6c 73 65 20 69 66 20 28 42 49 4f 5f 73  } else if (BIO_s
1320: 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74  hould_retry(stat
1330: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09  ePtr->bio)) {...
1340: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d  bioShouldRetry =
1350: 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20   1;..    } else 
1360: 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52  if (rc == SSL_ER
1370: 52 4f 52 5f 53 59 53 43 41 4c 4c 20 26 26 20 54  ROR_SYSCALL && T
1380: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 20 3d 3d  cl_GetErrno() ==
1390: 20 45 41 47 41 49 4e 29 20 7b 0a 09 09 62 69 6f   EAGAIN) {...bio
13a0: 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b  ShouldRetry = 1;
13b0: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20  ..    }..} else 
13c0: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  {..    if (!SSL_
13d0: 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64  is_init_finished
13e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
13f0: 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65   {...bioShouldRe
1400: 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a  try = 1;..    }.
1410: 09 7d 0a 0a 09 69 66 20 28 62 69 6f 53 68 6f 75  .}...if (bioShou
1420: 6c 64 52 65 74 72 79 29 20 7b 0a 09 20 20 20 20  ldRetry) {..    
1430: 64 70 72 69 6e 74 66 28 22 54 68 65 20 49 2f 4f  dprintf("The I/O
1440: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
1450: 65 20 2d 2d 20 62 75 74 20 77 65 20 73 68 6f 75  e -- but we shou
1460: 6c 64 20 74 72 79 20 69 74 20 61 67 61 69 6e 22  ld try it again"
1470: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 73 74 61  );...    if (sta
1480: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
1490: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a  LS_TCL_ASYNC) {.
14a0: 09 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72  ..dprintf("Retur
14b0: 6e 69 6e 67 20 45 41 47 41 49 4e 20 73 6f 20 74  ning EAGAIN so t
14c0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
14d0: 74 72 69 65 64 20 6c 61 74 65 72 22 29 3b 0a 09  tried later");..
14e0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
14f0: 20 45 41 47 41 49 4e 3b 0a 09 09 54 6c 73 5f 45   EAGAIN;...Tls_E
1500: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22  rror(statePtr, "
1510: 48 61 6e 64 73 68 61 6b 65 20 6e 6f 74 20 63 6f  Handshake not co
1520: 6d 70 6c 65 74 65 2c 20 77 69 6c 6c 20 72 65 74  mplete, will ret
1530: 72 79 20 6c 61 74 65 72 22 29 3b 0a 09 09 72 65  ry later");...re
1540: 74 75 72 6e 28 2d 31 29 3b 0a 09 20 20 20 20 7d  turn(-1);..    }
1550: 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74   else {...dprint
1560: 66 28 22 44 6f 69 6e 67 20 73 6f 20 6e 6f 77 22  f("Doing so now"
1570: 29 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  );...continue;..
1580: 20 20 20 20 7d 0a 09 7d 0a 0a 09 64 70 72 69 6e      }..}...dprin
1590: 74 66 28 22 57 65 20 68 61 76 65 20 65 69 74 68  tf("We have eith
15a0: 65 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 73  er completely es
15b0: 74 61 62 6c 69 73 68 65 64 20 74 68 65 20 73 65  tablished the se
15c0: 73 73 69 6f 6e 20 6f 72 20 63 6f 6d 70 6c 65 74  ssion or complet
15d0: 65 6c 79 20 66 61 69 6c 65 64 20 69 74 20 2d 2d  ely failed it --
15e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72   there is no mor
15f0: 65 20 6e 65 65 64 20 74 6f 20 65 76 65 72 20 72  e need to ever r
1600: 65 74 72 79 20 69 74 20 74 68 6f 75 67 68 22 29  etry it though")
1610: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ;..break;.    }.
1620: 0a 20 20 20 20 73 77 69 74 63 68 20 28 72 63 29  .    switch (rc)
1630: 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52   {..case SSL_ERR
1640: 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a  OR_NONE:..    /*
1650: 20 54 68 65 20 54 4c 53 2f 53 53 4c 20 49 2f 4f   The TLS/SSL I/O
1660: 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c   operation compl
1670: 65 74 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72  eted */..    dpr
1680: 69 6e 74 66 28 22 54 68 65 20 63 6f 6e 6e 65 63  intf("The connec
1690: 74 69 6f 6e 20 69 73 20 67 6f 6f 64 22 29 3b 0a  tion is good");.
16a0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
16b0: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 72 65  tr = 0;..    bre
16c0: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
16d0: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e  RROR_ZERO_RETURN
16e0: 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 54 4c  :..    /* The TL
16f0: 53 2f 53 53 4c 20 70 65 65 72 20 68 61 73 20 63  S/SSL peer has c
1700: 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63  losed the connec
1710: 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  tion for writing
1720: 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20   by sending the 
1730: 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65  close_notify ale
1740: 72 74 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  rt */..    dprin
1750: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 5a 45  tf("SSL_ERROR_ZE
1760: 52 4f 5f 52 45 54 55 52 4e 3a 20 43 6f 6e 6e 65  RO_RETURN: Conne
1770: 63 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ct returned an i
1780: 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 2e 2e 22  nvalid value..."
1790: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
17a0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
17b0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73  .    Tls_Error(s
17c0: 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68  tatePtr, "Peer h
17d0: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f  as closed the co
17e0: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69  nnection for wri
17f0: 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20  ting by sending 
1800: 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79  the close_notify
1810: 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 72   alert");..    r
1820: 65 74 75 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 73  eturn(-1);...cas
1830: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43  e SSL_ERROR_SYSC
1840: 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d  ALL:..    /* Som
1850: 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c  e non-recoverabl
1860: 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65 72 72  e, fatal I/O err
1870: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09  or occurred */..
1880: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c      dprintf("SSL
1890: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 22 29  _ERROR_SYSCALL")
18a0: 3b 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b  ;...    if (back
18b0: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26  ingError == 0 &&
18c0: 20 65 72 72 20 3d 3d 20 30 29 20 7b 0a 09 09 64   err == 0) {...d
18d0: 70 72 69 6e 74 66 28 22 45 4f 46 20 72 65 61 63  printf("EOF reac
18e0: 68 65 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f  hed")...*errorCo
18f0: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53  dePtr = ECONNRES
1900: 45 54 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28  ET;...Tls_Error(
1910: 73 74 61 74 65 50 74 72 2c 20 22 28 75 6e 65 78  statePtr, "(unex
1920: 70 65 63 74 65 64 29 20 45 4f 46 20 72 65 61 63  pected) EOF reac
1930: 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d 20 65  hed");...    } e
1940: 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45  lse if (backingE
1950: 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72  rror == 0 && err
1960: 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69   == -1) {...dpri
1970: 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f  ntf("I/O error o
1980: 63 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d  ccurred (errno =
1990: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
19a0: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45  d long) Tcl_GetE
19b0: 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f  rrno());...*erro
19c0: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
19d0: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20  etErrno();...if 
19e0: 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  (*errorCodePtr =
19f0: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a  = ECONNRESET) {.
1a00: 09 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
1a10: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54  Ptr = ECONNABORT
1a20: 45 44 3b 0a 09 09 7d 0a 09 09 54 6c 73 5f 45 72  ED;...}...Tls_Er
1a30: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63  ror(statePtr, (c
1a40: 68 61 72 20 2a 29 20 54 63 6c 5f 45 72 72 6e 6f  har *) Tcl_Errno
1a50: 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 74  Msg(*errorCodePt
1a60: 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73  r));...    } els
1a70: 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49  e {...dprintf("I
1a80: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
1a90: 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  d (backingError 
1aa0: 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67  = %lu)", backing
1ab0: 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72  Error);...*error
1ac0: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65  CodePtr = Tcl_Ge
1ad0: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28  tErrno();...if (
1ae0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d  *errorCodePtr ==
1af0: 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09   ECONNRESET) {..
1b00: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1b10: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45  tr = ECONNABORTE
1b20: 44 3b 0a 09 09 7d 0a 09 09 54 6c 73 5f 45 72 72  D;...}...Tls_Err
1b30: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68  or(statePtr, (ch
1b40: 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f 6e  ar *) ERR_reason
1b50: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61  _error_string(ba
1b60: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20  ckingError));.. 
1b70: 20 20 20 7d 0a 0a 09 20 20 20 20 73 74 61 74 65     }...    state
1b80: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
1b90: 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f  S_TCL_HANDSHAKE_
1ba0: 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 72 65 74  FAILED;..    ret
1bb0: 75 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 73 65 20  urn(-1);...case 
1bc0: 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09  SSL_ERROR_SSL:..
1bd0: 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63      /* A non-rec
1be0: 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20  overable, fatal 
1bf0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c  error in the SSL
1c00: 20 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65   library occurre
1c10: 64 2c 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f  d, usually a pro
1c20: 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09  tocol error */..
1c30: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c      dprintf("SSL
1c40: 5f 45 52 52 4f 52 5f 53 53 4c 3a 20 47 6f 74 20  _ERROR_SSL: Got 
1c50: 70 65 72 6d 61 6e 65 6e 74 20 66 61 74 61 6c 20  permanent fatal 
1c60: 53 53 4c 20 65 72 72 6f 72 2c 20 61 62 6f 72 74  SSL error, abort
1c70: 69 6e 67 20 69 6d 6d 65 64 69 61 74 65 6c 79 22  ing immediately"
1c80: 29 3b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f  );..    if (SSL_
1c90: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c  get_verify_resul
1ca0: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  t(statePtr->ssl)
1cb0: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b   != X509_V_OK) {
1cc0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
1cd0: 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20  tePtr, (char *) 
1ce0: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
1cf0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53  _error_string(SS
1d00: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
1d10: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
1d20: 6c 29 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  l)));..    }..  
1d30: 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72    if (backingErr
1d40: 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73  or != 0) {...Tls
1d50: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
1d60: 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f 72 65   (char *) ERR_re
1d70: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
1d80: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29  g(backingError))
1d90: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 74  ;..    }..    st
1da0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
1db0: 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41   TLS_TCL_HANDSHA
1dc0: 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20 20  KE_FAILED;..    
1dd0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1de0: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20  ECONNABORTED;.. 
1df0: 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 0a     return(-1);..
1e00: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
1e10: 57 41 4e 54 5f 52 45 41 44 3a 0a 09 63 61 73 65  WANT_READ:..case
1e20: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
1e30: 57 52 49 54 45 3a 0a 09 63 61 73 65 20 53 53 4c  WRITE:..case SSL
1e40: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39  _ERROR_WANT_X509
1e50: 5f 4c 4f 4f 4b 55 50 3a 0a 09 63 61 73 65 20 53  _LOOKUP:..case S
1e60: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f  SL_ERROR_WANT_CO
1e70: 4e 4e 45 43 54 3a 0a 09 63 61 73 65 20 53 53 4c  NNECT:..case SSL
1e80: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45  _ERROR_WANT_ACCE
1e90: 50 54 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  PT:..case SSL_ER
1ea0: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a  ROR_WANT_ASYNC:.
1eb0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
1ec0: 57 41 4e 54 5f 41 53 59 4e 43 5f 4a 4f 42 3a 0a  WANT_ASYNC_JOB:.
1ed0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
1ee0: 57 41 4e 54 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  WANT_CLIENT_HELL
1ef0: 4f 5f 43 42 3a 0a 09 64 65 66 61 75 6c 74 3a 0a  O_CB:..default:.
1f00: 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72  .    /* The oper
1f10: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f  ation did not co
1f20: 6d 70 6c 65 74 65 20 61 6e 64 20 73 68 6f 75 6c  mplete and shoul
1f30: 64 20 62 65 20 72 65 74 72 69 65 64 20 6c 61 74  d be retried lat
1f40: 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  er. */..    dpri
1f50: 6e 74 66 28 22 4f 70 65 72 61 74 69 6f 6e 20 64  ntf("Operation d
1f60: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 2c  id not complete,
1f70: 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61   call function a
1f80: 67 61 69 6e 20 6c 61 74 65 72 3a 20 25 69 22 2c  gain later: %i",
1f90: 20 72 63 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f   rc);..    *erro
1fa0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
1fb0: 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  N;..    dprintf(
1fc0: 22 45 52 52 28 25 64 2c 20 25 64 29 20 22 2c 20  "ERR(%d, %d) ", 
1fd0: 72 63 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  rc, *errorCodePt
1fe0: 72 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72  r);..    Tls_Err
1ff0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 4f 70  or(statePtr, "Op
2000: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
2010: 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66  complete, call f
2020: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  unction again la
2030: 74 65 72 22 29 3b 0a 09 20 20 20 20 72 65 74 75  ter");..    retu
2040: 72 6e 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  rn(-1);.    }.. 
2050: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 6d 6f     dprintf("Remo
2060: 76 69 6e 67 20 74 68 65 20 5c 22 54 4c 53 5f 54  ving the \"TLS_T
2070: 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67 20 73  CL_INIT\" flag s
2080: 69 6e 63 65 20 77 65 20 68 61 76 65 20 63 6f 6d  ince we have com
2090: 70 6c 65 74 65 64 20 74 68 65 20 68 61 6e 64 73  pleted the hands
20a0: 68 61 6b 65 22 29 3b 0a 20 20 20 20 73 74 61 74  hake");.    stat
20b0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  ePtr->flags &= ~
20c0: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20  TLS_TCL_INIT;.. 
20d0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
20e0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
20f0: 22 29 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f  ");.    *errorCo
2100: 64 65 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 72  dePtr = 0;.    r
2110: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
2120: 2a 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 2d 2d  ----------------
2160: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 49 6e  ----. *. * TlsIn
2170: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  putProc --. *. *
2180: 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 64 75      This procedu
2190: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  re is invoked by
21a0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20   the generic IO 
21b0: 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74  level. *       t
21c0: 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f  o read input fro
21d0: 6d 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  m a SSL socket b
21e0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  ased channel.. *
21f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20  . * Results:. * 
2200: 20 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e     Returns the n
2210: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
2220: 65 61 64 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ead or -1 on err
2230: 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72 43 6f  or. Sets errorCo
2240: 64 65 50 74 72 0a 20 2a 20 20 20 20 74 6f 20 61  dePtr. *    to a
2250: 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64   POSIX error cod
2260: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
2270: 63 75 72 72 65 64 2c 20 6f 72 20 30 20 69 66 20  curred, or 0 if 
2280: 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  none.. *. * Side
2290: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20   effects:. *    
22a0: 52 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f 6d  Reads input from
22b0: 20 74 68 65 20 69 6e 70 75 74 20 64 65 76 69 63   the input devic
22c0: 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c  e of the channel
22d0: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
2320: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 49 6e  static int TlsIn
2330: 70 75 74 50 72 6f 63 28 0a 20 20 20 20 76 6f 69  putProc(.    voi
2340: 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  d *instanceData,
2350: 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 2c 0a  .    char *buf,.
2360: 20 20 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c      int bufSize,
2370: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  .    int *errorC
2380: 6f 64 65 50 74 72 29 0a 7b 0a 20 20 20 20 75 6e  odePtr).{.    un
2390: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b  signed long back
23a0: 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20 53 74  ingError;.    St
23b0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
23c0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
23d0: 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  ceData;.    int 
23e0: 62 79 74 65 73 52 65 61 64 3b 0a 20 20 20 20 69  bytesRead;.    i
23f0: 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 20  nt tlsConnect;. 
2400: 20 20 20 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20     int err;..   
2410: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
2420: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
2430: 28 22 42 49 4f 5f 72 65 61 64 28 25 64 29 22 2c  ("BIO_read(%d)",
2440: 20 62 75 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20   bufSize);..    
2450: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  if (statePtr->fl
2460: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41  ags & TLS_TCL_CA
2470: 4c 4c 42 41 43 4b 29 20 7b 0a 09 2f 2a 20 64 6f  LLBACK) {../* do
2480: 6e 27 74 20 70 72 6f 63 65 73 73 20 61 6e 79 20  n't process any 
2490: 62 79 74 65 73 20 77 68 69 6c 65 20 76 65 72 69  bytes while veri
24a0: 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72  fy callback is r
24b0: 75 6e 6e 69 6e 67 20 2a 2f 0a 09 64 70 72 69 6e  unning */..dprin
24c0: 74 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20  tf("Callback is 
24d0: 72 75 6e 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67  running, reading
24e0: 20 30 20 62 79 74 65 73 22 29 3b 0a 09 72 65 74   0 bytes");..ret
24f0: 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  urn(0);.    }.. 
2500: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
2510: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  ing Tls_WaitForC
2520: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c  onnect");.    tl
2530: 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57  sConnect = Tls_W
2540: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
2550: 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64  atePtr, errorCod
2560: 65 50 74 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  ePtr, 0);.    if
2570: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30   (tlsConnect < 0
2580: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f  ) {..dprintf("Go
2590: 74 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69  t an error waiti
25a0: 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74  ng to connect (t
25b0: 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20  lsConnect = %i, 
25c0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
25d0: 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74  %i)", tlsConnect
25e0: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  , *errorCodePtr)
25f0: 3b 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ;..Tls_Error(sta
2600: 74 65 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28  tePtr, strerror(
2610: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b  *errorCodePtr));
2620: 0a 0a 09 62 79 74 65 73 52 65 61 64 20 3d 20 2d  ...bytesRead = -
2630: 31 3b 0a 09 69 66 20 28 2a 65 72 72 6f 72 43 6f  1;..if (*errorCo
2640: 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45  dePtr == ECONNRE
2650: 53 45 54 29 20 7b 0a 09 20 20 20 20 64 70 72 69  SET) {..    dpri
2660: 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74  ntf("Got connect
2670: 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 20 20  ion reset");..  
2680: 20 20 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f    /* Soft EOF */
2690: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
26a0: 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 79  Ptr = 0;..    by
26b0: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 7d 0a  tesRead = 0;..}.
26c0: 09 72 65 74 75 72 6e 28 62 79 74 65 73 52 65 61  .return(bytesRea
26d0: 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
26e0: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64  *.     * We need
26f0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53   to clear the SS
2700: 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f  L error stack no
2710: 77 20 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d  w because we som
2720: 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20  etimes reach.   
2730: 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f    * this functio
2740: 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20  n with leftover 
2750: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74  errors in the st
2760: 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 72 65 61  ack.  If BIO_rea
2770: 64 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73  d.     * returns
2780: 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20   -1 and intends 
2790: 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73  EAGAIN, there is
27a0: 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f   a leftover erro
27b0: 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20  r, it will be.  
27c0: 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65     * misconstrue
27d0: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e  d as an error, n
27e0: 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20  ot EAGAIN..     
27f0: 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61  *.     * Alterna
2800: 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77  tively, we may w
2810: 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ant to handle th
2820: 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65  e <0 return code
2830: 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49  s from.     * BI
2840: 4f 5f 72 65 61 64 20 73 70 65 63 69 61 6c 6c 79  O_read specially
2850: 20 28 61 73 20 61 64 76 69 73 65 64 20 69 6e 20   (as advised in 
2860: 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20  the RSA docs).  
2870: 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65  TLS's lower leve
2880: 6c 20 42 49 4f 0a 20 20 20 20 20 2a 20 66 75 6e  l BIO.     * fun
2890: 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68  ctions play with
28a0: 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 73   the retry flags
28b0: 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69   though, and thi
28c0: 73 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 0a  s seems to work.
28d0: 20 20 20 20 20 2a 20 63 6f 72 72 65 63 74 6c 79       * correctly
28e0: 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69  .  Similar fix i
28f0: 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e  n TlsOutputProc.
2900: 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f   - hobbs.     */
2910: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
2920: 72 72 6f 72 28 29 3b 0a 20 20 20 20 62 79 74 65  rror();.    byte
2930: 73 52 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 64  sRead = BIO_read
2940: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20  (statePtr->bio, 
2950: 62 75 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20  buf, bufSize);. 
2960: 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f     dprintf("BIO_
2970: 72 65 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74  read -> %d", byt
2980: 65 73 52 65 61 64 29 3b 0a 0a 20 20 20 20 65 72  esRead);..    er
2990: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f  r = SSL_get_erro
29a0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  r(statePtr->ssl,
29b0: 20 62 79 74 65 73 52 65 61 64 29 3b 0a 20 20 20   bytesRead);.   
29c0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20   backingError = 
29d0: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b  ERR_get_error();
29e0: 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 28  ..#if 0.    if (
29f0: 62 79 74 65 73 52 65 61 64 20 3c 3d 20 30 29 20  bytesRead <= 0) 
2a00: 7b 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c  {..if (BIO_shoul
2a10: 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72  d_retry(statePtr
2a20: 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64  ->bio)) {..    d
2a30: 70 72 69 6e 74 66 28 22 49 2f 4f 20 66 61 69 6c  printf("I/O fail
2a40: 65 64 2c 20 77 69 6c 6c 20 72 65 74 72 79 20 62  ed, will retry b
2a50: 61 73 65 64 20 6f 6e 20 45 41 47 41 49 4e 22 29  ased on EAGAIN")
2a60: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
2a70: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09  ePtr = EAGAIN;..
2a80: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
2a90: 20 20 20 20 73 77 69 74 63 68 20 28 65 72 72 29      switch (err)
2aa0: 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52   {..case SSL_ERR
2ab0: 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 64 70  OR_NONE:..    dp
2ac0: 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c 20  rintBuffer(buf, 
2ad0: 62 79 74 65 73 52 65 61 64 29 3b 0a 09 20 20 20  bytesRead);..   
2ae0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
2af0: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20  SL_ERROR_SSL:.. 
2b00: 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f     /* A non-reco
2b10: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65  verable, fatal e
2b20: 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20  rror in the SSL 
2b30: 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64  library occurred
2b40: 2c 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74  , usually a prot
2b50: 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20  ocol error */.. 
2b60: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 20     dprintf("SSL 
2b70: 65 72 72 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e  error, indicatin
2b80: 67 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  g that the conne
2b90: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 61  ction has been a
2ba0: 62 6f 72 74 65 64 22 29 3b 0a 09 20 20 20 20 69  borted");..    i
2bb0: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  f (backingError 
2bc0: 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72  != 0) {...Tls_Er
2bd0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63  ror(statePtr, (c
2be0: 68 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f  har *) ERR_reaso
2bf0: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62  n_error_string(b
2c00: 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09  ackingError));..
2c10: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 53      } else if (S
2c20: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
2c30: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
2c40: 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b  sl) != X509_V_OK
2c50: 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28  ) {...Tls_Error(
2c60: 73 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 20  statePtr, (char 
2c70: 2a 29 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63  *) X509_verify_c
2c80: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
2c90: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
2ca0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
2cb0: 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20  >ssl)));..    } 
2cc0: 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72  else {...Tls_Err
2cd0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e  or(statePtr, "Un
2ce0: 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22  known SSL error"
2cf0: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a  );..    }..    *
2d00: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
2d10: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20  CONNABORTED;..  
2d20: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31    bytesRead = -1
2d30: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
2d40: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
2d50: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
2d60: 20 20 2f 2a 20 55 6e 65 78 70 65 63 74 65 64 20    /* Unexpected 
2d70: 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 65 65  EOF from the pee
2d80: 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 33 2e  r for OpenSSL 3.
2d90: 30 2b 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 45  0+ */..    if (E
2da0: 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e 28 62 61  RR_GET_REASON(ba
2db0: 63 6b 69 6e 67 45 72 72 6f 72 29 20 3d 3d 20 53  ckingError) == S
2dc0: 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54 45 44 5f  SL_R_UNEXPECTED_
2dd0: 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41 44 49 4e  EOF_WHILE_READIN
2de0: 47 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  G) {...dprintf("
2df0: 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46  (Unexpected) EOF
2e00: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72   reached")...*er
2e10: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
2e20: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b  ..bytesRead = 0;
2e30: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
2e40: 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 61 63  tePtr, "EOF reac
2e50: 68 65 64 22 29 3b 0a 09 20 20 20 20 7d 0a 23 65  hed");..    }.#e
2e60: 6e 64 69 66 0a 09 20 20 20 20 62 72 65 61 6b 3b  ndif..    break;
2e70: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
2e80: 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20  R_SYSCALL:..    
2e90: 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f  /* Some non-reco
2ea0: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49  verable, fatal I
2eb0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
2ec0: 64 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 62  d */...    if (b
2ed0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30  ackingError == 0
2ee0: 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d   && bytesRead ==
2ef0: 20 30 29 20 7b 0a 09 09 2f 2a 20 55 6e 65 78 70   0) {.../* Unexp
2f00: 65 63 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 74  ected EOF from t
2f10: 68 65 20 70 65 65 72 20 66 6f 72 20 4f 70 65 6e  he peer for Open
2f20: 53 53 4c 20 31 2e 31 20 2a 2f 0a 09 09 64 70 72  SSL 1.1 */...dpr
2f30: 69 6e 74 66 28 22 28 55 6e 65 78 70 65 63 74 65  intf("(Unexpecte
2f40: 64 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 29  d) EOF reached")
2f50: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
2f60: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61   = 0;...bytesRea
2f70: 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72  d = 0;...Tls_Err
2f80: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f  or(statePtr, "EO
2f90: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20  F reached");... 
2fa0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61     } else if (ba
2fb0: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20  ckingError == 0 
2fc0: 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20  && bytesRead == 
2fd0: 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28  -1) {...dprintf(
2fe0: 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  "I/O error occur
2ff0: 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75  red (errno = %lu
3000: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
3010: 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  ng) Tcl_GetErrno
3020: 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64  ());...*errorCod
3030: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72  ePtr = Tcl_GetEr
3040: 72 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73 52 65  rno();...bytesRe
3050: 61 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45  ad = -1;...Tls_E
3060: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28  rror(statePtr, (
3070: 63 68 61 72 20 2a 29 20 54 63 6c 5f 45 72 72 6e  char *) Tcl_Errn
3080: 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50  oMsg(*errorCodeP
3090: 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c  tr));...    } el
30a0: 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  se {...dprintf("
30b0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72  I/O error occurr
30c0: 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  ed (backingError
30d0: 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e   = %lu)", backin
30e0: 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f  gError);...*erro
30f0: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
3100: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74  etErrno();...byt
3110: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 54  esRead = -1;...T
3120: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
3130: 72 2c 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f  r, (char *) ERR_
3140: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
3150: 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  ing(backingError
3160: 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ));..    }..    
3170: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
3180: 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54  L_ERROR_ZERO_RET
3190: 55 52 4e 3a 0a 09 20 20 20 20 64 70 72 69 6e 74  URN:..    dprint
31a0: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52  f("Got SSL_ERROR
31b0: 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74 68  _ZERO_RETURN, th
31c0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46 20  is means an EOF 
31d0: 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64  has been reached
31e0: 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65  ");..    bytesRe
31f0: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72  ad = 0;..    *er
3200: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
3210: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73  .    Tls_Error(s
3220: 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68  tatePtr, "Peer h
3230: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f  as closed the co
3240: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69  nnection for wri
3250: 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20  ting by sending 
3260: 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79  the close_notify
3270: 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62   alert");..    b
3280: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c  reak;...case SSL
3290: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44  _ERROR_WANT_READ
32a0: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  :..    dprintf("
32b0: 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  Got SSL_ERROR_WA
32c0: 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 6e 67  NT_READ, mapping
32d0: 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22   this to EAGAIN"
32e0: 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61  );..    bytesRea
32f0: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 2a 65 72  d = -1;..    *er
3300: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47  rorCodePtr = EAG
3310: 41 49 4e 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72  AIN;..    Tls_Er
3320: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53  ror(statePtr, "S
3330: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
3340: 41 44 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  AD");..    break
3350: 3b 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  ;...default:..  
3360: 20 20 64 70 72 69 6e 74 66 28 22 55 6e 6b 6e 6f    dprintf("Unkno
3370: 77 6e 20 65 72 72 6f 72 20 28 65 72 72 20 3d 20  wn error (err = 
3380: 25 69 29 2c 20 6d 61 70 70 69 6e 67 20 74 6f 20  %i), mapping to 
3390: 45 4f 46 22 2c 20 65 72 72 29 3b 0a 09 20 20 20  EOF", err);..   
33a0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
33b0: 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65   0;..    bytesRe
33c0: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73  ad = 0;..    Tls
33d0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
33e0: 20 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22   "Unknown error"
33f0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  );..    break;. 
3400: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
3410: 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d 3e 20  f("Input(%d) -> 
3420: 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 69 7a  %d [%d]", bufSiz
3430: 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20 2a 65  e, bytesRead, *e
3440: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20 20  rrorCodePtr);.  
3450: 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 52 65    return bytesRe
3460: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ad;.}../*. *----
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
34b0: 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70 75 74 50   *. * TlsOutputP
34c0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20  roc --. *. *    
34d0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
34e0: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  s invoked by the
34f0: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65   generic IO leve
3500: 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 77 72  l. *       to wr
3510: 69 74 65 20 6f 75 74 70 75 74 20 74 6f 20 61 20  ite output to a 
3520: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
3530: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20   channel.. *. * 
3540: 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 52  Results:. *    R
3550: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
3560: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
3570: 65 6e 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f  en or -1 on erro
3580: 72 2e 20 53 65 74 73 20 65 72 72 6f 72 43 6f 64  r. Sets errorCod
3590: 65 50 74 72 0a 20 2a 20 20 20 20 74 6f 20 61 20  ePtr. *    to a 
35a0: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65  POSIX error code
35b0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
35c0: 75 72 72 65 64 2c 20 6f 72 20 30 20 69 66 20 6e  urred, or 0 if n
35d0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
35e0: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 57  effects:. *    W
35f0: 72 69 74 65 73 20 6f 75 74 70 75 74 20 6f 6e 20  rites output on 
3600: 74 68 65 20 6f 75 74 70 75 74 20 64 65 76 69 63  the output devic
3610: 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c  e of the channel
3620: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
3670: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4f 75  static int TlsOu
3680: 74 70 75 74 50 72 6f 63 28 0a 20 20 20 20 76 6f  tputProc(.    vo
3690: 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61  id *instanceData
36a0: 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ,.    const char
36b0: 20 2a 62 75 66 2c 0a 20 20 20 20 69 6e 74 20 74   *buf,.    int t
36c0: 6f 57 72 69 74 65 2c 0a 20 20 20 20 69 6e 74 20  oWrite,.    int 
36d0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 0a 7b  *errorCodePtr).{
36e0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
36f0: 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b  ng backingError;
3700: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
3710: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
3720: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20   instanceData;. 
3730: 20 20 20 69 6e 74 20 77 72 69 74 74 65 6e 2c 20     int written, 
3740: 65 72 72 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73  err;.    int tls
3750: 43 6f 6e 6e 65 63 74 3b 0a 0a 20 20 20 20 2a 65  Connect;..    *e
3760: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
3770: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42  ..    dprintf("B
3780: 49 4f 5f 77 72 69 74 65 28 25 70 2c 20 25 64 29  IO_write(%p, %d)
3790: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74  ", (void *) stat
37a0: 65 50 74 72 2c 20 74 6f 57 72 69 74 65 29 3b 0a  ePtr, toWrite);.
37b0: 20 20 20 20 64 70 72 69 6e 74 42 75 66 66 65 72      dprintBuffer
37c0: 28 62 75 66 2c 20 74 6f 57 72 69 74 65 29 3b 0a  (buf, toWrite);.
37d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
37e0: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
37f0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09  CL_CALLBACK) {..
3800: 64 70 72 69 6e 74 66 28 22 44 6f 6e 27 74 20 70  dprintf("Don't p
3810: 72 6f 63 65 73 73 20 6f 75 74 70 75 74 20 77 68  rocess output wh
3820: 69 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 61 72  ile callbacks ar
3830: 65 20 72 75 6e 6e 69 6e 67 22 29 3b 0a 09 77 72  e running");..wr
3840: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 2a 65 72  itten = -1;..*er
3850: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47  rorCodePtr = EAG
3860: 41 49 4e 3b 0a 09 72 65 74 75 72 6e 28 2d 31 29  AIN;..return(-1)
3870: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
3880: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c  intf("Calling Tl
3890: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
38a0: 22 29 3b 0a 20 20 20 20 74 6c 73 43 6f 6e 6e 65  ");.    tlsConne
38b0: 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  ct = Tls_WaitFor
38c0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
38d0: 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20  , errorCodePtr, 
38e0: 31 29 3b 0a 20 20 20 20 69 66 20 28 74 6c 73 43  1);.    if (tlsC
38f0: 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09 64  onnect < 0) {..d
3900: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65  printf("Got an e
3910: 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f 20  rror waiting to 
3920: 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e  connect (tlsConn
3930: 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72  ect = %i, *error
3940: 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c 20  CodePtr = %i)", 
3950: 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72  tlsConnect, *err
3960: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 54 6c 73  orCodePtr);..Tls
3970: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
3980: 20 73 74 72 65 72 72 6f 72 28 2a 65 72 72 6f 72   strerror(*error
3990: 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 77 72 69  CodePtr));...wri
39a0: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 69 66 20 28  tten = -1;..if (
39b0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d  *errorCodePtr ==
39c0: 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09   ECONNRESET) {..
39d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
39e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 73 65   connection rese
39f0: 74 22 29 3b 0a 09 20 20 20 20 2f 2a 20 53 6f 66  t");..    /* Sof
3a00: 74 20 45 4f 46 20 2a 2f 0a 09 20 20 20 20 2a 65  t EOF */..    *e
3a10: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
3a20: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ..    written = 
3a30: 30 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 28 77 72  0;..}..return(wr
3a40: 69 74 74 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  itten);.    }.. 
3a50: 20 20 20 69 66 20 28 74 6f 57 72 69 74 65 20 3d     if (toWrite =
3a60: 3d 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  = 0) {..dprintf(
3a70: 22 7a 65 72 6f 2d 77 72 69 74 65 22 29 3b 0a 09  "zero-write");..
3a80: 65 72 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28  err = BIO_flush(
3a90: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
3aa0: 0a 09 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20  ..if (err <= 0) 
3ab0: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
3ac0: 46 6c 75 73 68 69 6e 67 20 66 61 69 6c 65 64 22  Flushing failed"
3ad0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  );..    Tls_Erro
3ae0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 46 6c 75  r(statePtr, "Flu
3af0: 73 68 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 20  sh failed");... 
3b00: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
3b10: 20 3d 20 45 49 4f 3b 0a 09 20 20 20 20 77 72 69   = EIO;..    wri
3b20: 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 72  tten = 0;..    r
3b30: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
3b40: 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 2a 65  written = 0;..*e
3b50: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
3b60: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20  ..return(0);.   
3b70: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
3b80: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65  * We need to cle
3b90: 61 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72  ar the SSL error
3ba0: 20 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75   stack now becau
3bb0: 73 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20  se we sometimes 
3bc0: 72 65 61 63 68 0a 20 20 20 20 20 2a 20 74 68 69  reach.     * thi
3bd0: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
3be0: 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20  leftover errors 
3bf0: 69 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49  in the stack.  I
3c00: 66 20 42 49 4f 5f 77 72 69 74 65 0a 20 20 20 20  f BIO_write.    
3c10: 20 2a 20 72 65 74 75 72 6e 73 20 2d 31 20 61 6e   * returns -1 an
3c20: 64 20 69 6e 74 65 6e 64 73 20 45 41 47 41 49 4e  d intends EAGAIN
3c30: 2c 20 74 68 65 72 65 20 69 73 20 61 20 6c 65 66  , there is a lef
3c40: 74 6f 76 65 72 20 65 72 72 6f 72 2c 20 69 74 20  tover error, it 
3c50: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 2a 20 6d  will be.     * m
3c60: 69 73 63 6f 6e 73 74 72 75 65 64 20 61 73 20 61  isconstrued as a
3c70: 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47  n error, not EAG
3c80: 41 49 4e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  AIN..     *.    
3c90: 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79   * Alternatively
3ca0: 2c 20 77 65 20 6d 61 79 20 77 61 6e 74 20 74 6f  , we may want to
3cb0: 20 68 61 6e 64 6c 65 20 74 68 65 20 3c 30 20 72   handle the <0 r
3cc0: 65 74 75 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d  eturn codes from
3cd0: 0a 20 20 20 20 20 2a 20 42 49 4f 5f 77 72 69 74  .     * BIO_writ
3ce0: 65 20 73 70 65 63 69 61 6c 6c 79 20 28 61 73 20  e specially (as 
3cf0: 61 64 76 69 73 65 64 20 69 6e 20 74 68 65 20 52  advised in the R
3d00: 53 41 20 64 6f 63 73 29 2e 20 20 54 4c 53 27 73  SA docs).  TLS's
3d10: 20 6c 6f 77 65 72 20 6c 65 76 65 6c 0a 20 20 20   lower level.   
3d20: 20 20 2a 20 42 49 4f 20 66 75 6e 63 74 69 6f 6e    * BIO function
3d30: 73 20 70 6c 61 79 20 77 69 74 68 20 74 68 65 20  s play with the 
3d40: 72 65 74 72 79 20 66 6c 61 67 73 20 74 68 6f 75  retry flags thou
3d50: 67 68 2c 20 61 6e 64 20 74 68 69 73 20 73 65 65  gh, and this see
3d60: 6d 73 20 74 6f 0a 20 20 20 20 20 2a 20 77 6f 72  ms to.     * wor
3d70: 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 69  k correctly.  Si
3d80: 6d 69 6c 61 72 20 66 69 78 20 69 6e 20 54 6c 73  milar fix in Tls
3d90: 49 6e 70 75 74 50 72 6f 63 2e 20 2d 20 68 6f 62  InputProc. - hob
3da0: 62 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 45  bs.     */.    E
3db0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
3dc0: 3b 0a 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ;.    written = 
3dd0: 42 49 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50  BIO_write(stateP
3de0: 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f  tr->bio, buf, to
3df0: 57 72 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69  Write);.    dpri
3e00: 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25  ntf("BIO_write(%
3e10: 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c  p, %d) -> [%d]",
3e20: 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50   (void *) stateP
3e30: 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69  tr, toWrite, wri
3e40: 74 74 65 6e 29 3b 0a 0a 20 20 20 20 65 72 72 20  tten);..    err 
3e50: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28  = SSL_get_error(
3e60: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77  statePtr->ssl, w
3e70: 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 62 61 63  ritten);.    bac
3e80: 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f  kingError = ERR_
3e90: 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20  get_error();.   
3ea0: 20 73 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a   switch (err) {.
3eb0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
3ec0: 4e 4f 4e 45 3a 0a 09 20 20 20 20 69 66 20 28 77  NONE:..    if (w
3ed0: 72 69 74 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09  ritten < 0) {...
3ee0: 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20  written = 0;..  
3ef0: 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a    }..    break;.
3f00: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
3f10: 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 20  WANT_WRITE:..   
3f20: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53   dprintf("Got SS
3f30: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49  L_ERROR_WANT_WRI
3f40: 54 45 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74  TE, mapping it t
3f50: 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20  o EAGAIN");..   
3f60: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
3f70: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72   EAGAIN;..    wr
3f80: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20  itten = -1;..   
3f90: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65   Tls_Error(state
3fa0: 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f  Ptr, "SSL_ERROR_
3fb0: 57 41 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09 20  WANT_WRITE");.. 
3fc0: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
3fd0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52  SSL_ERROR_WANT_R
3fe0: 45 41 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74  EAD:..    dprint
3ff0: 66 28 22 20 77 72 69 74 65 20 52 20 42 4c 4f 43  f(" write R BLOC
4000: 4b 22 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72  K");..    Tls_Er
4010: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53  ror(statePtr, "S
4020: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
4030: 41 44 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  AD");..    break
4040: 3b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ;..case SSL_ERRO
4050: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b  R_WANT_X509_LOOK
4060: 55 50 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66  UP:..    dprintf
4070: 28 22 20 77 72 69 74 65 20 58 20 42 4c 4f 43 4b  (" write X BLOCK
4080: 22 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72  ");..    Tls_Err
4090: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 53  or(statePtr, "SS
40a0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30  L_ERROR_WANT_X50
40b0: 39 5f 4c 4f 4f 4b 55 50 22 29 3b 0a 09 20 20 20  9_LOOKUP");..   
40c0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53   break;..case SS
40d0: 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54  L_ERROR_ZERO_RET
40e0: 55 52 4e 3a 0a 09 20 20 20 20 64 70 72 69 6e 74  URN:..    dprint
40f0: 66 28 22 20 63 6c 6f 73 65 64 22 29 3b 0a 09 20  f(" closed");.. 
4100: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a     written = 0;.
4110: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
4120: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73  tr = 0;..    Tls
4130: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
4140: 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65   "Peer has close
4150: 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  d the connection
4160: 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20   for writing by 
4170: 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73  sending the clos
4180: 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 22 29  e_notify alert")
4190: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
41a0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59  ase SSL_ERROR_SY
41b0: 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53  SCALL:..    /* S
41c0: 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61  ome non-recovera
41d0: 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65  ble, fatal I/O e
41e0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
41f0: 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69  ...    if (backi
4200: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20  ngError == 0 && 
4210: 77 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b 0a  written == 0) {.
4220: 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20 72  ..dprintf("EOF r
4230: 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72 6f  eached")...*erro
4240: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09  rCodePtr = 0;...
4250: 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09 54  written = 0;...T
4260: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4270: 72 2c 20 22 45 4f 46 20 72 65 61 63 68 65 64 22  r, "EOF reached"
4280: 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
4290: 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  if (backingError
42a0: 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e   == 0 && written
42b0: 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69   == -1) {...dpri
42c0: 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f  ntf("I/O error o
42d0: 63 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d  ccurred (errno =
42e0: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
42f0: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45  d long) Tcl_GetE
4300: 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f  rrno());...*erro
4310: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
4320: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69  etErrno();...wri
4330: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c 73  tten = -1;...Tls
4340: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
4350: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 45 72   (char *) Tcl_Er
4360: 72 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64  rnoMsg(*errorCod
4370: 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20  ePtr));...    } 
4380: 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66  else {...dprintf
4390: 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  ("I/O error occu
43a0: 72 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72  rred (backingErr
43b0: 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b  or = %lu)", back
43c0: 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72  ingError);...*er
43d0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c  rorCodePtr = Tcl
43e0: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77  _GetErrno();...w
43f0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54  ritten = -1;...T
4400: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4410: 72 2c 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f  r, (char *) ERR_
4420: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
4430: 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  ing(backingError
4440: 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ));..    }..    
4450: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
4460: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20  L_ERROR_SSL:..  
4470: 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76    /* A non-recov
4480: 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72  erable, fatal er
4490: 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  ror in the SSL l
44a0: 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c  ibrary occurred,
44b0: 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f   usually a proto
44c0: 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20  col error */..  
44d0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 20 65    dprintf("SSL e
44e0: 72 72 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e 67  rror, indicating
44f0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
4500: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 62  tion has been ab
4510: 6f 72 74 65 64 22 29 3b 0a 09 20 20 20 20 69 66  orted");..    if
4520: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21   (backingError !
4530: 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72  = 0) {...Tls_Err
4540: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68  or(statePtr, (ch
4550: 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f 6e  ar *) ERR_reason
4560: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61  _error_string(ba
4570: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20  ckingError));.. 
4580: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 53 53     } else if (SS
4590: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
45a0: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
45b0: 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29  l) != X509_V_OK)
45c0: 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73   {...Tls_Error(s
45d0: 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a  tatePtr, (char *
45e0: 29 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  ) X509_verify_ce
45f0: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
4600: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
4610: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
4620: 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20 65  ssl)));..    } e
4630: 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f  lse {...Tls_Erro
4640: 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b  r(statePtr, "Unk
4650: 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22 29  nown SSL error")
4660: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a 65  ;..    }..    *e
4670: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
4680: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20  ONNABORTED;..   
4690: 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09   written = -1;..
46a0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 64 65 66 61      break;..defa
46b0: 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 69 6e 74  ult:..    dprint
46c0: 66 28 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  f("unknown error
46d0: 3a 20 25 64 22 2c 20 65 72 72 29 3b 0a 09 20 20  : %d", err);..  
46e0: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74    Tls_Error(stat
46f0: 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 65  ePtr, "Unknown e
4700: 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 62 72 65  rror");..    bre
4710: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  ak;.    }..    d
4720: 70 72 69 6e 74 66 28 22 4f 75 74 70 75 74 28 25  printf("Output(%
4730: 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f 57 72 69  d) -> %d", toWri
4740: 74 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 20  te, written);.  
4750: 20 20 72 65 74 75 72 6e 28 77 72 69 74 74 65 6e    return(written
4760: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
47b0: 2a 0a 20 2a 20 54 6c 73 53 65 74 4f 70 74 69 6f  *. * TlsSetOptio
47c0: 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20  nProc --. *. *  
47d0: 20 20 53 65 74 73 20 61 6e 20 6f 70 74 69 6f 6e    Sets an option
47e0: 20 76 61 6c 75 65 20 66 6f 72 20 61 20 53 53 4c   value for a SSL
47f0: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
4800: 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a 20 2a 20 20  annel, or a. *  
4810: 20 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70    list of all op
4820: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20  tions and their 
4830: 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a 20 52 65  values.. *. * Re
4840: 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54 43 4c  sults:. *    TCL
4850: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
4860: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69  l or TCL_ERROR i
4870: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20  f failed.. *. * 
4880: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4890: 20 20 20 20 55 70 64 61 74 65 73 20 63 68 61 6e      Updates chan
48a0: 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65  nel option to ne
48b0: 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d  w value.. *. *--
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
4910: 0a 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f  .TlsSetOptionPro
4920: 63 28 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65  c(void *instance
4930: 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b  Data,    /* Sock
4940: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20  et state. */.   
4950: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4960: 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72  erp,../* For err
4970: 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c  ors - can be NUL
4980: 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  L. */.    const 
4990: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65  char *optionName
49a0: 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  ,./* Name of the
49b0: 20 6f 70 74 69 6f 6e 20 74 6f 20 73 65 74 20 74   option to set t
49c0: 68 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72  he value for, or
49d0: 0a 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20  ..... * NULL to 
49e0: 67 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20  get all options 
49f0: 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73  and their values
4a00: 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  . */.    const c
4a10: 68 61 72 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65  har *optionValue
4a20: 29 09 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 6f  )./* Value for o
4a30: 70 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20  ption. */.{.    
4a40: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
4a50: 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74  = (State *) inst
4a60: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 54  anceData;..    T
4a70: 63 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 6e 43  cl_Channel downC
4a80: 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72  han = Tls_GetPar
4a90: 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c  ent(statePtr, TL
4aa0: 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b  S_TCL_FASTPATH);
4ab0: 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53  .    Tcl_DriverS
4ac0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65  etOptionProc *se
4ad0: 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20  tOptionProc;..  
4ae0: 20 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20    setOptionProc 
4af0: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74  = Tcl_ChannelSet
4b00: 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47  OptionProc(Tcl_G
4b10: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f  etChannelType(do
4b20: 77 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 69 66  wnChan));.    if
4b30: 20 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20   (setOptionProc 
4b40: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  != NULL) {..retu
4b50: 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72  rn (*setOptionPr
4b60: 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  oc)(Tcl_GetChann
4b70: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64  elInstanceData(d
4b80: 6f 77 6e 43 68 61 6e 29 2c 20 69 6e 74 65 72 70  ownChan), interp
4b90: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70  , optionName, op
4ba0: 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20  tionValue);.    
4bb0: 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f  } else if (optio
4bc0: 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29  nName == (char*)
4bd0: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a   NULL) {../*.. *
4be0: 20 52 65 71 75 65 73 74 20 69 73 20 71 75 65 72   Request is quer
4bf0: 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e  y for all option
4c00: 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09  s, this is ok...
4c10: 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f   */..return TCL_
4c20: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  OK;.    }.    /*
4c30: 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 20  .     * Request 
4c40: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 6f  for a specific o
4c50: 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 69  ption has to fai
4c60: 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65  l, we don't have
4c70: 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20   any..     */.  
4c80: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64    return Tcl_Bad
4c90: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
4ca0: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65  terp, optionName
4cb0: 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 4f  --. *. * TlsGetO
4d10: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a  ptionProc --. *.
4d20: 20 2a 20 20 20 20 47 65 74 73 20 61 6e 20 6f 70   *    Gets an op
4d30: 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  tion value for a
4d40: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
4d50: 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a  d channel, or a.
4d60: 20 2a 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c   *    list of al
4d70: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68  l options and th
4d80: 65 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20  eir values.. *. 
4d90: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20  * Results:. *   
4da0: 20 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20   A standard Tcl 
4db0: 72 65 73 75 6c 74 2e 20 54 68 65 20 76 61 6c 75  result. The valu
4dc0: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  e of the specifi
4dd0: 65 64 20 6f 70 74 69 6f 6e 20 6f 72 20 61 0a 20  ed option or a. 
4de0: 2a 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c 6c  *    list of all
4df0: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65   options and the
4e00: 69 72 20 76 61 6c 75 65 73 20 69 73 20 72 65 74  ir values is ret
4e10: 75 72 6e 65 64 20 69 6e 20 74 68 65 0a 20 2a 20  urned in the. * 
4e20: 20 20 20 73 75 70 70 6c 69 65 64 20 44 53 74 72     supplied DStr
4e30: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
4e40: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e  effects:. *    N
4e50: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
4e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73  /.static int.Tls
4eb0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 0a 20  GetOptionProc(. 
4ec0: 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63     void *instanc
4ed0: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74  eData,./* Socket
4ee0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54   state. */.    T
4ef0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4f00: 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72  p,../* For error
4f10: 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  s - can be NULL.
4f20: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
4f30: 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09  ar *optionName,.
4f40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
4f50: 70 74 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  ption to retriev
4f60: 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 2c  e the value for,
4f70: 20 6f 72 0a 09 09 09 09 20 2a 20 4e 55 4c 4c 20   or..... * NULL 
4f80: 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 74 69 6f  to get all optio
4f90: 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c  ns and their val
4fa0: 75 65 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ues. */.    Tcl_
4fb0: 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 6f 6e 56  DString *optionV
4fc0: 61 6c 75 65 29 09 2f 2a 20 57 68 65 72 65 20 74  alue)./* Where t
4fd0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6d 70  o store the comp
4fe0: 75 74 65 64 20 76 61 6c 75 65 20 69 6e 69 74 69  uted value initi
4ff0: 61 6c 69 7a 65 64 20 62 79 20 63 61 6c 6c 65 72  alized by caller
5000: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65  . */.{.    State
5010: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
5020: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
5030: 61 74 61 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 68  ata;..    Tcl_Ch
5040: 61 6e 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20 3d  annel downChan =
5050: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73   Tls_GetParent(s
5060: 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c  tatePtr, TLS_TCL
5070: 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20  _FASTPATH);.    
5080: 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74  Tcl_DriverGetOpt
5090: 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69  ionProc *getOpti
50a0: 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 67 65 74  onProc;..    get
50b0: 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c  OptionProc = Tcl
50c0: 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69 6f  _ChannelGetOptio
50d0: 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61  nProc(Tcl_GetCha
50e0: 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61  nnelType(downCha
50f0: 6e 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74  n));.    if (get
5100: 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55  OptionProc != NU
5110: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a  LL) {..return (*
5120: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54  getOptionProc)(T
5130: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
5140: 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68  tanceData(downCh
5150: 61 6e 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74  an), interp, opt
5160: 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56  ionName, optionV
5170: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73  alue);.    } els
5180: 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65  e if (optionName
5190: 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c   == (char*) NULL
51a0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75  ) {../*.. * Requ
51b0: 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72  est is query for
51c0: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68   all options, th
51d0: 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09  is is ok... */..
51e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
51f0: 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20     }.    /*.    
5200: 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 61   * Request for a
5210: 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e   specific option
5220: 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65   has to fail, we
5230: 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e   don't have any.
5240: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  .     */.    ret
5250: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e  urn Tcl_BadChann
5260: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
5270: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29   optionName, "")
5280: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
52d0: 0a 20 2a 20 54 6c 73 57 61 74 63 68 50 72 6f 63  . * TlsWatchProc
52e0: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 49 6e 69   --. *. *    Ini
52f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69  tialize the noti
5300: 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 54 63  fier to watch Tc
5310: 6c 5f 46 69 6c 65 73 20 66 72 6f 6d 20 74 68 69  l_Files from thi
5320: 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  s channel.. *. *
5330: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20   Results:. *    
5340: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  None.. *. * Side
5350: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20   effects:. *    
5360: 53 65 74 73 20 75 70 20 74 68 65 20 6e 6f 74 69  Sets up the noti
5370: 66 69 65 72 20 73 6f 20 74 68 61 74 20 61 20 66  fier so that a f
5380: 75 74 75 72 65 20 65 76 65 6e 74 20 6f 6e 20 74  uture event on t
5390: 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 20 20 20  he channel. *   
53a0: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79   will be seen by
53b0: 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d   Tcl.. *. *-----
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5400: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  */..static void.
5410: 54 6c 73 57 61 74 63 68 50 72 6f 63 28 0a 20 20  TlsWatchProc(.  
5420: 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65    void *instance
5430: 44 61 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 20  Data,    /* The 
5440: 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f  socket state. */
5450: 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09  .    int mask)..
5460: 09 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e  ./* Events of in
5470: 74 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64  terest; an OR-ed
5480: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
5490: 09 09 09 09 20 2a 20 54 43 4c 5f 52 45 41 44 41  .... * TCL_READA
54a0: 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c  BLE, TCL_WRITABL
54b0: 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54  E and TCL_EXCEPT
54c0: 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63  ION. */.{.    Tc
54d0: 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64 6f  l_Channel     do
54e0: 77 6e 43 68 61 6e 3b 0a 20 20 20 20 53 74 61 74  wnChan;.    Stat
54f0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
5500: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65  tate *) instance
5510: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 44 72  Data;.    Tcl_Dr
5520: 69 76 65 72 57 61 74 63 68 50 72 6f 63 20 2a 77  iverWatchProc *w
5530: 61 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20 64  atchProc;..    d
5540: 70 72 69 6e 74 66 28 22 54 6c 73 57 61 74 63 68  printf("TlsWatch
5550: 50 72 6f 63 28 30 78 25 78 29 22 2c 20 6d 61 73  Proc(0x%x)", mas
5560: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74  k);..    /* Pret
5570: 65 6e 64 20 74 6f 20 62 65 20 64 65 61 64 20 61  end to be dead a
5580: 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 76 65  s long as the ve
5590: 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73  rify callback is
55a0: 20 72 75 6e 6e 69 6e 67 2e 0a 20 20 20 20 20 2a   running..     *
55b0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 61 74 20   Otherwise that 
55c0: 63 61 6c 6c 62 61 63 6b 20 63 6f 75 6c 64 20 62  callback could b
55d0: 65 20 69 6e 76 6f 6b 65 64 20 72 65 63 75 72 73  e invoked recurs
55e0: 69 76 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ively. */.    if
55f0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
5600: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  s & TLS_TCL_CALL
5610: 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66  BACK) {..dprintf
5620: 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e  ("Callback is on
5630: 2d 67 6f 69 6e 67 2c 20 64 6f 69 6e 67 20 6e 6f  -going, doing no
5640: 74 68 69 6e 67 22 29 3b 0a 09 72 65 74 75 72 6e  thing");..return
5650: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
5660: 69 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50 74  intFlags(statePt
5670: 72 29 3b 0a 0a 20 20 20 20 64 6f 77 6e 43 68 61  r);..    downCha
5680: 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e  n = Tls_GetParen
5690: 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f  t(statePtr, TLS_
56a0: 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 0a  TCL_FASTPATH);..
56b0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
56c0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
56d0: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c  L_HANDSHAKE_FAIL
56e0: 45 44 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  ED) {..dprintf("
56f0: 41 73 6b 65 64 20 74 6f 20 77 61 74 63 68 20 61  Asked to watch a
5700: 20 73 6f 63 6b 65 74 20 77 69 74 68 20 61 20 66   socket with a f
5710: 61 69 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 20  ailed handshake 
5720: 2d 2d 20 6e 6f 74 68 69 6e 67 20 63 61 6e 20 68  -- nothing can h
5730: 61 70 70 65 6e 20 68 65 72 65 22 29 3b 0a 09 64  appen here");..d
5740: 70 72 69 6e 74 66 28 22 55 6e 72 65 67 69 73 74  printf("Unregist
5750: 65 72 69 6e 67 20 69 6e 74 65 72 65 73 74 20 69  ering interest i
5760: 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e  n the lower chan
5770: 6e 65 6c 22 29 3b 0a 0a 09 77 61 74 63 68 50 72  nel");...watchPr
5780: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  oc = Tcl_Channel
5790: 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65  WatchProc(Tcl_Ge
57a0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77  tChannelType(dow
57b0: 6e 43 68 61 6e 29 29 3b 0a 09 77 61 74 63 68 50  nChan));..watchP
57c0: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
57d0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64  elInstanceData(d
57e0: 6f 77 6e 43 68 61 6e 29 2c 20 30 29 3b 0a 09 73  ownChan), 0);..s
57f0: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61  tatePtr->watchMa
5800: 73 6b 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 3b  sk = 0;..return;
5810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74  .    }..    stat
5820: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20  ePtr->watchMask 
5830: 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20  = mask;..    /* 
5840: 4e 6f 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c  No channel handl
5850: 65 72 73 20 61 6e 79 20 6d 6f 72 65 2e 20 57 65  ers any more. We
5860: 20 77 69 6c 6c 20 62 65 20 6e 6f 74 69 66 69 65   will be notifie
5870: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  d automatically.
5880: 20 20 20 20 20 2a 20 61 62 6f 75 74 20 65 76 65       * about eve
5890: 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e  nts on the chann
58a0: 65 6c 20 62 65 6c 6f 77 20 76 69 61 20 61 20 63  el below via a c
58b0: 61 6c 6c 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  all to our.     
58c0: 2a 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69  * 'TransformNoti
58d0: 66 79 50 72 6f 63 27 2e 20 42 75 74 20 77 65 20  fyProc'. But we 
58e0: 68 61 76 65 20 74 6f 20 70 61 73 73 20 74 68 65  have to pass the
58f0: 20 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20 6e   interest down n
5900: 6f 77 2e 0a 20 20 20 20 20 2a 20 57 65 20 61 72  ow..     * We ar
5910: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64  e allowed to add
5920: 20 61 64 64 69 74 69 6f 6e 61 6c 20 27 69 6e 74   additional 'int
5930: 65 72 65 73 74 27 20 74 6f 20 74 68 65 20 6d 61  erest' to the ma
5940: 73 6b 20 69 66 20 77 65 20 77 61 6e 74 0a 20 20  sk if we want.  
5950: 20 20 20 2a 20 74 6f 2e 20 42 75 74 20 74 68 69     * to. But thi
5960: 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
5970: 20 68 61 73 20 6e 6f 20 73 75 63 68 20 69 6e 74   has no such int
5980: 65 72 65 73 74 2e 20 49 74 20 6a 75 73 74 20 70  erest. It just p
5990: 61 73 73 65 73 0a 20 20 20 20 20 2a 20 74 68 65  asses.     * the
59a0: 20 72 65 71 75 65 73 74 20 64 6f 77 6e 2c 20 75   request down, u
59b0: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a  nchanged..     *
59c0: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  /.    dprintf("R
59d0: 65 67 69 73 74 65 72 69 6e 67 20 6f 75 72 20 69  egistering our i
59e0: 6e 74 65 72 65 73 74 20 69 6e 20 74 68 65 20 6c  nterest in the l
59f0: 6f 77 65 72 20 63 68 61 6e 6e 65 6c 20 28 63 68  ower channel (ch
5a00: 61 6e 3d 25 70 29 22 2c 20 28 76 6f 69 64 20 2a  an=%p)", (void *
5a10: 29 20 64 6f 77 6e 43 68 61 6e 29 3b 0a 20 20 20  ) downChan);.   
5a20: 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 6c   watchProc = Tcl
5a30: 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f  _ChannelWatchPro
5a40: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  c(Tcl_GetChannel
5a50: 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b  Type(downChan));
5a60: 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 54  .    watchProc(T
5a70: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
5a80: 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68  tanceData(downCh
5a90: 61 6e 29 2c 20 6d 61 73 6b 29 3b 0a 0a 0a 20 20  an), mask);...  
5aa0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6e 61    /*.     * Mana
5ab0: 67 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  gement of the in
5ac0: 74 65 72 6e 61 6c 20 74 69 6d 65 72 2e 0a 20 20  ternal timer..  
5ad0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74     */.    if (st
5ae0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
5af0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
5b00: 29 20 4e 55 4c 4c 29 20 7b 0a 09 64 70 72 69 6e  ) NULL) {..dprin
5b10: 74 66 28 22 41 20 74 69 6d 65 72 20 77 61 73 20  tf("A timer was 
5b20: 66 6f 75 6e 64 2c 20 64 65 6c 65 74 69 6e 67 20  found, deleting 
5b30: 69 74 22 29 3b 0a 09 54 63 6c 5f 44 65 6c 65 74  it");..Tcl_Delet
5b40: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
5b50: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
5b60: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
5b70: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b   = (Tcl_TimerTok
5b80: 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  en) NULL;.    }.
5b90: 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26  .    if ((mask &
5ba0: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26   TCL_READABLE) &
5bb0: 26 0a 09 28 28 54 63 6c 5f 49 6e 70 75 74 42 75  &..((Tcl_InputBu
5bc0: 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d  ffered(statePtr-
5bd0: 3e 73 65 6c 66 29 20 3e 20 30 29 20 7c 7c 20 28  >self) > 0) || (
5be0: 42 49 4f 5f 63 74 72 6c 5f 70 65 6e 64 69 6e 67  BIO_ctrl_pending
5bf0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20  (statePtr->bio) 
5c00: 3e 20 30 29 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a  > 0))) {../*.. *
5c10: 20 54 68 65 72 65 20 69 73 20 69 6e 74 65 72 65   There is intere
5c20: 73 74 20 69 6e 20 72 65 61 64 61 62 6c 65 20 65  st in readable e
5c30: 76 65 6e 74 73 20 61 6e 64 20 77 65 20 61 63 74  vents and we act
5c40: 75 61 6c 6c 79 20 68 61 76 65 0a 09 20 2a 20 64  ually have.. * d
5c50: 61 74 61 20 77 61 69 74 69 6e 67 2c 20 73 6f 20  ata waiting, so 
5c60: 67 65 6e 65 72 61 74 65 20 61 20 74 69 6d 65 72  generate a timer
5c70: 20 74 6f 20 66 6c 75 73 68 20 74 68 61 74 2e 0a   to flush that..
5c80: 09 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 43  . */..dprintf("C
5c90: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 69  reating a new ti
5ca0: 6d 65 72 20 73 69 6e 63 65 20 64 61 74 61 20 61  mer since data a
5cb0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 77 61 69  ppears to be wai
5cc0: 74 69 6e 67 22 29 3b 0a 09 73 74 61 74 65 50 74  ting");..statePt
5cd0: 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43  r->timer = Tcl_C
5ce0: 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  reateTimerHandle
5cf0: 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c  r(TLS_TCL_DELAY,
5d00: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c   TlsChannelHandl
5d10: 65 72 54 69 6d 65 72 2c 20 73 74 61 74 65 50 74  erTimer, statePt
5d20: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a  r);.    }.}../*.
5d30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47  -----. *. * TlsG
5d80: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a  etHandleProc --.
5d90: 20 2a 0a 20 2a 20 20 20 20 43 61 6c 6c 65 64 20   *. *    Called 
5da0: 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e  from Tcl_GetChan
5db0: 6e 65 6c 46 69 6c 65 20 74 6f 20 72 65 74 72 69  nelFile to retri
5dc0: 65 76 65 20 6f 2f 73 20 66 69 6c 65 20 68 61 6e  eve o/s file han
5dd0: 64 6c 65 72 0a 20 2a 20 20 20 20 66 72 6f 6d 20  dler. *    from 
5de0: 74 68 65 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  the SSL socket b
5df0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  ased channel.. *
5e00: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20  . * Results:. * 
5e10: 20 20 20 54 68 65 20 61 70 70 72 6f 70 72 69 61     The appropria
5e20: 74 65 20 54 63 6c 5f 46 69 6c 65 20 68 61 6e 64  te Tcl_File hand
5e30: 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  le or NULL if no
5e40: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
5e50: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f  ffects:. *    No
5e60: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
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 0a 20 2a 2f  ------------. */
5eb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 47  .static int TlsG
5ec0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 0a 20 20  etHandleProc(.  
5ed0: 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65    void *instance
5ee0: 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b  Data,    /* Sock
5ef0: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20  et state. */.   
5f00: 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 09   int direction,.
5f10: 09 2f 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  ./* TCL_READABLE
5f20: 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45   or TCL_WRITABLE
5f30: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 2a 68   */.    void **h
5f40: 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e  andlePtr)./* Han
5f50: 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
5f60: 69 74 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  ith the channel 
5f70: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
5f80: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
5f90: 65 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  e *)instanceData
5fa0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63  ;..    return(Tc
5fb0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64  l_GetChannelHand
5fc0: 6c 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74  le(Tls_GetParent
5fd0: 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54  (statePtr, TLS_T
5fe0: 43 4c 5f 46 41 53 54 50 41 54 48 29 2c 20 64 69  CL_FASTPATH), di
5ff0: 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50  rection, handleP
6000: 74 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  tr));.}../*. *--
6010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6050: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66  -. *. * TlsNotif
6060: 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20  yProc --. *. *  
6070: 20 20 48 61 6e 64 6c 65 72 20 63 61 6c 6c 65 64    Handler called
6080: 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72   by Tcl to infor
6090: 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 79  m us of activity
60a0: 0a 20 2a 20 20 20 20 6f 6e 20 74 68 65 20 75 6e  . *    on the un
60b0: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
60c0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
60d0: 0a 20 2a 20 20 20 20 54 79 70 65 20 6f 66 20 65  . *    Type of e
60e0: 76 65 6e 74 20 6f 72 20 30 20 69 66 20 66 61 69  vent or 0 if fai
60f0: 6c 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  led. *. * Side e
6100: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4d 61  ffects:. *    Ma
6110: 79 20 70 72 6f 63 65 73 73 20 74 68 65 20 69 6e  y process the in
6120: 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 62 79 20  coming event by 
6130: 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d 2d  itself.. *. *---
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6180: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
6190: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 28 0a   TlsNotifyProc(.
61a0: 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e      void *instan
61b0: 63 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f  ceData,    /* So
61c0: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20  cket state. */. 
61d0: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f     int mask).../
61e0: 2a 20 74 79 70 65 20 6f 66 20 65 76 65 6e 74 20  * type of event 
61f0: 74 68 61 74 20 6f 63 63 75 72 72 65 64 3a 0a 09  that occurred:..
6200: 09 09 09 20 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  ... * OR-ed comb
6210: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52  ination of TCL_R
6220: 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57  EADABLE or TCL_W
6230: 52 49 54 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20  RITABLE */.{.   
6240: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
6250: 20 3d 20 28 53 74 61 74 65 20 2a 29 69 6e 73 74   = (State *)inst
6260: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e  anceData;.    in
6270: 74 20 65 72 72 6f 72 43 6f 64 65 3b 0a 0a 20 20  t errorCode;..  
6280: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20 65    /*.     * An e
6290: 76 65 6e 74 20 6f 63 63 75 72 72 65 64 20 69 6e  vent occurred in
62a0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
62b0: 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a 20  channel.  This. 
62c0: 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61      * transforma
62d0: 74 69 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f  tion doesn't pro
62e0: 63 65 73 73 20 73 75 63 68 20 65 76 65 6e 74 73  cess such events
62f0: 20 74 68 75 73 20 72 65 74 75 72 6e 73 20 74 68   thus returns th
6300: 65 0a 20 20 20 20 20 2a 20 69 6e 63 6f 6d 69 6e  e.     * incomin
6310: 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e 67 65 64  g mask unchanged
6320: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ..     */.    if
6330: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
6340: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
6350: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f  oken) NULL) {../
6360: 2a 0a 09 20 2a 20 44 65 6c 65 74 65 20 61 6e 20  *.. * Delete an 
6370: 65 78 69 73 74 69 6e 67 20 74 69 6d 65 72 2e 20  existing timer. 
6380: 49 74 20 77 61 73 20 6e 6f 74 20 66 69 72 65 64  It was not fired
6390: 2c 20 79 65 74 20 77 65 20 61 72 65 0a 09 20 2a  , yet we are.. *
63a0: 20 68 65 72 65 2c 20 73 6f 20 74 68 65 20 63 68   here, so the ch
63b0: 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65  annel below gene
63c0: 72 61 74 65 64 20 73 75 63 68 20 61 6e 20 65 76  rated such an ev
63d0: 65 6e 74 20 61 6e 64 20 77 65 0a 09 20 2a 20 64  ent and we.. * d
63e0: 6f 6e 27 74 20 68 61 76 65 20 74 6f 2e 20 54 68  on't have to. Th
63f0: 65 20 72 65 6e 65 77 61 6c 20 6f 66 20 74 68 65  e renewal of the
6400: 20 69 6e 74 65 72 65 73 74 20 61 66 74 65 72 20   interest after 
6410: 74 68 65 0a 09 20 2a 20 65 78 65 63 75 74 69 6f  the.. * executio
6420: 6e 20 6f 66 20 63 68 61 6e 6e 65 6c 20 68 61 6e  n of channel han
6430: 64 6c 65 72 73 20 77 69 6c 6c 20 65 76 65 6e 74  dlers will event
6440: 75 61 6c 6c 79 20 63 61 75 73 65 20 75 73 20 74  ually cause us t
6450: 6f 0a 09 20 2a 20 72 65 63 72 65 61 74 65 20 74  o.. * recreate t
6460: 68 65 20 74 69 6d 65 72 20 28 69 6e 20 57 61 74  he timer (in Wat
6470: 63 68 50 72 6f 63 29 2e 0a 09 20 2a 2f 0a 09 54  chProc)... */..T
6480: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
6490: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
64a0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
64b0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f  r->timer = (Tcl_
64c0: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
64d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
64e0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
64f0: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42   & TLS_TCL_CALLB
6500: 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  ACK) {..dprintf(
6510: 22 52 65 74 75 72 6e 69 6e 67 20 30 20 64 75 65  "Returning 0 due
6520: 20 74 6f 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a   to callback");.
6530: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d  .return 0;.    }
6540: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
6550: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46  alling Tls_WaitF
6560: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20  orConnect");.   
6570: 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a   errorCode = 0;.
6580: 20 20 20 20 69 66 20 28 54 6c 73 5f 57 61 69 74      if (Tls_Wait
6590: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
65a0: 50 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c  Ptr, &errorCode,
65b0: 20 31 29 20 3c 20 30 29 20 7b 0a 09 54 6c 73 5f   1) < 0) {..Tls_
65c0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
65d0: 73 74 72 65 72 72 6f 72 28 65 72 72 6f 72 43 6f  strerror(errorCo
65e0: 64 65 29 29 3b 0a 09 69 66 20 28 65 72 72 6f 72  de));..if (error
65f0: 43 6f 64 65 20 3d 3d 20 45 41 47 41 49 4e 29 20  Code == EAGAIN) 
6600: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
6610: 41 73 79 6e 63 20 66 6c 61 67 20 63 6f 75 6c 64  Async flag could
6620: 20 62 65 20 73 65 74 20 28 64 69 64 6e 27 74 20   be set (didn't 
6630: 63 68 65 63 6b 29 20 61 6e 64 20 65 72 72 6f 72  check) and error
6640: 43 6f 64 65 20 3d 3d 20 45 41 47 41 49 4e 3a 20  Code == EAGAIN: 
6650: 20 52 65 74 75 72 6e 69 6e 67 20 30 22 29 3b 0a   Returning 0");.
6660: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ..    return 0;.
6670: 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 54 6c  .}...dprintf("Tl
6680: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
6690: 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
66a0: 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  or");.    }..   
66b0: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
66c0: 69 6e 67 20 25 69 22 2c 20 6d 61 73 6b 29 3b 0a  ing %i", mask);.
66d0: 0a 20 20 20 20 72 65 74 75 72 6e 28 6d 61 73 6b  .    return(mask
66e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6720: 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 54 6c 73 43  -*. *. *    TlsC
6730: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d  hannelHandlerTim
6740: 65 72 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 2d  er --. *. *    -
6750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
6780: 0a 20 2a 20 20 20 20 43 61 6c 6c 65 64 20 62 79  . *    Called by
6790: 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d   the notifier (-
67a0: 3e 20 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73  > timer) to flus
67b0: 68 20 6f 75 74 0a 20 2a 20 20 20 20 69 6e 66 6f  h out. *    info
67c0: 72 6d 61 74 69 6f 6e 20 77 61 69 74 69 6e 67 20  rmation waiting 
67d0: 69 6e 20 63 68 61 6e 6e 65 6c 20 62 75 66 66 65  in channel buffe
67e0: 72 73 2e 0a 20 2a 20 20 20 20 2d 2d 2d 2d 2d 2d  rs.. *    ------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
6820: 2a 20 20 20 20 53 69 64 65 20 65 66 66 65 63 74  *    Side effect
6830: 73 3a 0a 20 2a 20 20 20 20 20 20 20 20 41 73 20  s:. *        As 
6840: 6f 66 20 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61  of 'TlsChannelHa
6850: 6e 64 6c 65 72 27 2e 0a 20 2a 0a 20 2a 20 20 20  ndler'.. *. *   
6860: 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20   Result:. *     
6870: 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d     None.. *. *--
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68b0: 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ----*. */.static
68c0: 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e 65 6c   void TlsChannel
68d0: 48 61 6e 64 6c 65 72 54 69 6d 65 72 28 76 6f 69  HandlerTimer(voi
68e0: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 20 7b  d *clientData) {
68f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
6900: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
6910: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
6920: 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 0a   int mask = 0;..
6930: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
6940: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 74 61 74  led");..    stat
6950: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54  ePtr->timer = (T
6960: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
6970: 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 42 49  ULL;..    if (BI
6980: 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65  O_wpending(state
6990: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70  Ptr->bio)) {..dp
69a0: 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d  rintf("[chan=%p]
69b0: 20 42 49 4f 20 77 72 69 74 61 62 6c 65 22 2c 20   BIO writable", 
69c0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
69d0: 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57  ...mask |= TCL_W
69e0: 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a  RITABLE;.    }..
69f0: 20 20 20 20 69 66 20 28 42 49 4f 5f 70 65 6e 64      if (BIO_pend
6a00: 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ing(statePtr->bi
6a10: 6f 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  o)) {..dprintf("
6a20: 5b 63 68 61 6e 3d 25 70 5d 20 42 49 4f 20 72 65  [chan=%p] BIO re
6a30: 61 64 61 62 6c 65 22 2c 20 73 74 61 74 65 50 74  adable", statePt
6a40: 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61 73 6b  r->self);...mask
6a50: 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   |= TCL_READABLE
6a60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
6a70: 69 6e 74 66 28 22 4e 6f 74 69 66 79 69 6e 67 20  intf("Notifying 
6a80: 6f 75 72 73 65 6c 76 65 73 22 29 3b 0a 20 20 20  ourselves");.   
6a90: 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e   Tcl_NotifyChann
6aa0: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
6ab0: 66 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 64  f, mask);..    d
6ac0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
6ad0: 67 22 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  g");..    return
6ae0: 3b 0a 7d 0a 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c  ;.}..Tcl_Channel
6af0: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 53   Tls_GetParent(S
6b00: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
6b10: 69 6e 74 20 6d 61 73 6b 46 6c 61 67 73 29 20 7b  int maskFlags) {
6b20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
6b30: 71 75 65 73 74 65 64 20 74 6f 20 67 65 74 20 70  quested to get p
6b40: 61 72 65 6e 74 20 6f 66 20 63 68 61 6e 6e 65 6c  arent of channel
6b50: 20 25 70 22 2c 20 73 74 61 74 65 50 74 72 2d 3e   %p", statePtr->
6b60: 73 65 6c 66 29 3b 0a 0a 20 20 20 20 69 66 20 28  self);..    if (
6b70: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
6b80: 20 26 20 7e 6d 61 73 6b 46 6c 61 67 73 29 20 26   & ~maskFlags) &
6b90: 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54   TLS_TCL_FASTPAT
6ba0: 48 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41  H) {..dprintf("A
6bb0: 73 6b 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  sked to get the 
6bc0: 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 77  parent channel w
6bd0: 68 69 6c 65 20 77 65 20 61 72 65 20 75 73 69 6e  hile we are usin
6be0: 67 20 46 61 73 74 50 61 74 68 20 2d 2d 20 72 65  g FastPath -- re
6bf0: 74 75 72 6e 69 6e 67 20 4e 55 4c 4c 22 29 3b 0a  turning NULL");.
6c00: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20  .return(NULL);. 
6c10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28     }.    return(
6c20: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68  Tcl_GetStackedCh
6c30: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
6c40: 73 65 6c 66 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  self));.}../*. *
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c90: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 68  ---. *. * Tls_Ch
6ca0: 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a  annelType --. *.
6cb0: 20 2a 20 20 20 20 52 65 74 75 72 6e 20 74 68 65   *    Return the
6cc0: 20 63 6f 72 72 65 63 74 20 54 4c 53 20 63 68 61   correct TLS cha
6cd0: 6e 6e 65 6c 20 64 72 69 76 65 72 20 69 6e 66 6f  nnel driver info
6ce0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
6cf0: 20 2a 20 20 20 20 54 68 65 20 63 6f 72 72 65 63   *    The correc
6d00: 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72  t channel driver
6d10: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
6d20: 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 63 6c 2e   version of Tcl.
6d30: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
6d40: 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e  cts:. *    None.
6d50: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
6da0: 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43  atic const Tcl_C
6db0: 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c 73 43 68  hannelType tlsCh
6dc0: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20  annelType = {.  
6dd0: 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a 20 54 79    "tls",.../* Ty
6de0: 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54  pe name */.    T
6df0: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49  CL_CHANNEL_VERSI
6e00: 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 6e  ON_5,./* v5 chan
6e10: 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c  nel */.    TlsCl
6e20: 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f  oseProc,../* Clo
6e30: 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54  se proc */.    T
6e40: 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a  lsInputProc,../*
6e50: 20 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20   Input proc */. 
6e60: 20 20 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63     TlsOutputProc
6e70: 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f  ,../* Output pro
6e80: 63 20 2a 2f 0a 20 20 20 20 30 2c 09 09 09 2f 2a  c */.    0,.../*
6e90: 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20   Seek proc */.  
6ea0: 20 20 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72    TlsSetOptionPr
6eb0: 6f 63 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69  oc,../* Set opti
6ec0: 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54  on proc */.    T
6ed0: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c  lsGetOptionProc,
6ee0: 09 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20  ../* Get option 
6ef0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 57  proc */.    TlsW
6f00: 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e  atchProc,../* In
6f10: 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65  itialize notifie
6f20: 72 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 48  r */.    TlsGetH
6f30: 61 6e 64 6c 65 50 72 6f 63 2c 09 09 2f 2a 20 47  andleProc,../* G
6f40: 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75  et OS handles ou
6f50: 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  t of channel */.
6f60: 20 20 20 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f      TlsClose2Pro
6f70: 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f  c,../* close2pro
6f80: 63 20 2a 2f 0a 20 20 20 20 54 6c 73 42 6c 6f 63  c */.    TlsBloc
6f90: 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f 2a 20 53  kModeProc,../* S
6fa0: 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62  et blocking/nonb
6fb0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20  locking mode*/. 
6fc0: 20 20 20 30 2c 09 09 09 2f 2a 20 46 6c 75 73 68     0,.../* Flush
6fd0: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73   proc */.    Tls
6fe0: 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20  NotifyProc,../* 
6ff0: 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e  Handling of even
7000: 74 73 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a  ts bubbling up *
7010: 2f 0a 20 20 20 20 30 2c 09 09 09 2f 2a 20 57 69  /.    0,.../* Wi
7020: 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a  de seek proc */.
7030: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54      NULL,.../* T
7040: 68 72 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f 0a  hread action */.
7050: 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54 72      NULL.../* Tr
7060: 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 63 6f  uncate */.};..co
7070: 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54  nst Tcl_ChannelT
7080: 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c  ype *Tls_Channel
7090: 54 79 70 65 28 76 6f 69 64 29 20 7b 0a 20 20 20  Type(void) {.   
70a0: 20 72 65 74 75 72 6e 20 26 74 6c 73 43 68 61 6e   return &tlsChan
70b0: 6e 65 6c 54 79 70 65 3b 0a 7d 0a                 nelType;.}.