Hex Artifact Content

Artifact 9ae11efaff91c72bdfda61e382093f85b68fe2f4c56040e8cab4d5cc483d768f:


0000: 2f 2a 0a 20 2a 20 50 72 6f 76 69 64 65 73 20 49  /*. * Provides I
0010: 4f 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 69  O functions to i
0020: 6e 74 65 72 66 61 63 65 20 62 65 74 77 65 65 6e  nterface between
0030: 20 74 68 65 20 42 49 4f 20 62 75 66 66 65 72 73   the BIO buffers
0040: 20 61 6e 64 20 54 43 4c 0a 20 2a 20 61 70 70 6c   and TCL. * appl
0050: 69 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 75 73  ications when us
0060: 69 6e 67 20 73 74 61 63 6b 65 64 20 63 68 61 6e  ing stacked chan
0070: 6e 65 6c 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79  nels.. *. * Copy
0080: 72 69 67 68 74 20 28 43 29 20 31 39 39 37 2d 32  right (C) 1997-2
0090: 30 30 30 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20  000 Matt Newman 
00a0: 3c 6d 61 74 74 40 6e 6f 76 61 64 69 67 6d 2e 63  <matt@novadigm.c
00b0: 6f 6d 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74  om>. * Copyright
00c0: 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 20   (C) 2000 Ajuba 
00d0: 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 20 43 6f 70  Solutions. * Cop
00e0: 79 72 69 67 68 74 20 28 43 29 20 32 30 32 34 20  yright (C) 2024 
00f0: 42 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a  Brian O'Hagan. *
0100: 0a 20 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 63  . * Additional c
0110: 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f 72  redit is due for
0120: 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73   Andreas Kupries
0130: 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74   (a.kupries@west
0140: 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a  end.com), for. *
0150: 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54   providing the T
0160: 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65  cl_ReplaceChanne
0170: 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20  l mechanism and 
0180: 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20  working closely 
0190: 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e  with me. * to en
01a0: 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70  hance it to supp
01b0: 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65  ort full fileeve
01c0: 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a  nt semantics.. *
01d0: 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f  . * Also work do
01e0: 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ne by the follow
01f0: 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64   people provided
0200: 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20   the impetus to 
0210: 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 3a  do this "right":
0220: 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69  . *.tclSSL (Coli
0230: 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61  n McCormack, Sha
0240: 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a  red Technology).
0250: 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72   *.SSLtcl (Peter
0260: 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a   Antman). *. */.
0270: 0a 2f 2a 0a 09 09 74 6c 73 42 49 4f 2e 63 09 09  ./*...tlsBIO.c..
0280: 09 09 74 6c 73 49 4f 2e 63 0a 20 20 2b 2d 2d 2d  ..tlsIO.c.  +---
0290: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20  ---+            
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
02b0: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20  ---+            
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02d0: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
02e0: 2b 0a 20 20 7c 20 20 20 20 20 20 7c 54 63 6c 5f  +.  |      |Tcl_
02f0: 57 72 69 74 65 52 61 77 20 3c 2d 2d 20 42 69 6f  WriteRaw <-- Bio
0300: 57 72 69 74 65 7c 20 53 53 4c 20 7c 42 49 4f 5f  Write| SSL |BIO_
0310: 77 72 69 74 65 20 3c 2d 2d 20 54 6c 73 4f 75 74  write <-- TlsOut
0320: 70 75 74 50 72 6f 63 20 3c 2d 2d 20 57 72 69 74  putProc <-- Writ
0330: 65 7c 20 20 20 20 20 20 7c 0a 20 20 7c 73 6f 63  e|      |.  |soc
0340: 6b 65 74 7c 20 20 20 20 20 20 3c 65 6e 63 72 79  ket|      <encry
0350: 70 74 65 64 3e 20 20 20 20 20 20 20 20 7c 20 42  pted>        | B
0360: 49 4f 20 7c 20 20 20 20 20 20 20 20 20 20 20 20  IO |            
0370: 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e 20 20 20  <unencrypted>   
0380: 20 20 20 20 20 20 20 20 20 7c 20 41 70 70 20 20           | App  
0390: 7c 0a 20 20 7c 20 20 20 20 20 20 7c 54 63 6c 5f  |.  |      |Tcl_
03a0: 52 65 61 64 52 61 77 20 20 2d 2d 3e 20 20 42 69  ReadRaw  -->  Bi
03b0: 6f 52 65 61 64 7c 20 20 20 20 20 7c 42 49 4f 5f  oRead|     |BIO_
03c0: 52 65 61 64 20 20 2d 2d 3e 20 54 6c 73 49 6e 70  Read  --> TlsInp
03d0: 75 74 50 72 6f 63 20 20 2d 2d 3e 20 20 52 65 61  utProc  -->  Rea
03e0: 64 7c 20 20 20 20 20 20 7c 0a 20 20 2b 2d 2d 2d  d|      |.  +---
03f0: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20  ---+            
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
0410: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20  ---+            
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
0440: 2b 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  +.*/..#include "
0450: 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  tlsInt.h".#inclu
0460: 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a  de <errno.h>../*
0470: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04c0: 0a 20 2a 0a 20 2a 20 54 6c 73 42 6c 6f 63 6b 4d  . *. * TlsBlockM
04d0: 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  odeProc --. *. *
04e0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
04f0: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
0500: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76  e generic IO lev
0510: 65 6c 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65  el to set channe
0520: 6c 20 74 6f 0a 20 2a 09 62 6c 6f 63 6b 69 6e 67  l to. *.blocking
0530: 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20   or nonblocking 
0540: 6d 6f 64 65 2e 20 43 61 6c 6c 65 64 20 62 79 20  mode. Called by 
0550: 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20  the generic I/O 
0560: 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72 0a 20  layer whenever. 
0570: 2a 09 74 68 65 20 54 63 6c 5f 53 65 74 43 68 61  *.the Tcl_SetCha
0580: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 29 20 66 75 6e  nnelOption() fun
0590: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77 69  ction is used wi
05a0: 74 68 20 6f 70 74 69 6f 6e 20 2d 62 6c 6f 63 6b  th option -block
05b0: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ing.. *. * Resul
05c0: 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63  ts:. *.0 if succ
05d0: 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20  essful or POSIX 
05e0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61  error code if fa
05f0: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  iled.. *. * Side
0600: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
0610: 73 20 74 68 65 20 64 65 76 69 63 65 20 69 6e 74  s the device int
0620: 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f  o blocking or no
0630: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  nblocking mode..
0640: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
06a0: 74 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72  t TlsBlockModePr
06b0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  oc(ClientData in
06c0: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20  stanceData, int 
06d0: 6d 6f 64 65 29 20 7b 0a 20 20 20 20 53 74 61 74  mode) {.    Stat
06e0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
06f0: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65  tate *) instance
0700: 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d  Data;..    if (m
0710: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f  ode == TCL_MODE_
0720: 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09  NONBLOCKING) {..
0730: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
0740: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43  |= TLS_TCL_ASYNC
0750: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
0760: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
0770: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59  &= ~(TLS_TCL_ASY
0780: 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NC);.    }.    r
0790: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
07a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 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 0a 20  --------------. 
07f0: 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 72 6f  *. * TlsClosePro
0800: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
0810: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
0820: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  oked by the gene
0830: 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20  ric IO level to 
0840: 70 65 72 66 6f 72 6d 20 63 68 61 6e 6e 65 6c 0a  perform channel.
0850: 20 2a 09 74 79 70 65 20 73 70 65 63 69 66 69 63   *.type specific
0860: 20 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 61 20   cleanup when a 
0870: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
0880: 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73   channel is clos
0890: 65 64 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79  ed.. *.Called by
08a0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f   the generic I/O
08b0: 20 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72 20   layer whenever 
08c0: 74 68 65 20 54 63 6c 5f 43 6c 6f 73 65 28 29 20  the Tcl_Close() 
08d0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 2a 09 75  function is. *.u
08e0: 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  sed.. *. * Resul
08f0: 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63  ts:. *.0 if succ
0900: 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20  essful or POSIX 
0910: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61  error code if fa
0920: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  iled.. *. * Side
0930: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6c 6f   effects:. *.Clo
0940: 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f  ses the socket o
0950: 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20  f the channel.. 
0960: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09b0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
09c0: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 43 6c   TlsCloseProc(Cl
09d0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
09e0: 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  eData, Tcl_Inter
09f0: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
0a00: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
0a10: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
0a20: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20  tanceData;..    
0a30: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73  dprintf("TlsClos
0a40: 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f 69  eProc(%p)", (voi
0a50: 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  d *) statePtr);.
0a60: 0a 20 20 20 20 2f 2a 20 46 6c 75 73 68 20 61 6e  .    /* Flush an
0a70: 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a  y pending data *
0a80: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 73  /..    /* Send s
0a90: 68 75 74 64 6f 77 6e 20 6e 6f 74 69 66 69 63 61  hutdown notifica
0aa0: 74 69 6f 6e 2e 20 57 69 6c 6c 20 72 65 74 75 72  tion. Will retur
0ab0: 6e 20 30 20 77 68 69 6c 65 20 69 6e 20 70 72 6f  n 0 while in pro
0ac0: 63 65 73 73 2c 20 74 68 65 6e 20 31 20 77 68 65  cess, then 1 whe
0ad0: 6e 20 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20  n complete. */. 
0ae0: 20 20 20 2f 2a 20 43 6c 6f 73 65 73 20 74 68 65     /* Closes the
0af0: 20 77 72 69 74 65 20 64 69 72 65 63 74 69 6f 6e   write direction
0b00: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
0b10: 6f 6e 3b 20 74 68 65 20 72 65 61 64 20 64 69 72  on; the read dir
0b20: 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64  ection is closed
0b30: 20 62 79 20 74 68 65 20 70 65 65 72 2e 20 2a 2f   by the peer. */
0b40: 0a 20 20 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74  .    /* Does not
0b50: 20 61 66 66 65 63 74 20 73 6f 63 6b 65 74 20 73   affect socket s
0b60: 74 61 74 65 2e 20 44 6f 6e 27 74 20 63 61 6c 6c  tate. Don't call
0b70: 20 61 66 74 65 72 20 66 61 74 61 6c 20 65 72 72   after fatal err
0b80: 6f 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  or. */.    if (s
0b90: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 21 3d 20  tatePtr->ssl != 
0ba0: 4e 55 4c 4c 20 26 26 20 21 28 73 74 61 74 65 50  NULL && !(stateP
0bb0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
0bc0: 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41  TCL_HANDSHAKE_FA
0bd0: 49 4c 45 44 29 29 20 7b 0a 09 53 53 4c 5f 73 68  ILED)) {..SSL_sh
0be0: 75 74 64 6f 77 6e 28 73 74 61 74 65 50 74 72 2d  utdown(statePtr-
0bf0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >ssl);.    }..  
0c00: 20 20 2f 2a 20 54 6c 73 5f 46 72 65 65 20 63 61    /* Tls_Free ca
0c10: 6c 6c 73 20 54 6c 73 5f 43 6c 65 61 6e 20 2a 2f  lls Tls_Clean */
0c20: 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61  .    Tcl_Eventua
0c30: 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44  llyFree((ClientD
0c40: 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c  ata)statePtr, Tl
0c50: 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 72 65 74  s_Free);.    ret
0c60: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  urn 0;.}../*. *-
0c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0cc0: 20 2a 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63   * TlsClose2Proc
0cd0: 20 2d 2d 0a 20 2a 0a 20 2a 09 53 69 6d 69 6c 61   --. *. *.Simila
0ce0: 72 20 74 6f 20 54 6c 73 43 6c 6f 73 65 50 72 6f  r to TlsClosePro
0cf0: 63 2c 20 62 75 74 20 61 6c 6c 6f 77 73 20 66 6f  c, but allows fo
0d00: 72 20 73 65 70 61 72 61 74 65 20 63 6c 6f 73 65  r separate close
0d10: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 0a   read and write.
0d20: 20 2a 09 73 69 64 65 20 6f 66 20 63 68 61 6e 6e   *.side of chann
0d30: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
0d90: 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32 50  c int TlsClose2P
0da0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
0db0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20  nstanceData,    
0dc0: 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74  /* The socket st
0dd0: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ate. */.    Tcl_
0de0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09  Interp *interp,.
0df0: 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d  ./* For errors -
0e00: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   can be NULL. */
0e10: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09  .    int flags).
0e20: 09 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 6c  ../* Flags to cl
0e30: 6f 73 65 20 72 65 61 64 20 61 6e 64 2f 6f 72 20  ose read and/or 
0e40: 77 72 69 74 65 20 73 69 64 65 20 6f 66 20 63 68  write side of ch
0e50: 61 6e 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53  annel */.{.    S
0e60: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
0e70: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61   (State *) insta
0e80: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  nceData;..    dp
0e90: 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 65 32  rintf("TlsClose2
0ea0: 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f 69 64  Proc(%p)", (void
0eb0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a   *) statePtr);..
0ec0: 20 20 20 20 69 66 20 28 28 66 6c 61 67 73 20 26      if ((flags &
0ed0: 20 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44   (TCL_CLOSE_READ
0ee0: 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45  |TCL_CLOSE_WRITE
0ef0: 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75  )) == 0) {..retu
0f00: 72 6e 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28  rn TlsCloseProc(
0f10: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
0f20: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  terp);.    }.   
0f30: 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a   return EINVAL;.
0f40: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
0fa0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d  WaitForConnect -
0fb0: 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20  -. *. *.Perform 
0fc0: 63 6f 6e 6e 65 63 74 20 28 63 6c 69 65 6e 74 29  connect (client)
0fd0: 20 6f 72 20 61 63 63 65 70 74 20 28 73 65 72 76   or accept (serv
0fe0: 65 72 29 20 66 75 6e 63 74 69 6f 6e 2e 20 41 6c  er) function. Al
0ff0: 73 6f 20 70 65 72 66 6f 72 6d 73 0a 20 2a 09 65  so performs. *.e
1000: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 68 61 6e  quivalent of han
1010: 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 2e  dshake function.
1020: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20  . *. * Result:. 
1030: 2a 20 20 20 20 31 20 69 66 20 73 75 63 63 65 73  *    1 if succes
1040: 73 66 75 6c 2c 20 30 20 69 66 20 77 61 69 74 20  sful, 0 if wait 
1050: 66 6f 72 20 63 6f 6e 6e 65 63 74 2c 20 61 6e 64  for connect, and
1060: 20 2d 31 20 69 66 20 66 61 69 6c 65 64 2e 0a 20   -1 if failed.. 
1070: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1080: 73 3a 0a 20 2a 09 49 73 73 75 65 73 20 53 53 4c  s:. *.Issues SSL
1090: 5f 61 63 63 65 70 74 20 6f 72 20 53 53 4c 5f 63  _accept or SSL_c
10a0: 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  onnect. *. *----
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
1100: 74 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  t Tls_WaitForCon
1110: 6e 65 63 74 28 53 74 61 74 65 20 2a 73 74 61 74  nect(State *stat
1120: 65 50 74 72 2c 20 69 6e 74 20 2a 65 72 72 6f 72  ePtr, int *error
1130: 43 6f 64 65 50 74 72 2c 20 69 6e 74 20 68 61 6e  CodePtr, int han
1140: 64 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50  dshakeFailureIsP
1150: 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 20 20 20 20  ermanent) {.    
1160: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61  unsigned long ba
1170: 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20  ckingError;.    
1180: 69 6e 74 20 65 72 72 2c 20 72 63 20 3d 20 30 3b  int err, rc = 0;
1190: 0a 20 20 20 20 69 6e 74 20 62 69 6f 53 68 6f 75  .    int bioShou
11a0: 6c 64 52 65 74 72 79 3b 0a 20 20 20 20 2a 65 72  ldRetry;.    *er
11b0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
11c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 61  .    dprintf("Wa
11d0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 25 70 29  itForConnect(%p)
11e0: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74  ", (void *) stat
11f0: 65 50 74 72 29 3b 0a 20 20 20 20 64 70 72 69 6e  ePtr);.    dprin
1200: 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29  tFlags(statePtr)
1210: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 20 61 6c  ;..    /* Can al
1220: 73 6f 20 63 68 65 63 6b 20 53 53 4c 5f 69 73 5f  so check SSL_is_
1230: 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73  init_finished(ss
1240: 6c 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 28  l) */.    if (!(
1250: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
1260: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 29  & TLS_TCL_INIT))
1270: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 54 6c 73   {..dprintf("Tls
1280: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
1290: 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 72 65 61 64  called on alread
12a0: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 68  y initialized ch
12b0: 61 6e 6e 65 6c 20 2d 2d 20 72 65 74 75 72 6e 69  annel -- returni
12c0: 6e 67 20 77 69 74 68 20 69 6d 6d 65 64 69 61 74  ng with immediat
12d0: 65 20 73 75 63 63 65 73 73 22 29 3b 0a 09 72 65  e success");..re
12e0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
12f0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
1300: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
1310: 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45  _HANDSHAKE_FAILE
1320: 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 69 66  D) {../*.. * Dif
1330: 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20  ferent types of 
1340: 6f 70 65 72 61 74 69 6f 6e 73 20 68 61 76 65 20  operations have 
1350: 64 69 66 66 65 72 65 6e 74 20 72 65 71 75 69 72  different requir
1360: 65 6d 65 6e 74 73 0a 09 20 2a 20 53 53 4c 20 62  ements.. * SSL b
1370: 65 69 6e 67 20 65 73 74 61 62 6c 69 73 68 65 64  eing established
1380: 0a 09 20 2a 2f 0a 09 69 66 20 28 68 61 6e 64 73  .. */..if (hands
1390: 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72  hakeFailureIsPer
13a0: 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20 20 20 64  manent) {..    d
13b0: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
13c0: 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20   wait for a TLS 
13d0: 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68  handshake that h
13e0: 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65  as already faile
13f0: 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61  d.  Returning fa
1400: 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a 09 20 20  tal error");..  
1410: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
1420: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a  = ECONNABORTED;.
1430: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64  .} else {..    d
1440: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
1450: 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20   wait for a TLS 
1460: 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68  handshake that h
1470: 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65  as already faile
1480: 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 73 6f  d.  Returning so
1490: 66 74 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20  ft error");..   
14a0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
14b0: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 7d 0a   ECONNRESET;..}.
14c0: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65  .Tls_Error(state
14d0: 50 74 72 2c 20 22 57 61 69 74 20 66 6f 72 20 66  Ptr, "Wait for f
14e0: 61 69 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 22  ailed handshake"
14f0: 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20  );..return -1;. 
1500: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 3b     }..    for (;
1510: 3b 29 20 7b 0a 09 45 52 52 5f 63 6c 65 61 72 5f  ;) {..ERR_clear_
1520: 65 72 72 6f 72 28 29 3b 0a 09 42 49 4f 5f 63 6c  error();..BIO_cl
1530: 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 73 28  ear_retry_flags(
1540: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
1550: 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 69 61 6c  ../* Not initial
1560: 69 7a 65 64 20 79 65 74 21 20 41 6c 73 6f 20 63  ized yet! Also c
1570: 61 6c 6c 73 20 53 53 4c 5f 64 6f 5f 68 61 6e 64  alls SSL_do_hand
1580: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20  shake(). */..if 
1590: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
15a0: 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45   & TLS_TCL_SERVE
15b0: 52 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  R) {..    dprint
15c0: 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c 5f 61  f("Calling SSL_a
15d0: 63 63 65 70 74 28 29 22 29 3b 0a 09 20 20 20 20  ccept()");..    
15e0: 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 65 70 74  err = SSL_accept
15f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
1600: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ...} else {..   
1610: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e   dprintf("Callin
1620: 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 29 22  g SSL_connect()"
1630: 29 3b 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53  );..    err = SS
1640: 4c 5f 63 6f 6e 6e 65 63 74 28 73 74 61 74 65 50  L_connect(stateP
1650: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f  tr->ssl);..}.../
1660: 2a 20 31 3d 73 75 63 63 65 73 73 66 75 6c 2c 20  * 1=successful, 
1670: 30 3d 6e 6f 74 20 73 75 63 63 65 73 73 66 75 6c  0=not successful
1680: 20 61 6e 64 20 73 68 75 74 20 64 6f 77 6e 2c 20   and shut down, 
1690: 3c 30 3d 66 61 74 61 6c 20 65 72 72 6f 72 20 2a  <0=fatal error *
16a0: 2f 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29 20  /..if (err > 0) 
16b0: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
16c0: 41 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e 65 63  Accept or connec
16d0: 74 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  t was successful
16e0: 22 29 3b 0a 0a 09 20 20 20 20 65 72 72 20 3d 20  ");...    err = 
16f0: 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50  BIO_flush(stateP
1700: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 69  tr->bio);..    i
1710: 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09  f (err <= 0) {..
1720: 09 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69  .dprintf("Flushi
1730: 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 6c 61 79  ng the lower lay
1740: 65 72 73 20 66 61 69 6c 65 64 2c 20 74 68 69 73  ers failed, this
1750: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 74   will probably t
1760: 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20 73 65  erminate this se
1770: 73 73 69 6f 6e 22 29 3b 0a 09 20 20 20 20 7d 0a  ssion");..    }.
1780: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64  .} else {..    d
1790: 70 72 69 6e 74 66 28 22 41 63 63 65 70 74 20 6f  printf("Accept o
17a0: 72 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64  r connect failed
17b0: 22 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 61 6d 65  ");..}.../* Same
17c0: 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62 75   as SSL_want, bu
17d0: 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68  t also checks th
17e0: 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a 2f  e error queue */
17f0: 0a 09 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65  ..rc = SSL_get_e
1800: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73  rror(statePtr->s
1810: 73 6c 2c 20 65 72 72 29 3b 0a 09 62 61 63 6b 69  sl, err);..backi
1820: 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65  ngError = ERR_ge
1830: 74 5f 65 72 72 6f 72 28 29 3b 0a 09 69 66 20 28  t_error();..if (
1840: 72 63 20 21 3d 20 53 53 4c 5f 45 52 52 4f 52 5f  rc != SSL_ERROR_
1850: 4e 4f 4e 45 29 20 7b 0a 09 20 20 20 20 64 70 72  NONE) {..    dpr
1860: 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a  intf("Got error:
1870: 20 25 69 20 28 72 63 20 3d 20 25 69 29 22 2c 20   %i (rc = %i)", 
1880: 65 72 72 2c 20 72 63 29 3b 0a 09 20 20 20 20 64  err, rc);..    d
1890: 70 72 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f  printf("Got erro
18a0: 72 3a 20 25 73 22 2c 20 45 52 52 5f 72 65 61 73  r: %s", ERR_reas
18b0: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  on_error_string(
18c0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a  backingError));.
18d0: 09 7d 0a 0a 09 2f 2a 20 54 68 65 20 72 65 74 72  .}.../* The retr
18e0: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79  y flag is set by
18f0: 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 65 74   the BIO_set_ret
1900: 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ry_* functions *
1910: 2f 0a 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72  /..bioShouldRetr
1920: 79 20 3d 20 42 49 4f 5f 73 68 6f 75 6c 64 5f 72  y = BIO_should_r
1930: 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62  etry(statePtr->b
1940: 69 6f 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 62  io);..dprintf("b
1950: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20  ioShouldRetry = 
1960: 25 64 22 2c 20 62 69 6f 53 68 6f 75 6c 64 52 65  %d", bioShouldRe
1970: 74 72 79 29 3b 0a 0a 09 69 66 20 28 65 72 72 20  try);...if (err 
1980: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20  <= 0) {..    if 
1990: 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52  (rc == SSL_ERROR
19a0: 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 20 7c 7c  _WANT_CONNECT ||
19b0: 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52   rc == SSL_ERROR
19c0: 5f 57 41 4e 54 5f 41 43 43 45 50 54 29 20 7b 0a  _WANT_ACCEPT) {.
19d0: 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79  ..bioShouldRetry
19e0: 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73   = 1;..    } els
19f0: 65 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f  e if (rc == SSL_
1a00: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 29  ERROR_WANT_READ)
1a10: 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65   {...bioShouldRe
1a20: 74 72 79 20 3d 20 31 3b 0a 09 09 73 74 61 74 65  try = 1;...state
1a30: 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c  Ptr->want |= TCL
1a40: 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20  _READABLE;..    
1a50: 7d 20 65 6c 73 65 20 69 66 20 28 72 63 20 3d 3d  } else if (rc ==
1a60: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
1a70: 57 52 49 54 45 29 20 7b 0a 09 09 62 69 6f 53 68  WRITE) {...bioSh
1a80: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09  ouldRetry = 1;..
1a90: 09 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20  .statePtr->want 
1aa0: 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b  |= TCL_WRITABLE;
1ab0: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
1ac0: 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72  (BIO_should_retr
1ad0: 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  y(statePtr->bio)
1ae0: 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52  ) {...bioShouldR
1af0: 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d  etry = 1;..    }
1b00: 20 65 6c 73 65 20 69 66 20 28 72 63 20 3d 3d 20   else if (rc == 
1b10: 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c  SSL_ERROR_SYSCAL
1b20: 4c 20 26 26 20 54 63 6c 5f 47 65 74 45 72 72 6e  L && Tcl_GetErrn
1b30: 6f 28 29 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b  o() == EAGAIN) {
1b40: 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72  ...bioShouldRetr
1b50: 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d  y = 1;..    }..}
1b60: 0a 0a 09 69 66 20 28 62 69 6f 53 68 6f 75 6c 64  ...if (bioShould
1b70: 52 65 74 72 79 29 20 7b 0a 09 20 20 20 20 64 70  Retry) {..    dp
1b80: 72 69 6e 74 66 28 22 54 68 65 20 49 2f 4f 20 64  rintf("The I/O d
1b90: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  id not complete 
1ba0: 2d 2d 20 62 75 74 20 77 65 20 73 68 6f 75 6c 64  -- but we should
1bb0: 20 74 72 79 20 69 74 20 61 67 61 69 6e 22 29 3b   try it again");
1bc0: 0a 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65  ...    if (state
1bd0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
1be0: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09  _TCL_ASYNC) {...
1bf0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
1c00: 6e 67 20 45 41 47 41 49 4e 20 73 6f 20 74 68 61  ng EAGAIN so tha
1c10: 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 74 72  t it can be retr
1c20: 69 65 64 20 6c 61 74 65 72 22 29 3b 0a 09 09 2a  ied later");...*
1c30: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
1c40: 41 47 41 49 4e 3b 0a 09 09 72 65 74 75 72 6e 20  AGAIN;...return 
1c50: 30 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  0;..    } else {
1c60: 0a 09 09 64 70 72 69 6e 74 66 28 22 44 6f 69 6e  ...dprintf("Doin
1c70: 67 20 73 6f 20 6e 6f 77 22 29 3b 0a 09 09 63 6f  g so now");...co
1c80: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09  ntinue;..    }..
1c90: 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 57 65 20  }...dprintf("We 
1ca0: 68 61 76 65 20 65 69 74 68 65 72 20 63 6f 6d 70  have either comp
1cb0: 6c 65 74 65 6c 79 20 65 73 74 61 62 6c 69 73 68  letely establish
1cc0: 65 64 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f  ed the session o
1cd0: 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 66 61 69  r completely fai
1ce0: 6c 65 64 20 69 74 20 2d 2d 20 74 68 65 72 65 20  led it -- there 
1cf0: 69 73 20 6e 6f 20 6d 6f 72 65 20 6e 65 65 64 20  is no more need 
1d00: 74 6f 20 65 76 65 72 20 72 65 74 72 79 20 69 74  to ever retry it
1d10: 20 74 68 6f 75 67 68 22 29 3b 0a 09 62 72 65 61   though");..brea
1d20: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  k;.    }..    sw
1d30: 69 74 63 68 20 28 72 63 29 20 7b 0a 09 63 61 73  itch (rc) {..cas
1d40: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45  e SSL_ERROR_NONE
1d50: 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 54 4c  :..    /* The TL
1d60: 53 2f 53 53 4c 20 49 2f 4f 20 6f 70 65 72 61 74  S/SSL I/O operat
1d70: 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 73 75  ion completed su
1d80: 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 09 20  ccessfully */.. 
1d90: 20 20 20 64 70 72 69 6e 74 66 28 22 54 68 65 20     dprintf("The 
1da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 67 6f  connection is go
1db0: 6f 64 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  od");..    *erro
1dc0: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20  rCodePtr = 0;.. 
1dd0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
1de0: 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a   SSL_ERROR_SSL:.
1df0: 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65  .    /* A non-re
1e00: 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c  coverable, fatal
1e10: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53   error in the SS
1e20: 4c 20 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72  L library occurr
1e30: 65 64 2c 20 75 73 75 61 6c 6c 79 20 61 20 70 72  ed, usually a pr
1e40: 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a  otocol error */.
1e50: 09 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 63  .    /* This inc
1e60: 6c 75 64 65 73 20 63 65 72 74 69 66 69 63 61 74  ludes certificat
1e70: 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 65 72 72  e validation err
1e80: 6f 72 73 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  ors */..    dpri
1e90: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53  ntf("SSL_ERROR_S
1ea0: 53 4c 3a 20 47 6f 74 20 70 65 72 6d 61 6e 65 6e  SL: Got permanen
1eb0: 74 20 66 61 74 61 6c 20 53 53 4c 20 65 72 72 6f  t fatal SSL erro
1ec0: 72 2c 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d 65  r, aborting imme
1ed0: 64 69 61 74 65 6c 79 22 29 3b 0a 09 20 20 20 20  diately");..    
1ee0: 69 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69  if (SSL_get_veri
1ef0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50  fy_result(stateP
1f00: 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39  tr->ssl) != X509
1f10: 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45  _V_OK) {...Tls_E
1f20: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 58  rror(statePtr, X
1f30: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f  509_verify_cert_
1f40: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c  error_string(SSL
1f50: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75  _get_verify_resu
1f60: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  lt(statePtr->ssl
1f70: 29 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  )));..    }..   
1f80: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f   if (backingErro
1f90: 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f  r != 0) {...Tls_
1fa0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
1fb0: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
1fc0: 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45  _string(backingE
1fd0: 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09  rror));..    }..
1fe0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
1ff0: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48  ags |= TLS_TCL_H
2000: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b  ANDSHAKE_FAILED;
2010: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
2020: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54  Ptr = ECONNABORT
2030: 45 44 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ED;..    return 
2040: 2d 31 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  -1;...case SSL_E
2050: 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20  RROR_SYSCALL:.. 
2060: 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72     /* Some non-r
2070: 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61  ecoverable, fata
2080: 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  l I/O error occu
2090: 72 72 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72  rred */..    dpr
20a0: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f  intf("SSL_ERROR_
20b0: 53 59 53 43 41 4c 4c 22 29 3b 0a 0a 09 20 20 20  SYSCALL");...   
20c0: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f   if (backingErro
20d0: 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20 3d 3d  r == 0 && err ==
20e0: 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28   0) {...dprintf(
20f0: 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09  "EOF reached")..
2100: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
2110: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 54   ECONNRESET;...T
2120: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
2130: 72 2c 20 22 28 75 6e 65 78 70 65 63 74 65 64 29  r, "(unexpected)
2140: 20 45 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a   EOF reached");.
2150: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
2160: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d  (backingError ==
2170: 20 30 20 26 26 20 65 72 72 20 3d 3d 20 2d 31 29   0 && err == -1)
2180: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f   {...dprintf("I/
2190: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  O error occurred
21a0: 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c   (errno = %lu)",
21b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
21c0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29   Tcl_GetErrno())
21d0: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ;...*errorCodePt
21e0: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  r = Tcl_GetErrno
21f0: 28 29 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f 72  ();...if (*error
2200: 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e  CodePtr == ECONN
2210: 52 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20 2a  RESET) {...    *
2220: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
2230: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d  CONNABORTED;...}
2240: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
2250: 74 65 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f  tePtr, Tcl_Errno
2260: 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 74  Msg(*errorCodePt
2270: 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73  r));...    } els
2280: 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49  e {...dprintf("I
2290: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
22a0: 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  d (backingError 
22b0: 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67  = %lu)", backing
22c0: 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72  Error);...*error
22d0: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65  CodePtr = Tcl_Ge
22e0: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28  tErrno();...if (
22f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d  *errorCodePtr ==
2300: 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09   ECONNRESET) {..
2310: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
2320: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45  tr = ECONNABORTE
2330: 44 3b 0a 09 09 7d 0a 09 09 54 6c 73 5f 45 72 72  D;...}...Tls_Err
2340: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 52  or(statePtr, ERR
2350: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74  _reason_error_st
2360: 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f  ring(backingErro
2370: 72 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  r));..    }...  
2380: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67    statePtr->flag
2390: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e  s |= TLS_TCL_HAN
23a0: 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09  DSHAKE_FAILED;..
23b0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a      return -1;..
23c0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
23d0: 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20  ZERO_RETURN:..  
23e0: 20 20 2f 2a 20 50 65 65 72 20 68 61 73 20 63 6c    /* Peer has cl
23f0: 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74  osed the connect
2400: 69 6f 6e 20 62 79 20 73 65 6e 64 69 6e 67 20 74  ion by sending t
2410: 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20  he close_notify 
2420: 61 6c 65 72 74 2e 20 43 61 6e 27 74 20 72 65 61  alert. Can't rea
2430: 64 2c 20 62 75 74 20 63 61 6e 20 77 72 69 74 65  d, but can write
2440: 2e 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 4e 65 65  . */..    /* Nee
2450: 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 45  d to return an E
2460: 4f 46 2c 20 73 6f 20 63 68 61 6e 6e 65 6c 20 69  OF, so channel i
2470: 73 20 63 6c 6f 73 65 64 20 77 68 69 63 68 20 77  s closed which w
2480: 69 6c 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f  ill send an SSL_
2490: 73 68 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09  shutdown(). */..
24a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c      dprintf("SSL
24b0: 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55  _ERROR_ZERO_RETU
24c0: 52 4e 3a 20 43 6f 6e 6e 65 63 74 20 72 65 74 75  RN: Connect retu
24d0: 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
24e0: 76 61 6c 75 65 2e 2e 2e 22 29 3b 0a 09 20 20 20  value...");..   
24f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
2500: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 20 20   ECONNRESET;..  
2510: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74    Tls_Error(stat
2520: 65 50 74 72 2c 20 22 50 65 65 72 20 68 61 73 20  ePtr, "Peer has 
2530: 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65  closed the conne
2540: 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e  ction for writin
2550: 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65  g by sending the
2560: 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c   close_notify al
2570: 65 72 74 22 29 3b 0a 09 20 20 20 20 72 65 74 75  ert");..    retu
2580: 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65 20 53 53  rn -1;...case SS
2590: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41  L_ERROR_WANT_REA
25a0: 44 3a 0a 09 20 20 20 20 2f 2a 20 4d 6f 72 65 20  D:..    /* More 
25b0: 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
25c0: 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
25d0: 6c 79 69 6e 67 20 42 49 4f 20 6c 61 79 65 72 20  lying BIO layer 
25e0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
25f0: 6c 65 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  lete the actual 
2600: 53 53 4c 5f 2a 28 29 20 6f 70 65 72 61 74 69 6f  SSL_*() operatio
2610: 6e 2e 20 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  n.  */..    dpri
2620: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57  ntf("SSL_ERROR_W
2630: 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20 20 20  ANT_READ");..   
2640: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72   BIO_set_retry_r
2650: 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ead(statePtr->bi
2660: 6f 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  o);..    *errorC
2670: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
2680: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45  ..    dprintf("E
2690: 52 52 28 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52  RR(SSL_ERROR_ZER
26a0: 4f 5f 52 45 54 55 52 4e 2c 20 45 41 47 41 49 4e  O_RETURN, EAGAIN
26b0: 29 20 22 29 3b 0a 09 20 20 20 20 73 74 61 74 65  ) ");..    state
26c0: 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c  Ptr->want |= TCL
26d0: 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20  _READABLE;..    
26e0: 72 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65  return 0;...case
26f0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
2700: 57 52 49 54 45 3a 0a 09 20 20 20 20 2f 2a 20 54  WRITE:..    /* T
2710: 68 65 72 65 20 69 73 20 64 61 74 61 20 69 6e 20  here is data in 
2720: 74 68 65 20 53 53 4c 20 62 75 66 66 65 72 20 74  the SSL buffer t
2730: 68 61 74 20 6d 75 73 74 20 62 65 20 77 72 69 74  hat must be writ
2740: 74 65 6e 20 74 6f 20 74 68 65 20 75 6e 64 65 72  ten to the under
2750: 6c 79 69 6e 67 20 42 49 4f 20 69 6e 20 6f 72 64  lying BIO in ord
2760: 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
2770: 68 65 20 53 53 4c 5f 2a 28 29 20 6f 70 65 72 61  he SSL_*() opera
2780: 74 69 6f 6e 2e 20 2a 2f 0a 09 20 20 20 20 64 70  tion. */..    dp
2790: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52  rintf("SSL_ERROR
27a0: 5f 57 41 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09  _WANT_WRITE");..
27b0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72      BIO_set_retr
27c0: 79 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72  y_write(statePtr
27d0: 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 2a 65 72  ->bio);..    *er
27e0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47  rorCodePtr = EAG
27f0: 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74  AIN;..    dprint
2800: 66 28 22 45 52 52 28 53 53 4c 5f 45 52 52 4f 52  f("ERR(SSL_ERROR
2810: 5f 57 41 4e 54 5f 57 52 49 54 45 2c 20 45 41 47  _WANT_WRITE, EAG
2820: 41 49 4e 29 20 22 29 3b 0a 09 20 20 20 20 73 74  AIN) ");..    st
2830: 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20  atePtr->want |= 
2840: 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20  TCL_WRITABLE;.. 
2850: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 63     return 0;...c
2860: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
2870: 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09 20 20 20  NT_CONNECT:..   
2880: 20 2f 2a 20 43 6f 6e 6e 65 63 74 20 77 6f 75 6c   /* Connect woul
2890: 64 20 68 61 76 65 20 62 6c 6f 63 6b 65 64 2e 20  d have blocked. 
28a0: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
28b0: 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f  "SSL_ERROR_WANT_
28c0: 43 4f 4e 4e 45 43 54 22 29 3b 0a 09 20 20 20 20  CONNECT");..    
28d0: 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 73 70  BIO_set_retry_sp
28e0: 65 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d 3e  ecial(statePtr->
28f0: 62 69 6f 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73  bio);..    BIO_s
2900: 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e 28  et_retry_reason(
2910: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 42  statePtr->bio, B
2920: 49 4f 5f 52 52 5f 43 4f 4e 4e 45 43 54 29 3b 0a  IO_RR_CONNECT);.
2930: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
2940: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
2950: 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 53    dprintf("ERR(S
2960: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f  SL_ERROR_WANT_CO
2970: 4e 4e 45 43 54 2c 20 45 41 47 41 49 4e 29 20 22  NNECT, EAGAIN) "
2980: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30  );..    return 0
2990: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
29a0: 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 3a 0a  OR_WANT_ACCEPT:.
29b0: 09 20 20 20 20 2f 2a 20 41 63 63 65 70 74 20 77  .    /* Accept w
29c0: 6f 75 6c 64 20 68 61 76 65 20 62 6c 6f 63 6b 65  ould have blocke
29d0: 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  d */..    dprint
29e0: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  f("SSL_ERROR_WAN
29f0: 54 5f 41 43 43 45 50 54 22 29 3b 0a 09 20 20 20  T_ACCEPT");..   
2a00: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 73   BIO_set_retry_s
2a10: 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d  pecial(statePtr-
2a20: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42 49 4f 5f  >bio);..    BIO_
2a30: 73 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e  set_retry_reason
2a40: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20  (statePtr->bio, 
2a50: 42 49 4f 5f 52 52 5f 41 43 43 45 50 54 29 3b 0a  BIO_RR_ACCEPT);.
2a60: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
2a70: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
2a80: 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 53    dprintf("ERR(S
2a90: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43  SL_ERROR_WANT_AC
2aa0: 43 45 50 54 2c 20 45 41 47 41 49 4e 29 20 22 29  CEPT, EAGAIN) ")
2ab0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ;..    return 0;
2ac0: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
2ad0: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b  R_WANT_X509_LOOK
2ae0: 55 50 3a 0a 09 20 20 20 20 2f 2a 20 41 70 70 20  UP:..    /* App 
2af0: 63 61 6c 6c 62 61 63 6b 20 73 65 74 20 62 79 20  callback set by 
2b00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
2b10: 6e 74 5f 63 65 72 74 5f 63 62 20 68 61 73 20 61  nt_cert_cb has a
2b20: 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  sked to be calle
2b30: 64 20 61 67 61 69 6e 20 2a 2f 0a 09 20 20 20 20  d again */..    
2b40: 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  /* The operation
2b50: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
2b60: 65 20 62 65 63 61 75 73 65 20 61 6e 20 61 70 70  e because an app
2b70: 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  lication callbac
2b80: 6b 20 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58  k set by SSL_CTX
2b90: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74  _set_client_cert
2ba0: 5f 63 62 28 29 20 68 61 73 20 61 73 6b 65 64 20  _cb() has asked 
2bb0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61  to be called aga
2bc0: 69 6e 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  in. */..    dpri
2bd0: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57  ntf("SSL_ERROR_W
2be0: 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 22  ANT_X509_LOOKUP"
2bf0: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f  );..    BIO_set_
2c00: 72 65 74 72 79 5f 73 70 65 63 69 61 6c 28 73 74  retry_special(st
2c10: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20  atePtr->bio);.. 
2c20: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
2c30: 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72  _reason(statePtr
2c40: 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52 5f 53 53  ->bio, BIO_RR_SS
2c50: 4c 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 29 3b 0a  L_X509_LOOKUP);.
2c60: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
2c70: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
2c80: 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 53    dprintf("ERR(S
2c90: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
2ca0: 30 39 5f 4c 4f 4f 4b 55 50 2c 20 45 41 47 41 49  09_LOOKUP, EAGAI
2cb0: 4e 29 20 22 29 3b 0a 09 20 20 20 20 72 65 74 75  N) ");..    retu
2cc0: 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c  rn 0;...case SSL
2cd0: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e  _ERROR_WANT_ASYN
2ce0: 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20  C:..    /* Used 
2cf0: 77 69 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f  with flag SSL_MO
2d00: 44 45 5f 41 53 59 4e 43 2c 20 6f 70 20 64 69 64  DE_ASYNC, op did
2d10: 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  n't complete bec
2d20: 61 75 73 65 20 61 6e 20 61 73 79 6e 63 20 65 6e  ause an async en
2d30: 67 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72  gine is still pr
2d40: 6f 63 65 73 73 69 6e 67 20 64 61 74 61 20 2a 2f  ocessing data */
2d50: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
2d60: 5f 57 41 4e 54 5f 41 53 59 4e 43 5f 4a 4f 42 3a  _WANT_ASYNC_JOB:
2d70: 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 61 73 79  ..    /* The asy
2d80: 6e 63 68 72 6f 6e 6f 75 73 20 6a 6f 62 20 63 6f  nchronous job co
2d90: 75 6c 64 20 6e 6f 74 20 62 65 20 73 74 61 72 74  uld not be start
2da0: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 72 65  ed because there
2db0: 20 77 65 72 65 20 6e 6f 20 61 73 79 6e 63 20 6a   were no async j
2dc0: 6f 62 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  obs available in
2dd0: 20 74 68 65 20 70 6f 6f 6c 2e 20 2a 2f 0a 09 63   the pool. */..c
2de0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
2df0: 4e 54 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  NT_CLIENT_HELLO_
2e00: 43 42 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20  CB:..    /* The 
2e10: 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f  operation did no
2e20: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
2e30: 73 65 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f  se an applicatio
2e40: 6e 20 63 61 6c 6c 62 61 63 6b 20 73 65 74 20 62  n callback set b
2e50: 79 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  y SSL_CTX_set_cl
2e60: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 29 20  ient_hello_cb() 
2e70: 68 61 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20  has asked to be 
2e80: 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f  called again. */
2e90: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
2ea0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
2eb0: 78 33 30 30 30 30 30 30 30 4c 0a 09 63 61 73 65  x30000000L..case
2ec0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
2ed0: 52 45 54 52 59 5f 56 45 52 49 46 59 3a 0a 09 20  RETRY_VERIFY:.. 
2ee0: 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74     /* The operat
2ef0: 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70  ion did not comp
2f00: 6c 65 74 65 20 62 65 63 61 75 73 65 20 61 20 63  lete because a c
2f10: 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66  ertificate verif
2f20: 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ication callback
2f30: 20 68 61 73 20 61 73 6b 65 64 20 74 6f 20 62 65   has asked to be
2f40: 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 76 69   called again vi
2f50: 61 20 53 53 4c 5f 73 65 74 5f 72 65 74 72 79 5f  a SSL_set_retry_
2f60: 76 65 72 69 66 79 28 33 29 2e 20 2a 2f 0a 23 65  verify(3). */.#e
2f70: 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09  ndif..default:..
2f80: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61      /* The opera
2f90: 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d  tion did not com
2fa0: 70 6c 65 74 65 20 61 6e 64 20 73 68 6f 75 6c 64  plete and should
2fb0: 20 62 65 20 72 65 74 72 69 65 64 20 6c 61 74 65   be retried late
2fc0: 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  r. */..    dprin
2fd0: 74 66 28 22 4f 70 65 72 61 74 69 6f 6e 20 64 69  tf("Operation di
2fe0: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 2c 20  d not complete, 
2ff0: 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61 67  call function ag
3000: 61 69 6e 20 6c 61 74 65 72 22 29 3b 0a 09 20 20  ain later");..  
3010: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
3020: 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64  = EAGAIN;..    d
3030: 70 72 69 6e 74 66 28 22 45 52 52 28 4f 74 68 65  printf("ERR(Othe
3040: 72 2c 20 45 41 47 41 49 4e 29 20 22 29 3b 0a 09  r, EAGAIN) ");..
3050: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3060: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
3070: 28 22 52 65 6d 6f 76 69 6e 67 20 74 68 65 20 5c  ("Removing the \
3080: 22 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 5c 22 20  "TLS_TCL_INIT\" 
3090: 66 6c 61 67 20 73 69 6e 63 65 20 77 65 20 68 61  flag since we ha
30a0: 76 65 20 63 6f 6d 70 6c 65 74 65 64 20 74 68 65  ve completed the
30b0: 20 68 61 6e 64 73 68 61 6b 65 22 29 3b 0a 20 20   handshake");.  
30c0: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67    statePtr->flag
30d0: 73 20 26 3d 20 7e 54 4c 53 5f 54 43 4c 5f 49 4e  s &= ~TLS_TCL_IN
30e0: 49 54 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  IT;..    dprintf
30f0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 63  ("Returning succ
3100: 65 73 73 22 29 3b 0a 20 20 20 20 2a 65 72 72 6f  ess");.    *erro
3110: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 20 20  rCodePtr = 0;.  
3120: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
3130: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 49 6e 70 75 74  -. *. * TlsInput
3190: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
31a0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
31b0: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67  invoked by the g
31c0: 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72  eneric I/O layer
31d0: 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72   to read data fr
31e0: 6f 6d 0a 20 2a 09 74 68 65 20 42 49 4f 20 77 68  om. *.the BIO wh
31f0: 65 6e 65 76 65 72 20 74 68 65 20 54 63 6c 5f 52  enever the Tcl_R
3200: 65 61 64 28 29 2c 20 54 63 6c 5f 52 65 61 64 43  ead(), Tcl_ReadC
3210: 68 61 72 73 2c 20 54 63 6c 5f 47 65 74 73 2c 20  hars, Tcl_Gets, 
3220: 61 6e 64 0a 20 2a 09 54 63 6c 5f 47 65 74 73 4f  and. *.Tcl_GetsO
3230: 62 6a 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  bj functions are
3240: 20 75 73 65 64 2e 20 45 71 75 69 76 61 6c 65 6e   used. Equivalen
3250: 74 20 74 6f 20 53 53 4c 5f 72 65 61 64 5f 65 78  t to SSL_read_ex
3260: 20 61 6e 64 20 53 53 4c 5f 72 65 61 64 2e 0a 20   and SSL_read.. 
3270: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
3280: 09 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d  .Returns the num
3290: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
32a0: 64 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72  d or -1 on error
32b0: 2e 20 53 65 74 73 20 65 72 72 6f 72 43 6f 64 65  . Sets errorCode
32c0: 50 74 72 20 74 6f 0a 20 2a 09 61 20 50 4f 53 49  Ptr to. *.a POSI
32d0: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  X error code if 
32e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
32f0: 64 2c 20 6f 72 20 30 20 69 66 20 6e 6f 6e 65 2e  d, or 0 if none.
3300: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3310: 63 74 73 3a 0a 20 2a 09 52 65 61 64 73 20 69 6e  cts:. *.Reads in
3320: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  put from the inp
3330: 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 68 65  ut device of the
3340: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20   channel.. *. * 
3350: 44 61 74 61 20 69 73 20 72 65 63 65 69 76 65 64  Data is received
3360: 20 69 6e 20 77 68 6f 6c 65 20 62 6c 6f 63 6b 73   in whole blocks
3370: 20 6b 6e 6f 77 6e 20 61 73 20 72 65 63 6f 72 64   known as record
3380: 73 20 66 72 6f 6d 20 74 68 65 20 70 65 65 72 2e  s from the peer.
3390: 20 41 20 77 68 6f 6c 65 0a 20 2a 20 72 65 63 6f   A whole. * reco
33a0: 72 64 20 69 73 20 70 72 6f 63 65 73 73 65 64 20  rd is processed 
33b0: 28 65 2e 67 2e 20 64 65 63 72 79 70 74 65 64 29  (e.g. decrypted)
33c0: 20 69 6e 20 6f 6e 65 20 67 6f 20 61 6e 64 20 69   in one go and i
33d0: 73 20 62 75 66 66 65 72 65 64 20 62 79 20 4f 70  s buffered by Op
33e0: 65 6e 53 53 4c 0a 20 2a 20 75 6e 74 69 6c 20 69  enSSL. * until i
33f0: 74 20 69 73 20 72 65 61 64 20 62 79 20 74 68 65  t is read by the
3400: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 76 69 61   application via
3410: 20 61 20 63 61 6c 6c 20 74 6f 20 53 53 4c 5f 72   a call to SSL_r
3420: 65 61 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ead.. *. *------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
3480: 69 63 20 69 6e 74 20 54 6c 73 49 6e 70 75 74 50  ic int TlsInputP
3490: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
34a0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 63 68 61  nstanceData, cha
34b0: 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 53  r *buf, int bufS
34c0: 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43  ize, int *errorC
34d0: 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 75 6e  odePtr) {.    un
34e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b  signed long back
34f0: 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20 53 74  ingError;.    St
3500: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
3510: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
3520: 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  ceData;.    int 
3530: 62 79 74 65 73 52 65 61 64 2c 20 65 72 72 3b 0a  bytesRead, err;.
3540: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
3550: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  r = 0;..    dpri
3560: 6e 74 66 28 22 52 65 61 64 28 25 64 29 22 2c 20  ntf("Read(%d)", 
3570: 62 75 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 2f  bufSize);..    /
3580: 2a 20 53 6b 69 70 20 69 66 20 75 73 65 72 20 76  * Skip if user v
3590: 65 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69  erify callback i
35a0: 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20  s still running 
35b0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
35c0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
35d0: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b  _TCL_CALLBACK) {
35e0: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62  ..dprintf("Callb
35f0: 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20  ack is running, 
3600: 72 65 61 64 69 6e 67 20 30 20 62 79 74 65 73 22  reading 0 bytes"
3610: 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  );..return 0;.  
3620: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
3630: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ot initialized, 
3640: 64 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20  do connect */.  
3650: 20 20 2f 2a 20 43 61 6e 20 61 6c 73 6f 20 63 68    /* Can also ch
3660: 65 63 6b 20 53 53 4c 5f 69 73 5f 69 6e 69 74 5f  eck SSL_is_init_
3670: 66 69 6e 69 73 68 65 64 28 73 73 6c 29 20 2a 2f  finished(ssl) */
3680: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
3690: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
36a0: 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 69 6e 74 20  CL_INIT) {..int 
36b0: 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70  tlsConnect;...dp
36c0: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54  rintf("Calling T
36d0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
36e0: 74 22 29 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63  t");...tlsConnec
36f0: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  t = Tls_WaitForC
3700: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c  onnect(statePtr,
3710: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 30   errorCodePtr, 0
3720: 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f 6e 6e 65  );..if (tlsConne
3730: 63 74 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 64  ct < 0) {..    d
3740: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65  printf("Got an e
3750: 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f 20  rror waiting to 
3760: 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e  connect (tlsConn
3770: 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72  ect = %i, *error
3780: 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c 20  CodePtr = %i)", 
3790: 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72  tlsConnect, *err
37a0: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a 09 20 20  orCodePtr);...  
37b0: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31    bytesRead = -1
37c0: 3b 0a 09 20 20 20 20 69 66 20 28 2a 65 72 72 6f  ;..    if (*erro
37d0: 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e  rCodePtr == ECON
37e0: 4e 52 45 53 45 54 29 20 7b 0a 09 09 64 70 72 69  NRESET) {...dpri
37f0: 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74  ntf("Got connect
3800: 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 2f  ion reset");.../
3810: 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 09  * Soft EOF */...
3820: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3830: 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d  0;...bytesRead =
3840: 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20   0;..    }..    
3850: 72 65 74 75 72 6e 20 62 79 74 65 73 52 65 61 64  return bytesRead
3860: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
3870: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65  /*.     * We nee
3880: 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53  d to clear the S
3890: 53 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e  SL error stack n
38a0: 6f 77 20 62 65 63 61 75 73 65 20 77 65 20 73 6f  ow because we so
38b0: 6d 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20  metimes reach.  
38c0: 20 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69     * this functi
38d0: 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72  on with leftover
38e0: 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73   errors in the s
38f0: 74 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 72 65  tack.  If BIO_re
3900: 61 64 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e  ad.     * return
3910: 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73  s -1 and intends
3920: 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69   EAGAIN, there i
3930: 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72  s a leftover err
3940: 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20  or, it will be. 
3950: 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75      * misconstru
3960: 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20  ed as an error, 
3970: 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20  not EAGAIN..    
3980: 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e   *.     * Altern
3990: 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20  atively, we may 
39a0: 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74  want to handle t
39b0: 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64  he <0 return cod
39c0: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42  es from.     * B
39d0: 49 4f 5f 72 65 61 64 20 73 70 65 63 69 61 6c 6c  IO_read speciall
39e0: 79 20 28 61 73 20 61 64 76 69 73 65 64 20 69 6e  y (as advised in
39f0: 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20   the RSA docs). 
3a00: 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76   TLS's lower lev
3a10: 65 6c 20 42 49 4f 0a 20 20 20 20 20 2a 20 66 75  el BIO.     * fu
3a20: 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74  nctions play wit
3a30: 68 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 67  h the retry flag
3a40: 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68  s though, and th
3a50: 69 73 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b  is seems to work
3a60: 0a 20 20 20 20 20 2a 20 63 6f 72 72 65 63 74 6c  .     * correctl
3a70: 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20  y.  Similar fix 
3a80: 69 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63  in TlsOutputProc
3a90: 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a  . - hobbs.     *
3aa0: 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  /.    ERR_clear_
3ab0: 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f  error();.    BIO
3ac0: 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c 61  _clear_retry_fla
3ad0: 67 73 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  gs(statePtr->bio
3ae0: 29 3b 0a 20 20 20 20 62 79 74 65 73 52 65 61 64  );.    bytesRead
3af0: 20 3d 20 42 49 4f 5f 72 65 61 64 28 73 74 61 74   = BIO_read(stat
3b00: 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20  ePtr->bio, buf, 
3b10: 62 75 66 53 69 7a 65 29 3b 0a 20 20 20 20 64 70  bufSize);.    dp
3b20: 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 61 64 20  rintf("BIO_read 
3b30: 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52 65 61  -> %d", bytesRea
3b40: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 61 6d 65  d);..    /* Same
3b50: 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62 75   as SSL_want, bu
3b60: 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68  t also checks th
3b70: 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a 2f  e error queue */
3b80: 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 67  .    err = SSL_g
3b90: 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74  et_error(statePt
3ba0: 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61  r->ssl, bytesRea
3bb0: 64 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67 45  d);.    backingE
3bc0: 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65  rror = ERR_get_e
3bd0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 66 20  rror();..    if 
3be0: 28 62 79 74 65 73 52 65 61 64 20 3c 3d 20 30 29  (bytesRead <= 0)
3bf0: 20 7b 0a 09 2f 2a 20 54 68 65 20 72 65 74 72 79   {../* The retry
3c00: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
3c10: 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 65 74 72  the BIO_set_retr
3c20: 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  y_* functions */
3c30: 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64  ..if (BIO_should
3c40: 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d  _retry(statePtr-
3c50: 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70  >bio)) {..    dp
3c60: 72 69 6e 74 66 28 22 52 65 61 64 20 66 61 69 6c  rintf("Read fail
3c70: 65 64 20 77 69 74 68 20 63 6f 64 65 3d 25 64 2c  ed with code=%d,
3c80: 20 62 79 74 65 73 20 72 65 61 64 3d 25 64 3a 20   bytes read=%d: 
3c90: 73 68 6f 75 6c 64 20 72 65 74 72 79 22 2c 20 65  should retry", e
3ca0: 72 72 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a  rr, bytesRead);.
3cb0: 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 64 6f 63  .    /* Some doc
3cc0: 73 20 69 6d 70 6c 79 20 77 65 20 73 68 6f 75 6c  s imply we shoul
3cd0: 64 20 72 65 64 6f 20 74 68 65 20 42 49 4f 5f 72  d redo the BIO_r
3ce0: 65 61 64 20 6e 6f 77 20 2a 2f 0a 09 7d 20 65 6c  ead now */..} el
3cf0: 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  se {..    dprint
3d00: 66 28 22 52 65 61 64 20 66 61 69 6c 65 64 20 77  f("Read failed w
3d10: 69 74 68 20 63 6f 64 65 3d 25 64 2c 20 62 79 74  ith code=%d, byt
3d20: 65 73 20 72 65 61 64 3d 25 64 3a 20 65 72 72 6f  es read=%d: erro
3d30: 72 20 63 6f 6e 64 69 74 69 6f 6e 22 2c 20 65 72  r condition", er
3d40: 72 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a 09  r, bytesRead);..
3d50: 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  }...dprintf("BIO
3d60: 20 69 73 20 45 4f 46 20 25 64 22 2c 20 42 49 4f   is EOF %d", BIO
3d70: 5f 65 6f 66 28 73 74 61 74 65 50 74 72 2d 3e 62  _eof(statePtr->b
3d80: 69 6f 29 29 3b 0a 0a 09 2f 2a 20 54 68 65 73 65  io));.../* These
3d90: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
3da0: 20 42 49 4f 5f 72 65 74 72 79 5f 74 79 70 65 20   BIO_retry_type 
3db0: 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75  */..if (BIO_shou
3dc0: 6c 64 5f 72 65 61 64 28 73 74 61 74 65 50 74 72  ld_read(statePtr
3dd0: 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64  ->bio)) {..    d
3de0: 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20  printf("BIO has 
3df0: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 64 61 74  insufficient dat
3e00: 61 20 74 6f 20 72 65 61 64 20 61 6e 64 20 72 65  a to read and re
3e10: 74 75 72 6e 22 29 3b 0a 09 20 20 20 20 73 74 61  turn");..    sta
3e20: 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54  tePtr->want |= T
3e30: 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 7d 0a  CL_READABLE;..}.
3e40: 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f  .if (BIO_should_
3e50: 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e  write(statePtr->
3e60: 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72  bio)) {..    dpr
3e70: 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20 70 65  intf("BIO has pe
3e80: 6e 64 69 6e 67 20 64 61 74 61 20 74 6f 20 77 72  nding data to wr
3e90: 69 74 65 22 29 3b 0a 09 20 20 20 20 73 74 61 74  ite");..    stat
3ea0: 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43  ePtr->want |= TC
3eb0: 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 7d 0a 09  L_WRITABLE;..}..
3ec0: 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 69  if (BIO_should_i
3ed0: 6f 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65 50  o_special(stateP
3ee0: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20  tr->bio)) {..   
3ef0: 20 69 6e 74 20 72 65 61 73 6f 6e 20 3d 20 42 49   int reason = BI
3f00: 4f 5f 67 65 74 5f 72 65 74 72 79 5f 72 65 61 73  O_get_retry_reas
3f10: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  on(statePtr->bio
3f20: 29 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
3f30: 22 42 49 4f 20 68 61 73 20 73 6f 6d 65 20 73 70  "BIO has some sp
3f40: 65 63 69 61 6c 20 63 6f 6e 64 69 74 69 6f 6e 20  ecial condition 
3f50: 6f 74 68 65 72 20 74 68 61 6e 20 72 65 61 64 20  other than read 
3f60: 6f 72 20 77 72 69 74 65 3a 20 63 6f 64 65 3d 25  or write: code=%
3f70: 64 22 2c 20 72 65 61 73 6f 6e 29 3b 0a 09 7d 0a  d", reason);..}.
3f80: 09 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61  .dprintf("BIO ha
3f90: 73 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 74  s pending data t
3fa0: 6f 20 77 72 69 74 65 22 29 3b 0a 20 20 20 20 7d  o write");.    }
3fb0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 65 72  ..    switch (er
3fc0: 72 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45  r) {..case SSL_E
3fd0: 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20  RROR_NONE:..    
3fe0: 2f 2a 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e  /* I/O operation
3ff0: 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 09 20   completed */.. 
4000: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
4010: 45 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09 20  ERROR_NONE");.. 
4020: 20 20 20 64 70 72 69 6e 74 42 75 66 66 65 72 28     dprintBuffer(
4030: 62 75 66 2c 20 62 79 74 65 73 52 65 61 64 29 3b  buf, bytesRead);
4040: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
4050: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53  ase SSL_ERROR_SS
4060: 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e  L:..    /* A non
4070: 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61  -recoverable, fa
4080: 74 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 68 65  tal error in the
4090: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 63 63   SSL library occ
40a0: 75 72 72 65 64 2c 20 75 73 75 61 6c 6c 79 20 61  urred, usually a
40b0: 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20   protocol error 
40c0: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
40d0: 22 53 53 4c 20 65 72 72 6f 72 2c 20 69 6e 64 69  "SSL error, indi
40e0: 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
40f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 62  connection has b
4100: 65 65 6e 20 61 62 6f 72 74 65 64 22 29 3b 0a 09  een aborted");..
4110: 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45      if (backingE
4120: 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09 54  rror != 0) {...T
4130: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4140: 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72  r, ERR_reason_er
4150: 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69  ror_string(backi
4160: 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20  ngError));..    
4170: 7d 20 65 6c 73 65 20 69 66 20 28 53 53 4c 5f 67  } else if (SSL_g
4180: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
4190: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  (statePtr->ssl) 
41a0: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a  != X509_V_OK) {.
41b0: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
41c0: 65 50 74 72 2c 20 58 35 30 39 5f 76 65 72 69 66  ePtr, X509_verif
41d0: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72  y_cert_error_str
41e0: 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69  ing(SSL_get_veri
41f0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50  fy_result(stateP
4200: 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20  tr->ssl)));..   
4210: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f   } else {...Tls_
4220: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
4230: 22 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72  "Unknown SSL err
4240: 6f 72 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  or");..    }..  
4250: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
4260: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a  = ECONNABORTED;.
4270: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
4280: 20 2d 31 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53   -1;..#if OPENSS
4290: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
42a0: 20 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c 0a   >= 0x30000000L.
42b0: 09 20 20 20 20 2f 2a 20 55 6e 65 78 70 65 63 74  .    /* Unexpect
42c0: 65 64 20 45 4f 46 20 66 72 6f 6d 20 74 68 65 20  ed EOF from the 
42d0: 70 65 65 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c  peer for OpenSSL
42e0: 20 33 2e 30 2b 20 2a 2f 0a 09 20 20 20 20 69 66   3.0+ */..    if
42f0: 20 28 45 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e   (ERR_GET_REASON
4300: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 20 3d  (backingError) =
4310: 3d 20 53 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54  = SSL_R_UNEXPECT
4320: 45 44 5f 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41  ED_EOF_WHILE_REA
4330: 44 49 4e 47 29 20 7b 0a 09 09 64 70 72 69 6e 74  DING) {...dprint
4340: 66 28 22 28 55 6e 65 78 70 65 63 74 65 64 29 20  f("(Unexpected) 
4350: 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09  EOF reached")...
4360: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
4370: 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d  0;...bytesRead =
4380: 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28   0;...Tls_Error(
4390: 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72  statePtr, "EOF r
43a0: 65 61 63 68 65 64 22 29 3b 0a 09 20 20 20 20 7d  eached");..    }
43b0: 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 62 72 65  .#endif..    bre
43c0: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
43d0: 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a  RROR_WANT_READ:.
43e0: 09 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 20 6e  .    /* Op did n
43f0: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20  ot complete due 
4400: 74 6f 20 6e 6f 74 20 65 6e 6f 75 67 68 20 64 61  to not enough da
4410: 74 61 20 77 61 73 20 61 76 61 69 6c 61 62 6c 65  ta was available
4420: 2e 20 52 65 74 72 79 20 6c 61 74 65 72 2e 20 2a  . Retry later. *
4430: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
4440: 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  Got SSL_ERROR_WA
4450: 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 6e 67  NT_READ, mapping
4460: 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22   this to EAGAIN"
4470: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
4480: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
4490: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
44a0: 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 65 50   -1;..    stateP
44b0: 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f  tr->want |= TCL_
44c0: 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 42  READABLE;..    B
44d0: 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61  IO_set_retry_rea
44e0: 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  d(statePtr->bio)
44f0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
4500: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57  case SSL_ERROR_W
4510: 41 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 20  ANT_WRITE:..    
4520: 2f 2a 20 4f 70 20 64 69 64 20 6e 6f 74 20 63 6f  /* Op did not co
4530: 6d 70 6c 65 74 65 20 64 75 65 20 74 6f 20 75 6e  mplete due to un
4540: 61 62 6c 65 20 74 6f 20 73 65 6e 64 20 61 6c 6c  able to send all
4550: 20 64 61 74 61 20 74 6f 20 74 68 65 20 42 49 4f   data to the BIO
4560: 2e 20 52 65 74 72 79 20 6c 61 74 65 72 2e 20 2a  . Retry later. *
4570: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
4580: 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  Got SSL_ERROR_WA
4590: 4e 54 5f 57 52 49 54 45 2c 20 6d 61 70 70 69 6e  NT_WRITE, mappin
45a0: 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e  g this to EAGAIN
45b0: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
45c0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
45d0: 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20  ..    bytesRead 
45e0: 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 65  = -1;..    state
45f0: 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c  Ptr->want |= TCL
4600: 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 20 20  _WRITABLE;..    
4610: 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77 72  BIO_set_retry_wr
4620: 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ite(statePtr->bi
4630: 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  o);..    break;.
4640: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
4650: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55  _WANT_X509_LOOKU
4660: 50 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 20 64 69  P:..    /* Op di
4670: 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 73 69  dn't complete si
4680: 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 73 65 74  nce callback set
4690: 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f   by SSL_CTX_set_
46a0: 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62 28 29  client_cert_cb()
46b0: 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c   asked to be cal
46c0: 6c 65 64 20 61 67 61 69 6e 20 2a 2f 0a 09 20 20  led again */..  
46d0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53    dprintf("Got S
46e0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
46f0: 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d 61 70 70 69  09_LOOKUP, mappi
4700: 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e 22  ng it to EAGAIN"
4710: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
4720: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
4730: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
4740: 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b   -1;..    break;
4750: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
4760: 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20  R_SYSCALL:..    
4770: 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f  /* Some non-reco
4780: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49  verable, fatal I
4790: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
47a0: 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  d */..    dprint
47b0: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53  f("SSL_ERROR_SYS
47c0: 43 41 4c 4c 22 29 3b 0a 0a 09 20 20 20 20 69 66  CALL");...    if
47d0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d   (backingError =
47e0: 3d 20 30 20 26 26 20 62 79 74 65 73 52 65 61 64  = 0 && bytesRead
47f0: 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 55 6e   == 0) {.../* Un
4800: 65 78 70 65 63 74 65 64 20 45 4f 46 20 66 72 6f  expected EOF fro
4810: 6d 20 74 68 65 20 70 65 65 72 20 66 6f 72 20 4f  m the peer for O
4820: 70 65 6e 53 53 4c 20 31 2e 31 20 2a 2f 0a 09 09  penSSL 1.1 */...
4830: 64 70 72 69 6e 74 66 28 22 28 55 6e 65 78 70 65  dprintf("(Unexpe
4840: 63 74 65 64 29 20 45 4f 46 20 72 65 61 63 68 65  cted) EOF reache
4850: 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65  d")...*errorCode
4860: 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73  Ptr = 0;...bytes
4870: 52 65 61 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f  Read = 0;...Tls_
4880: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
4890: 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a  "EOF reached");.
48a0: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
48b0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d  (backingError ==
48c0: 20 30 20 26 26 20 62 79 74 65 73 52 65 61 64 20   0 && bytesRead 
48d0: 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e  == -1) {...dprin
48e0: 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63  tf("I/O error oc
48f0: 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20  curred (errno = 
4900: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
4910: 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72   long) Tcl_GetEr
4920: 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72  rno());...*error
4930: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65  CodePtr = Tcl_Ge
4940: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74 65  tErrno();...byte
4950: 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 54 6c  sRead = -1;...Tl
4960: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
4970: 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a  , Tcl_ErrnoMsg(*
4980: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a  errorCodePtr));.
4990: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
49a0: 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72  .dprintf("I/O er
49b0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 61  ror occurred (ba
49c0: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75  ckingError = %lu
49d0: 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  )", backingError
49e0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  );...*errorCodeP
49f0: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e  tr = Tcl_GetErrn
4a00: 6f 28 29 3b 0a 09 09 62 79 74 65 73 52 65 61 64  o();...bytesRead
4a10: 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 72   = -1;...Tls_Err
4a20: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 52  or(statePtr, ERR
4a30: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74  _reason_error_st
4a40: 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f  ring(backingErro
4a50: 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  r));..    }..   
4a60: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
4a70: 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45  SL_ERROR_ZERO_RE
4a80: 54 55 52 4e 3a 0a 09 20 20 20 20 2f 2a 20 50 65  TURN:..    /* Pe
4a90: 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68  er has closed th
4aa0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 79 20  e connection by 
4ab0: 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73  sending the clos
4ac0: 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 2e 20  e_notify alert. 
4ad0: 43 61 6e 27 74 20 72 65 61 64 2c 20 62 75 74 20  Can't read, but 
4ae0: 63 61 6e 20 77 72 69 74 65 2e 20 2a 2f 0a 09 20  can write. */.. 
4af0: 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
4b00: 74 75 72 6e 20 61 6e 20 45 4f 46 2c 20 73 6f 20  turn an EOF, so 
4b10: 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65  channel is close
4b20: 64 20 77 68 69 63 68 20 77 69 6c 6c 20 73 65 6e  d which will sen
4b30: 64 20 61 6e 20 53 53 4c 5f 73 68 75 74 64 6f 77  d an SSL_shutdow
4b40: 6e 28 29 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72  n(). */..    dpr
4b50: 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52  intf("Got SSL_ER
4b60: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 2c  ROR_ZERO_RETURN,
4b70: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 45   this means an E
4b80: 4f 46 20 68 61 73 20 62 65 65 6e 20 72 65 61 63  OF has been reac
4b90: 68 65 64 22 29 3b 0a 09 20 20 20 20 62 79 74 65  hed");..    byte
4ba0: 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20  sRead = 0;..    
4bb0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
4bc0: 30 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  0;..    Tls_Erro
4bd0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 50 65 65  r(statePtr, "Pee
4be0: 72 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65  r has closed the
4bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
4c00: 77 72 69 74 69 6e 67 20 62 79 20 73 65 6e 64 69  writing by sendi
4c10: 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74  ng the close_not
4c20: 69 66 79 20 61 6c 65 72 74 22 29 3b 0a 09 20 20  ify alert");..  
4c30: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
4c40: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41  SSL_ERROR_WANT_A
4c50: 53 59 4e 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73  SYNC:..    /* Us
4c60: 65 64 20 77 69 74 68 20 66 6c 61 67 20 53 53 4c  ed with flag SSL
4c70: 5f 4d 4f 44 45 5f 41 53 59 4e 43 2c 20 6f 70 20  _MODE_ASYNC, op 
4c80: 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20  didn't complete 
4c90: 62 65 63 61 75 73 65 20 61 6e 20 61 73 79 6e 63  because an async
4ca0: 20 65 6e 67 69 6e 65 20 69 73 20 73 74 69 6c 6c   engine is still
4cb0: 20 70 72 6f 63 65 73 73 69 6e 67 20 64 61 74 61   processing data
4cc0: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
4cd0: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
4ce0: 57 41 4e 54 5f 41 53 59 4e 43 2c 20 6d 61 70 70  WANT_ASYNC, mapp
4cf0: 69 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47 41  ing this to EAGA
4d00: 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  IN");..    *erro
4d10: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
4d20: 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61  N;..    bytesRea
4d30: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72 65  d = -1;..    bre
4d40: 61 6b 3b 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09  ak;...default:..
4d50: 20 20 20 20 64 70 72 69 6e 74 66 28 22 55 6e 6b      dprintf("Unk
4d60: 6e 6f 77 6e 20 65 72 72 6f 72 20 28 65 72 72 20  nown error (err 
4d70: 3d 20 25 69 29 2c 20 6d 61 70 70 69 6e 67 20 74  = %i), mapping t
4d80: 6f 20 45 4f 46 22 2c 20 65 72 72 29 3b 0a 09 20  o EOF", err);.. 
4d90: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
4da0: 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73   = 0;..    bytes
4db0: 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 54  Read = 0;..    T
4dc0: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4dd0: 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f  r, "Unknown erro
4de0: 72 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  r");..    break;
4df0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
4e00: 6e 74 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d  ntf("Input(%d) -
4e10: 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53  > %d [%d]", bufS
4e20: 69 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20  ize, bytesRead, 
4e30: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a  *errorCodePtr);.
4e40: 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73      return bytes
4e50: 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  Read;.}../*. *--
4e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4eb0: 2a 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20  * TlsOutputProc 
4ec0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
4ed0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
4ee0: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
4ef0: 63 20 49 2f 4f 20 6c 61 79 65 72 20 74 6f 20 77  c I/O layer to w
4f00: 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
4f10: 0a 20 2a 09 42 49 4f 20 77 68 65 6e 65 76 65 72  . *.BIO whenever
4f20: 20 74 68 65 20 74 68 65 20 54 63 6c 5f 57 72 69   the the Tcl_Wri
4f30: 74 65 28 29 2c 20 54 63 6c 5f 57 72 69 74 65 43  te(), Tcl_WriteC
4f40: 68 61 72 73 2c 20 61 6e 64 20 54 63 6c 5f 57 72  hars, and Tcl_Wr
4f50: 69 74 65 4f 62 6a 0a 20 2a 09 66 75 6e 63 74 69  iteObj. *.functi
4f60: 6f 6e 73 20 61 72 65 20 75 73 65 64 2e 20 45 71  ons are used. Eq
4f70: 75 69 76 61 6c 65 6e 74 20 74 6f 20 53 53 4c 5f  uivalent to SSL_
4f80: 77 72 69 74 65 5f 65 78 20 61 6e 64 20 53 53 4c  write_ex and SSL
4f90: 5f 77 72 69 74 65 2e 0a 20 2a 0a 20 2a 20 52 65  _write.. *. * Re
4fa0: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e  sults:. *.Return
4fb0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
4fc0: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 6f 72  bytes written or
4fd0: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65   -1 on error. Se
4fe0: 74 73 20 65 72 72 6f 72 43 6f 64 65 50 74 72 0a  ts errorCodePtr.
4ff0: 20 2a 09 74 6f 20 61 20 50 4f 53 49 58 20 65 72   *.to a POSIX er
5000: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
5010: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 6f  rror occurred, o
5020: 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a  r 0 if none.. *.
5030: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5040: 0a 20 2a 09 57 72 69 74 65 73 20 6f 75 74 70 75  . *.Writes outpu
5050: 74 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20  t on the output 
5060: 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68  device of the ch
5070: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
50d0: 61 74 69 63 20 69 6e 74 20 54 6c 73 4f 75 74 70  atic int TlsOutp
50e0: 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  utProc(ClientDat
50f0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
5100: 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c  const char *buf,
5110: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e   int toWrite, in
5120: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  t *errorCodePtr)
5130: 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20   {.    unsigned 
5140: 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f  long backingErro
5150: 72 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  r;.    State *st
5160: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
5170: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
5180: 0a 20 20 20 20 69 6e 74 20 77 72 69 74 74 65 6e  .    int written
5190: 2c 20 65 72 72 3b 0a 20 20 20 20 2a 65 72 72 6f  , err;.    *erro
51a0: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20  rCodePtr = 0;.. 
51b0: 20 20 20 64 70 72 69 6e 74 66 28 22 57 72 69 74     dprintf("Writ
51c0: 65 28 25 70 2c 20 25 64 29 22 2c 20 28 76 6f 69  e(%p, %d)", (voi
51d0: 64 20 2a 29 20 73 74 61 74 65 50 74 72 2c 20 74  d *) statePtr, t
51e0: 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 64 70 72  oWrite);.    dpr
51f0: 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c 20 74  intBuffer(buf, t
5200: 6f 57 72 69 74 65 29 3b 0a 0a 20 20 20 20 2f 2a  oWrite);..    /*
5210: 20 53 6b 69 70 20 69 66 20 75 73 65 72 20 76 65   Skip if user ve
5220: 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73  rify callback is
5230: 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 2a   still running *
5240: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
5250: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
5260: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a  TCL_CALLBACK) {.
5270: 09 64 70 72 69 6e 74 66 28 22 44 6f 6e 27 74 20  .dprintf("Don't 
5280: 70 72 6f 63 65 73 73 20 6f 75 74 70 75 74 20 77  process output w
5290: 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 61  hile callbacks a
52a0: 72 65 20 72 75 6e 6e 69 6e 67 22 29 3b 0a 09 77  re running");..w
52b0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 2a 65  ritten = -1;..*e
52c0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
52d0: 47 41 49 4e 3b 0a 09 72 65 74 75 72 6e 20 2d 31  GAIN;..return -1
52e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
52f0: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
5300: 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63 74 20 2a  ed, do connect *
5310: 2f 0a 20 20 20 20 2f 2a 20 43 61 6e 20 61 6c 73  /.    /* Can als
5320: 6f 20 63 68 65 63 6b 20 53 53 4c 5f 69 73 5f 69  o check SSL_is_i
5330: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c  nit_finished(ssl
5340: 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  ) */.    if (sta
5350: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
5360: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09  LS_TCL_INIT) {..
5370: 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a  int tlsConnect;.
5380: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69  ..dprintf("Calli
5390: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
53a0: 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f  nnect");...tlsCo
53b0: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74  nnect = Tls_Wait
53c0: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
53d0: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74  Ptr, errorCodePt
53e0: 72 2c 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43  r, 1);..if (tlsC
53f0: 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09 20  onnect < 0) {.. 
5400: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
5410: 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67  an error waiting
5420: 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73   to connect (tls
5430: 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65  Connect = %i, *e
5440: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69  rrorCodePtr = %i
5450: 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20  )", tlsConnect, 
5460: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a  *errorCodePtr);.
5470: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ..    written = 
5480: 2d 31 3b 0a 09 20 20 20 20 69 66 20 28 2a 65 72  -1;..    if (*er
5490: 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43  rorCodePtr == EC
54a0: 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 64 70  ONNRESET) {...dp
54b0: 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65  rintf("Got conne
54c0: 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09  ction reset");..
54d0: 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a  ./* Soft EOF */.
54e0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
54f0: 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d  = 0;...written =
5500: 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20   0;..    }..    
5510: 72 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a  return written;.
5520: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
5530: 20 28 74 6f 57 72 69 74 65 20 3d 3d 20 30 29 20   (toWrite == 0) 
5540: 7b 0a 09 64 70 72 69 6e 74 66 28 22 7a 65 72 6f  {..dprintf("zero
5550: 2d 77 72 69 74 65 22 29 3b 0a 09 65 72 72 20 3d  -write");..err =
5560: 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65   BIO_flush(state
5570: 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 69 66 20  Ptr->bio);...if 
5580: 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 20  (err <= 0) {..  
5590: 20 20 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68    dprintf("Flush
55a0: 69 6e 67 20 66 61 69 6c 65 64 22 29 3b 0a 09 20  ing failed");.. 
55b0: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61     Tls_Error(sta
55c0: 74 65 50 74 72 2c 20 22 46 6c 75 73 68 20 66 61  tePtr, "Flush fa
55d0: 69 6c 65 64 22 29 3b 0a 0a 09 20 20 20 20 2a 65  iled");...    *e
55e0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
55f0: 4f 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  O;..    written 
5600: 3d 20 30 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  = 0;..    return
5610: 20 2d 31 3b 0a 09 7d 0a 0a 09 77 72 69 74 74 65   -1;..}...writte
5620: 6e 20 3d 20 30 3b 0a 09 2a 65 72 72 6f 72 43 6f  n = 0;..*errorCo
5630: 64 65 50 74 72 20 3d 20 30 3b 0a 09 72 65 74 75  dePtr = 0;..retu
5640: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
5650: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65   /*.     * We ne
5660: 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  ed to clear the 
5670: 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20  SSL error stack 
5680: 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65 20 73  now because we s
5690: 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20  ometimes reach. 
56a0: 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74      * this funct
56b0: 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65  ion with leftove
56c0: 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  r errors in the 
56d0: 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 77  stack.  If BIO_w
56e0: 72 69 74 65 0a 20 20 20 20 20 2a 20 72 65 74 75  rite.     * retu
56f0: 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e  rns -1 and inten
5700: 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65  ds EAGAIN, there
5710: 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65   is a leftover e
5720: 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65  rror, it will be
5730: 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74  .     * misconst
5740: 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72  rued as an error
5750: 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20  , not EAGAIN..  
5760: 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65     *.     * Alte
5770: 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61  rnatively, we ma
5780: 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65  y want to handle
5790: 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63   the <0 return c
57a0: 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a  odes from.     *
57b0: 20 42 49 4f 5f 77 72 69 74 65 20 73 70 65 63 69   BIO_write speci
57c0: 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73 65 64  ally (as advised
57d0: 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73   in the RSA docs
57e0: 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20  ).  TLS's lower 
57f0: 6c 65 76 65 6c 0a 20 20 20 20 20 2a 20 42 49 4f  level.     * BIO
5800: 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20   functions play 
5810: 77 69 74 68 20 74 68 65 20 72 65 74 72 79 20 66  with the retry f
5820: 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64  lags though, and
5830: 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f 0a 20   this seems to. 
5840: 20 20 20 20 2a 20 77 6f 72 6b 20 63 6f 72 72 65      * work corre
5850: 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66  ctly.  Similar f
5860: 69 78 20 69 6e 20 54 6c 73 49 6e 70 75 74 50 72  ix in TlsInputPr
5870: 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 20  oc. - hobbs.    
5880: 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   */.    ERR_clea
5890: 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 42  r_error();.    B
58a0: 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f 66  IO_clear_retry_f
58b0: 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e 62  lags(statePtr->b
58c0: 69 6f 29 3b 0a 20 20 20 20 77 72 69 74 74 65 6e  io);.    written
58d0: 20 3d 20 42 49 4f 5f 77 72 69 74 65 28 73 74 61   = BIO_write(sta
58e0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c  tePtr->bio, buf,
58f0: 20 74 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 64   toWrite);.    d
5900: 70 72 69 6e 74 66 28 22 42 49 4f 5f 77 72 69 74  printf("BIO_writ
5910: 65 28 25 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64  e(%p, %d) -> [%d
5920: 5d 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61  ]", (void *) sta
5930: 74 65 50 74 72 2c 20 74 6f 57 72 69 74 65 2c 20  tePtr, toWrite, 
5940: 77 72 69 74 74 65 6e 29 3b 0a 0a 20 20 20 20 2f  written);..    /
5950: 2a 20 53 61 6d 65 20 61 73 20 53 53 4c 5f 77 61  * Same as SSL_wa
5960: 6e 74 2c 20 62 75 74 20 61 6c 73 6f 20 63 68 65  nt, but also che
5970: 63 6b 73 20 74 68 65 20 65 72 72 6f 72 20 71 75  cks the error qu
5980: 65 75 65 20 2a 2f 0a 20 20 20 20 65 72 72 20 3d  eue */.    err =
5990: 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73   SSL_get_error(s
59a0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72  tatePtr->ssl, wr
59b0: 69 74 74 65 6e 29 3b 0a 20 20 20 20 62 61 63 6b  itten);.    back
59c0: 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67  ingError = ERR_g
59d0: 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  et_error();..   
59e0: 20 69 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20   if (written <= 
59f0: 30 29 20 7b 0a 09 2f 2a 20 54 68 65 20 72 65 74  0) {../* The ret
5a00: 72 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 62  ry flag is set b
5a10: 79 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 65  y the BIO_set_re
5a20: 74 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20  try_* functions 
5a30: 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75  */..if (BIO_shou
5a40: 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74  ld_retry(statePt
5a50: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20  r->bio)) {..    
5a60: 64 70 72 69 6e 74 66 28 22 57 72 69 74 65 20 66  dprintf("Write f
5a70: 61 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 20  ailed with code 
5a80: 25 64 2c 20 62 79 74 65 73 20 77 72 69 74 74 65  %d, bytes writte
5a90: 6e 3d 25 64 3a 20 73 68 6f 75 6c 64 20 72 65 74  n=%d: should ret
5aa0: 72 79 22 2c 20 65 72 72 2c 20 77 72 69 74 74 65  ry", err, writte
5ab0: 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  n);..} else {.. 
5ac0: 20 20 20 64 70 72 69 6e 74 66 28 22 57 72 69 74     dprintf("Writ
5ad0: 65 20 66 61 69 6c 65 64 20 77 69 74 68 20 63 6f  e failed with co
5ae0: 64 65 20 25 64 2c 20 62 79 74 65 73 20 77 72 69  de %d, bytes wri
5af0: 74 74 65 6e 3d 25 64 3a 20 65 72 72 6f 72 20 63  tten=%d: error c
5b00: 6f 6e 64 69 74 69 6f 6e 22 2c 20 65 72 72 2c 20  ondition", err, 
5b10: 77 72 69 74 74 65 6e 29 3b 0a 09 7d 0a 0a 09 2f  written);..}.../
5b20: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
5b30: 73 61 6d 65 20 61 73 20 42 49 4f 5f 72 65 74 72  same as BIO_retr
5b40: 79 5f 74 79 70 65 20 2a 2f 0a 09 69 66 20 28 42  y_type */..if (B
5b50: 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 61 64 28 73  IO_should_read(s
5b60: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b  tatePtr->bio)) {
5b70: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 42  ..    dprintf("B
5b80: 49 4f 20 68 61 73 20 69 6e 73 75 66 66 69 63 69  IO has insuffici
5b90: 65 6e 74 20 64 61 74 61 20 74 6f 20 72 65 61 64  ent data to read
5ba0: 20 61 6e 64 20 72 65 74 75 72 6e 22 29 3b 0a 09   and return");..
5bb0: 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c  }..if (BIO_shoul
5bc0: 64 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72  d_write(statePtr
5bd0: 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64  ->bio)) {..    d
5be0: 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20  printf("BIO has 
5bf0: 70 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f 20  pending data to 
5c00: 77 72 69 74 65 22 29 3b 0a 09 7d 0a 09 69 66 20  write");..}..if 
5c10: 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 69 6f 5f 73  (BIO_should_io_s
5c20: 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d  pecial(statePtr-
5c30: 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 69 6e  >bio)) {..    in
5c40: 74 20 72 65 61 73 6f 6e 20 3d 20 42 49 4f 5f 67  t reason = BIO_g
5c50: 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e 28  et_retry_reason(
5c60: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
5c70: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49  .    dprintf("BI
5c80: 4f 20 68 61 73 20 73 6f 6d 65 20 73 70 65 63 69  O has some speci
5c90: 61 6c 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 74 68  al condition oth
5ca0: 65 72 20 74 68 61 6e 20 72 65 61 64 20 6f 72 20  er than read or 
5cb0: 77 72 69 74 65 3a 20 63 6f 64 65 3d 25 64 22 2c  write: code=%d",
5cc0: 20 72 65 61 73 6f 6e 29 3b 0a 09 7d 0a 09 64 70   reason);..}..dp
5cd0: 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20 70  rintf("BIO has p
5ce0: 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f 20 77  ending data to w
5cf0: 72 69 74 65 22 29 3b 0a 0a 20 20 20 20 7d 20 65  rite");..    } e
5d00: 6c 73 65 20 7b 0a 09 42 49 4f 5f 66 6c 75 73 68  lse {..BIO_flush
5d10: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
5d20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
5d30: 63 68 20 28 65 72 72 29 20 7b 0a 09 63 61 73 65  ch (err) {..case
5d40: 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a   SSL_ERROR_NONE:
5d50: 0a 09 20 20 20 20 2f 2a 20 49 2f 4f 20 6f 70 65  ..    /* I/O ope
5d60: 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64  ration completed
5d70: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
5d80: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45  ("SSL_ERROR_NONE
5d90: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 77 72 69  ");..    if (wri
5da0: 74 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09 77 72  tten < 0) {...wr
5db0: 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20  itten = 0;..    
5dc0: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  }..    break;...
5dd0: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53  case SSL_ERROR_S
5de0: 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f  SL:..    /* A no
5df0: 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66  n-recoverable, f
5e00: 61 74 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 68  atal error in th
5e10: 65 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 63  e SSL library oc
5e20: 63 75 72 72 65 64 2c 20 75 73 75 61 6c 6c 79 20  curred, usually 
5e30: 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72  a protocol error
5e40: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
5e50: 28 22 53 53 4c 20 65 72 72 6f 72 2c 20 69 6e 64  ("SSL error, ind
5e60: 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
5e70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
5e80: 62 65 65 6e 20 61 62 6f 72 74 65 64 22 29 3b 0a  been aborted");.
5e90: 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67  .    if (backing
5ea0: 45 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09  Error != 0) {...
5eb0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
5ec0: 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65  tr, ERR_reason_e
5ed0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b  rror_string(back
5ee0: 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20  ingError));..   
5ef0: 20 7d 20 65 6c 73 65 20 69 66 20 28 53 53 4c 5f   } else if (SSL_
5f00: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c  get_verify_resul
5f10: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  t(statePtr->ssl)
5f20: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b   != X509_V_OK) {
5f30: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
5f40: 74 65 50 74 72 2c 20 58 35 30 39 5f 76 65 72 69  tePtr, X509_veri
5f50: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
5f60: 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72  ring(SSL_get_ver
5f70: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
5f80: 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20  Ptr->ssl)));..  
5f90: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 6c 73    } else {...Tls
5fa0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
5fb0: 20 22 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 72   "Unknown SSL er
5fc0: 72 6f 72 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20  ror");..    }.. 
5fd0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
5fe0: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b   = ECONNABORTED;
5ff0: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ..    written = 
6000: 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -1;..    break;.
6010: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
6020: 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20  _WANT_READ:..   
6030: 20 2f 2a 20 4f 70 20 64 69 64 20 6e 6f 74 20 63   /* Op did not c
6040: 6f 6d 70 6c 65 74 65 20 64 75 65 20 74 6f 20 6e  omplete due to n
6050: 6f 74 20 65 6e 6f 75 67 68 20 64 61 74 61 20 77  ot enough data w
6060: 61 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  as available. Re
6070: 74 72 79 20 6c 61 74 65 72 2e 20 2a 2f 0a 09 20  try later. */.. 
6080: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
6090: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52  SSL_ERROR_WANT_R
60a0: 45 41 44 2c 20 6d 61 70 70 69 6e 67 20 69 74 20  EAD, mapping it 
60b0: 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20  to EAGAIN");..  
60c0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
60d0: 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77  = EAGAIN;..    w
60e0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20  ritten = -1;..  
60f0: 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74    statePtr->want
6100: 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   |= TCL_READABLE
6110: 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72  ;..    BIO_set_r
6120: 65 74 72 79 5f 72 65 61 64 28 73 74 61 74 65 50  etry_read(stateP
6130: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62  tr->bio);..    b
6140: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c  reak;...case SSL
6150: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54  _ERROR_WANT_WRIT
6160: 45 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 20 64 69  E:..    /* Op di
6170: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64  d not complete d
6180: 75 65 20 74 6f 20 75 6e 61 62 6c 65 20 74 6f 20  ue to unable to 
6190: 73 65 6e 64 20 61 6c 6c 20 64 61 74 61 20 74 6f  send all data to
61a0: 20 74 68 65 20 42 49 4f 2e 20 52 65 74 72 79 20   the BIO. Retry 
61b0: 6c 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64  later. */..    d
61c0: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f  printf("Got SSL_
61d0: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45  ERROR_WANT_WRITE
61e0: 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20  , mapping it to 
61f0: 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a  EAGAIN");..    *
6200: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
6210: 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74  AGAIN;..    writ
6220: 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73  ten = -1;..    s
6230: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d  tatePtr->want |=
6240: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09   TCL_WRITABLE;..
6250: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72      BIO_set_retr
6260: 79 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72  y_write(statePtr
6270: 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65  ->bio);..    bre
6280: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
6290: 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c  RROR_WANT_X509_L
62a0: 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 2a 20 4f  OOKUP:..    /* O
62b0: 70 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74  p didn't complet
62c0: 65 20 73 69 6e 63 65 20 63 61 6c 6c 62 61 63 6b  e since callback
62d0: 20 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f   set by SSL_CTX_
62e0: 73 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f  set_client_cert_
62f0: 63 62 28 29 20 61 73 6b 65 64 20 74 6f 20 62 65  cb() asked to be
6300: 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 2a 2f   called again */
6310: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47  ..    dprintf("G
6320: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  ot SSL_ERROR_WAN
6330: 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d  T_X509_LOOKUP, m
6340: 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47  apping it to EAG
6350: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  AIN");..    *err
6360: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
6370: 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e  IN;..    written
6380: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61   = -1;..    brea
6390: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
63a0: 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20  ROR_SYSCALL:..  
63b0: 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65    /* Some non-re
63c0: 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c  coverable, fatal
63d0: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
63e0: 72 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  red */..    dpri
63f0: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53  ntf("SSL_ERROR_S
6400: 59 53 43 41 4c 4c 22 29 3b 0a 0a 09 20 20 20 20  YSCALL");...    
6410: 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  if (backingError
6420: 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e   == 0 && written
6430: 20 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e   == 0) {...dprin
6440: 74 66 28 22 45 4f 46 20 72 65 61 63 68 65 64 22  tf("EOF reached"
6450: 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  )...*errorCodePt
6460: 72 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 6e  r = 0;...written
6470: 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f   = 0;...Tls_Erro
6480: 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46  r(statePtr, "EOF
6490: 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20   reached");...  
64a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63    } else if (bac
64b0: 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26  kingError == 0 &
64c0: 26 20 77 72 69 74 74 65 6e 20 3d 3d 20 2d 31 29  & written == -1)
64d0: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f   {...dprintf("I/
64e0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  O error occurred
64f0: 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c   (errno = %lu)",
6500: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
6510: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29   Tcl_GetErrno())
6520: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ;...*errorCodePt
6530: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  r = Tcl_GetErrno
6540: 28 29 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20  ();...written = 
6550: 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28  -1;...Tls_Error(
6560: 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 45 72  statePtr, Tcl_Er
6570: 72 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64  rnoMsg(*errorCod
6580: 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20  ePtr));...    } 
6590: 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66  else {...dprintf
65a0: 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  ("I/O error occu
65b0: 72 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72  rred (backingErr
65c0: 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b  or = %lu)", back
65d0: 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72  ingError);...*er
65e0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c  rorCodePtr = Tcl
65f0: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77  _GetErrno();...w
6600: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54  ritten = -1;...T
6610: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
6620: 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72  r, ERR_reason_er
6630: 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69  ror_string(backi
6640: 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20  ngError));..    
6650: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  }..    break;...
6660: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a  case SSL_ERROR_Z
6670: 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20  ERO_RETURN:..   
6680: 20 2f 2a 20 50 65 65 72 20 68 61 73 20 63 6c 6f   /* Peer has clo
6690: 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  sed the connecti
66a0: 6f 6e 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68  on by sending th
66b0: 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61  e close_notify a
66c0: 6c 65 72 74 2e 20 43 61 6e 27 74 20 72 65 61 64  lert. Can't read
66d0: 2c 20 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e  , but can write.
66e0: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 4e 65 65 64   */..    /* Need
66f0: 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 45 4f   to return an EO
6700: 46 2c 20 73 6f 20 63 68 61 6e 6e 65 6c 20 69 73  F, so channel is
6710: 20 63 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69   closed which wi
6720: 6c 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73  ll send an SSL_s
6730: 68 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20  hutdown(). */.. 
6740: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
6750: 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52  SSL_ERROR_ZERO_R
6760: 45 54 55 52 4e 2c 20 74 68 69 73 20 6d 65 61 6e  ETURN, this mean
6770: 73 20 61 6e 20 45 4f 46 20 68 61 73 20 62 65 65  s an EOF has bee
6780: 6e 20 72 65 61 63 68 65 64 22 29 3b 0a 09 20 20  n reached");..  
6790: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
67a0: 3d 20 30 3b 0a 09 20 20 20 20 77 72 69 74 74 65  = 0;..    writte
67b0: 6e 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73 5f  n = 0;..    Tls_
67c0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
67d0: 22 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64  "Peer has closed
67e0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
67f0: 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 73  for writing by s
6800: 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65  ending the close
6810: 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 22 29 3b  _notify alert");
6820: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
6830: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
6840: 4e 54 5f 41 53 59 4e 43 3a 0a 09 20 20 20 20 2f  NT_ASYNC:..    /
6850: 2a 20 55 73 65 64 20 77 69 74 68 20 66 6c 61 67  * Used with flag
6860: 20 53 53 4c 5f 4d 4f 44 45 5f 41 53 59 4e 43 2c   SSL_MODE_ASYNC,
6870: 20 6f 70 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c   op didn't compl
6880: 65 74 65 20 62 65 63 61 75 73 65 20 61 6e 20 61  ete because an a
6890: 73 79 6e 63 20 65 6e 67 69 6e 65 20 69 73 20 73  sync engine is s
68a0: 74 69 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  till processing 
68b0: 64 61 74 61 20 2a 2f 0a 09 20 20 20 20 64 70 72  data */..    dpr
68c0: 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52  intf("Got SSL_ER
68d0: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 2c 20  ROR_WANT_ASYNC, 
68e0: 6d 61 70 70 69 6e 67 20 74 68 69 73 20 74 6f 20  mapping this to 
68f0: 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a  EAGAIN");..    *
6900: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
6910: 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74  AGAIN;..    writ
6920: 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 62  ten = -1;..    b
6930: 72 65 61 6b 3b 0a 0a 09 64 65 66 61 75 6c 74 3a  reak;...default:
6940: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 75  ..    dprintf("u
6950: 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 3a 20 25 64  nknown error: %d
6960: 22 2c 20 65 72 72 29 3b 0a 09 20 20 20 20 54 6c  ", err);..    Tl
6970: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
6980: 2c 20 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  , "Unknown error
6990: 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  ");..    break;.
69a0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
69b0: 74 66 28 22 4f 75 74 70 75 74 28 25 64 29 20 2d  tf("Output(%d) -
69c0: 3e 20 25 64 22 2c 20 74 6f 57 72 69 74 65 2c 20  > %d", toWrite, 
69d0: 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 72 65  written);.    re
69e0: 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a 7d 0a  turn written;.}.
69f0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a40: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 47 65  ---. *. * Tls_Ge
6a50: 74 50 61 72 65 6e 74 20 2d 2d 0a 20 2a 0a 20 2a  tParent --. *. *
6a60: 09 47 65 74 20 70 61 72 65 6e 74 20 63 68 61 6e  .Get parent chan
6a70: 6e 65 6c 20 66 6f 72 20 61 20 73 74 61 63 6b 65  nel for a stacke
6a80: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  d channel.. *. *
6a90: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c   Results:. *.Tcl
6aa0: 5f 43 68 61 6e 6e 65 6c 20 6f 72 20 4e 55 4c 4c  _Channel or NULL
6ab0: 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d   if none.. *. *-
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
6b10: 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 54 6c 73  .Tcl_Channel Tls
6b20: 5f 47 65 74 50 61 72 65 6e 74 28 53 74 61 74 65  _GetParent(State
6b30: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20   *statePtr, int 
6b40: 6d 61 73 6b 46 6c 61 67 73 29 20 7b 0a 20 20 20  maskFlags) {.   
6b50: 20 64 70 72 69 6e 74 66 28 22 52 65 71 75 65 73   dprintf("Reques
6b60: 74 65 64 20 74 6f 20 67 65 74 20 70 61 72 65 6e  ted to get paren
6b70: 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 25 70 22  t of channel %p"
6b80: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
6b90: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 73 74 61  );..    if ((sta
6ba0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 7e  tePtr->flags & ~
6bb0: 6d 61 73 6b 46 6c 61 67 73 29 20 26 20 54 4c 53  maskFlags) & TLS
6bc0: 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 20 7b  _TCL_FASTPATH) {
6bd0: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64  ..dprintf("Asked
6be0: 20 74 6f 20 67 65 74 20 74 68 65 20 70 61 72 65   to get the pare
6bf0: 6e 74 20 63 68 61 6e 6e 65 6c 20 77 68 69 6c 65  nt channel while
6c00: 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 46 61   we are using Fa
6c10: 73 74 50 61 74 68 20 2d 2d 20 72 65 74 75 72 6e  stPath -- return
6c20: 69 6e 67 20 4e 55 4c 4c 22 29 3b 0a 09 72 65 74  ing NULL");..ret
6c30: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
6c40: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47      return Tcl_G
6c50: 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c  etStackedChannel
6c60: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
6c70: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
6cd0: 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d  sSetOptionProc -
6ce0: 2d 0a 20 2a 0a 20 2a 09 53 65 74 73 20 61 6e 20  -. *. *.Sets an 
6cf0: 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65 20  option to value 
6d00: 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  for a SSL socket
6d10: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 20   based channel. 
6d20: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 0a 20 2a  Called by the. *
6d30: 09 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79  .generic I/O lay
6d40: 65 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  er whenever the 
6d50: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
6d60: 74 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  tion() function 
6d70: 69 73 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52  is used.. *. * R
6d80: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 43 4c 5f 4f  esults:. *.TCL_O
6d90: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  K if successful 
6da0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20  or TCL_ERROR if 
6db0: 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69  failed.. *. * Si
6dc0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 55  de effects:. *.U
6dd0: 70 64 61 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f  pdates channel o
6de0: 70 74 69 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c  ption to new val
6df0: 75 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ue.. *. *-------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
6e50: 63 20 69 6e 74 0a 54 6c 73 53 65 74 4f 70 74 69  c int.TlsSetOpti
6e60: 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  onProc(ClientDat
6e70: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
6e80: 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61     /* Socket sta
6e90: 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  te. */.    Tcl_I
6ea0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
6eb0: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20  /* For errors - 
6ec0: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  can be NULL. */.
6ed0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6ee0: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e  optionName,./* N
6ef0: 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f  ame of the optio
6f00: 6e 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  n to set the val
6f10: 75 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20  ue for, or..... 
6f20: 2a 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c  * NULL to get al
6f30: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68  l options and th
6f40: 65 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20  eir values. */. 
6f50: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f     const char *o
6f60: 70 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 56  ptionValue)./* V
6f70: 61 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 2e  alue for option.
6f80: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20   */.{.    State 
6f90: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
6fa0: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61  te *) instanceDa
6fb0: 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ta;.    Tcl_Chan
6fc0: 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20 54 6c 73  nel parent = Tls
6fd0: 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65  _GetParent(state
6fe0: 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53  Ptr, TLS_TCL_FAS
6ff0: 54 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f  TPATH);.    Tcl_
7000: 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e 50  DriverSetOptionP
7010: 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72  roc *setOptionPr
7020: 6f 63 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  oc;..    dprintf
7030: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
7040: 20 2f 2a 20 50 61 73 73 20 74 6f 20 70 61 72 65   /* Pass to pare
7050: 6e 74 20 2a 2f 0a 20 20 20 20 73 65 74 4f 70 74  nt */.    setOpt
7060: 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68  ionProc = Tcl_Ch
7070: 61 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72  annelSetOptionPr
7080: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  oc(Tcl_GetChanne
7090: 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a  lType(parent));.
70a0: 20 20 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f      if (setOptio
70b0: 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b  nProc != NULL) {
70c0: 0a 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70  ..return (*setOp
70d0: 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65  tionProc)(Tcl_Ge
70e0: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
70f0: 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e  Data(parent), in
7100: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65  terp, optionName
7110: 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a  , optionValue);.
7120: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20      }.    /*.   
7130: 20 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20    * Request for 
7140: 61 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f  a specific optio
7150: 6e 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77  n has to fail, w
7160: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79  e don't have any
7170: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  ..     */.    re
7180: 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e  turn Tcl_BadChan
7190: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
71a0: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22  , optionName, ""
71b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7200: 2a 0a 20 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f  *. * TlsGetOptio
7210: 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 47  nProc --. *. *.G
7220: 65 74 20 61 20 6f 70 74 69 6f 6e 27 73 20 76 61  et a option's va
7230: 6c 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f  lue for a SSL so
7240: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
7250: 65 6c 2c 20 6f 72 20 61 20 6c 69 73 74 20 6f 66  el, or a list of
7260: 20 61 6c 6c 0a 20 2a 09 6f 70 74 69 6f 6e 73 20   all. *.options 
7270: 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73  and their values
7280: 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  . Called by the 
7290: 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65  generic I/O laye
72a0: 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20  r whenever the. 
72b0: 2a 09 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *.Tcl_GetChannel
72c0: 4f 70 74 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  Option() functio
72d0: 6e 20 69 73 20 75 73 65 64 2e 0a 20 2a 0a 20 2a  n is used.. *. *
72e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
72f0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
7300: 65 73 75 6c 74 2e 20 54 68 65 20 76 61 6c 75 65  esult. The value
7310: 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
7320: 64 20 6f 70 74 69 6f 6e 20 6f 72 20 61 20 6c 69  d option or a li
7330: 73 74 20 6f 66 0a 20 2a 09 61 6c 6c 20 6f 70 74  st of. *.all opt
7340: 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76  ions and their v
7350: 61 6c 75 65 73 20 69 73 20 72 65 74 75 72 6e 65  alues is returne
7360: 64 20 69 6e 20 74 68 65 20 73 75 70 70 6c 69 65  d in the supplie
7370: 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a  d DString.. *. *
7380: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
7390: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
73a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73e0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
73f0: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  TlsGetOptionProc
7400: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
7410: 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a 20  anceData,    /* 
7420: 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f  Socket state. */
7430: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
7440: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72  *interp,../* For
7450: 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 65   errors - can be
7460: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f   NULL. */.    co
7470: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e  nst char *option
7480: 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66  Name,./* Name of
7490: 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20 72   the option to r
74a0: 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c 75  etrieve the valu
74b0: 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a  e for, or..... *
74c0: 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c   NULL to get all
74d0: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65   options and the
74e0: 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20  ir values. */.  
74f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f    Tcl_DString *o
7500: 70 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 57  ptionValue)./* W
7510: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68  here to store th
7520: 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65  e computed value
7530: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
7540: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20  caller. */.{.   
7550: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
7560: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
7570: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 54  tanceData;.    T
7580: 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e  cl_Channel paren
7590: 74 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e  t = Tls_GetParen
75a0: 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f  t(statePtr, TLS_
75b0: 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 20  TCL_FASTPATH);. 
75c0: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74     Tcl_DriverGet
75d0: 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f  OptionProc *getO
75e0: 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20  ptionProc;..    
75f0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
7600: 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 61 73 73 20  );..    /* Pass 
7610: 74 6f 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 20  to parent */.   
7620: 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d   getOptionProc =
7630: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f   Tcl_ChannelGetO
7640: 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65  ptionProc(Tcl_Ge
7650: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72  tChannelType(par
7660: 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67  ent));.    if (g
7670: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20  etOptionProc != 
7680: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
7690: 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29  (*getOptionProc)
76a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  (Tcl_GetChannelI
76b0: 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65  nstanceData(pare
76c0: 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74  nt), interp, opt
76d0: 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56  ionName, optionV
76e0: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73  alue);.    } els
76f0: 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65  e if (optionName
7700: 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c   == (char*) NULL
7710: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75  ) {../*.. * Requ
7720: 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72  est is query for
7730: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68   all options, th
7740: 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09  is is ok... */..
7750: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
7760: 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20     }.    /*.    
7770: 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 61   * Request for a
7780: 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e   specific option
7790: 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65   has to fail, we
77a0: 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e   don't have any.
77b0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  .     */.    ret
77c0: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e  urn Tcl_BadChann
77d0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
77e0: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29   optionName, "")
77f0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
7850: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54  sChannelHandlerT
7860: 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  imer --. *. *.Ca
7870: 6c 6c 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69  lled by the noti
7880: 66 69 65 72 20 76 69 61 20 61 20 74 69 6d 65 72  fier via a timer
7890: 2c 20 74 6f 20 66 6c 75 73 68 20 6f 75 74 20 64  , to flush out d
78a0: 61 74 61 20 77 61 69 74 69 6e 67 20 69 6e 0a 20  ata waiting in. 
78b0: 2a 09 63 68 61 6e 6e 65 6c 20 62 75 66 66 65 72  *.channel buffer
78c0: 73 2e 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  s. called by the
78d0: 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79   generic I/O lay
78e0: 65 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  er whenever the.
78f0: 20 2a 09 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *.Tcl_GetChanne
7900: 6c 48 61 6e 64 6c 65 28 29 20 66 75 6e 63 74 69  lHandle() functi
7910: 6f 6e 20 69 73 20 75 73 65 64 2e 0a 20 2a 0a 20  on is used.. *. 
7920: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
7930: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
7940: 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74  ffects:. *.Creat
7950: 65 73 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20  es notification 
7960: 65 76 65 6e 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  event.. *. *----
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
79c0: 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 68 61  atic void TlsCha
79d0: 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72  nnelHandlerTimer
79e0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
79f0: 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 53 74  ntData) {.    St
7a00: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
7a10: 28 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  (State *) client
7a20: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61  Data;.    int ma
7a30: 73 6b 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 77  sk = statePtr->w
7a40: 61 6e 74 3b 20 2f 2a 20 49 6e 69 74 20 74 6f 20  ant; /* Init to 
7a50: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52  SSL_ERROR_WANT_R
7a60: 45 41 44 20 61 6e 64 20 53 53 4c 5f 45 52 52 4f  EAD and SSL_ERRO
7a70: 52 5f 57 41 4e 54 5f 57 52 49 54 45 20 2a 2f 0a  R_WANT_WRITE */.
7a80: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7a90: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 74 61  lled");..    sta
7aa0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28  tePtr->timer = (
7ab0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
7ac0: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  NULL;..    /* Ch
7ad0: 65 63 6b 20 66 6f 72 20 61 6d 6f 75 6e 74 20 6f  eck for amount o
7ae0: 66 20 64 61 74 61 20 70 65 6e 64 69 6e 67 20 69  f data pending i
7af0: 6e 20 42 49 4f 20 77 72 69 74 65 20 62 75 66 66  n BIO write buff
7b00: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 42 49  er */.    if (BI
7b10: 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65  O_wpending(state
7b20: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70  Ptr->bio)) {..dp
7b30: 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d  rintf("[chan=%p]
7b40: 20 42 49 4f 20 77 72 69 74 61 62 6c 65 22 2c 20   BIO writable", 
7b50: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
7b60: 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57  ...mask |= TCL_W
7b70: 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a  RITABLE;.    }..
7b80: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
7b90: 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20   amount of data 
7ba0: 70 65 6e 64 69 6e 67 20 69 6e 20 42 49 4f 20 72  pending in BIO r
7bb0: 65 61 64 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  ead buffer */.  
7bc0: 20 20 69 66 20 28 42 49 4f 5f 70 65 6e 64 69 6e    if (BIO_pendin
7bd0: 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  g(statePtr->bio)
7be0: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 5b 63  ) {..dprintf("[c
7bf0: 68 61 6e 3d 25 70 5d 20 42 49 4f 20 72 65 61 64  han=%p] BIO read
7c00: 61 62 6c 65 22 2c 20 73 74 61 74 65 50 74 72 2d  able", statePtr-
7c10: 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c  >self);...mask |
7c20: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a  = TCL_READABLE;.
7c30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f      }..    /* No
7c40: 74 69 66 79 20 74 68 65 20 67 65 6e 65 72 69 63  tify the generic
7c50: 20 49 4f 20 6c 61 79 65 72 20 74 68 61 74 20 74   IO layer that t
7c60: 68 65 20 6d 61 73 6b 20 65 76 65 6e 74 73 20 68  he mask events h
7c70: 61 76 65 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  ave occurred on 
7c80: 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  the channel */. 
7c90: 20 20 20 64 70 72 69 6e 74 66 28 22 4e 6f 74 69     dprintf("Noti
7ca0: 66 79 69 6e 67 20 6f 75 72 73 65 6c 76 65 73 22  fying ourselves"
7cb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66  );.    Tcl_Notif
7cc0: 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  yChannel(statePt
7cd0: 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a  r->self, mask);.
7ce0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61      statePtr->wa
7cf0: 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  nt = 0;..    dpr
7d00: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22  intf("Returning"
7d10: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  );..    return;.
7d20: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57  -----. *. * TlsW
7d80: 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  atchProc --. *. 
7d90: 2a 09 53 65 74 20 75 70 20 74 68 65 20 65 76 65  *.Set up the eve
7da0: 6e 74 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77  nt notifier to w
7db0: 61 74 63 68 20 66 6f 72 20 65 76 65 6e 74 73 20  atch for events 
7dc0: 6f 66 20 69 6e 74 65 72 65 73 74 20 66 72 6f 6d  of interest from
7dd0: 20 74 68 69 73 0a 20 2a 09 63 68 61 6e 6e 65 6c   this. *.channel
7de0: 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  . Called by the 
7df0: 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65  generic I/O laye
7e00: 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 75  r whenever the u
7e10: 73 65 72 20 28 6f 72 20 74 68 65 0a 20 2a 09 73  ser (or the. *.s
7e20: 79 73 74 65 6d 29 20 61 6e 6e 6f 75 6e 63 65 73  ystem) announces
7e30: 20 69 74 73 20 28 64 69 73 29 69 6e 74 65 72 65   its (dis)intere
7e40: 73 74 20 69 6e 20 65 76 65 6e 74 73 20 6f 6e 20  st in events on 
7e50: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69  the channel. Thi
7e60: 73 20 69 73 0a 20 2a 09 63 61 6c 6c 65 64 20 72  s is. *.called r
7e70: 65 70 65 61 74 65 64 6c 79 2e 0a 20 2a 0a 20 2a  epeatedly.. *. *
7e80: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
7e90: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
7ea0: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 75  fects:. *.Sets u
7eb0: 70 20 74 68 65 20 74 69 6d 65 2d 62 61 73 65 64  p the time-based
7ec0: 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 74 68 61   notifier so tha
7ed0: 74 20 66 75 74 75 72 65 20 65 76 65 6e 74 73 20  t future events 
7ee0: 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20  on the channel. 
7ef0: 2a 09 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62  *.will be seen b
7f00: 79 20 54 43 4c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  y TCL.. *. *----
7f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
7f60: 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 57 61 74  atic void.TlsWat
7f70: 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  chProc(ClientDat
7f80: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
7f90: 20 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74     /* The socket
7fa0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69   state. */.    i
7fb0: 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 45 76  nt mask).../* Ev
7fc0: 65 6e 74 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ents of interest
7fd0: 3b 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69  ; an OR-ed combi
7fe0: 6e 61 74 69 6f 6e 20 6f 66 0a 09 09 09 09 20 2a  nation of..... *
7ff0: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 54   TCL_READABLE, T
8000: 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64 20  CL_WRITABLE and 
8010: 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 2e 20 2a  TCL_EXCEPTION. *
8020: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  /.{.    Tcl_Chan
8030: 6e 65 6c 20 20 20 20 20 70 61 72 65 6e 74 3b 0a  nel     parent;.
8040: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
8050: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
8060: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
8070: 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63    Tcl_DriverWatc
8080: 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63  hProc *watchProc
8090: 3b 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e  ;.    int pendin
80a0: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  g = 0;..    dpri
80b0: 6e 74 66 28 22 54 6c 73 57 61 74 63 68 50 72 6f  ntf("TlsWatchPro
80c0: 63 28 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b  c(0x%x)", mask);
80d0: 0a 20 20 20 20 64 70 72 69 6e 74 46 6c 61 67 73  .    dprintFlags
80e0: 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  (statePtr);..   
80f0: 20 2f 2a 20 50 72 65 74 65 6e 64 20 74 6f 20 62   /* Pretend to b
8100: 65 20 64 65 61 64 20 61 73 20 6c 6f 6e 67 20 61  e dead as long a
8110: 73 20 74 68 65 20 76 65 72 69 66 79 20 63 61 6c  s the verify cal
8120: 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67  lback is running
8130: 2e 0a 20 20 20 20 20 2a 20 4f 74 68 65 72 77 69  ..     * Otherwi
8140: 73 65 20 74 68 61 74 20 63 61 6c 6c 62 61 63 6b  se that callback
8150: 20 63 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65   could be invoke
8160: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 2a  d recursively. *
8170: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
8180: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
8190: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a  TCL_CALLBACK) {.
81a0: 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61  .dprintf("Callba
81b0: 63 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20  ck is on-going, 
81c0: 64 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 22 29 3b  doing nothing");
81d0: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
81e0: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 6c  .    parent = Tl
81f0: 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74  s_GetParent(stat
8200: 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41  ePtr, TLS_TCL_FA
8210: 53 54 50 41 54 48 29 3b 0a 0a 20 20 20 20 69 66  STPATH);..    if
8220: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
8230: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44  s & TLS_TCL_HAND
8240: 53 48 41 4b 45 5f 46 41 49 4c 45 44 29 20 7b 0a  SHAKE_FAILED) {.
8250: 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20  .dprintf("Asked 
8260: 74 6f 20 77 61 74 63 68 20 61 20 73 6f 63 6b 65  to watch a socke
8270: 74 20 77 69 74 68 20 61 20 66 61 69 6c 65 64 20  t with a failed 
8280: 68 61 6e 64 73 68 61 6b 65 20 2d 2d 20 6e 6f 74  handshake -- not
8290: 68 69 6e 67 20 63 61 6e 20 68 61 70 70 65 6e 20  hing can happen 
82a0: 68 65 72 65 22 29 3b 0a 09 64 70 72 69 6e 74 66  here");..dprintf
82b0: 28 22 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20  ("Unregistering 
82c0: 69 6e 74 65 72 65 73 74 20 69 6e 20 74 68 65 20  interest in the 
82d0: 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 22 29 3b  lower channel");
82e0: 0a 0a 09 77 61 74 63 68 50 72 6f 63 20 3d 20 54  ...watchProc = T
82f0: 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50  cl_ChannelWatchP
8300: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
8310: 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b  elType(parent));
8320: 0a 09 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f  ..watchProc(Tcl_
8330: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
8340: 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20  ceData(parent), 
8350: 30 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 77  0);..statePtr->w
8360: 61 74 63 68 4d 61 73 6b 20 3d 20 30 3b 0a 09 72  atchMask = 0;..r
8370: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
8380: 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63    statePtr->watc
8390: 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20  hMask = mask;.. 
83a0: 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 6e 65 6c     /* No channel
83b0: 20 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d 6f   handlers any mo
83c0: 72 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20 6e  re. We will be n
83d0: 6f 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74 69  otified automati
83e0: 63 61 6c 6c 79 0a 20 20 20 20 20 2a 20 61 62 6f  cally.     * abo
83f0: 75 74 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65  ut events on the
8400: 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 76   channel below v
8410: 69 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f 75 72  ia a call to our
8420: 0a 20 20 20 20 20 2a 20 27 54 72 61 6e 73 66 6f  .     * 'Transfo
8430: 72 6d 4e 6f 74 69 66 79 50 72 6f 63 27 2e 20 42  rmNotifyProc'. B
8440: 75 74 20 77 65 20 68 61 76 65 20 74 6f 20 70 61  ut we have to pa
8450: 73 73 20 74 68 65 20 69 6e 74 65 72 65 73 74 20  ss the interest 
8460: 64 6f 77 6e 20 6e 6f 77 2e 0a 20 20 20 20 20 2a  down now..     *
8470: 20 57 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20   We are allowed 
8480: 74 6f 20 61 64 64 20 61 64 64 69 74 69 6f 6e 61  to add additiona
8490: 6c 20 27 69 6e 74 65 72 65 73 74 27 20 74 6f 20  l 'interest' to 
84a0: 74 68 65 20 6d 61 73 6b 20 69 66 20 77 65 20 77  the mask if we w
84b0: 61 6e 74 0a 20 20 20 20 20 2a 20 74 6f 2e 20 42  ant.     * to. B
84c0: 75 74 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ut this transfor
84d0: 6d 61 74 69 6f 6e 20 68 61 73 20 6e 6f 20 73 75  mation has no su
84e0: 63 68 20 69 6e 74 65 72 65 73 74 2e 20 49 74 20  ch interest. It 
84f0: 6a 75 73 74 20 70 61 73 73 65 73 0a 20 20 20 20  just passes.    
8500: 20 2a 20 74 68 65 20 72 65 71 75 65 73 74 20 64   * the request d
8510: 6f 77 6e 2c 20 75 6e 63 68 61 6e 67 65 64 2e 0a  own, unchanged..
8520: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69       */.    dpri
8530: 6e 74 66 28 22 52 65 67 69 73 74 65 72 69 6e 67  ntf("Registering
8540: 20 6f 75 72 20 69 6e 74 65 72 65 73 74 20 69 6e   our interest in
8550: 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e   the lower chann
8560: 65 6c 20 28 63 68 61 6e 3d 25 70 29 22 2c 20 28  el (chan=%p)", (
8570: 76 6f 69 64 20 2a 29 20 70 61 72 65 6e 74 29 3b  void *) parent);
8580: 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 20 3d  .    watchProc =
8590: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63   Tcl_ChannelWatc
85a0: 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61  hProc(Tcl_GetCha
85b0: 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29  nnelType(parent)
85c0: 29 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63  );.    watchProc
85d0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  (Tcl_GetChannelI
85e0: 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65  nstanceData(pare
85f0: 6e 74 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20  nt), mask);..   
8600: 20 2f 2a 20 44 6f 20 77 65 20 68 61 76 65 20 61   /* Do we have a
8610: 6e 79 20 70 65 6e 64 69 6e 67 20 65 76 65 6e 74  ny pending event
8620: 73 20 2a 2f 0a 20 20 20 20 70 65 6e 64 69 6e 67  s */.    pending
8630: 20 3d 20 28 73 74 61 74 65 50 74 72 2d 3e 77 61   = (statePtr->wa
8640: 6e 74 20 7c 7c 20 5c 0a 09 28 28 6d 61 73 6b 20  nt || \..((mask 
8650: 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20  & TCL_READABLE) 
8660: 26 26 20 28 28 54 63 6c 5f 49 6e 70 75 74 42 75  && ((Tcl_InputBu
8670: 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d  ffered(statePtr-
8680: 3e 73 65 6c 66 29 20 3e 20 30 29 20 7c 7c 20 28  >self) > 0) || (
8690: 42 49 4f 5f 63 74 72 6c 5f 70 65 6e 64 69 6e 67  BIO_ctrl_pending
86a0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20  (statePtr->bio) 
86b0: 3e 20 30 29 29 29 20 7c 7c 0a 09 28 28 6d 61 73  > 0))) ||..((mas
86c0: 6b 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  k & TCL_WRITABLE
86d0: 29 20 26 26 20 28 28 54 63 6c 5f 4f 75 74 70 75  ) && ((Tcl_Outpu
86e0: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50  tBuffered(stateP
86f0: 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20 7c  tr->self) > 0) |
8700: 7c 20 28 42 49 4f 5f 63 74 72 6c 5f 77 70 65 6e  | (BIO_ctrl_wpen
8710: 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62  ding(statePtr->b
8720: 69 6f 29 20 3e 20 30 29 29 29 29 3b 0a 0a 20 20  io) > 0))));..  
8730: 20 20 64 70 72 69 6e 74 66 28 22 49 4f 20 57 61    dprintf("IO Wa
8740: 6e 74 3d 25 64 2c 20 69 6e 70 75 74 20 62 75 66  nt=%d, input buf
8750: 66 65 72 3d 25 64 2c 20 6f 75 74 70 75 74 20 62  fer=%d, output b
8760: 75 66 66 65 72 3d 25 64 2c 20 42 49 4f 20 70 65  uffer=%d, BIO pe
8770: 6e 64 69 6e 67 3d 25 7a 64 2c 20 42 49 4f 20 77  nding=%zd, BIO w
8780: 70 65 6e 64 69 6e 67 3d 25 7a 64 22 2c 20 5c 0a  pending=%zd", \.
8790: 09 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 2c  .statePtr->want,
87a0: 20 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72   Tcl_InputBuffer
87b0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
87c0: 66 29 2c 20 54 63 6c 5f 4f 75 74 70 75 74 42 75  f), Tcl_OutputBu
87d0: 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d  ffered(statePtr-
87e0: 3e 73 65 6c 66 29 2c 20 5c 0a 09 42 49 4f 5f 63  >self), \..BIO_c
87f0: 74 72 6c 5f 70 65 6e 64 69 6e 67 28 73 74 61 74  trl_pending(stat
8800: 65 50 74 72 2d 3e 62 69 6f 29 2c 20 42 49 4f 5f  ePtr->bio), BIO_
8810: 63 74 72 6c 5f 77 70 65 6e 64 69 6e 67 28 73 74  ctrl_wpending(st
8820: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 3b 0a 0a  atePtr->bio));..
8830: 20 20 20 20 69 66 20 28 21 28 6d 61 73 6b 20 26      if (!(mask &
8840: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 7c   TCL_READABLE) |
8850: 7c 20 70 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  | pending == 0) 
8860: 7b 0a 09 2f 2a 20 52 65 6d 6f 76 65 20 74 69 6d  {../* Remove tim
8870: 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 09 69  er, if any */..i
8880: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
8890: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
88a0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
88b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 20 74      dprintf("A t
88c0: 69 6d 65 72 20 77 61 73 20 66 6f 75 6e 64 2c 20  imer was found, 
88d0: 64 65 6c 65 74 69 6e 67 20 69 74 22 29 3b 0a 09  deleting it");..
88e0: 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 54 69      Tcl_DeleteTi
88f0: 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65  merHandler(state
8900: 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 20 20  Ptr->timer);..  
8910: 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65    statePtr->time
8920: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f  r = (Tcl_TimerTo
8930: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20  ken) NULL;..}.. 
8940: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
8950: 41 64 64 20 74 69 6d 65 72 2c 20 69 66 20 6e 6f  Add timer, if no
8960: 6e 65 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65  ne */..if (state
8970: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 3d 20 28 54  Ptr->timer == (T
8980: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
8990: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 64 70 72 69  ULL) {..    dpri
89a0: 6e 74 66 28 22 43 72 65 61 74 69 6e 67 20 61 20  ntf("Creating a 
89b0: 6e 65 77 20 74 69 6d 65 72 20 73 69 6e 63 65 20  new timer since 
89c0: 64 61 74 61 20 61 70 70 65 61 72 73 20 74 6f 20  data appears to 
89d0: 62 65 20 77 61 69 74 69 6e 67 22 29 3b 0a 09 20  be waiting");.. 
89e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d     statePtr->tim
89f0: 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54  er = Tcl_CreateT
8a00: 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f  imerHandler(TLS_
8a10: 54 43 4c 5f 44 45 4c 41 59 2c 20 54 6c 73 43 68  TCL_DELAY, TlsCh
8a20: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65  annelHandlerTime
8a30: 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  r, (ClientData) 
8a40: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 20 20  statePtr);..}.  
8a50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d    }.}../*. *----
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
8ab0: 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63  TlsGetHandleProc
8ac0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
8ad0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
8ae0: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  ked by the gener
8af0: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 72  ic IO level to r
8b00: 65 74 72 69 65 76 65 20 61 6e 20 4f 53 0a 20 2a  etrieve an OS. *
8b10: 09 73 70 65 63 69 66 69 63 20 68 61 6e 64 6c 65  .specific handle
8b20: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8b30: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f   the channel. No
8b40: 74 20 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73  t used for trans
8b50: 66 6f 72 6d 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  forms.. *. * Res
8b60: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 70 70  ults:. *.The app
8b70: 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69 6c  ropriate Tcl_Fil
8b80: 65 20 68 61 6e 64 6c 65 20 6f 72 20 4e 55 4c 4c  e handle or NULL
8b90: 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20   if none.. *. * 
8ba0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8bb0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
8bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
8c10: 61 74 69 63 20 69 6e 74 20 54 6c 73 47 65 74 48  atic int TlsGetH
8c20: 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74  andleProc(Client
8c30: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
8c40: 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20  a,    /* Socket 
8c50: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  state. */.    in
8c60: 74 20 64 69 72 65 63 74 69 6f 6e 2c 09 09 2f 2a  t direction,../*
8c70: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72   TCL_READABLE or
8c80: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 2a 2f   TCL_WRITABLE */
8c90: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
8ca0: 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20 48  *handlePtr)./* H
8cb0: 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
8cc0: 20 77 69 74 68 20 74 68 65 20 63 68 61 6e 6e 65   with the channe
8cd0: 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65  l */.{.    State
8ce0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
8cf0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
8d00: 61 74 61 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  ata;..    return
8d10: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48   Tcl_GetChannelH
8d20: 61 6e 64 6c 65 28 54 6c 73 5f 47 65 74 50 61 72  andle(Tls_GetPar
8d30: 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c  ent(statePtr, TL
8d40: 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 2c  S_TCL_FASTPATH),
8d50: 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64   direction, hand
8d60: 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  lePtr);.}../*. *
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8dc0: 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f  . * TlsNotifyPro
8dd0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
8de0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
8df0: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  oked by the gene
8e00: 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20  ric IO level to 
8e10: 6e 6f 74 69 66 79 20 74 68 65 20 63 68 61 6e 6e  notify the chann
8e20: 65 6c 0a 20 2a 09 74 68 61 74 20 61 6e 20 65 76  el. *.that an ev
8e30: 65 6e 74 20 68 61 73 20 6f 63 63 75 72 72 65 64  ent has occurred
8e40: 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69   on the underlyi
8e50: 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 49 74 20 69  ng channel. It i
8e60: 73 20 75 73 65 64 20 62 79 20 73 74 61 63 6b 65  s used by stacke
8e70: 64 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72  d channel driver
8e80: 73 20 74 68 61 74 0a 20 2a 09 77 69 73 68 20 74  s that. *.wish t
8e90: 6f 20 62 65 20 6e 6f 74 69 66 69 65 64 20 6f 66  o be notified of
8ea0: 20 65 76 65 6e 74 73 20 74 68 61 74 20 6f 63 63   events that occ
8eb0: 75 72 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c  ur on the underl
8ec0: 79 69 6e 67 20 28 73 74 61 63 6b 65 64 29 0a 20  ying (stacked). 
8ed0: 2a 09 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  *.channel.. *. *
8ee0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 79 70   Results:. *.Typ
8ef0: 65 20 6f 66 20 65 76 65 6e 74 20 6f 72 20 30 20  e of event or 0 
8f00: 69 66 20 66 61 69 6c 65 64 0a 20 2a 0a 20 2a 20  if failed. *. * 
8f10: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8f20: 09 4d 61 79 20 70 72 6f 63 65 73 73 20 74 68 65  .May process the
8f30: 20 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20   incoming event 
8f40: 62 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a  by itself.. *. *
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8fa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73  /.static int Tls
8fb0: 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e  NotifyProc(Clien
8fc0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
8fd0: 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74  ta,    /* Socket
8fe0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69   state. */.    i
8ff0: 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 74 79  nt mask).../* ty
9000: 70 65 20 6f 66 20 65 76 65 6e 74 20 74 68 61 74  pe of event that
9010: 20 6f 63 63 75 72 72 65 64 3a 0a 09 09 09 09 20   occurred:..... 
9020: 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  * OR-ed combinat
9030: 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41  ion of TCL_READA
9040: 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41  BLE or TCL_WRITA
9050: 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61  BLE */.{.    Sta
9060: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
9070: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
9080: 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 65  eData;.    int e
9090: 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 0a 20  rrorCode = 0;.. 
90a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
90b0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ed");..    /*.  
90c0: 20 20 20 2a 20 44 65 6c 65 74 65 20 61 6e 20 65     * Delete an e
90d0: 78 69 73 74 69 6e 67 20 74 69 6d 65 72 2e 20 49  xisting timer. I
90e0: 74 20 77 61 73 20 6e 6f 74 20 66 69 72 65 64 2c  t was not fired,
90f0: 20 79 65 74 20 77 65 20 61 72 65 0a 20 20 20 20   yet we are.    
9100: 20 2a 20 68 65 72 65 2c 20 73 6f 20 74 68 65 20   * here, so the 
9110: 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 67 65  channel below ge
9120: 6e 65 72 61 74 65 64 20 73 75 63 68 20 61 6e 20  nerated such an 
9130: 65 76 65 6e 74 20 61 6e 64 20 77 65 0a 20 20 20  event and we.   
9140: 20 20 2a 20 64 6f 6e 27 74 20 68 61 76 65 20 74    * don't have t
9150: 6f 2e 20 54 68 65 20 72 65 6e 65 77 61 6c 20 6f  o. The renewal o
9160: 66 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 61  f the interest a
9170: 66 74 65 72 20 74 68 65 0a 20 20 20 20 20 2a 20  fter the.     * 
9180: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 61  execution of cha
9190: 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 69  nnel handlers wi
91a0: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  ll eventually ca
91b0: 75 73 65 20 75 73 20 74 6f 0a 20 20 20 20 20 2a  use us to.     *
91c0: 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74 69   recreate the ti
91d0: 6d 65 72 20 28 69 6e 20 57 61 74 63 68 50 72 6f  mer (in WatchPro
91e0: 63 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  c)..     */.    
91f0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69  if (statePtr->ti
9200: 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65  mer != (Tcl_Time
9210: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a  rToken) NULL) {.
9220: 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72  .Tcl_DeleteTimer
9230: 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
9240: 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65  ->timer);..state
9250: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63  Ptr->timer = (Tc
9260: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
9270: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
9280: 2a 20 53 6b 69 70 20 69 66 20 75 73 65 72 20 76  * Skip if user v
9290: 65 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69  erify callback i
92a0: 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20  s still running 
92b0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
92c0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
92d0: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b  _TCL_CALLBACK) {
92e0: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62  ..dprintf("Callb
92f0: 61 63 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c  ack is on-going,
9300: 20 72 65 74 75 72 6e 69 6e 67 20 66 61 69 6c 65   returning faile
9310: 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  d");..return 0;.
9320: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
9330: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
9340: 2c 20 64 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a  , do connect */.
9350: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
9360: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
9370: 4c 5f 49 4e 49 54 29 20 7b 0a 09 69 6e 74 20 74  L_INIT) {..int t
9380: 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70 72  lsConnect;...dpr
9390: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c  intf("Calling Tl
93a0: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
93b0: 22 29 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63 74  ");...tlsConnect
93c0: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f   = Tls_WaitForCo
93d0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20  nnect(statePtr, 
93e0: 26 65 72 72 6f 72 43 6f 64 65 2c 20 31 29 3b 0a  &errorCode, 1);.
93f0: 09 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20  .if (tlsConnect 
9400: 3c 20 31 29 20 7b 0a 09 20 20 20 20 64 70 72 69  < 1) {..    dpri
9410: 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f  ntf("Got an erro
9420: 72 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e  r waiting to con
9430: 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74  nect (tlsConnect
9440: 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64   = %i, *errorCod
9450: 65 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73  ePtr = %i)", tls
9460: 43 6f 6e 6e 65 63 74 2c 20 65 72 72 6f 72 43 6f  Connect, errorCo
9470: 64 65 29 3b 0a 09 20 20 20 20 69 66 20 28 65 72  de);..    if (er
9480: 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 41 49  rorCode == EAGAI
9490: 4e 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  N) {...dprintf("
94a0: 41 73 79 6e 63 20 66 6c 61 67 20 63 6f 75 6c 64  Async flag could
94b0: 20 62 65 20 73 65 74 20 28 64 69 64 6e 27 74 20   be set (didn't 
94c0: 63 68 65 63 6b 29 20 61 6e 64 20 65 72 72 6f 72  check) and error
94d0: 43 6f 64 65 20 3d 3d 20 45 41 47 41 49 4e 3a 20  Code == EAGAIN: 
94e0: 20 52 65 74 75 72 6e 69 6e 67 20 66 61 69 6c 65   Returning faile
94f0: 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 20 30  d");....return 0
9500: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64  ;..    }...    d
9510: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74  printf("Tls_Wait
9520: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72  ForConnect retur
9530: 6e 65 64 20 61 6e 20 65 72 72 6f 72 22 29 3b 0a  ned an error");.
9540: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  .}.    }..    dp
9550: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
9560: 20 25 69 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20   %i", mask);..  
9570: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20 65    /*.     * An e
9580: 76 65 6e 74 20 6f 63 63 75 72 72 65 64 20 69 6e  vent occurred in
9590: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
95a0: 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a 20  channel.  This. 
95b0: 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61      * transforma
95c0: 74 69 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f  tion doesn't pro
95d0: 63 65 73 73 20 73 75 63 68 20 65 76 65 6e 74 73  cess such events
95e0: 20 74 68 75 73 20 72 65 74 75 72 6e 73 20 74 68   thus returns th
95f0: 65 0a 20 20 20 20 20 2a 20 69 6e 63 6f 6d 69 6e  e.     * incomin
9600: 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e 67 65 64  g mask unchanged
9610: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  ..     */.    re
9620: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  turn mask;.}../*
9630: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9680: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 68 61 6e 6e  . *. * Tls_Chann
9690: 65 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09  elType --. *. *.
96a0: 44 65 66 69 6e 65 73 20 74 68 65 20 63 6f 72 72  Defines the corr
96b0: 65 63 74 20 54 4c 53 20 63 68 61 6e 6e 65 6c 20  ect TLS channel 
96c0: 64 72 69 76 65 72 20 68 61 6e 64 6c 65 72 73 20  driver handlers 
96d0: 66 6f 72 20 74 68 69 73 20 63 68 61 6e 6e 65 6c  for this channel
96e0: 20 74 79 70 65 2e 0a 20 2a 0a 20 2a 20 52 65 73   type.. *. * Res
96f0: 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 5f 43 68 61  ults:. *.Tcl_Cha
9700: 6e 6e 65 6c 54 79 70 65 20 73 74 72 75 63 74 75  nnelType structu
9710: 72 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  re.. *. * Side e
9720: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
9730: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
9740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9780: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  ---. */.static c
9790: 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  onst Tcl_Channel
97a0: 54 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54  Type tlsChannelT
97b0: 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 74 6c 73  ype = {.    "tls
97c0: 22 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d  ",.../* Type nam
97d0: 65 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41  e */.    TCL_CHA
97e0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09  NNEL_VERSION_5,.
97f0: 2f 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f  /* v5 channel */
9800: 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f  .    TlsClosePro
9810: 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f  c,../* Close pro
9820: 63 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75  c */.    TlsInpu
9830: 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74  tProc,../* Input
9840: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73   proc */.    Tls
9850: 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20  OutputProc,../* 
9860: 4f 75 74 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20  Output proc */. 
9870: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65     NULL,.../* Se
9880: 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54  ek proc */.    T
9890: 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c  lsSetOptionProc,
98a0: 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20  ../* Set option 
98b0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 47  proc */.    TlsG
98c0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f  etOptionProc,../
98d0: 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f  * Get option pro
98e0: 63 20 2a 2f 0a 20 20 20 20 54 6c 73 57 61 74 63  c */.    TlsWatc
98f0: 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69  hProc,../* Initi
9900: 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a  alize notifier *
9910: 2f 0a 20 20 20 20 54 6c 73 47 65 74 48 61 6e 64  /.    TlsGetHand
9920: 6c 65 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20  leProc,../* Get 
9930: 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f  OS handles out o
9940: 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  f channel */.   
9950: 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 2c 09   TlsClose2Proc,.
9960: 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a  ./* close2proc *
9970: 2f 0a 20 20 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f  /.    TlsBlockMo
9980: 64 65 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20  deProc,../* Set 
9990: 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63  blocking/nonbloc
99a0: 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20  king mode*/.    
99b0: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68  NULL,.../* Flush
99c0: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73   proc */.    Tls
99d0: 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20  NotifyProc,../* 
99e0: 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e  Handling of even
99f0: 74 73 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a  ts bubbling up *
9a00: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  /.    NULL,.../*
9a10: 20 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20   Wide seek proc 
9a20: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f  */.    NULL,.../
9a30: 2a 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e 20  * Thread action 
9a40: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a  */.    NULL.../*
9a50: 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a   Truncate */.};.
9a60: 0a 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e  .const Tcl_Chann
9a70: 65 6c 54 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e  elType *Tls_Chan
9a80: 6e 65 6c 54 79 70 65 28 76 6f 69 64 29 20 7b 0a  nelType(void) {.
9a90: 20 20 20 20 72 65 74 75 72 6e 20 26 74 6c 73 43      return &tlsC
9aa0: 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d 0a        hannelType;.}.