Hex Artifact Content

Artifact ff0429678e2cd4ed80ccdfbbb4758056b985a41d2a59a1aabc4616973fd48bad:


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 0a 2f 2a 0a   "tlsInt.h"../*.
02b0: 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61   * Forward decla
02c0: 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 73 74 61 74  rations. */.stat
02d0: 69 63 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e  ic void TlsChann
02e0: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 28 43  elHandlerTimer(C
02f0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
0300: 44 61 74 61 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 4c  Data);../*. * TL
0310: 53 20 43 68 61 6e 6e 65 6c 20 54 79 70 65 0a 20  S Channel Type. 
0320: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68  */.static Tcl_Ch
0330: 61 6e 6e 65 6c 54 79 70 65 20 2a 74 6c 73 43 68  annelType *tlsCh
0340: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 4e 55 4c 4c  annelType = NULL
0350: 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ;../*. *--------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
03a0: 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72  * TlsBlockModePr
03b0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54  oc --. *. *    T
03c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
03d0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
03e0: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c  generic IO level
03f0: 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 73 65 74  . *       to set
0400: 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f   blocking and no
0410: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a  nblocking modes.
0420: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20   * Results:. *  
0430: 20 20 30 20 69 66 20 73 75 63 63 65 73 73 66 75    0 if successfu
0440: 6c 2c 20 65 72 72 6e 6f 20 77 68 65 6e 20 66 61  l, errno when fa
0450: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  iled.. *. * Side
0460: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20   effects:. *    
0470: 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65 20  Sets the device 
0480: 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72  into blocking or
0490: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64   nonblocking mod
04a0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
04f0: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42 6c  static int TlsBl
0500: 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65  ockModeProc(Clie
0510: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
0520: 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b  ata, int mode) {
0530: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
0540: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
0550: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a   instanceData;..
0560: 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20      if (mode == 
0570: 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43  TCL_MODE_NONBLOC
0580: 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74  KING) {..statePt
0590: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
05a0: 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d  TCL_ASYNC;.    }
05b0: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74   else {..statePt
05c0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c  r->flags &= ~(TL
05d0: 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20  S_TCL_ASYNC);.  
05e0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28 30    }.    return(0
05f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0640: 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 72 6f  *. * TlsClosePro
0650: 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54 68  c --. *. *    Th
0660: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
0670: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67  invoked by the g
0680: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20  eneric IO level 
0690: 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 20 20 20  to perform. *   
06a0: 20 63 68 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70   channel-type-sp
06b0: 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77  ecific cleanup w
06c0: 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
06d0: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
06e0: 2a 20 20 20 20 69 73 20 63 6c 6f 73 65 64 2e 0a  *    is closed..
06f0: 20 2a 0a 20 2a 20 20 20 20 4e 6f 74 65 3a 20 77   *. *    Note: w
0700: 65 20 6c 65 61 76 65 20 74 68 65 20 75 6e 64 65  e leave the unde
0710: 72 6c 79 69 6e 67 20 73 6f 63 6b 65 74 20 61 6c  rlying socket al
0720: 6f 6e 65 2c 20 69 73 20 74 68 69 73 20 72 69 67  one, is this rig
0730: 68 74 3f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ht?. *. * Result
0740: 73 3a 0a 20 2a 20 20 20 20 30 20 69 66 20 73 75  s:. *    0 if su
0750: 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 76 61  ccessful, the va
0760: 6c 75 65 20 6f 66 20 54 63 6c 5f 47 65 74 45 72  lue of Tcl_GetEr
0770: 72 6e 6f 28 29 20 69 66 20 66 61 69 6c 65 64 2e  rno() if failed.
0780: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
0790: 63 74 73 3a 0a 20 2a 20 20 20 20 43 6c 6f 73 65  cts:. *    Close
07a0: 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f 66 20  s the socket of 
07b0: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  the channel.. *.
07c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
0810: 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 50 72 6f   int TlsClosePro
0820: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
0830: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49  tanceData, Tcl_I
0840: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
0850: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
0860: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
0870: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a   instanceData;..
0880: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73      dprintf("Tls
0890: 43 6c 6f 73 65 50 72 6f 63 28 25 70 29 22 2c 20  CloseProc(%p)", 
08a0: 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74  (void *) statePt
08b0: 72 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65  r);..    Tls_Cle
08c0: 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  an(statePtr);.  
08d0: 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79    Tcl_Eventually
08e0: 46 72 65 65 28 28 43 6c 69 65 6e 74 44 61 74 61  Free((ClientData
08f0: 29 73 74 61 74 65 50 74 72 2c 20 54 6c 73 5f 46  )statePtr, Tls_F
0900: 72 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ree);.    return
0910: 28 30 29 3b 0a 0a 09 2f 2a 20 49 6e 74 65 72 70  (0);.../* Interp
0920: 20 69 73 20 75 6e 75 73 65 64 2e 20 2a 2f 0a 09   is unused. */..
0930: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
0940: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 54  .}..static int T
0950: 6c 73 43 6c 6f 73 65 50 72 6f 63 32 28 43 6c 69  lsCloseProc2(Cli
0960: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
0970: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
0980: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
0990: 61 67 73 29 20 7b 0a 20 20 20 20 69 66 20 28 28  ags) {.    if ((
09a0: 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f  flags & (TCL_CLO
09b0: 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 4c 4f 53  SE_READ|TCL_CLOS
09c0: 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 20  E_WRITE)) == 0) 
09d0: 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73 43 6c 6f  {..return TlsClo
09e0: 73 65 50 72 6f 63 28 69 6e 73 74 61 6e 63 65 44  seProc(instanceD
09f0: 61 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata, interp);.  
0a00: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 45    }.    return E
0a10: 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  INVAL;.}../*. *-
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20  -----*. *. *    
0a60: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
0a70: 63 74 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 53  ct --. *. *    S
0a80: 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 20 20  ideeffects:. *  
0a90: 20 20 20 20 20 20 49 73 73 75 65 73 20 53 53 4c        Issues SSL
0aa0: 5f 61 63 63 65 70 74 20 6f 72 20 53 53 4c 5f 63  _accept or SSL_c
0ab0: 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20  onnect. *. *    
0ac0: 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 20  Result:. *      
0ad0: 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d    None.. *. *---
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b10: 2d 2d 2d 2a 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73  ---*. */.int Tls
0b20: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28  _WaitForConnect(
0b30: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
0b40: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
0b50: 74 72 2c 20 69 6e 74 20 68 61 6e 64 73 68 61 6b  tr, int handshak
0b60: 65 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61 6e  eFailureIsPerman
0b70: 65 6e 74 29 20 7b 0a 20 20 20 20 75 6e 73 69 67  ent) {.    unsig
0b80: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67  ned long backing
0b90: 45 72 72 6f 72 3b 0a 20 20 20 20 69 6e 74 20 65  Error;.    int e
0ba0: 72 72 2c 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  rr, rc;.    int 
0bb0: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 3b 0a  bioShouldRetry;.
0bc0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 61  .    dprintf("Wa
0bd0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 25 70 29  itForConnect(%p)
0be0: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74  ", (void *) stat
0bf0: 65 50 74 72 29 3b 0a 20 20 20 20 64 70 72 69 6e  ePtr);.    dprin
0c00: 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29  tFlags(statePtr)
0c10: 3b 0a 0a 20 20 20 20 69 66 20 28 21 28 73 74 61  ;..    if (!(sta
0c20: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
0c30: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 29 20 7b 0a  LS_TCL_INIT)) {.
0c40: 09 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61  .dprintf("Tls_Wa
0c50: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 63 61 6c  itForConnect cal
0c60: 6c 65 64 20 6f 6e 20 61 6c 72 65 61 64 79 20 69  led on already i
0c70: 6e 69 74 69 61 6c 69 7a 65 64 20 63 68 61 6e 6e  nitialized chann
0c80: 65 6c 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20  el -- returning 
0c90: 77 69 74 68 20 69 6d 6d 65 64 69 61 74 65 20 73  with immediate s
0ca0: 75 63 63 65 73 73 22 29 3b 0a 09 2a 65 72 72 6f  uccess");..*erro
0cb0: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 72  rCodePtr = 0;..r
0cc0: 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a  eturn(0);.    }.
0cd0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
0ce0: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
0cf0: 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49  CL_HANDSHAKE_FAI
0d00: 4c 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44  LED) {../*.. * D
0d10: 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
0d20: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 68 61 76  f operations hav
0d30: 65 20 64 69 66 66 65 72 65 6e 74 20 72 65 71 75  e different requ
0d40: 69 72 65 6d 65 6e 74 73 0a 09 20 2a 20 53 53 4c  irements.. * SSL
0d50: 20 62 65 69 6e 67 20 65 73 74 61 62 6c 69 73 68   being establish
0d60: 65 64 0a 09 20 2a 2f 0a 09 69 66 20 28 68 61 6e  ed.. */..if (han
0d70: 64 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50  dshakeFailureIsP
0d80: 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20 20  ermanent) {..   
0d90: 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20   dprintf("Asked 
0da0: 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c  to wait for a TL
0db0: 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74  S handshake that
0dc0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69   has already fai
0dd0: 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  led.  Returning 
0de0: 66 61 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a 09  fatal error");..
0df0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
0e00: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44  r = ECONNABORTED
0e10: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
0e20: 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20   dprintf("Asked 
0e30: 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c  to wait for a TL
0e40: 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74  S handshake that
0e50: 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69   has already fai
0e60: 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  led.  Returning 
0e70: 73 6f 66 74 20 65 72 72 6f 72 22 29 3b 0a 09 20  soft error");.. 
0e80: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
0e90: 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09   = ECONNRESET;..
0ea0: 7d 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 20  }..return(-1);. 
0eb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 3b     }..    for (;
0ec0: 3b 29 20 7b 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69  ;) {../* Not ini
0ed0: 74 69 61 6c 69 7a 65 64 20 79 65 74 21 20 2a 2f  tialized yet! */
0ee0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
0ef0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
0f00: 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 64  SERVER) {..    d
0f10: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
0f20: 53 53 4c 5f 61 63 63 65 70 74 28 29 22 29 3b 0a  SSL_accept()");.
0f30: 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 61  .    err = SSL_a
0f40: 63 63 65 70 74 28 73 74 61 74 65 50 74 72 2d 3e  ccept(statePtr->
0f50: 73 73 6c 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b  ssl);...} else {
0f60: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
0f70: 61 6c 6c 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e 65  alling SSL_conne
0f80: 63 74 28 29 22 29 3b 0a 09 20 20 20 20 65 72 72  ct()");..    err
0f90: 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 73   = SSL_connect(s
0fa0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
0fb0: 7d 0a 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29  }...if (err > 0)
0fc0: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
0fd0: 22 54 68 61 74 20 73 65 65 6d 73 20 74 6f 20 68  "That seems to h
0fe0: 61 76 65 20 67 6f 6e 65 20 6f 6b 61 79 22 29 3b  ave gone okay");
0ff0: 0a 0a 09 20 20 20 20 65 72 72 20 3d 20 42 49 4f  ...    err = BIO
1000: 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d  _flush(statePtr-
1010: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 69 66 20 28  >bio);..    if (
1020: 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 09 64 70  err <= 0) {...dp
1030: 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20  rintf("Flushing 
1040: 74 68 65 20 6c 6f 77 65 72 20 6c 61 79 65 72 73  the lower layers
1050: 20 66 61 69 6c 65 64 2c 20 74 68 69 73 20 77 69   failed, this wi
1060: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 74 65 72 6d  ll probably term
1070: 69 6e 61 74 65 20 74 68 69 73 20 73 65 73 73 69  inate this sessi
1080: 6f 6e 22 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  on");..    }..}.
1090: 0a 09 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65  ..rc = SSL_get_e
10a0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73  rror(statePtr->s
10b0: 73 6c 2c 20 65 72 72 29 3b 0a 0a 09 64 70 72 69  sl, err);...dpri
10c0: 6e 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a 20  ntf("Got error: 
10d0: 25 69 20 28 72 63 20 3d 20 25 69 29 22 2c 20 65  %i (rc = %i)", e
10e0: 72 72 2c 20 72 63 29 3b 0a 0a 09 62 69 6f 53 68  rr, rc);...bioSh
10f0: 6f 75 6c 64 52 65 74 72 79 20 3d 20 30 3b 0a 09  ouldRetry = 0;..
1100: 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a  if (err <= 0) {.
1110: 09 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53  .    if (rc == S
1120: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f  SL_ERROR_WANT_CO
1130: 4e 4e 45 43 54 20 7c 7c 20 72 63 20 3d 3d 20 53  NNECT || rc == S
1140: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43  SL_ERROR_WANT_AC
1150: 43 45 50 54 20 7c 7c 20 72 63 20 3d 3d 20 53 53  CEPT || rc == SS
1160: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41  L_ERROR_WANT_REA
1170: 44 20 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45  D || rc == SSL_E
1180: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 29  RROR_WANT_WRITE)
1190: 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65   {...bioShouldRe
11a0: 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20  try = 1;..    } 
11b0: 65 6c 73 65 20 69 66 20 28 42 49 4f 5f 73 68 6f  else if (BIO_sho
11c0: 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50  uld_retry(stateP
11d0: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 62 69  tr->bio)) {...bi
11e0: 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31  oShouldRetry = 1
11f0: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
1200: 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f   (rc == SSL_ERRO
1210: 52 5f 53 59 53 43 41 4c 4c 20 26 26 20 54 63 6c  R_SYSCALL && Tcl
1220: 5f 47 65 74 45 72 72 6e 6f 28 29 20 3d 3d 20 45  _GetErrno() == E
1230: 41 47 41 49 4e 29 20 7b 0a 09 09 62 69 6f 53 68  AGAIN) {...bioSh
1240: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09  ouldRetry = 1;..
1250: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a      }..} else {.
1260: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73  .    if (!SSL_is
1270: 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73  _init_finished(s
1280: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b  tatePtr->ssl)) {
1290: 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72  ...bioShouldRetr
12a0: 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d  y = 1;..    }..}
12b0: 0a 0a 09 69 66 20 28 62 69 6f 53 68 6f 75 6c 64  ...if (bioShould
12c0: 52 65 74 72 79 29 20 7b 0a 09 20 20 20 20 64 70  Retry) {..    dp
12d0: 72 69 6e 74 66 28 22 54 68 65 20 49 2f 4f 20 64  rintf("The I/O d
12e0: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  id not complete 
12f0: 2d 2d 20 62 75 74 20 77 65 20 73 68 6f 75 6c 64  -- but we should
1300: 20 74 72 79 20 69 74 20 61 67 61 69 6e 22 29 3b   try it again");
1310: 0a 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65  ...    if (state
1320: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
1330: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09  _TCL_ASYNC) {...
1340: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
1350: 6e 67 20 45 41 47 41 49 4e 20 73 6f 20 74 68 61  ng EAGAIN so tha
1360: 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 74 72  t it can be retr
1370: 69 65 64 20 6c 61 74 65 72 22 29 3b 0a 0a 09 09  ied later");....
1380: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1390: 45 41 47 41 49 4e 3b 0a 09 09 72 65 74 75 72 6e  EAGAIN;...return
13a0: 28 2d 31 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73  (-1);..    } els
13b0: 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 44  e {...dprintf("D
13c0: 6f 69 6e 67 20 73 6f 20 6e 6f 77 22 29 3b 0a 0a  oing so now");..
13d0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20  ..continue;..   
13e0: 20 7d 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28   }..}...dprintf(
13f0: 22 57 65 20 68 61 76 65 20 65 69 74 68 65 72 20  "We have either 
1400: 63 6f 6d 70 6c 65 74 65 6c 79 20 65 73 74 61 62  completely estab
1410: 6c 69 73 68 65 64 20 74 68 65 20 73 65 73 73 69  lished the sessi
1420: 6f 6e 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79  on or completely
1430: 20 66 61 69 6c 65 64 20 69 74 20 2d 2d 20 74 68   failed it -- th
1440: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 6e  ere is no more n
1450: 65 65 64 20 74 6f 20 65 76 65 72 20 72 65 74 72  eed to ever retr
1460: 79 20 69 74 20 74 68 6f 75 67 68 22 29 3b 0a 09  y it though");..
1470: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1480: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
1490: 3d 20 45 49 4e 56 41 4c 3b 0a 0a 20 20 20 20 73  = EINVAL;..    s
14a0: 77 69 74 63 68 20 28 72 63 29 20 7b 0a 09 63 61  witch (rc) {..ca
14b0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e  se SSL_ERROR_NON
14c0: 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 63  E:..    /* The c
14d0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 75 70 2c  onnection is up,
14e0: 20 77 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72   we are done her
14f0: 65 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  e */..    dprint
1500: 66 28 22 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  f("The connectio
1510: 6e 20 69 73 20 75 70 22 29 3b 0a 09 20 20 20 20  n is up");..    
1520: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 4c  break;..case SSL
1530: 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55  _ERROR_ZERO_RETU
1540: 52 4e 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66  RN:..    dprintf
1550: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f  ("SSL_ERROR_ZERO
1560: 5f 52 45 54 55 52 4e 3a 20 43 6f 6e 6e 65 63 74  _RETURN: Connect
1570: 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
1580: 61 6c 69 64 20 76 61 6c 75 65 2e 2e 2e 22 29 0a  alid value...").
1590: 09 20 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b  .    return(-1);
15a0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
15b0: 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 62  _SYSCALL:..    b
15c0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52  ackingError = ER
15d0: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a  R_get_error();..
15e0: 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67  .    if (backing
15f0: 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 65 72  Error == 0 && er
1600: 72 20 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69  r == 0) {...dpri
1610: 6e 74 66 28 22 45 4f 46 20 72 65 61 63 68 65 64  ntf("EOF reached
1620: 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  ")...*errorCodeP
1630: 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b  tr = ECONNRESET;
1640: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
1650: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d  (backingError ==
1660: 20 30 20 26 26 20 65 72 72 20 3d 3d 20 2d 31 29   0 && err == -1)
1670: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f   {...dprintf("I/
1680: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  O error occurred
1690: 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c   (errno = %lu)",
16a0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16b0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29   Tcl_GetErrno())
16c0: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ;...*errorCodePt
16d0: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  r = Tcl_GetErrno
16e0: 28 29 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f 72  ();...if (*error
16f0: 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e  CodePtr == ECONN
1700: 52 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20 2a  RESET) {...    *
1710: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
1720: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d  CONNABORTED;...}
1730: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
1740: 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72  .dprintf("I/O er
1750: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 61  ror occurred (ba
1760: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75  ckingError = %lu
1770: 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  )", backingError
1780: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  );...*errorCodeP
1790: 74 72 20 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f  tr = backingErro
17a0: 72 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43  r;...if (*errorC
17b0: 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52  odePtr == ECONNR
17c0: 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65  ESET) {...    *e
17d0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
17e0: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a  ONNABORTED;...}.
17f0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73 74 61  .    }...    sta
1800: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
1810: 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b  TLS_TCL_HANDSHAK
1820: 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 72  E_FAILED;..    r
1830: 65 74 75 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 73  eturn(-1);...cas
1840: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a  e SSL_ERROR_SSL:
1850: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47  ..    dprintf("G
1860: 6f 74 20 70 65 72 6d 61 6e 65 6e 74 20 66 61 74  ot permanent fat
1870: 61 6c 20 53 53 4c 20 65 72 72 6f 72 2c 20 61 62  al SSL error, ab
1880: 6f 72 74 69 6e 67 20 69 6d 6d 65 64 69 61 74 65  orting immediate
1890: 6c 79 22 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45  ly");..    Tls_E
18a0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28  rror(statePtr, (
18b0: 63 68 61 72 20 2a 29 45 52 52 5f 72 65 61 73 6f  char *)ERR_reaso
18c0: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45  n_error_string(E
18d0: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 29  RR_get_error()))
18e0: 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
18f0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
1900: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c  L_HANDSHAKE_FAIL
1910: 45 44 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ED;..    *errorC
1920: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42  odePtr = ECONNAB
1930: 4f 52 54 45 44 3b 0a 09 20 20 20 20 72 65 74 75  ORTED;..    retu
1940: 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 73 65 20 53  rn(-1);...case S
1950: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f  SL_ERROR_WANT_CO
1960: 4e 4e 45 43 54 3a 0a 09 63 61 73 65 20 53 53 4c  NNECT:..case SSL
1970: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45  _ERROR_WANT_ACCE
1980: 50 54 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  PT:..case SSL_ER
1990: 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f  ROR_WANT_X509_LO
19a0: 4f 4b 55 50 3a 0a 09 64 65 66 61 75 6c 74 3a 0a  OKUP:..default:.
19b0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 65  .    dprintf("We
19c0: 20 67 6f 74 20 61 20 63 6f 6e 66 75 73 69 6e 67   got a confusing
19d0: 20 72 65 70 6c 79 3a 20 25 69 22 2c 20 72 63 29   reply: %i", rc)
19e0: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
19f0: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72  ePtr = Tcl_GetEr
1a00: 72 6e 6f 28 29 3b 0a 09 20 20 20 20 64 70 72 69  rno();..    dpri
1a10: 6e 74 66 28 22 45 52 52 28 25 64 2c 20 25 64 29  ntf("ERR(%d, %d)
1a20: 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 43 6f   ", rc, *errorCo
1a30: 64 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  dePtr);..    ret
1a40: 75 72 6e 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  urn(-1);.    }..
1a50: 23 69 66 20 30 0a 20 20 20 20 69 66 20 28 73 74  #if 0.    if (st
1a60: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
1a70: 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20  TLS_TCL_SERVER) 
1a80: 7b 0a 09 64 70 72 69 6e 74 66 28 22 54 68 69 73  {..dprintf("This
1a90: 20 69 73 20 61 6e 20 54 4c 53 20 73 65 72 76 65   is an TLS serve
1aa0: 72 2c 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20  r, checking the 
1ab0: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20  certificate for 
1ac0: 74 68 65 20 70 65 65 72 22 29 3b 0a 0a 09 65 72  the peer");...er
1ad0: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  r = SSL_get_veri
1ae0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50  fy_result(stateP
1af0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 69 66 20 28 65  tr->ssl);..if (e
1b00: 72 72 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29  rr != X509_V_OK)
1b10: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
1b20: 22 49 6e 76 61 6c 69 64 20 63 65 72 74 69 66 69  "Invalid certifi
1b30: 63 61 74 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  cate, returning 
1b40: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
1b50: 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74      Tls_Error(st
1b60: 61 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29  atePtr, (char *)
1b70: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
1b80: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72  _error_string(er
1b90: 72 29 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50  r));..    stateP
1ba0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
1bb0: 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46  _TCL_HANDSHAKE_F
1bc0: 41 49 4c 45 44 3b 0a 09 20 20 20 20 2a 65 72 72  AILED;..    *err
1bd0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e  orCodePtr = ECON
1be0: 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 72  NABORTED;..    r
1bf0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 20 20  eturn(-1);..}.  
1c00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1c10: 64 70 72 69 6e 74 66 28 22 52 65 6d 6f 76 69 6e  dprintf("Removin
1c20: 67 20 74 68 65 20 5c 22 54 4c 53 5f 54 43 4c 5f  g the \"TLS_TCL_
1c30: 49 4e 49 54 5c 22 20 66 6c 61 67 20 73 69 6e 63  INIT\" flag sinc
1c40: 65 20 77 65 20 68 61 76 65 20 63 6f 6d 70 6c 65  e we have comple
1c50: 74 65 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b  ted the handshak
1c60: 65 22 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  e");.    statePt
1c70: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 4c 53  r->flags &= ~TLS
1c80: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20 20 20 20  _TCL_INIT;..    
1c90: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
1ca0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b  ng in success");
1cb0: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1cc0: 74 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  tr = 0;.    retu
1cd0: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  rn(0);.}../*. *-
1ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d20: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 49 6e 70 75  --. *. * TlsInpu
1d30: 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20  tProc --. *. *  
1d40: 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65    This procedure
1d50: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74   is invoked by t
1d60: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65  he generic IO le
1d70: 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20  vel. *       to 
1d80: 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  read input from 
1d90: 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
1da0: 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  ed channel.. *. 
1db0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20  * Results:. *   
1dc0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
1dd0: 79 74 65 73 20 72 65 61 64 20 69 73 20 72 65 74  ytes read is ret
1de0: 75 72 6e 65 64 20 6f 72 20 2d 31 20 6f 6e 20 65  urned or -1 on e
1df0: 72 72 6f 72 2e 20 41 6e 20 6f 75 74 70 75 74 0a  rror. An output.
1e00: 20 2a 20 20 20 20 61 72 67 75 6d 65 6e 74 20 63   *    argument c
1e10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 4f 53 49  ontains the POSI
1e20: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  X error code on 
1e30: 65 72 72 6f 72 2c 20 6f 72 20 7a 65 72 6f 20 69  error, or zero i
1e40: 66 20 6e 6f 0a 20 2a 20 20 20 20 65 72 72 6f 72  f no. *    error
1e50: 20 6f 63 63 75 72 72 65 64 2e 0a 20 2a 0a 20 2a   occurred.. *. *
1e60: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
1e70: 2a 20 20 20 20 52 65 61 64 73 20 69 6e 70 75 74  *    Reads input
1e80: 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
1e90: 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68  device of the ch
1ea0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1ef0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
1f00: 6c 73 49 6e 70 75 74 50 72 6f 63 28 43 6c 69 65  lsInputProc(Clie
1f10: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1f20: 61 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 20  ata, char *buf, 
1f30: 69 6e 74 20 62 75 66 53 69 7a 65 2c 20 69 6e 74  int bufSize, int
1f40: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20   *errorCodePtr) 
1f50: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  {.    unsigned l
1f60: 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  ong backingError
1f70: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  ;.    State *sta
1f80: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
1f90: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
1fa0: 20 20 20 20 69 6e 74 20 62 79 74 65 73 52 65 61      int bytesRea
1fb0: 64 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 43 6f  d;.    int tlsCo
1fc0: 6e 6e 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 65  nnect;.    int e
1fd0: 72 72 3b 0a 0a 20 20 20 20 2a 65 72 72 6f 72 43  rr;..    *errorC
1fe0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  odePtr = 0;..   
1ff0: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65   dprintf("BIO_re
2000: 61 64 28 25 64 29 22 2c 20 62 75 66 53 69 7a 65  ad(%d)", bufSize
2010: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
2020: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c  ePtr->flags & TL
2030: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20  S_TCL_CALLBACK) 
2040: 7b 0a 09 2f 2a 20 64 6f 6e 27 74 20 70 72 6f 63  {../* don't proc
2050: 65 73 73 20 61 6e 79 20 62 79 74 65 73 20 77 68  ess any bytes wh
2060: 69 6c 65 20 76 65 72 69 66 79 20 63 61 6c 6c 62  ile verify callb
2070: 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 20 2a  ack is running *
2080: 2f 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c  /..dprintf("Call
2090: 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2c  back is running,
20a0: 20 72 65 61 64 69 6e 67 20 30 20 62 79 74 65 73   reading 0 bytes
20b0: 22 29 3b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ");..return(0);.
20c0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
20d0: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f  tf("Calling Tls_
20e0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29  WaitForConnect")
20f0: 3b 0a 20 20 20 20 74 6c 73 43 6f 6e 6e 65 63 74  ;.    tlsConnect
2100: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f   = Tls_WaitForCo
2110: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20  nnect(statePtr, 
2120: 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 30 29  errorCodePtr, 0)
2130: 3b 0a 20 20 20 20 69 66 20 28 74 6c 73 43 6f 6e  ;.    if (tlsCon
2140: 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09 64 70 72  nect < 0) {..dpr
2150: 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72  intf("Got an err
2160: 6f 72 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f  or waiting to co
2170: 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63  nnect (tlsConnec
2180: 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f  t = %i, *errorCo
2190: 64 65 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c  dePtr = %i)", tl
21a0: 73 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72  sConnect, *error
21b0: 43 6f 64 65 50 74 72 29 3b 0a 0a 09 62 79 74 65  CodePtr);...byte
21c0: 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 69 66 20  sRead = -1;..if 
21d0: 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  (*errorCodePtr =
21e0: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a  = ECONNRESET) {.
21f0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
2200: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 73  t connection res
2210: 65 74 22 29 3b 0a 09 20 20 20 20 2f 2a 20 53 6f  et");..    /* So
2220: 66 74 20 45 4f 46 20 2a 2f 0a 09 20 20 20 20 2a  ft EOF */..    *
2230: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
2240: 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64  ;..    bytesRead
2250: 20 3d 20 30 3b 0a 09 7d 0a 09 72 65 74 75 72 6e   = 0;..}..return
2260: 28 62 79 74 65 73 52 65 61 64 29 3b 0a 20 20 20  (bytesRead);.   
2270: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
2280: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65  * We need to cle
2290: 61 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72  ar the SSL error
22a0: 20 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75   stack now becau
22b0: 73 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20  se we sometimes 
22c0: 72 65 61 63 68 0a 20 20 20 20 20 2a 20 74 68 69  reach.     * thi
22d0: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
22e0: 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20  leftover errors 
22f0: 69 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49  in the stack.  I
2300: 66 20 42 49 4f 5f 72 65 61 64 0a 20 20 20 20 20  f BIO_read.     
2310: 2a 20 72 65 74 75 72 6e 73 20 2d 31 20 61 6e 64  * returns -1 and
2320: 20 69 6e 74 65 6e 64 73 20 45 41 47 41 49 4e 2c   intends EAGAIN,
2330: 20 74 68 65 72 65 20 69 73 20 61 20 6c 65 66 74   there is a left
2340: 6f 76 65 72 20 65 72 72 6f 72 2c 20 69 74 20 77  over error, it w
2350: 69 6c 6c 20 62 65 0a 20 20 20 20 20 2a 20 6d 69  ill be.     * mi
2360: 73 63 6f 6e 73 74 72 75 65 64 20 61 73 20 61 6e  sconstrued as an
2370: 20 65 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41   error, not EAGA
2380: 49 4e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  IN..     *.     
2390: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
23a0: 20 77 65 20 6d 61 79 20 77 61 6e 74 20 74 6f 20   we may want to 
23b0: 68 61 6e 64 6c 65 20 74 68 65 20 3c 30 20 72 65  handle the <0 re
23c0: 74 75 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a  turn codes from.
23d0: 20 20 20 20 20 2a 20 42 49 4f 5f 72 65 61 64 20       * BIO_read 
23e0: 73 70 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64  specially (as ad
23f0: 76 69 73 65 64 20 69 6e 20 74 68 65 20 52 53 41  vised in the RSA
2400: 20 64 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c   docs).  TLS's l
2410: 6f 77 65 72 20 6c 65 76 65 6c 20 42 49 4f 0a 20  ower level BIO. 
2420: 20 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20      * functions 
2430: 70 6c 61 79 20 77 69 74 68 20 74 68 65 20 72 65  play with the re
2440: 74 72 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68  try flags though
2450: 2c 20 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73  , and this seems
2460: 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 2a 20   to work.     * 
2470: 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69  correctly.  Simi
2480: 6c 61 72 20 66 69 78 20 69 6e 20 54 6c 73 4f 75  lar fix in TlsOu
2490: 74 70 75 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62  tputProc. - hobb
24a0: 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 45 52  s.     */.    ER
24b0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
24c0: 0a 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
24d0: 20 42 49 4f 5f 72 65 61 64 28 73 74 61 74 65 50   BIO_read(stateP
24e0: 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 62 75  tr->bio, buf, bu
24f0: 66 53 69 7a 65 29 3b 0a 20 20 20 20 64 70 72 69  fSize);.    dpri
2500: 6e 74 66 28 22 42 49 4f 5f 72 65 61 64 20 2d 3e  ntf("BIO_read ->
2510: 20 25 64 22 2c 20 62 79 74 65 73 52 65 61 64 29   %d", bytesRead)
2520: 3b 0a 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c  ;..    err = SSL
2530: 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65  _get_error(state
2540: 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52  Ptr->ssl, bytesR
2550: 65 61 64 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20  ead);..#if 0.   
2560: 20 69 66 20 28 62 79 74 65 73 52 65 61 64 20 3c   if (bytesRead <
2570: 3d 20 30 29 20 7b 0a 09 69 66 20 28 42 49 4f 5f  = 0) {..if (BIO_
2580: 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61  should_retry(sta
2590: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09  tePtr->bio)) {..
25a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 49 2f 4f      dprintf("I/O
25b0: 20 66 61 69 6c 65 64 2c 20 77 69 6c 6c 20 72 65   failed, will re
25c0: 74 72 79 20 62 61 73 65 64 20 6f 6e 20 45 41 47  try based on EAG
25d0: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  AIN");..    *err
25e0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
25f0: 49 4e 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e  IN;..}.    }.#en
2600: 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20  dif..    switch 
2610: 28 65 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53  (err) {..case SS
2620: 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20  L_ERROR_NONE:.. 
2630: 20 20 20 64 70 72 69 6e 74 42 75 66 66 65 72 28     dprintBuffer(
2640: 62 75 66 2c 20 62 79 74 65 73 52 65 61 64 29 3b  buf, bytesRead);
2650: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
2660: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53  ase SSL_ERROR_SS
2670: 4c 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  L:..    dprintf(
2680: 22 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e  "SSL negotiation
2690: 20 65 72 72 6f 72 2c 20 69 6e 64 69 63 61 74 69   error, indicati
26a0: 6e 67 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e  ng that the conn
26b0: 65 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  ection has been 
26c0: 61 62 6f 72 74 65 64 22 29 3b 0a 0a 09 20 20 20  aborted");...   
26d0: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65   Tls_Error(state
26e0: 50 74 72 2c 20 54 43 4c 54 4c 53 5f 53 53 4c 5f  Ptr, TCLTLS_SSL_
26f0: 45 52 52 4f 52 28 73 74 61 74 65 50 74 72 2d 3e  ERROR(statePtr->
2700: 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 29 29  ssl, bytesRead))
2710: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
2720: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
2730: 54 45 44 3b 0a 09 20 20 20 20 62 79 74 65 73 52  TED;..    bytesR
2740: 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 62  ead = -1;..    b
2750: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c  reak;...case SSL
2760: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a  _ERROR_SYSCALL:.
2770: 09 20 20 20 20 62 61 63 6b 69 6e 67 45 72 72 6f  .    backingErro
2780: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f  r = ERR_get_erro
2790: 72 28 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 62  r();...    if (b
27a0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30  ackingError == 0
27b0: 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d   && bytesRead ==
27c0: 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28   0) {...dprintf(
27d0: 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09  "EOF reached")..
27e0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
27f0: 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20   0;...bytesRead 
2800: 3d 20 30 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  = 0;..    } else
2810: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f   if (backingErro
2820: 72 20 3d 3d 20 30 20 26 26 20 62 79 74 65 73 52  r == 0 && bytesR
2830: 65 61 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64  ead == -1) {...d
2840: 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f  printf("I/O erro
2850: 72 20 6f 63 63 75 72 72 65 64 20 28 65 72 72 6e  r occurred (errn
2860: 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  o = %lu)", (unsi
2870: 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47  gned long) Tcl_G
2880: 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65  etErrno());...*e
2890: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63  rrorCodePtr = Tc
28a0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09  l_GetErrno();...
28b0: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a  bytesRead = -1;.
28c0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
28d0: 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72  dprintf("I/O err
28e0: 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 61 63  or occurred (bac
28f0: 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29  kingError = %lu)
2900: 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29  ", backingError)
2910: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ;...*errorCodePt
2920: 72 20 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  r = backingError
2930: 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20  ;...bytesRead = 
2940: 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  -1;..    }..    
2950: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
2960: 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54  L_ERROR_ZERO_RET
2970: 55 52 4e 3a 0a 09 20 20 20 20 64 70 72 69 6e 74  URN:..    dprint
2980: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52  f("Got SSL_ERROR
2990: 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74 68  _ZERO_RETURN, th
29a0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46 20  is means an EOF 
29b0: 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64  has been reached
29c0: 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65  ");..    bytesRe
29d0: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72  ad = 0;..    *er
29e0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
29f0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
2a00: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  se SSL_ERROR_WAN
2a10: 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 64 70 72  T_READ:..    dpr
2a20: 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52  intf("Got SSL_ER
2a30: 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 2c 20 6d  ROR_WANT_READ, m
2a40: 61 70 70 69 6e 67 20 74 68 69 73 20 74 6f 20 45  apping this to E
2a50: 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 62 79  AGAIN");..    by
2a60: 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20  tesRead = -1;.. 
2a70: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
2a80: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20   = EAGAIN;..    
2a90: 62 72 65 61 6b 3b 0a 0a 09 64 65 66 61 75 6c 74  break;...default
2aa0: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  :..    dprintf("
2ab0: 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 28 65  Unknown error (e
2ac0: 72 72 20 3d 20 25 69 29 2c 20 6d 61 70 70 69 6e  rr = %i), mappin
2ad0: 67 20 74 6f 20 45 4f 46 22 2c 20 65 72 72 29 3b  g to EOF", err);
2ae0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
2af0: 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 79  Ptr = 0;..    by
2b00: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20  tesRead = 0;..  
2b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
2b20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 49 6e 70      dprintf("Inp
2b30: 75 74 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 64  ut(%d) -> %d [%d
2b40: 5d 22 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 74  ]", bufSize, byt
2b50: 65 73 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 6f  esRead, *errorCo
2b60: 64 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  dePtr);.    retu
2b70: 72 6e 28 62 79 74 65 73 52 65 61 64 29 3b 0a 7d  rn(bytesRead);.}
2b80: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
2bd0: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 2d   TlsOutputProc -
2be0: 2d 0a 20 2a 0a 20 2a 20 20 20 20 54 68 69 73 20  -. *. *    This 
2bf0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
2c00: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  oked by the gene
2c10: 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20  ric IO level. * 
2c20: 20 20 20 20 20 20 74 6f 20 77 72 69 74 65 20 6f        to write o
2c30: 75 74 70 75 74 20 74 6f 20 61 20 53 53 4c 20 73  utput to a SSL s
2c40: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
2c50: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  nel.. *. * Resul
2c60: 74 73 3a 0a 20 2a 20 20 20 20 54 68 65 20 6e 75  ts:. *    The nu
2c70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
2c80: 69 74 74 65 6e 20 69 73 20 72 65 74 75 72 6e 65  itten is returne
2c90: 64 2e 20 41 6e 20 6f 75 74 70 75 74 20 61 72 67  d. An output arg
2ca0: 75 6d 65 6e 74 20 69 73 0a 20 2a 20 20 20 20 73  ument is. *    s
2cb0: 65 74 20 74 6f 20 61 20 50 4f 53 49 58 20 65 72  et to a POSIX er
2cc0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
2cd0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 6f  rror occurred, o
2ce0: 72 20 7a 65 72 6f 2e 0a 20 2a 0a 20 2a 20 53 69  r zero.. *. * Si
2cf0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20  de effects:. *  
2d00: 20 20 57 72 69 74 65 73 20 6f 75 74 70 75 74 20    Writes output 
2d10: 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 65  on the output de
2d20: 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e  vice of the chan
2d30: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2d80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73  /.static int Tls
2d90: 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e  OutputProc(Clien
2da0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
2db0: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta, const char *
2dc0: 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65  buf, int toWrite
2dd0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
2de0: 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 67  Ptr) {.    unsig
2df0: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67  ned long backing
2e00: 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65  Error;.    State
2e10: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
2e20: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
2e30: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 72 69  ata;.    int wri
2e40: 74 74 65 6e 2c 20 65 72 72 3b 0a 20 20 20 20 69  tten, err;.    i
2e50: 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a  nt tlsConnect;..
2e60: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2e70: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  r = 0;..    dpri
2e80: 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25  ntf("BIO_write(%
2e90: 70 2c 20 25 64 29 22 2c 20 28 76 6f 69 64 20 2a  p, %d)", (void *
2ea0: 29 20 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72  ) statePtr, toWr
2eb0: 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ite);.    dprint
2ec0: 42 75 66 66 65 72 28 62 75 66 2c 20 74 6f 57 72  Buffer(buf, toWr
2ed0: 69 74 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ite);..    if (s
2ee0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
2ef0: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43   TLS_TCL_CALLBAC
2f00: 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 44  K) {..dprintf("D
2f10: 6f 6e 27 74 20 70 72 6f 63 65 73 73 20 6f 75 74  on't process out
2f20: 70 75 74 20 77 68 69 6c 65 20 63 61 6c 6c 62 61  put while callba
2f30: 63 6b 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 22  cks are running"
2f40: 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31  );..written = -1
2f50: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ;..*errorCodePtr
2f60: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 72 65 74 75   = EAGAIN;..retu
2f70: 72 6e 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  rn(-1);.    }.. 
2f80: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
2f90: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  ing Tls_WaitForC
2fa0: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c  onnect");.    tl
2fb0: 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57  sConnect = Tls_W
2fc0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
2fd0: 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64  atePtr, errorCod
2fe0: 65 50 74 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  ePtr, 1);.    if
2ff0: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30   (tlsConnect < 0
3000: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f  ) {..dprintf("Go
3010: 74 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69  t an error waiti
3020: 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74  ng to connect (t
3030: 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20  lsConnect = %i, 
3040: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3050: 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74  %i)", tlsConnect
3060: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  , *errorCodePtr)
3070: 3b 0a 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31  ;...written = -1
3080: 3b 0a 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64  ;..if (*errorCod
3090: 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53  ePtr == ECONNRES
30a0: 45 54 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  ET) {..    dprin
30b0: 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69  tf("Got connecti
30c0: 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20  on reset");..   
30d0: 20 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a   /* Soft EOF */.
30e0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
30f0: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 77 72 69  tr = 0;..    wri
3100: 74 74 65 6e 20 3d 20 30 3b 0a 09 7d 0a 09 72 65  tten = 0;..}..re
3110: 74 75 72 6e 28 77 72 69 74 74 65 6e 29 3b 0a 20  turn(written);. 
3120: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f     }..    if (to
3130: 57 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64  Write == 0) {..d
3140: 70 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69  printf("zero-wri
3150: 74 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f  te");..err = BIO
3160: 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d  _flush(statePtr-
3170: 3e 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72  >bio);...if (err
3180: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70   <= 0) {..    dp
3190: 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20  rintf("Flushing 
31a0: 66 61 69 6c 65 64 22 29 3b 0a 0a 09 20 20 20 20  failed");...    
31b0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
31c0: 45 49 4f 3b 0a 09 20 20 20 20 77 72 69 74 74 65  EIO;..    writte
31d0: 6e 20 3d 20 30 3b 0a 09 20 20 20 20 72 65 74 75  n = 0;..    retu
31e0: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 77 72 69  rn(-1);..}...wri
31f0: 74 74 65 6e 20 3d 20 30 3b 0a 09 2a 65 72 72 6f  tten = 0;..*erro
3200: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 72  rCodePtr = 0;..r
3210: 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a  eturn(0);.    }.
3220: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
3230: 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20  e need to clear 
3240: 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74  the SSL error st
3250: 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20  ack now because 
3260: 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61  we sometimes rea
3270: 63 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66  ch.     * this f
3280: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66  unction with lef
3290: 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20  tover errors in 
32a0: 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42  the stack.  If B
32b0: 49 4f 5f 77 72 69 74 65 0a 20 20 20 20 20 2a 20  IO_write.     * 
32c0: 72 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69  returns -1 and i
32d0: 6e 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74  ntends EAGAIN, t
32e0: 68 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76  here is a leftov
32f0: 65 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c  er error, it wil
3300: 6c 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63  l be.     * misc
3310: 6f 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 65  onstrued as an e
3320: 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e  rror, not EAGAIN
3330: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
3340: 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77  Alternatively, w
3350: 65 20 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61  e may want to ha
3360: 6e 64 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75  ndle the <0 retu
3370: 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20  rn codes from.  
3380: 20 20 20 2a 20 42 49 4f 5f 77 72 69 74 65 20 73     * BIO_write s
3390: 70 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76  pecially (as adv
33a0: 69 73 65 64 20 69 6e 20 74 68 65 20 52 53 41 20  ised in the RSA 
33b0: 64 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f  docs).  TLS's lo
33c0: 77 65 72 20 6c 65 76 65 6c 0a 20 20 20 20 20 2a  wer level.     *
33d0: 20 42 49 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70   BIO functions p
33e0: 6c 61 79 20 77 69 74 68 20 74 68 65 20 72 65 74  lay with the ret
33f0: 72 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c  ry flags though,
3400: 20 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20   and this seems 
3410: 74 6f 0a 20 20 20 20 20 2a 20 77 6f 72 6b 20 63  to.     * work c
3420: 6f 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c  orrectly.  Simil
3430: 61 72 20 66 69 78 20 69 6e 20 54 6c 73 49 6e 70  ar fix in TlsInp
3440: 75 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a  utProc. - hobbs.
3450: 20 20 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f       */.    ERR_
3460: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20  clear_error();. 
3470: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 42 49 4f     written = BIO
3480: 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d  _write(statePtr-
3490: 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69  >bio, buf, toWri
34a0: 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66  te);.    dprintf
34b0: 28 22 42 49 4f 5f 77 72 69 74 65 28 25 70 2c 20  ("BIO_write(%p, 
34c0: 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28 76  %d) -> [%d]", (v
34d0: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 2c  oid *) statePtr,
34e0: 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65   toWrite, writte
34f0: 6e 29 3b 0a 0a 20 20 20 20 65 72 72 20 3d 20 53  n);..    err = S
3500: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61  SL_get_error(sta
3510: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74  tePtr->ssl, writ
3520: 74 65 6e 29 3b 0a 20 20 20 20 73 77 69 74 63 68  ten);.    switch
3530: 20 28 65 72 72 29 20 7b 0a 09 63 61 73 65 20 53   (err) {..case S
3540: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09  SL_ERROR_NONE:..
3550: 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e 20      if (written 
3560: 3c 20 30 29 20 7b 0a 09 09 77 72 69 74 74 65 6e  < 0) {...written
3570: 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20   = 0;..    }..  
3580: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
3590: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57  SSL_ERROR_WANT_W
35a0: 52 49 54 45 3a 0a 09 20 20 20 20 64 70 72 69 6e  RITE:..    dprin
35b0: 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f  tf("Got SSL_ERRO
35c0: 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d 61  R_WANT_WRITE, ma
35d0: 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41  pping it to EAGA
35e0: 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  IN");..    *erro
35f0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
3600: 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  N;..    written 
3610: 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b  = -1;..    break
3620: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
3630: 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20  OR_WANT_READ:.. 
3640: 20 20 20 64 70 72 69 6e 74 66 28 22 20 77 72 69     dprintf(" wri
3650: 74 65 20 52 20 42 4c 4f 43 4b 22 29 3b 0a 09 20  te R BLOCK");.. 
3660: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
3670: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
3680: 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20  X509_LOOKUP:..  
3690: 20 20 64 70 72 69 6e 74 66 28 22 20 77 72 69 74    dprintf(" writ
36a0: 65 20 58 20 42 4c 4f 43 4b 22 29 3b 0a 09 20 20  e X BLOCK");..  
36b0: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
36c0: 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52  SSL_ERROR_ZERO_R
36d0: 45 54 55 52 4e 3a 0a 09 20 20 20 20 64 70 72 69  ETURN:..    dpri
36e0: 6e 74 66 28 22 20 63 6c 6f 73 65 64 22 29 3b 0a  ntf(" closed");.
36f0: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30  .    written = 0
3700: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
3710: 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62  ePtr = 0;..    b
3720: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c  reak;...case SSL
3730: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a  _ERROR_SYSCALL:.
3740: 09 20 20 20 20 62 61 63 6b 69 6e 67 45 72 72 6f  .    backingErro
3750: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f  r = ERR_get_erro
3760: 72 28 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 62  r();...    if (b
3770: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30  ackingError == 0
3780: 20 26 26 20 77 72 69 74 74 65 6e 20 3d 3d 20 30   && written == 0
3790: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 45  ) {...dprintf("E
37a0: 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a  OF reached")...*
37b0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
37c0: 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 30 3b  ;...written = 0;
37d0: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
37e0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d  (backingError ==
37f0: 20 30 20 26 26 20 77 72 69 74 74 65 6e 20 3d 3d   0 && written ==
3800: 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66   -1) {...dprintf
3810: 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  ("I/O error occu
3820: 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c  rred (errno = %l
3830: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
3840: 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 72 6e  ong) Tcl_GetErrn
3850: 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f  o());...*errorCo
3860: 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45  dePtr = Tcl_GetE
3870: 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69 74 74 65  rrno();...writte
3880: 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 20 65  n = -1;..    } e
3890: 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28  lse {...dprintf(
38a0: 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  "I/O error occur
38b0: 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f  red (backingErro
38c0: 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69  r = %lu)", backi
38d0: 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72  ngError);...*err
38e0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 62 61 63 6b  orCodePtr = back
38f0: 69 6e 67 45 72 72 6f 72 3b 0a 09 09 77 72 69 74  ingError;...writ
3900: 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 7d  ten = -1;..    }
3910: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
3920: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53  ase SSL_ERROR_SS
3930: 4c 3a 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  L:..    Tls_Erro
3940: 72 28 73 74 61 74 65 50 74 72 2c 20 54 43 4c 54  r(statePtr, TCLT
3950: 4c 53 5f 53 53 4c 5f 45 52 52 4f 52 28 73 74 61  LS_SSL_ERROR(sta
3960: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74  tePtr->ssl, writ
3970: 74 65 6e 29 29 3b 0a 09 20 20 20 20 2a 65 72 72  ten));..    *err
3980: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e  orCodePtr = ECON
3990: 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 77  NABORTED;..    w
39a0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20  ritten = -1;..  
39b0: 20 20 62 72 65 61 6b 3b 0a 0a 09 64 65 66 61 75    break;...defau
39c0: 6c 74 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66  lt:..    dprintf
39d0: 28 22 20 75 6e 6b 6e 6f 77 6e 20 65 72 72 3a 20  (" unknown err: 
39e0: 25 64 22 2c 20 65 72 72 29 3b 0a 09 20 20 20 20  %d", err);..    
39f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3a00: 20 20 64 70 72 69 6e 74 66 28 22 4f 75 74 70 75    dprintf("Outpu
3a10: 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f  t(%d) -> %d", to
3a20: 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 3b  Write, written);
3a30: 0a 20 20 20 20 72 65 74 75 72 6e 28 77 72 69 74  .    return(writ
3a40: 74 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ten);.}../*. *--
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 74 4f 70  -. *. * TlsSetOp
3aa0: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tionProc --. *. 
3ab0: 2a 20 20 20 20 43 6f 6d 70 75 74 65 73 20 61 6e  *    Computes an
3ac0: 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f   option value fo
3ad0: 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  r a SSL socket b
3ae0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72  ased channel, or
3af0: 20 61 0a 20 2a 20 20 20 20 6c 69 73 74 20 6f 66   a. *    list of
3b00: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64   all options and
3b10: 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e 0a 20   their values.. 
3b20: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
3b30: 20 20 20 20 41 20 73 74 61 6e 64 61 72 64 20 54      A standard T
3b40: 63 6c 20 72 65 73 75 6c 74 2e 20 54 68 65 20 76  cl result. The v
3b50: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 70 65 63  alue of the spec
3b60: 69 66 69 65 64 20 6f 70 74 69 6f 6e 20 6f 72 20  ified option or 
3b70: 61 0a 20 2a 20 20 20 20 6c 69 73 74 20 6f 66 20  a. *    list of 
3b80: 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20  all options and 
3b90: 20 20 20 74 68 65 69 72 20 76 61 6c 75 65 73 20     their values 
3ba0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74  is returned in t
3bb0: 68 65 0a 20 2a 20 20 20 20 73 75 70 70 6c 69 65  he. *    supplie
3bc0: 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a  d DString.. *. *
3bd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
3be0: 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  *    None.. *. *
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c30: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
3c40: 6e 74 0a 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50  nt.TlsSetOptionP
3c50: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
3c60: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20  nstanceData,    
3c70: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e  /* Socket state.
3c80: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65   */.    Tcl_Inte
3c90: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
3ca0: 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e  For errors - can
3cb0: 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20   be NULL. */.   
3cc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74   const char *opt
3cd0: 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65  ionName,./* Name
3ce0: 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74   of the option t
3cf0: 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
3d00: 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e  for, or..... * N
3d10: 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f  ULL to get all o
3d20: 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72  ptions and their
3d30: 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20   values. */.    
3d40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69  const char *opti
3d50: 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61 6c 75  onValue)./* Valu
3d60: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20 2a 2f  e for option. */
3d70: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
3d80: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
3d90: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
3da0: 0a 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ..    Tcl_Channe
3db0: 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c 73  l downChan = Tls
3dc0: 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65  _GetParent(state
3dd0: 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53  Ptr, TLS_TCL_FAS
3de0: 54 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f  TPATH);.    Tcl_
3df0: 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e 50  DriverSetOptionP
3e00: 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72  roc *setOptionPr
3e10: 6f 63 3b 0a 0a 20 20 20 20 73 65 74 4f 70 74 69  oc;..    setOpti
3e20: 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  onProc = Tcl_Cha
3e30: 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f  nnelSetOptionPro
3e40: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  c(Tcl_GetChannel
3e50: 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b  Type(downChan));
3e60: 0a 20 20 20 20 69 66 20 28 73 65 74 4f 70 74 69  .    if (setOpti
3e70: 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20  onProc != NULL) 
3e80: 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f  {..return (*setO
3e90: 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47  ptionProc)(Tcl_G
3ea0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
3eb0: 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c  eData(downChan),
3ec0: 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e   interp, optionN
3ed0: 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65  ame, optionValue
3ee0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
3ef0: 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20   (optionName == 
3f00: 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a  (char*) NULL) {.
3f10: 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73 74 20  ./*.. * Request 
3f20: 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c  is query for all
3f30: 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69   options, this i
3f40: 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65 74 75  s ok... */..retu
3f50: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
3f60: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52  .    /*.     * R
3f70: 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65  equest for a spe
3f80: 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73  cific option has
3f90: 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e   to fail, we don
3fa0: 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 20  't have any..   
3fb0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
3fc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
3fd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
4020: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d  GetOptionProc --
4030: 0a 20 2a 0a 20 2a 20 20 20 20 43 6f 6d 70 75 74  . *. *    Comput
4040: 65 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61 6c  es an option val
4050: 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63  ue for a SSL soc
4060: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
4070: 6c 2c 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69  l, or a. *    li
4080: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e  st of all option
4090: 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75  s and their valu
40a0: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  es.. *. * Result
40b0: 73 3a 0a 20 2a 20 20 20 20 41 20 73 74 61 6e 64  s:. *    A stand
40c0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20  ard Tcl result. 
40d0: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
40e0: 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 69 6f   specified optio
40f0: 6e 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69 73  n or a. *    lis
4100: 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73  t of all options
4110: 20 61 6e 64 20 20 20 20 74 68 65 69 72 20 76 61   and    their va
4120: 6c 75 65 73 20 69 73 20 72 65 74 75 72 6e 65 64  lues is returned
4130: 20 69 6e 20 74 68 65 0a 20 2a 20 20 20 20 73 75   in the. *    su
4140: 70 70 6c 69 65 64 20 44 53 74 72 69 6e 67 2e 0a  pplied DString..
4150: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
4160: 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a  ts:. *    None..
4170: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
41c0: 74 69 63 20 69 6e 74 0a 54 6c 73 47 65 74 4f 70  tic int.TlsGetOp
41d0: 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44  tionProc(ClientD
41e0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
41f0: 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73  ,    /* Socket s
4200: 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  tate. */.    Tcl
4210: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4220: 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20  ../* For errors 
4230: 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a  - can be NULL. *
4240: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
4250: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a   *optionName,./*
4260: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74   Name of the opt
4270: 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
4280: 74 68 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f  the value for, o
4290: 72 0a 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f  r..... * NULL to
42a0: 20 67 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73   get all options
42b0: 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65   and their value
42c0: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  s. */.    Tcl_DS
42d0: 74 72 69 6e 67 20 2a 64 73 50 74 72 29 09 09 2f  tring *dsPtr)../
42e0: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65  * Where to store
42f0: 20 74 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61   the computed va
4300: 6c 75 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  lue initialized 
4310: 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a  by caller. */.{.
4320: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
4330: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
4340: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20  instanceData;.. 
4350: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 64     Tcl_Channel d
4360: 6f 77 6e 43 68 61 6e 20 3d 20 54 6c 73 5f 47 65  ownChan = Tls_Ge
4370: 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72  tParent(statePtr
4380: 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41  , TLS_TCL_FASTPA
4390: 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69  TH);.    Tcl_Dri
43a0: 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  verGetOptionProc
43b0: 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b   *getOptionProc;
43c0: 0a 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50  ..    getOptionP
43d0: 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65  roc = Tcl_Channe
43e0: 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54  lGetOptionProc(T
43f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
4400: 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b 0a 20 20  e(downChan));.  
4410: 20 20 69 66 20 28 67 65 74 4f 70 74 69 6f 6e 50    if (getOptionP
4420: 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  roc != NULL) {..
4430: 72 65 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 69  return (*getOpti
4440: 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43  onProc)(Tcl_GetC
4450: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
4460: 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 69 6e  ta(downChan), in
4470: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65  terp, optionName
4480: 2c 20 64 73 50 74 72 29 3b 0a 20 20 20 20 7d 20  , dsPtr);.    } 
4490: 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e  else if (optionN
44a0: 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e  ame == (char*) N
44b0: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52  ULL) {../*.. * R
44c0: 65 71 75 65 73 74 20 69 73 20 71 75 65 72 79 20  equest is query 
44d0: 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c  for all options,
44e0: 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a   this is ok... *
44f0: 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  /..return TCL_OK
4500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20  ;.    }.    /*. 
4510: 20 20 20 20 2a 20 52 65 71 75 65 73 74 20 66 6f      * Request fo
4520: 72 20 61 20 73 70 65 63 69 66 69 63 20 6f 70 74  r a specific opt
4530: 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 69 6c 2c  ion has to fail,
4540: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 61   we don't have a
4550: 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ny..     */.    
4560: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4570: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
4580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
45c0: 0a 20 2a 20 54 6c 73 57 61 74 63 68 50 72 6f 63  . * TlsWatchProc
45d0: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 49 6e 69   --. *. *    Ini
45e0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69  tialize the noti
45f0: 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 54 63  fier to watch Tc
4600: 6c 5f 46 69 6c 65 73 20 66 72 6f 6d 20 74 68 69  l_Files from thi
4610: 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  s channel.. *. *
4620: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20   Results:. *    
4630: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  None.. *. * Side
4640: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20   effects:. *    
4650: 53 65 74 73 20 75 70 20 74 68 65 20 6e 6f 74 69  Sets up the noti
4660: 66 69 65 72 20 73 6f 20 74 68 61 74 20 61 20 66  fier so that a f
4670: 75 74 75 72 65 20 65 76 65 6e 74 20 6f 6e 20 74  uture event on t
4680: 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 20 20 20  he channel. *   
4690: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79   will be seen by
46a0: 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d   Tcl.. *. *-----
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
46f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54  */.static void.T
4700: 6c 73 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65  lsWatchProc(Clie
4710: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
4720: 61 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 20 73  ata,    /* The s
4730: 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a  ocket state. */.
4740: 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 2f      int mask)../
4750: 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65  * Events of inte
4760: 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 20 63  rest; an OR-ed c
4770: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 09 09  ombination of...
4780: 09 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c  .* TCL_READABLE,
4790: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e   TCL_WRITABLE an
47a0: 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 2e  d TCL_EXCEPTION.
47b0: 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68   */.{.    Tcl_Ch
47c0: 61 6e 6e 65 6c 20 20 20 20 20 64 6f 77 6e 43 68  annel     downCh
47d0: 61 6e 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  an;.    State *s
47e0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
47f0: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
4800: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
4810: 54 6c 73 57 61 74 63 68 50 72 6f 63 28 30 78 25  TlsWatchProc(0x%
4820: 78 29 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20  x)", mask);..   
4830: 20 2f 2a 20 50 72 65 74 65 6e 64 20 74 6f 20 62   /* Pretend to b
4840: 65 20 64 65 61 64 20 61 73 20 6c 6f 6e 67 20 61  e dead as long a
4850: 73 20 74 68 65 20 76 65 72 69 66 79 20 63 61 6c  s the verify cal
4860: 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67  lback is running
4870: 2e 0a 20 20 20 20 20 2a 20 4f 74 68 65 72 77 69  ..     * Otherwi
4880: 73 65 20 74 68 61 74 20 63 61 6c 6c 62 61 63 6b  se that callback
4890: 20 63 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65   could be invoke
48a0: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 2a  d recursively. *
48b0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
48c0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
48d0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a  TCL_CALLBACK) {.
48e0: 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61  .dprintf("Callba
48f0: 63 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20  ck is on-going, 
4900: 64 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 22 29 3b  doing nothing");
4910: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
4920: 0a 20 20 20 20 64 70 72 69 6e 74 46 6c 61 67 73  .    dprintFlags
4930: 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  (statePtr);..   
4940: 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c 73 5f   downChan = Tls_
4950: 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50  GetParent(stateP
4960: 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54  tr, TLS_TCL_FAST
4970: 50 41 54 48 29 3b 0a 0a 20 20 20 20 69 66 20 28  PATH);..    if (
4980: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
4990: 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48  & TLS_TCL_HANDSH
49a0: 41 4b 45 5f 46 41 49 4c 45 44 29 20 7b 0a 09 64  AKE_FAILED) {..d
49b0: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
49c0: 20 77 61 74 63 68 20 61 20 73 6f 63 6b 65 74 20   watch a socket 
49d0: 77 69 74 68 20 61 20 66 61 69 6c 65 64 20 68 61  with a failed ha
49e0: 6e 64 73 68 61 6b 65 20 2d 2d 20 6e 6f 74 68 69  ndshake -- nothi
49f0: 6e 67 20 63 61 6e 20 68 61 70 70 65 6e 20 68 65  ng can happen he
4a00: 72 65 22 29 3b 0a 09 64 70 72 69 6e 74 66 28 22  re");..dprintf("
4a10: 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 69 6e  Unregistering in
4a20: 74 65 72 65 73 74 20 69 6e 20 74 68 65 20 6c 6f  terest in the lo
4a30: 77 65 72 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 0a  wer channel");..
4a40: 09 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  .(Tcl_GetChannel
4a50: 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 2d  Type(downChan))-
4a60: 3e 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47  >watchProc(Tcl_G
4a70: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
4a80: 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c  eData(downChan),
4a90: 20 30 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e   0);..statePtr->
4aa0: 77 61 74 63 68 4d 61 73 6b 20 3d 20 30 3b 0a 09  watchMask = 0;..
4ab0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
4ac0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74     statePtr->wat
4ad0: 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a  chMask = mask;..
4ae0: 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 6e 65      /* No channe
4af0: 6c 20 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d  l handlers any m
4b00: 6f 72 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20  ore. We will be 
4b10: 6e 6f 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74  notified automat
4b20: 69 63 61 6c 6c 79 0a 20 20 20 20 20 2a 20 61 62  ically.     * ab
4b30: 6f 75 74 20 65 76 65 6e 74 73 20 6f 6e 20 74 68  out events on th
4b40: 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20  e channel below 
4b50: 76 69 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f 75  via a call to ou
4b60: 72 0a 20 20 20 20 20 2a 20 27 54 72 61 6e 73 66  r.     * 'Transf
4b70: 6f 72 6d 4e 6f 74 69 66 79 50 72 6f 63 27 2e 20  ormNotifyProc'. 
4b80: 42 75 74 20 77 65 20 68 61 76 65 20 74 6f 20 70  But we have to p
4b90: 61 73 73 20 74 68 65 20 69 6e 74 65 72 65 73 74  ass the interest
4ba0: 20 64 6f 77 6e 20 6e 6f 77 2e 0a 20 20 20 20 20   down now..     
4bb0: 2a 20 57 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  * We are allowed
4bc0: 20 74 6f 20 61 64 64 20 61 64 64 69 74 69 6f 6e   to add addition
4bd0: 61 6c 20 27 69 6e 74 65 72 65 73 74 27 20 74 6f  al 'interest' to
4be0: 20 74 68 65 20 6d 61 73 6b 20 69 66 20 77 65 20   the mask if we 
4bf0: 77 61 6e 74 0a 20 20 20 20 20 2a 20 74 6f 2e 20  want.     * to. 
4c00: 42 75 74 20 74 68 69 73 20 74 72 61 6e 73 66 6f  But this transfo
4c10: 72 6d 61 74 69 6f 6e 20 68 61 73 20 6e 6f 20 73  rmation has no s
4c20: 75 63 68 20 69 6e 74 65 72 65 73 74 2e 20 49 74  uch interest. It
4c30: 20 6a 75 73 74 20 70 61 73 73 65 73 0a 20 20 20   just passes.   
4c40: 20 20 2a 20 74 68 65 20 72 65 71 75 65 73 74 20    * the request 
4c50: 64 6f 77 6e 2c 20 75 6e 63 68 61 6e 67 65 64 2e  down, unchanged.
4c60: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72  .     */.    dpr
4c70: 69 6e 74 66 28 22 52 65 67 69 73 74 65 72 69 6e  intf("Registerin
4c80: 67 20 6f 75 72 20 69 6e 74 65 72 65 73 74 20 69  g our interest i
4c90: 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e  n the lower chan
4ca0: 6e 65 6c 20 28 63 68 61 6e 3d 25 70 29 22 2c 20  nel (chan=%p)", 
4cb0: 28 76 6f 69 64 20 2a 29 20 64 6f 77 6e 43 68 61  (void *) downCha
4cc0: 6e 29 3b 0a 20 20 20 20 28 54 63 6c 5f 47 65 74  n);.    (Tcl_Get
4cd0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e  ChannelType(down
4ce0: 43 68 61 6e 29 29 2d 3e 77 61 74 63 68 50 72 6f  Chan))->watchPro
4cf0: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  c(Tcl_GetChannel
4d00: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f 77  InstanceData(dow
4d10: 6e 43 68 61 6e 29 2c 20 6d 61 73 6b 29 3b 0a 0a  nChan), mask);..
4d20: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61      /*.     * Ma
4d30: 6e 61 67 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  nagement of the 
4d40: 69 6e 74 65 72 6e 61 6c 20 74 69 6d 65 72 2e 0a  internal timer..
4d50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28       */.    if (
4d60: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
4d70: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
4d80: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 64 70 72  en) NULL) {..dpr
4d90: 69 6e 74 66 28 22 41 20 74 69 6d 65 72 20 77 61  intf("A timer wa
4da0: 73 20 66 6f 75 6e 64 2c 20 64 65 6c 65 74 69 6e  s found, deletin
4db0: 67 20 69 74 22 29 3b 0a 09 54 63 6c 5f 44 65 6c  g it");..Tcl_Del
4dc0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
4dd0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
4de0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
4df0: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
4e00: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
4e10: 7d 0a 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b  }..    if ((mask
4e20: 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29   & TCL_READABLE)
4e30: 20 26 26 0a 09 28 28 54 63 6c 5f 49 6e 70 75 74   &&..((Tcl_Input
4e40: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74  Buffered(statePt
4e50: 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20 7c 7c  r->self) > 0) ||
4e60: 20 28 42 49 4f 5f 63 74 72 6c 5f 70 65 6e 64 69   (BIO_ctrl_pendi
4e70: 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ng(statePtr->bio
4e80: 29 20 3e 20 30 29 29 29 20 7b 0a 09 20 20 20 20  ) > 0))) {..    
4e90: 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 72 65  /*..     * There
4ea0: 20 69 73 20 69 6e 74 65 72 65 73 74 20 69 6e 20   is interest in 
4eb0: 72 65 61 64 61 62 6c 65 20 65 76 65 6e 74 73 20  readable events 
4ec0: 61 6e 64 20 77 65 20 61 63 74 75 61 6c 6c 79 20  and we actually 
4ed0: 68 61 76 65 0a 09 20 20 20 20 20 2a 20 64 61 74  have..     * dat
4ee0: 61 20 77 61 69 74 69 6e 67 2c 20 73 6f 20 67 65  a waiting, so ge
4ef0: 6e 65 72 61 74 65 20 61 20 74 69 6d 65 72 20 74  nerate a timer t
4f00: 6f 20 66 6c 75 73 68 20 74 68 61 74 2e 0a 09 20  o flush that... 
4f10: 20 20 20 20 2a 2f 0a 09 20 20 20 20 64 70 72 69      */..    dpri
4f20: 6e 74 66 28 22 43 72 65 61 74 69 6e 67 20 61 20  ntf("Creating a 
4f30: 6e 65 77 20 74 69 6d 65 72 20 73 69 6e 63 65 20  new timer since 
4f40: 64 61 74 61 20 61 70 70 65 61 72 73 20 74 6f 20  data appears to 
4f50: 62 65 20 77 61 69 74 69 6e 67 22 29 3b 0a 09 20  be waiting");.. 
4f60: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d     statePtr->tim
4f70: 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54  er = Tcl_CreateT
4f80: 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f  imerHandler(TLS_
4f90: 54 43 4c 5f 44 45 4c 41 59 2c 20 54 6c 73 43 68  TCL_DELAY, TlsCh
4fa0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65  annelHandlerTime
4fb0: 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  r, (ClientData) 
4fc0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d  statePtr);.    }
4fd0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
4fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5020: 20 2a 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50   * TlsGetHandleP
5030: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20  roc --. *. *    
5040: 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f  Called from Tcl_
5050: 47 65 74 43 68 61 6e 6e 65 6c 46 69 6c 65 20 74  GetChannelFile t
5060: 6f 20 72 65 74 72 69 65 76 65 20 6f 2f 73 20 66  o retrieve o/s f
5070: 69 6c 65 20 68 61 6e 64 6c 65 72 0a 20 2a 20 20  ile handler. *  
5080: 20 20 66 72 6f 6d 20 74 68 65 20 53 53 4c 20 73    from the SSL s
5090: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
50a0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  nel.. *. * Resul
50b0: 74 73 3a 0a 20 2a 20 20 20 20 54 68 65 20 61 70  ts:. *    The ap
50c0: 70 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69  propriate Tcl_Fi
50d0: 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  le or NULL if no
50e0: 74 20 70 72 65 73 65 6e 74 2e 0a 20 2a 0a 20 2a  t present.. *. *
50f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5100: 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  *    None.. *. *
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
5160: 6e 74 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50  nt TlsGetHandleP
5170: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
5180: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
5190: 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65   direction, Clie
51a0: 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74  ntData *handlePt
51b0: 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  r) {.    State *
51c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
51d0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
51e0: 61 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54  a;..    return(T
51f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e  cl_GetChannelHan
5200: 64 6c 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e  dle(Tls_GetParen
5210: 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f  t(statePtr, TLS_
5220: 54 43 4c 5f 46 41 53 54 50 41 54 48 29 2c 20 64  TCL_FASTPATH), d
5230: 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65  irection, handle
5240: 50 74 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  Ptr));.}../*. *-
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69  --. *. * TlsNoti
52a0: 66 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20  fyProc --. *. * 
52b0: 20 20 20 48 61 6e 64 6c 65 72 20 63 61 6c 6c 65     Handler calle
52c0: 64 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f  d by Tcl to info
52d0: 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74  rm us of activit
52e0: 79 0a 20 2a 20 20 20 20 6f 6e 20 74 68 65 20 75  y. *    on the u
52f0: 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65  nderlying channe
5300: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  l.. *. * Results
5310: 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a  :. *    None.. *
5320: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
5330: 3a 0a 20 2a 20 20 20 20 4d 61 79 20 70 72 6f 63  :. *    May proc
5340: 65 73 73 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67  ess the incoming
5350: 20 65 76 65 6e 74 20 62 79 20 69 74 73 65 6c 66   event by itself
5360: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
53b0: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4e 6f 74  tatic int TlsNot
53c0: 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  ifyProc(ClientDa
53d0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
53e0: 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20 20   int mask) {.   
53f0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
5400: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
5410: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69  tanceData;.    i
5420: 6e 74 20 65 72 72 6f 72 43 6f 64 65 3b 0a 0a 20  nt errorCode;.. 
5430: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20     /*.     * An 
5440: 65 76 65 6e 74 20 6f 63 63 75 72 72 65 64 20 69  event occurred i
5450: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  n the underlying
5460: 20 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a   channel.  This.
5470: 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d       * transform
5480: 61 74 69 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72  ation doesn't pr
5490: 6f 63 65 73 73 20 73 75 63 68 20 65 76 65 6e 74  ocess such event
54a0: 73 20 74 68 75 73 20 72 65 74 75 72 6e 73 20 74  s thus returns t
54b0: 68 65 0a 20 20 20 20 20 2a 20 69 6e 63 6f 6d 69  he.     * incomi
54c0: 6e 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e 67 65  ng mask unchange
54d0: 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  d..     */.    i
54e0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
54f0: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
5500: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
5510: 2f 2a 0a 09 20 2a 20 44 65 6c 65 74 65 20 61 6e  /*.. * Delete an
5520: 20 65 78 69 73 74 69 6e 67 20 74 69 6d 65 72 2e   existing timer.
5530: 20 49 74 20 77 61 73 20 6e 6f 74 20 66 69 72 65   It was not fire
5540: 64 2c 20 79 65 74 20 77 65 20 61 72 65 0a 09 20  d, yet we are.. 
5550: 2a 20 68 65 72 65 2c 20 73 6f 20 74 68 65 20 63  * here, so the c
5560: 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 67 65 6e  hannel below gen
5570: 65 72 61 74 65 64 20 73 75 63 68 20 61 6e 20 65  erated such an e
5580: 76 65 6e 74 20 61 6e 64 20 77 65 0a 09 20 2a 20  vent and we.. * 
5590: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 2e 20 54  don't have to. T
55a0: 68 65 20 72 65 6e 65 77 61 6c 20 6f 66 20 74 68  he renewal of th
55b0: 65 20 69 6e 74 65 72 65 73 74 20 61 66 74 65 72  e interest after
55c0: 20 74 68 65 0a 09 20 2a 20 65 78 65 63 75 74 69   the.. * executi
55d0: 6f 6e 20 6f 66 20 63 68 61 6e 6e 65 6c 20 68 61  on of channel ha
55e0: 6e 64 6c 65 72 73 20 77 69 6c 6c 20 65 76 65 6e  ndlers will even
55f0: 74 75 61 6c 6c 79 20 63 61 75 73 65 20 75 73 20  tually cause us 
5600: 74 6f 0a 09 20 2a 20 72 65 63 72 65 61 74 65 20  to.. * recreate 
5610: 74 68 65 20 74 69 6d 65 72 20 28 69 6e 20 57 61  the timer (in Wa
5620: 74 63 68 50 72 6f 63 29 2e 0a 09 20 2a 2f 0a 09  tchProc)... */..
5630: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
5640: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
5650: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
5660: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
5670: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
5680: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
5690: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
56a0: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  s & TLS_TCL_CALL
56b0: 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66  BACK) {..dprintf
56c0: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 64 75  ("Returning 0 du
56d0: 65 20 74 6f 20 63 61 6c 6c 62 61 63 6b 22 29 3b  e to callback");
56e0: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
56f0: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
5700: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74  Calling Tls_Wait
5710: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20  ForConnect");.  
5720: 20 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b    errorCode = 0;
5730: 0a 20 20 20 20 69 66 20 28 54 6c 73 5f 57 61 69  .    if (Tls_Wai
5740: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74  tForConnect(stat
5750: 65 50 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65  ePtr, &errorCode
5760: 2c 20 31 29 20 3c 20 30 29 20 7b 0a 09 69 66 20  , 1) < 0) {..if 
5770: 28 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41  (errorCode == EA
5780: 47 41 49 4e 29 20 7b 0a 09 20 20 20 20 64 70 72  GAIN) {..    dpr
5790: 69 6e 74 66 28 22 41 73 79 6e 63 20 66 6c 61 67  intf("Async flag
57a0: 20 63 6f 75 6c 64 20 62 65 20 73 65 74 20 28 64   could be set (d
57b0: 69 64 6e 27 74 20 63 68 65 63 6b 29 20 61 6e 64  idn't check) and
57c0: 20 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41   errorCode == EA
57d0: 47 41 49 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67  GAIN:  Returning
57e0: 20 30 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75   0");...    retu
57f0: 72 6e 20 30 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e  rn 0;..}...dprin
5800: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43  tf("Tls_WaitForC
5810: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 20  onnect returned 
5820: 61 6e 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20  an error");.    
5830: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
5840: 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 6d  Returning %i", m
5850: 61 73 6b 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ask);..    retur
5860: 6e 28 6d 61 73 6b 29 3b 0a 7d 0a 0a 23 69 66 20  n(mask);.}..#if 
5870: 30 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  0./*. *---------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
58b0: 2a 0a 20 2a 20 20 20 20 20 20 54 6c 73 43 68 61  *. *      TlsCha
58c0: 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 2d 0a 20  nnelHandler --. 
58d0: 2a 0a 20 2a 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d  *. *      ------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 20 20  ----------*. *  
5910: 20 20 20 20 48 61 6e 64 6c 65 72 20 63 61 6c 6c      Handler call
5920: 65 64 20 62 79 20 54 63 6c 20 61 73 20 61 20 72  ed by Tcl as a r
5930: 65 73 75 6c 74 20 6f 66 0a 20 2a 20 20 20 20 20  esult of. *     
5940: 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e   Tcl_CreateChann
5950: 65 6c 48 61 6e 64 6c 65 72 20 2d 20 74 6f 20 69  elHandler - to i
5960: 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69  nform us of acti
5970: 76 69 74 79 0a 20 2a 20 20 20 20 20 20 6f 6e 20  vity. *      on 
5980: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  the underlying c
5990: 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20 20 20 20 20  hannel.. *      
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 53 69 64  *. *. *      Sid
59e0: 65 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20  eeffects:. *    
59f0: 20 20 20 20 20 20 20 20 20 20 4d 61 79 20 67 65            May ge
5a00: 6e 65 72 61 74 65 20 73 75 62 73 65 71 75 65 6e  nerate subsequen
5a10: 74 20 63 61 6c 6c 73 20 74 6f 0a 20 2a 20 20 20  t calls to. *   
5a20: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e             Tcl_N
5a30: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 2e 0a 20 2a  otifyChannel.. *
5a40: 0a 20 2a 20 20 20 20 20 20 52 65 73 75 6c 74 3a  . *      Result:
5a50: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
5a60: 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   None.. *. *----
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  --*. */.static v
5ab0: 6f 69 64 0a 54 6c 73 43 68 61 6e 6e 65 6c 48 61  oid.TlsChannelHa
5ac0: 6e 64 6c 65 72 20 28 43 6c 69 65 6e 74 44 61 74  ndler (ClientDat
5ad0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  a clientData, in
5ae0: 74 20 6d 61 73 6b 29 20 7b 0a 20 20 20 20 53 74  t mask) {.    St
5af0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
5b00: 28 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  (State *) client
5b10: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
5b20: 74 66 28 22 48 41 4e 44 4c 45 52 28 30 78 25 78  tf("HANDLER(0x%x
5b30: 29 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 54  )", mask);.    T
5b40: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
5b50: 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72  entData)statePtr
5b60: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d 61 73 6b  );..    if (mask
5b70: 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29   & TCL_READABLE)
5b80: 20 7b 0a 09 42 49 4f 5f 73 65 74 5f 66 6c 61 67   {..BIO_set_flag
5b90: 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  s(statePtr->p_bi
5ba0: 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41  o, BIO_FLAGS_REA
5bb0: 44 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  D);.    } else {
5bc0: 0a 09 42 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 67  ..BIO_clear_flag
5bd0: 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  s(statePtr->p_bi
5be0: 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41  o, BIO_FLAGS_REA
5bf0: 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  D);.    }..    i
5c00: 66 20 28 6d 61 73 6b 20 26 20 54 43 4c 5f 57 52  f (mask & TCL_WR
5c10: 49 54 41 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73  ITABLE) {..BIO_s
5c20: 65 74 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74  et_flags(statePt
5c30: 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c  r->p_bio, BIO_FL
5c40: 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 20 20 20  AGS_WRITE);.    
5c50: 7d 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f 63 6c  } else {..BIO_cl
5c60: 65 61 72 5f 66 6c 61 67 73 28 73 74 61 74 65 50  ear_flags(stateP
5c70: 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46  tr->p_bio, BIO_F
5c80: 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 20 20  LAGS_WRITE);.   
5c90: 20 7d 0a 0a 20 20 20 20 6d 61 73 6b 20 3d 20 30   }..    mask = 0
5ca0: 3b 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 77 70  ;.    if (BIO_wp
5cb0: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d  ending(statePtr-
5cc0: 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c  >bio)) {..mask |
5cd0: 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a  = TCL_WRITABLE;.
5ce0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 42 49      }.    if (BI
5cf0: 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50  O_pending(stateP
5d00: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73  tr->bio)) {..mas
5d10: 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c  k |= TCL_READABL
5d20: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
5d30: 0a 20 20 20 20 20 2a 20 54 68 65 20 66 6f 6c 6c  .     * The foll
5d40: 6f 77 69 6e 67 20 4e 6f 74 69 66 79 43 68 61 6e  owing NotifyChan
5d50: 6e 65 6c 20 63 61 6c 6c 73 20 73 65 65 6d 73 20  nel calls seems 
5d60: 74 6f 20 62 65 20 69 6d 70 6f 72 74 61 6e 74 2c  to be important,
5d70: 20 62 75 74 0a 20 20 20 20 20 2a 20 77 65 20 64   but.     * we d
5d80: 6f 6e 27 74 20 6b 6e 6f 77 20 77 68 79 2e 20 20  on't know why.  
5d90: 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 69 66  It looks like if
5da0: 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 76 65   the mask is eve
5db0: 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 20 20 20 20 20  r non-zero.     
5dc0: 2a 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 65  * that it will e
5dd0: 6e 74 65 72 20 61 6e 20 69 6e 66 69 6e 69 74 65  nter an infinite
5de0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 2a 0a 20 20   loop..     *.  
5df0: 20 20 20 2a 20 4e 6f 74 69 66 79 20 74 68 65 20     * Notify the 
5e00: 75 70 70 65 72 20 63 68 61 6e 6e 65 6c 20 6f 66  upper channel of
5e10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 42 49 4f   the current BIO
5e20: 20 73 74 61 74 65 20 73 6f 20 74 68 65 20 65 76   state so the ev
5e30: 65 6e 74 0a 20 20 20 20 20 2a 20 63 6f 6e 74 69  ent.     * conti
5e40: 6e 75 65 73 20 74 6f 20 70 72 6f 70 61 67 61 74  nues to propagat
5e50: 65 20 75 70 20 74 68 65 20 63 68 61 69 6e 2e 0a  e up the chain..
5e60: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 73 74       *.     * st
5e70: 61 6e 74 6f 6e 3a 20 49 74 20 6c 6f 6f 6b 73 20  anton: It looks 
5e80: 6c 69 6b 65 20 74 68 69 73 20 63 6f 75 6c 64 20  like this could 
5e90: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 66  result in an inf
5ea0: 69 6e 69 74 65 20 6c 6f 6f 70 20 69 66 0a 20 20  inite loop if.  
5eb0: 20 20 20 2a 20 74 68 65 20 75 70 70 65 72 20 63     * the upper c
5ec0: 68 61 6e 6e 65 6c 20 64 6f 65 73 6e 27 74 20 63  hannel doesn't c
5ed0: 61 75 73 65 20 43 68 61 6e 6e 65 6c 48 61 6e 64  ause ChannelHand
5ee0: 6c 65 72 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  ler to be remove
5ef0: 64 0a 20 20 20 20 20 2a 20 62 65 66 6f 72 65 20  d.     * before 
5f00: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65  Tcl_NotifyChanne
5f10: 6c 20 63 61 6c 6c 73 20 63 68 61 6e 6e 65 6c 20  l calls channel 
5f20: 68 61 6e 64 6c 65 72 73 20 6f 6e 20 74 68 65 20  handlers on the 
5f30: 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 2e 0a 20  lower channel.. 
5f40: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4e      */.    Tcl_N
5f50: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61  otifyChannel(sta
5f60: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73  tePtr->self, mas
5f70: 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  k);..    if (sta
5f80: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
5f90: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
5fa0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
5fb0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
5fc0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
5fd0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
5fe0: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
5ff0: 6f 6b 65 6e 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d  oken)NULL;.    }
6000: 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26  .    if ((mask &
6010: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26   TCL_READABLE) &
6020: 26 20 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65  & Tcl_InputBuffe
6030: 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65  red(statePtr->se
6040: 6c 66 29 20 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09  lf) > 0) {../*..
6050: 20 2a 20 44 61 74 61 20 69 73 20 77 61 69 74 69   * Data is waiti
6060: 6e 67 2c 20 66 6c 75 73 68 20 69 74 20 6f 75 74  ng, flush it out
6070: 20 69 6e 20 73 68 6f 72 74 20 74 69 6d 65 0a 09   in short time..
6080: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 74   */..statePtr->t
6090: 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74  imer = Tcl_Creat
60a0: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c  eTimerHandler(TL
60b0: 53 5f 54 43 4c 5f 44 45 4c 41 59 2c 20 54 6c 73  S_TCL_DELAY, Tls
60c0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69  ChannelHandlerTi
60d0: 6d 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  mer, (ClientData
60e0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
60f0: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
6100: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 73  se((ClientData)s
6110: 74 61 74 65 50 74 72 29 3b 0a 7d 0a 23 65 6e 64  tatePtr);.}.#end
6120: 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  if../*. *-------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
6160: 0a 20 2a 0a 20 2a 20 20 20 20 54 6c 73 43 68 61  . *. *    TlsCha
6170: 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72  nnelHandlerTimer
6180: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 2d 2d 2d   --. *. *    ---
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
61c0: 2a 20 20 20 20 43 61 6c 6c 65 64 20 62 79 20 74  *    Called by t
61d0: 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d 3e 20  he notifier (-> 
61e0: 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 68 20  timer) to flush 
61f0: 6f 75 74 0a 20 2a 20 20 20 20 69 6e 66 6f 72 6d  out. *    inform
6200: 61 74 69 6f 6e 20 77 61 69 74 69 6e 67 20 69 6e  ation waiting in
6210: 20 63 68 61 6e 6e 65 6c 20 62 75 66 66 65 72 73   channel buffers
6220: 2e 0a 20 2a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  .. *    --------
6230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6250: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20  --------*. *. * 
6260: 20 20 20 53 69 64 65 65 66 66 65 63 74 73 3a 0a     Sideeffects:.
6270: 20 2a 20 20 20 20 20 20 20 20 41 73 20 6f 66 20   *        As of 
6280: 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c  'TlsChannelHandl
6290: 65 72 27 2e 0a 20 2a 0a 20 2a 20 20 20 20 52 65  er'.. *. *    Re
62a0: 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20 20  sult:. *        
62b0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
62c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62f0: 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  -*. */.static vo
6300: 69 64 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e  id TlsChannelHan
6310: 64 6c 65 72 54 69 6d 65 72 28 43 6c 69 65 6e 74  dlerTimer(Client
6320: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29  Data clientData)
6330: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
6340: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
6350: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
6360: 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b     int mask = 0;
6370: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
6380: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 74  alled");..    st
6390: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
63a0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
63b0: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28   NULL;..    if (
63c0: 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61  BIO_wpending(sta
63d0: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09  tePtr->bio)) {..
63e0: 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25  dprintf("[chan=%
63f0: 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c 65 22  p] BIO writable"
6400: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
6410: 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c  );...mask |= TCL
6420: 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d  _WRITABLE;.    }
6430: 0a 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 70 65  ..    if (BIO_pe
6440: 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e  nding(statePtr->
6450: 62 69 6f 29 29 20 7b 0a 09 64 70 72 69 6e 74 66  bio)) {..dprintf
6460: 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49 4f 20  ("[chan=%p] BIO 
6470: 72 65 61 64 61 62 6c 65 22 2c 20 73 74 61 74 65  readable", state
6480: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61  Ptr->self);...ma
6490: 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42  sk |= TCL_READAB
64a0: 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  LE;.    }..    d
64b0: 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79 69 6e  printf("Notifyin
64c0: 67 20 6f 75 72 73 65 6c 76 65 73 22 29 3b 0a 20  g ourselves");. 
64d0: 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61     Tcl_NotifyCha
64e0: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73  nnel(statePtr->s
64f0: 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20  elf, mask);..   
6500: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
6510: 69 6e 67 22 29 3b 0a 0a 20 20 20 20 72 65 74 75  ing");..    retu
6520: 72 6e 3b 0a 7d 0a 0a 54 63 6c 5f 43 68 61 6e 6e  rn;.}..Tcl_Chann
6530: 65 6c 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74  el Tls_GetParent
6540: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
6550: 2c 20 69 6e 74 20 6d 61 73 6b 46 6c 61 67 73 29  , int maskFlags)
6560: 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
6570: 52 65 71 75 65 73 74 65 64 20 74 6f 20 67 65 74  Requested to get
6580: 20 70 61 72 65 6e 74 20 6f 66 20 63 68 61 6e 6e   parent of chann
6590: 65 6c 20 25 70 22 2c 20 73 74 61 74 65 50 74 72  el %p", statePtr
65a0: 2d 3e 73 65 6c 66 29 3b 0a 0a 20 20 20 20 69 66  ->self);..    if
65b0: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61   ((statePtr->fla
65c0: 67 73 20 26 20 7e 6d 61 73 6b 46 6c 61 67 73 29  gs & ~maskFlags)
65d0: 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50   & TLS_TCL_FASTP
65e0: 41 54 48 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  ATH) {..dprintf(
65f0: 22 41 73 6b 65 64 20 74 6f 20 67 65 74 20 74 68  "Asked to get th
6600: 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c  e parent channel
6610: 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 75 73   while we are us
6620: 69 6e 67 20 46 61 73 74 50 61 74 68 20 2d 2d 20  ing FastPath -- 
6630: 72 65 74 75 72 6e 69 6e 67 20 4e 55 4c 4c 22 29  returning NULL")
6640: 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ;..return(NULL);
6650: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
6660: 6e 28 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64  n(Tcl_GetStacked
6670: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72  Channel(statePtr
6680: 2d 3e 73 65 6c 66 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ->self));.}../*.
6690: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66d0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
66e0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a 20  ChannelType --. 
66f0: 2a 0a 20 2a 20 20 20 20 52 65 74 75 72 6e 20 74  *. *    Return t
6700: 68 65 20 63 6f 72 72 65 63 74 20 54 4c 53 20 63  he correct TLS c
6710: 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 20 69 6e  hannel driver in
6720: 66 6f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  fo. *. * Results
6730: 3a 0a 20 2a 20 20 20 20 54 68 65 20 63 6f 72 72  :. *    The corr
6740: 65 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 76  ect channel driv
6750: 65 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  er for the curre
6760: 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 63  nt version of Tc
6770: 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  l.. *. * Side ef
6780: 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e  fects:. *    Non
6790: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
67e0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20  Tcl_ChannelType 
67f0: 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65  *Tls_ChannelType
6800: 28 76 6f 69 64 29 20 7b 0a 20 20 20 20 75 6e 73  (void) {.    uns
6810: 69 67 6e 65 64 20 69 6e 74 20 73 69 7a 65 3b 0a  igned int size;.
6820: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49  .    /*.     * I
6830: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 68  nitialize the ch
6840: 61 6e 6e 65 6c 20 74 79 70 65 20 69 66 20 6e 65  annel type if ne
6850: 63 65 73 73 61 72 79 0a 20 20 20 20 20 2a 2f 0a  cessary.     */.
6860: 20 20 20 20 69 66 20 28 74 6c 73 43 68 61 6e 6e      if (tlsChann
6870: 65 6c 54 79 70 65 20 3d 3d 20 4e 55 4c 4c 29 20  elType == NULL) 
6880: 7b 0a 09 2f 2a 0a 09 20 2a 20 41 6c 6c 6f 63 61  {../*.. * Alloca
6890: 74 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 74 79  te new channelty
68a0: 70 65 20 73 74 72 75 63 74 75 72 65 0a 09 20 2a  pe structure.. *
68b0: 2f 0a 09 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66  /..size = sizeof
68c0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65  (Tcl_ChannelType
68d0: 29 3b 20 2f 2a 20 42 61 73 65 20 73 69 7a 65 20  ); /* Base size 
68e0: 2a 2f 0a 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54  */...tlsChannelT
68f0: 79 70 65 20 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  ype = (Tcl_Chann
6900: 65 6c 54 79 70 65 20 2a 29 20 63 6b 61 6c 6c 6f  elType *) ckallo
6910: 63 28 73 69 7a 65 29 3b 0a 09 6d 65 6d 73 65 74  c(size);..memset
6920: 28 28 76 6f 69 64 20 2a 29 20 74 6c 73 43 68 61  ((void *) tlsCha
6930: 6e 6e 65 6c 54 79 70 65 2c 20 30 2c 20 73 69 7a  nnelType, 0, siz
6940: 65 29 3b 0a 0a 09 74 6c 73 43 68 61 6e 6e 65 6c  e);...tlsChannel
6950: 54 79 70 65 2d 3e 74 79 70 65 4e 61 6d 65 09 3d  Type->typeName.=
6960: 20 22 74 6c 73 22 3b 0a 23 69 66 64 65 66 20 54   "tls";.#ifdef T
6970: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49  CL_CHANNEL_VERSI
6980: 4f 4e 5f 35 0a 09 74 6c 73 43 68 61 6e 6e 65 6c  ON_5..tlsChannel
6990: 54 79 70 65 2d 3e 76 65 72 73 69 6f 6e 09 09 3d  Type->version..=
69a0: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
69b0: 53 49 4f 4e 5f 35 3b 0a 09 74 6c 73 43 68 61 6e  SION_5;..tlsChan
69c0: 6e 65 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 50 72  nelType->closePr
69d0: 6f 63 09 3d 20 54 6c 73 43 6c 6f 73 65 50 72 6f  oc.= TlsClosePro
69e0: 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79  c;..tlsChannelTy
69f0: 70 65 2d 3e 69 6e 70 75 74 50 72 6f 63 09 3d 20  pe->inputProc.= 
6a00: 54 6c 73 49 6e 70 75 74 50 72 6f 63 3b 0a 09 74  TlsInputProc;..t
6a10: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 6f  lsChannelType->o
6a20: 75 74 70 75 74 50 72 6f 63 09 3d 20 54 6c 73 4f  utputProc.= TlsO
6a30: 75 74 70 75 74 50 72 6f 63 3b 0a 09 74 6c 73 43  utputProc;..tlsC
6a40: 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 73 65 65 6b  hannelType->seek
6a50: 50 72 6f 63 09 3d 20 4e 55 4c 4c 3b 0a 09 74 6c  Proc.= NULL;..tl
6a60: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 73 65  sChannelType->se
6a70: 74 4f 70 74 69 6f 6e 50 72 6f 63 09 3d 20 54 6c  tOptionProc.= Tl
6a80: 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a  sSetOptionProc;.
6a90: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d  .tlsChannelType-
6aa0: 3e 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 09 3d  >getOptionProc.=
6ab0: 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f   TlsGetOptionPro
6ac0: 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79  c;..tlsChannelTy
6ad0: 70 65 2d 3e 77 61 74 63 68 50 72 6f 63 09 3d 20  pe->watchProc.= 
6ae0: 54 6c 73 57 61 74 63 68 50 72 6f 63 3b 0a 09 74  TlsWatchProc;..t
6af0: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 67  lsChannelType->g
6b00: 65 74 48 61 6e 64 6c 65 50 72 6f 63 09 3d 20 54  etHandleProc.= T
6b10: 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 3b  lsGetHandleProc;
6b20: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  ..tlsChannelType
6b30: 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 09 3d 20 54  ->close2Proc.= T
6b40: 6c 73 43 6c 6f 73 65 50 72 6f 63 32 3b 0a 09 74  lsCloseProc2;..t
6b50: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 62  lsChannelType->b
6b60: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 09 3d 20 54  lockModeProc.= T
6b70: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b  lsBlockModeProc;
6b80: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  ..tlsChannelType
6b90: 2d 3e 66 6c 75 73 68 50 72 6f 63 09 3d 20 4e 55  ->flushProc.= NU
6ba0: 4c 4c 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54  LL;..tlsChannelT
6bb0: 79 70 65 2d 3e 68 61 6e 64 6c 65 72 50 72 6f 63  ype->handlerProc
6bc0: 09 3d 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63  .= TlsNotifyProc
6bd0: 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70  ;..tlsChannelTyp
6be0: 65 2d 3e 77 69 64 65 53 65 65 6b 50 72 6f 63 09  e->wideSeekProc.
6bf0: 3d 20 4e 55 4c 4c 3b 0a 09 74 6c 73 43 68 61 6e  = NULL;..tlsChan
6c00: 6e 65 6c 54 79 70 65 2d 3e 74 68 72 65 61 64 41  nelType->threadA
6c10: 63 74 69 6f 6e 50 72 6f 63 20 3d 20 4e 55 4c 4c  ctionProc = NULL
6c20: 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70  ;..tlsChannelTyp
6c30: 65 2d 3e 74 72 75 6e 63 61 74 65 50 72 6f 63 09  e->truncateProc.
6c40: 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 74  = NULL;.#else..t
6c50: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 76  lsChannelType->v
6c60: 65 72 73 69 6f 6e 09 09 3d 20 54 43 4c 5f 43 48  ersion..= TCL_CH
6c70: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 3b  ANNEL_VERSION_2;
6c80: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  ..tlsChannelType
6c90: 2d 3e 63 6c 6f 73 65 50 72 6f 63 09 3d 20 54 6c  ->closeProc.= Tl
6ca0: 73 43 6c 6f 73 65 50 72 6f 63 3b 0a 09 74 6c 73  sCloseProc;..tls
6cb0: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 69 6e 70  ChannelType->inp
6cc0: 75 74 50 72 6f 63 09 3d 20 54 6c 73 49 6e 70 75  utProc.= TlsInpu
6cd0: 74 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e  tProc;..tlsChann
6ce0: 65 6c 54 79 70 65 2d 3e 6f 75 74 70 75 74 50 72  elType->outputPr
6cf0: 6f 63 09 3d 20 54 6c 73 4f 75 74 70 75 74 50 72  oc.= TlsOutputPr
6d00: 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54  oc;..tlsChannelT
6d10: 79 70 65 2d 3e 73 65 65 6b 50 72 6f 63 09 3d 20  ype->seekProc.= 
6d20: 4e 55 4c 4c 3b 0a 09 74 6c 73 43 68 61 6e 6e 65  NULL;..tlsChanne
6d30: 6c 54 79 70 65 2d 3e 73 65 74 4f 70 74 69 6f 6e  lType->setOption
6d40: 50 72 6f 63 09 3d 20 54 6c 73 53 65 74 4f 70 74  Proc.= TlsSetOpt
6d50: 69 6f 6e 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61  ionProc;..tlsCha
6d60: 6e 6e 65 6c 54 79 70 65 2d 3e 67 65 74 4f 70 74  nnelType->getOpt
6d70: 69 6f 6e 50 72 6f 63 09 3d 20 54 6c 73 47 65 74  ionProc.= TlsGet
6d80: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 09 74 6c 73  OptionProc;..tls
6d90: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 77 61 74  ChannelType->wat
6da0: 63 68 50 72 6f 63 09 3d 20 54 6c 73 57 61 74 63  chProc.= TlsWatc
6db0: 68 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e  hProc;..tlsChann
6dc0: 65 6c 54 79 70 65 2d 3e 67 65 74 48 61 6e 64 6c  elType->getHandl
6dd0: 65 50 72 6f 63 09 3d 20 54 6c 73 47 65 74 48 61  eProc.= TlsGetHa
6de0: 6e 64 6c 65 50 72 6f 63 3b 0a 09 74 6c 73 43 68  ndleProc;..tlsCh
6df0: 61 6e 6e 65 6c 54 79 70 65 2d 3e 63 6c 6f 73 65  annelType->close
6e00: 32 50 72 6f 63 09 3d 20 4e 55 4c 4c 3b 0a 09 74  2Proc.= NULL;..t
6e10: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 62  lsChannelType->b
6e20: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 09 3d 20 54  lockModeProc.= T
6e30: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b  lsBlockModeProc;
6e40: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  ..tlsChannelType
6e50: 2d 3e 66 6c 75 73 68 50 72 6f 63 09 3d 20 4e 55  ->flushProc.= NU
6e60: 4c 4c 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54  LL;..tlsChannelT
6e70: 79 70 65 2d 3e 68 61 6e 64 6c 65 72 50 72 6f 63  ype->handlerProc
6e80: 09 3d 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63  .= TlsNotifyProc
6e90: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
6ea0: 20 20 20 72 65 74 75 72 6e 28 74 6c 73 43 68 61     return(tlsCha
6eb0: 6e 6e 65 6c 54 79 70 65 29 3b 0a 7d 0a           nnelType);.}.