Hex Artifact Content

Artifact 093ad0fd96239007f08630529e714e3961be1a4b1561ae561dfb8a76a3bebecf:


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 4e 6f 72 6d 61 6c 0a 09 09 74 6c 73  ./*.Normal...tls
0280: 42 49 4f 2e 63 09 09 09 09 74 6c 73 49 4f 2e 63  BIO.c....tlsIO.c
0290: 0a 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20  . +------+      
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02b0: 20 20 2b 2d 2d 2d 2d 2d 2b 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 20 2b 2d 2d 2d 2b 0a            +---+.
02e0: 20 7c 20 20 20 20 20 20 7c 54 63 6c 5f 57 72 69   |      |Tcl_Wri
02f0: 74 65 52 61 77 3c 2d 2d 42 69 6f 4f 75 74 70 75  teRaw<--BioOutpu
0300: 74 7c 20 53 53 4c 20 7c 42 49 4f 5f 77 72 69 74  t| SSL |BIO_writ
0310: 65 3c 2d 2d 54 6c 73 4f 75 74 70 75 74 50 72 6f  e<--TlsOutputPro
0320: 63 3c 2d 2d 57 72 69 74 65 7c 20 20 20 7c 0a 20  c<--Write|   |. 
0330: 7c 73 6f 63 6b 65 74 7c 20 20 20 20 20 20 3c 65  |socket|      <e
0340: 6e 63 72 79 70 74 65 64 3e 20 20 20 20 20 20 20  ncrypted>       
0350: 7c 20 42 49 4f 20 7c 20 20 20 20 20 20 20 20 20  | BIO |         
0360: 20 20 20 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e     <unencrypted>
0370: 20 20 20 20 20 20 20 20 7c 41 70 70 7c 0a 20 7c          |App|. |
0380: 20 20 20 20 20 20 7c 54 63 6c 5f 52 65 61 64 52        |Tcl_ReadR
0390: 61 77 20 2d 2d 3e 20 42 69 6f 49 6e 70 75 74 7c  aw --> BioInput|
03a0: 20 20 20 20 20 7c 42 49 4f 5f 52 65 61 64 20 2d       |BIO_Read -
03b0: 2d 3e 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d  ->TlsInputProc -
03c0: 2d 3e 20 52 65 61 64 7c 20 20 20 7c 0a 20 2b 2d  -> Read|   |. +-
03d0: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20  -----+          
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d                +-
03f0: 2d 2d 2d 2d 2b 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 20 20 20                  
0410: 20 20 20 20 20 20 2b 2d 2d 2d 2b 0a 0a 0a 46 61        +---+...Fa
0420: 73 74 20 50 61 74 68 0a 09 09 09 09 09 74 6c 73  st Path......tls
0430: 49 4f 2e 63 0a 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20  IO.c.  +------+ 
0440: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
0450: 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  --+             
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0470: 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 0a          +-----+.
0480: 20 20 7c 20 20 20 20 20 20 7c 3c 2d 2d 20 77 72    |      |<-- wr
0490: 69 74 65 20 3c 2d 2d 7c 20 53 53 4c 20 7c 42 49  ite <--| SSL |BI
04a0: 4f 5f 77 72 69 74 65 20 3c 2d 2d 20 54 6c 73 4f  O_write <-- TlsO
04b0: 75 74 70 75 74 50 72 6f 63 20 3c 2d 2d 20 57 72  utputProc <-- Wr
04c0: 69 74 65 7c 20 20 20 20 20 7c 0a 20 20 7c 73 6f  ite|     |.  |so
04d0: 63 6b 65 74 7c 20 3c 65 6e 63 72 79 70 74 65 64  cket| <encrypted
04e0: 3e 20 7c 20 42 49 4f 20 7c 20 20 20 20 20 20 20  > | BIO |       
04f0: 20 20 20 20 20 3c 75 6e 65 6e 63 72 79 70 74 65       <unencrypte
0500: 64 3e 20 20 20 20 20 20 20 20 20 20 20 20 7c 20  d>            | 
0510: 41 70 70 20 7c 0a 20 20 7c 20 20 20 20 20 20 7c  App |.  |      |
0520: 3c 2d 2d 20 20 72 65 61 64 20 3c 2d 2d 7c 20 20  <--  read <--|  
0530: 20 20 20 7c 42 49 4f 5f 52 65 61 64 20 20 2d 2d     |BIO_Read  --
0540: 3e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 20  > TlsInputProc  
0550: 2d 2d 3e 20 20 52 65 61 64 7c 20 20 20 20 20 7c  -->  Read|     |
0560: 0a 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20  .  +------+     
0570: 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 20          +-----+ 
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 0a 2a 2f 0a 0a      +-----+.*/..
05b0: 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74  #include "tlsInt
05c0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72  .h".#include <er
05d0: 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  rno.h>../*. *---
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0630: 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f   TlsBlockModePro
0640: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
0650: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
0660: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  oked by the gene
0670: 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20  ric IO level to 
0680: 73 65 74 20 63 68 61 6e 6e 65 6c 20 74 6f 0a 20  set channel to. 
0690: 2a 09 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f  *.blocking or no
06a0: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 20  nblocking mode. 
06b0: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65  Called by the ge
06c0: 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20  neric I/O layer 
06d0: 77 68 65 6e 65 76 65 72 0a 20 2a 09 74 68 65 20  whenever. *.the 
06e0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
06f0: 74 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  tion() function 
0700: 69 73 20 75 73 65 64 20 77 69 74 68 20 6f 70 74  is used with opt
0710: 69 6f 6e 20 2d 62 6c 6f 63 6b 69 6e 67 2e 0a 20  ion -blocking.. 
0720: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
0730: 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  .0 if successful
0740: 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20   or POSIX error 
0750: 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a  code if failed..
0760: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0770: 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20  ts:. *.Sets the 
0780: 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63  device into bloc
0790: 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b  king or nonblock
07a0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d  ing mode.. *. *-
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 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0800: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42  .static int TlsB
0810: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 0a 20 20  lockModeProc(.  
0820: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
0830: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43 6f  tanceData,./* Co
0840: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69  nnection state i
0850: 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  nfo */.    int m
0860: 6f 64 65 29 09 09 09 2f 2a 20 42 6c 6f 63 6b 69  ode).../* Blocki
0870: 6e 67 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  ng or non-blocki
0880: 6e 67 20 6d 6f 64 65 20 2a 2f 0a 7b 0a 20 20 20  ng mode */.{.   
0890: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
08a0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
08b0: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20  tanceData;..    
08c0: 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f  if (mode == TCL_
08d0: 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47  MODE_NONBLOCKING
08e0: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66  ) {..statePtr->f
08f0: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
0900: 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73  ASYNC;.    } els
0910: 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66  e {..statePtr->f
0920: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43  lags &= ~(TLS_TC
0930: 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a  L_ASYNC);.    }.
0940: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a      return 0;.}.
0950: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
0960: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f  ---. *. * TlsClo
09b0: 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  seProc --. *. *.
09c0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
09d0: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  s invoked by the
09e0: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65   generic IO leve
09f0: 6c 20 74 6f 20 70 65 72 66 6f 72 6d 20 63 68 61  l to perform cha
0a00: 6e 6e 65 6c 0a 20 2a 09 74 79 70 65 20 73 70 65  nnel. *.type spe
0a10: 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68  cific cleanup wh
0a20: 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20  en a SSL socket 
0a30: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 20 69 73  based channel is
0a40: 20 63 6c 6f 73 65 64 2e 20 43 61 6c 6c 65 64 0a   closed. Called.
0a50: 20 2a 09 62 79 20 74 68 65 20 67 65 6e 65 72 69   *.by the generi
0a60: 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e  c I/O layer when
0a70: 65 76 65 72 20 74 68 65 20 54 63 6c 5f 43 6c 6f  ever the Tcl_Clo
0a80: 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  se() function is
0a90: 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73   used.. *. * Res
0aa0: 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75  ults:. *.0 if su
0ab0: 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49  ccessful or POSI
0ac0: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  X error code if 
0ad0: 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69  failed.. *. * Si
0ae0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0af0: 6c 6f 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74  loses the socket
0b00: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e   of the channel.
0b10: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
0b70: 6e 74 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28  nt TlsCloseProc(
0b80: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
0b90: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a  instanceData,./*
0ba0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74   Connection stat
0bb0: 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 54 63  e info */.    Tc
0bc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0bd0: 29 09 09 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70  )../* Tcl interp
0be0: 72 65 74 65 72 20 74 6f 20 72 65 70 6f 72 74 20  reter to report 
0bf0: 65 72 72 6f 72 73 20 74 6f 20 2a 2f 0a 7b 0a 20  errors to */.{. 
0c00: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
0c10: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69  tr = (State *) i
0c20: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
0c30: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c    dprintf("TlsCl
0c40: 6f 73 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76  oseProc(%p)", (v
0c50: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29  oid *) statePtr)
0c60: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 73  ;..    /* Send s
0c70: 68 75 74 64 6f 77 6e 20 6e 6f 74 69 66 69 63 61  hutdown notifica
0c80: 74 69 6f 6e 2e 20 57 69 6c 6c 20 72 65 74 75 72  tion. Will retur
0c90: 6e 20 30 20 77 68 69 6c 65 20 69 6e 20 70 72 6f  n 0 while in pro
0ca0: 63 65 73 73 2c 20 74 68 65 6e 20 31 20 77 68 65  cess, then 1 whe
0cb0: 6e 0a 20 20 20 20 20 20 20 63 6f 6d 70 6c 65 74  n.       complet
0cc0: 65 2e 20 4f 6e 6c 79 20 63 6c 6f 73 65 73 20 74  e. Only closes t
0cd0: 68 65 20 77 72 69 74 65 20 64 69 72 65 63 74 69  he write directi
0ce0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  on of the connec
0cf0: 74 69 6f 6e 3b 20 74 68 65 20 72 65 61 64 0a 20  tion; the read. 
0d00: 20 20 20 20 20 20 64 69 72 65 63 74 69 6f 6e 20        direction 
0d10: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 74 68 65  is closed by the
0d20: 20 70 65 65 72 2e 20 44 6f 65 73 20 6e 6f 74 20   peer. Does not 
0d30: 61 66 66 65 63 74 20 73 6f 63 6b 65 74 20 73 74  affect socket st
0d40: 61 74 65 2e 20 44 6f 6e 27 74 0a 20 20 20 20 20  ate. Don't.     
0d50: 20 20 63 61 6c 6c 20 61 66 74 65 72 20 66 61 74    call after fat
0d60: 61 6c 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  al error. */.   
0d70: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
0d80: 73 6c 20 21 3d 20 4e 55 4c 4c 20 26 26 20 21 28  sl != NULL && !(
0d90: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
0da0: 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48  & TLS_TCL_HANDSH
0db0: 41 4b 45 5f 46 41 49 4c 45 44 29 29 20 7b 0a 09  AKE_FAILED)) {..
0dc0: 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50  BIO_flush(stateP
0dd0: 74 72 2d 3e 62 69 6f 29 3b 0a 09 53 53 4c 5f 73  tr->bio);..SSL_s
0de0: 68 75 74 64 6f 77 6e 28 73 74 61 74 65 50 74 72  hutdown(statePtr
0df0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->ssl);.    }.. 
0e00: 20 20 20 2f 2a 20 54 6c 73 5f 46 72 65 65 20 63     /* Tls_Free c
0e10: 61 6c 6c 73 20 54 6c 73 5f 43 6c 65 61 6e 20 2a  alls Tls_Clean *
0e20: 2f 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75  /.    Tcl_Eventu
0e30: 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74  allyFree((Client
0e40: 44 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 54  Data)statePtr, T
0e50: 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 72 65  ls_Free);.    re
0e60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  turn 0;.}../*. *
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0ec0: 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f  . * TlsClose2Pro
0ed0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 53 69 6d 69 6c  c --. *. *.Simil
0ee0: 61 72 20 74 6f 20 54 6c 73 43 6c 6f 73 65 50 72  ar to TlsClosePr
0ef0: 6f 63 2c 20 62 75 74 20 61 6c 6c 6f 77 73 20 66  oc, but allows f
0f00: 6f 72 20 73 65 70 61 72 61 74 65 20 63 6c 6f 73  or separate clos
0f10: 65 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  e read and write
0f20: 0a 20 2a 09 73 69 64 65 20 6f 66 20 63 68 61 6e  . *.side of chan
0f30: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
0f90: 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32  ic int TlsClose2
0fa0: 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74  Proc(.    Client
0fb0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
0fc0: 61 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e  a,./* Connection
0fd0: 20 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20   state info */. 
0fe0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
0ff0: 6e 74 65 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69  nterp,../* Tcl i
1000: 6e 74 65 72 70 72 65 74 65 72 20 74 6f 20 72 65  nterpreter to re
1010: 70 6f 72 74 20 65 72 72 6f 72 73 20 74 6f 20 2a  port errors to *
1020: 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29  /.    int flags)
1030: 09 09 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63  .../* Flags to c
1040: 6c 6f 73 65 20 72 65 61 64 2f 77 72 69 74 65 20  lose read/write 
1050: 73 69 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c 20  side of channel 
1060: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
1070: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
1080: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
1090: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
10a0: 22 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 25  "TlsClose2Proc(%
10b0: 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74  p)", (void *) st
10c0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66  atePtr);..    if
10d0: 20 28 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f   ((flags & (TCL_
10e0: 43 4c 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43  CLOSE_READ|TCL_C
10f0: 4c 4f 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20  LOSE_WRITE)) == 
1100: 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73  0) {..return Tls
1110: 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e  CloseProc(instan
1120: 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b  ceData, interp);
1130: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1140: 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  n EINVAL;.}../*.
1150: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
11a0: 20 2a 0a 20 2a 20 54 6c 73 5f 57 61 69 74 46 6f   *. * Tls_WaitFo
11b0: 72 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a 20  rConnect --. *. 
11c0: 2a 09 50 65 72 66 6f 72 6d 20 63 6f 6e 6e 65 63  *.Perform connec
11d0: 74 20 28 63 6c 69 65 6e 74 29 20 6f 72 20 61 63  t (client) or ac
11e0: 63 65 70 74 20 28 73 65 72 76 65 72 29 20 66 75  cept (server) fu
11f0: 6e 63 74 69 6f 6e 2e 20 41 6c 73 6f 20 70 65 72  nction. Also per
1200: 66 6f 72 6d 73 0a 20 2a 09 65 71 75 69 76 61 6c  forms. *.equival
1210: 65 6e 74 20 6f 66 20 68 61 6e 64 73 68 61 6b 65  ent of handshake
1220: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a   function.. *. *
1230: 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 31   Result:. *    1
1240: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1250: 30 20 69 66 20 77 61 69 74 20 66 6f 72 20 63 6f  0 if wait for co
1260: 6e 6e 65 63 74 2c 20 61 6e 64 20 2d 31 20 69 66  nnect, and -1 if
1270: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53   failed.. *. * S
1280: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1290: 49 73 73 75 65 73 20 53 53 4c 5f 61 63 63 65 70  Issues SSL_accep
12a0: 74 20 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74  t or SSL_connect
12b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1300: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f  ---. */.int Tls_
1310: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 0a  WaitForConnect(.
1320: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
1330: 50 74 72 2c 09 09 09 2f 2a 20 43 6f 6e 6e 65 63  Ptr,.../* Connec
1340: 74 69 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20  tion state info 
1350: 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f  */.    int *erro
1360: 72 43 6f 64 65 50 74 72 2c 09 09 09 2f 2a 20 53  rCodePtr,.../* S
1370: 74 6f 72 61 67 65 20 66 6f 72 20 65 72 72 6f 72  torage for error
1380: 20 63 6f 64 65 20 74 6f 20 72 65 74 75 72 6e 20   code to return 
1390: 2a 2f 0a 20 20 20 20 69 6e 74 20 68 61 6e 64 73  */.    int hands
13a0: 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72  hakeFailureIsPer
13b0: 6d 61 6e 65 6e 74 29 09 2f 2a 20 49 73 20 74 68  manent)./* Is th
13c0: 65 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 75 72  e connect failur
13d0: 65 20 70 65 72 6d 61 6e 65 6e 74 20 2a 2f 0a 7b  e permanent */.{
13e0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
13f0: 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b  ng backingError;
1400: 0a 20 20 20 20 69 6e 74 20 65 72 72 2c 20 72 63  .    int err, rc
1410: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 69   = 0;.    int bi
1420: 6f 53 68 6f 75 6c 64 52 65 74 72 79 3b 0a 20 20  oShouldRetry;.  
1430: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
1440: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
1450: 66 28 22 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  f("WaitForConnec
1460: 74 28 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29  t(%p)", (void *)
1470: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
1480: 64 70 72 69 6e 74 46 6c 61 67 73 28 73 74 61 74  dprintFlags(stat
1490: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ePtr);..    /* C
14a0: 61 6e 20 61 6c 73 6f 20 63 68 65 63 6b 20 53 53  an also check SS
14b0: 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68  L_is_init_finish
14c0: 65 64 28 73 73 6c 29 20 2a 2f 0a 20 20 20 20 69  ed(ssl) */.    i
14d0: 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66  f (!(statePtr->f
14e0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49  lags & TLS_TCL_I
14f0: 4e 49 54 29 29 20 7b 0a 09 64 70 72 69 6e 74 66  NIT)) {..dprintf
1500: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  ("Tls_WaitForCon
1510: 6e 65 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20 61  nect called on a
1520: 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a  lready initializ
1530: 65 64 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72 65  ed channel -- re
1540: 74 75 72 6e 69 6e 67 20 77 69 74 68 20 69 6d 6d  turning with imm
1550: 65 64 69 61 74 65 20 73 75 63 63 65 73 73 22 29  ediate success")
1560: 3b 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20  ;..return 1;.   
1570: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
1580: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c  ePtr->flags & TL
1590: 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f  S_TCL_HANDSHAKE_
15a0: 46 41 49 4c 45 44 29 20 7b 0a 09 2f 2a 0a 09 20  FAILED) {../*.. 
15b0: 2a 20 44 69 66 66 65 72 65 6e 74 20 74 79 70 65  * Different type
15c0: 73 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  s of operations 
15d0: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 20 72  have different r
15e0: 65 71 75 69 72 65 6d 65 6e 74 73 0a 09 20 2a 20  equirements.. * 
15f0: 53 53 4c 20 62 65 69 6e 67 20 65 73 74 61 62 6c  SSL being establ
1600: 69 73 68 65 64 0a 09 20 2a 2f 0a 09 69 66 20 28  ished.. */..if (
1610: 68 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65  handshakeFailure
1620: 49 73 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 09  IsPermanent) {..
1630: 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b      dprintf("Ask
1640: 65 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61  ed to wait for a
1650: 20 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74   TLS handshake t
1660: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1670: 66 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69  failed.  Returni
1680: 6e 67 20 66 61 74 61 6c 20 65 72 72 6f 72 22 29  ng fatal error")
1690: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
16a0: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
16b0: 54 45 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  TED;..} else {..
16c0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b      dprintf("Ask
16d0: 65 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61  ed to wait for a
16e0: 20 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74   TLS handshake t
16f0: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1700: 66 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69  failed.  Returni
1710: 6e 67 20 73 6f 66 74 20 65 72 72 6f 72 22 29 3b  ng soft error");
1720: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
1730: 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54  Ptr = ECONNRESET
1740: 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 2d 31 3b  ;..}..return -1;
1750: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20  .    }..    for 
1760: 28 3b 3b 29 20 7b 0a 09 45 52 52 5f 63 6c 65 61  (;;) {..ERR_clea
1770: 72 5f 65 72 72 6f 72 28 29 3b 0a 09 42 49 4f 5f  r_error();..BIO_
1780: 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67  clear_retry_flag
1790: 73 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  s(statePtr->bio)
17a0: 3b 0a 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 69  ;.../* Not initi
17b0: 61 6c 69 7a 65 64 20 79 65 74 21 20 41 6c 73 6f  alized yet! Also
17c0: 20 63 61 6c 6c 73 20 53 53 4c 5f 64 6f 5f 68 61   calls SSL_do_ha
17d0: 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69  ndshake(). */..i
17e0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  f (statePtr->fla
17f0: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52  gs & TLS_TCL_SER
1800: 56 45 52 29 20 7b 0a 09 20 20 20 20 64 70 72 69  VER) {..    dpri
1810: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c  ntf("Calling SSL
1820: 5f 61 63 63 65 70 74 28 29 22 29 3b 0a 09 20 20  _accept()");..  
1830: 20 20 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 65    err = SSL_acce
1840: 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  pt(statePtr->ssl
1850: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  );...} else {.. 
1860: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
1870: 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28  ing SSL_connect(
1880: 29 22 29 3b 0a 09 20 20 20 20 65 72 72 20 3d 20  )");..    err = 
1890: 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 73 74 61 74  SSL_connect(stat
18a0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a  ePtr->ssl);..}..
18b0: 09 2f 2a 20 31 3d 73 75 63 63 65 73 73 66 75 6c  ./* 1=successful
18c0: 2c 20 30 3d 6e 6f 74 20 73 75 63 63 65 73 73 66  , 0=not successf
18d0: 75 6c 20 61 6e 64 20 73 68 75 74 20 64 6f 77 6e  ul and shut down
18e0: 2c 20 3c 30 3d 66 61 74 61 6c 20 65 72 72 6f 72  , <0=fatal error
18f0: 20 2a 2f 0a 09 69 66 20 28 65 72 72 20 3e 20 30   */..if (err > 0
1900: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
1910: 28 22 41 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e  ("Accept or conn
1920: 65 63 74 20 77 61 73 20 73 75 63 63 65 73 73 66  ect was successf
1930: 75 6c 22 29 3b 0a 0a 09 20 20 20 20 65 72 72 20  ul");...    err 
1940: 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74  = BIO_flush(stat
1950: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20  ePtr->bio);..   
1960: 20 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b   if (err <= 0) {
1970: 0a 09 09 64 70 72 69 6e 74 66 28 22 46 6c 75 73  ...dprintf("Flus
1980: 68 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 6c  hing the lower l
1990: 61 79 65 72 73 20 66 61 69 6c 65 64 2c 20 74 68  ayers failed, th
19a0: 69 73 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  is will probably
19b0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20   terminate this 
19c0: 73 65 73 73 69 6f 6e 22 29 3b 0a 09 20 20 20 20  session");..    
19d0: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  }..} else {..   
19e0: 20 64 70 72 69 6e 74 66 28 22 41 63 63 65 70 74   dprintf("Accept
19f0: 20 6f 72 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c   or connect fail
1a00: 65 64 22 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 61  ed");..}.../* Sa
1a10: 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20  me as SSL_want, 
1a20: 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20  but also checks 
1a30: 74 68 65 20 65 72 72 6f 72 20 71 75 65 75 65 20  the error queue 
1a40: 2a 2f 0a 09 72 63 20 3d 20 53 53 4c 5f 67 65 74  */..rc = SSL_get
1a50: 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d  _error(statePtr-
1a60: 3e 73 73 6c 2c 20 65 72 72 29 3b 0a 09 62 61 63  >ssl, err);..bac
1a70: 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f  kingError = ERR_
1a80: 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 09 69 66  get_error();..if
1a90: 20 28 72 63 20 21 3d 20 53 53 4c 5f 45 52 52 4f   (rc != SSL_ERRO
1aa0: 52 5f 4e 4f 4e 45 29 20 7b 0a 09 20 20 20 20 64  R_NONE) {..    d
1ab0: 70 72 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f  printf("Got erro
1ac0: 72 3a 20 25 69 20 28 72 63 20 3d 20 25 69 29 22  r: %i (rc = %i)"
1ad0: 2c 20 65 72 72 2c 20 72 63 29 3b 0a 09 20 20 20  , err, rc);..   
1ae0: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 65 72   dprintf("Got er
1af0: 72 6f 72 3a 20 25 73 22 2c 20 45 52 52 5f 72 65  ror: %s", ERR_re
1b00: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
1b10: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29  g(backingError))
1b20: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 68 65 20 72 65  ;..}.../* The re
1b30: 74 72 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  try flag is set 
1b40: 62 79 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72  by the BIO_set_r
1b50: 65 74 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73  etry_* functions
1b60: 20 2a 2f 0a 09 62 69 6f 53 68 6f 75 6c 64 52 65   */..bioShouldRe
1b70: 74 72 79 20 3d 20 42 49 4f 5f 73 68 6f 75 6c 64  try = BIO_should
1b80: 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d  _retry(statePtr-
1b90: 3e 62 69 6f 29 3b 0a 09 64 70 72 69 6e 74 66 28  >bio);..dprintf(
1ba0: 22 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20  "bioShouldRetry 
1bb0: 3d 20 25 64 22 2c 20 62 69 6f 53 68 6f 75 6c 64  = %d", bioShould
1bc0: 52 65 74 72 79 29 3b 0a 0a 09 69 66 20 28 62 69  Retry);...if (bi
1bd0: 6f 53 68 6f 75 6c 64 52 65 74 72 79 29 20 7b 0a  oShouldRetry) {.
1be0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 68  .    dprintf("Th
1bf0: 65 20 49 2f 4f 20 64 69 64 20 6e 6f 74 20 63 6f  e I/O did not co
1c00: 6d 70 6c 65 74 65 20 2d 2d 20 62 75 74 20 77 65  mplete -- but we
1c10: 20 73 68 6f 75 6c 64 20 74 72 79 20 69 74 20 61   should try it a
1c20: 67 61 69 6e 22 29 3b 0a 0a 09 20 20 20 20 69 66  gain");...    if
1c30: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
1c40: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  s & TLS_TCL_ASYN
1c50: 43 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  C) {...dprintf("
1c60: 52 65 74 75 72 6e 69 6e 67 20 45 41 47 41 49 4e  Returning EAGAIN
1c70: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
1c80: 62 65 20 72 65 74 72 69 65 64 20 6c 61 74 65 72  be retried later
1c90: 22 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65  ");...*errorCode
1ca0: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 09  Ptr = EAGAIN;...
1cb0: 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d  return 0;..    }
1cc0: 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74   else {...dprint
1cd0: 66 28 22 44 6f 69 6e 67 20 73 6f 20 6e 6f 77 22  f("Doing so now"
1ce0: 29 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  );...continue;..
1cf0: 20 20 20 20 7d 0a 09 7d 0a 0a 09 64 70 72 69 6e      }..}...dprin
1d00: 74 66 28 22 57 65 20 68 61 76 65 20 65 69 74 68  tf("We have eith
1d10: 65 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 73  er completely es
1d20: 74 61 62 6c 69 73 68 65 64 20 74 68 65 20 73 65  tablished the se
1d30: 73 73 69 6f 6e 20 6f 72 20 63 6f 6d 70 6c 65 74  ssion or complet
1d40: 65 6c 79 20 66 61 69 6c 65 64 20 69 74 20 2d 2d  ely failed it --
1d50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72   there is no mor
1d60: 65 20 6e 65 65 64 20 74 6f 20 65 76 65 72 20 72  e need to ever r
1d70: 65 74 72 79 20 69 74 20 74 68 6f 75 67 68 22 29  etry it though")
1d80: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ;..break;.    }.
1d90: 0a 20 20 20 20 73 77 69 74 63 68 20 28 72 63 29  .    switch (rc)
1da0: 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52   {..case SSL_ERR
1db0: 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a  OR_NONE:..    /*
1dc0: 20 54 68 65 20 54 4c 53 2f 53 53 4c 20 49 2f 4f   The TLS/SSL I/O
1dd0: 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c   operation compl
1de0: 65 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  eted successfull
1df0: 79 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  y */..    dprint
1e00: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e  f("SSL_ERROR_NON
1e10: 45 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  E");..    *error
1e20: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20  CodePtr = 0;..  
1e30: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
1e40: 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09  SSL_ERROR_SSL:..
1e50: 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63      /* A non-rec
1e60: 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20  overable, fatal 
1e70: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c  error in the SSL
1e80: 20 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65   library occurre
1e90: 64 2c 0a 09 20 20 20 20 20 20 20 75 73 75 61 6c  d,..       usual
1ea0: 6c 79 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72  ly a protocol er
1eb0: 72 6f 72 2e 20 54 68 69 73 20 69 6e 63 6c 75 64  ror. This includ
1ec0: 65 73 20 63 65 72 74 69 66 69 63 61 74 65 20 76  es certificate v
1ed0: 61 6c 69 64 61 74 69 6f 6e 0a 09 20 20 20 20 20  alidation..     
1ee0: 20 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 09 20 20    errors. */..  
1ef0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45    dprintf("SSL_E
1f00: 52 52 4f 52 5f 53 53 4c 3a 20 46 61 74 61 6c 20  RROR_SSL: Fatal 
1f10: 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72  SSL protocol err
1f20: 6f 72 20 6f 63 63 75 72 72 65 64 22 29 3b 0a 09  or occurred");..
1f30: 20 20 20 20 69 66 20 28 53 53 4c 5f 67 65 74 5f      if (SSL_get_
1f40: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74  verify_result(st
1f50: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20  atePtr->ssl) != 
1f60: 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54  X509_V_OK) {...T
1f70: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
1f80: 72 2c 0a 09 09 20 20 20 20 58 35 30 39 5f 76 65  r,...    X509_ve
1f90: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
1fa0: 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76  string(SSL_get_v
1fb0: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
1fc0: 74 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09  tePtr->ssl)));..
1fd0: 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 62      }..    if (b
1fe0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20 30  ackingError != 0
1ff0: 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28  ) {...Tls_Error(
2000: 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65  statePtr, ERR_re
2010: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
2020: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29  g(backingError))
2030: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 74  ;..    }..    st
2040: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
2050: 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41   TLS_TCL_HANDSHA
2060: 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20 20  KE_FAILED;..    
2070: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2080: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20  ECONNABORTED;.. 
2090: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09     return -1;...
20a0: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57  case SSL_ERROR_W
20b0: 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f  ANT_READ:..    /
20c0: 2a 20 4d 6f 72 65 20 64 61 74 61 20 6d 75 73 74  * More data must
20d0: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
20e0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 42 49 4f  e underlying BIO
20f0: 20 6c 61 79 65 72 20 69 6e 20 6f 72 64 65 72 20   layer in order 
2100: 74 6f 0a 09 20 20 20 20 20 20 20 63 6f 6d 70 6c  to..       compl
2110: 65 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 53  ete the actual S
2120: 53 4c 5f 2a 28 29 20 6f 70 65 72 61 74 69 6f 6e  SL_*() operation
2130: 2e 20 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  .  */..    dprin
2140: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41  tf("SSL_ERROR_WA
2150: 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20 20 20 20  NT_READ");..    
2160: 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65  BIO_set_retry_re
2170: 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ad(statePtr->bio
2180: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
2190: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
21a0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 52  .    dprintf("ER
21b0: 52 28 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  R(SSL_ERROR_WANT
21c0: 5f 52 45 41 44 2c 20 45 41 47 41 49 4e 29 22 29  _READ, EAGAIN)")
21d0: 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
21e0: 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 52 45 41  >want |= TCL_REA
21f0: 44 41 42 4c 45 3b 0a 09 20 20 20 20 72 65 74 75  DABLE;..    retu
2200: 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c  rn 0;...case SSL
2210: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54  _ERROR_WANT_WRIT
2220: 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 72 65  E:..    /* There
2230: 20 69 73 20 64 61 74 61 20 69 6e 20 74 68 65 20   is data in the 
2240: 53 53 4c 20 62 75 66 66 65 72 20 74 68 61 74 20  SSL buffer that 
2250: 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
2260: 74 6f 20 74 68 65 0a 09 20 20 20 20 20 20 20 75  to the..       u
2270: 6e 64 65 72 6c 79 69 6e 67 20 42 49 4f 20 69 6e  nderlying BIO in
2280: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
2290: 74 65 20 74 68 65 20 53 53 4c 5f 2a 28 29 20 6f  te the SSL_*() o
22a0: 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 09 20 20  peration. */..  
22b0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45    dprintf("SSL_E
22c0: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 22  RROR_WANT_WRITE"
22d0: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f  );..    BIO_set_
22e0: 72 65 74 72 79 5f 77 72 69 74 65 28 73 74 61 74  retry_write(stat
22f0: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20  ePtr->bio);..   
2300: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
2310: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70   EAGAIN;..    dp
2320: 72 69 6e 74 66 28 22 45 52 52 28 53 53 4c 5f 45  rintf("ERR(SSL_E
2330: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c  RROR_WANT_WRITE,
2340: 20 45 41 47 41 49 4e 29 22 29 3b 0a 09 20 20 20   EAGAIN)");..   
2350: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20   statePtr->want 
2360: 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b  |= TCL_WRITABLE;
2370: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ..    return 0;.
2380: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
2390: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55  _WANT_X509_LOOKU
23a0: 50 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f  P:..    /* The o
23b0: 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
23c0: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
23d0: 65 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e  e an application
23e0: 20 63 61 6c 6c 62 61 63 6b 0a 09 20 20 20 20 20   callback..     
23f0: 20 20 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58    set by SSL_CTX
2400: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74  _set_client_cert
2410: 5f 63 62 28 29 20 68 61 73 20 61 73 6b 65 64 20  _cb() has asked 
2420: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61  to be called aga
2430: 69 6e 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  in. */..    dpri
2440: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57  ntf("SSL_ERROR_W
2450: 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 22  ANT_X509_LOOKUP"
2460: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f  );..    BIO_set_
2470: 72 65 74 72 79 5f 73 70 65 63 69 61 6c 28 73 74  retry_special(st
2480: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20  atePtr->bio);.. 
2490: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
24a0: 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72  _reason(statePtr
24b0: 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52 5f 53 53  ->bio, BIO_RR_SS
24c0: 4c 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 29 3b 0a  L_X509_LOOKUP);.
24d0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
24e0: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
24f0: 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 53    dprintf("ERR(S
2500: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
2510: 30 39 5f 4c 4f 4f 4b 55 50 2c 20 45 41 47 41 49  09_LOOKUP, EAGAI
2520: 4e 29 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72  N)");..    retur
2530: 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  n 0;...case SSL_
2540: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09  ERROR_SYSCALL:..
2550: 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d      /* Some non-
2560: 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74  recoverable, fat
2570: 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  al I/O error occ
2580: 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 20 64 70  urred */..    dp
2590: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52  rintf("SSL_ERROR
25a0: 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74 61 6c 20  _SYSCALL: Fatal 
25b0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72  I/O error occurr
25c0: 65 64 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28  ed");...    if (
25d0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20  backingError == 
25e0: 30 20 26 26 20 65 72 72 20 3d 3d 20 30 29 20 7b  0 && err == 0) {
25f0: 0a 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20  ...dprintf("EOF 
2600: 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72  reached")...*err
2610: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e  orCodePtr = ECON
2620: 4e 52 45 53 45 54 3b 0a 09 09 54 6c 73 5f 45 72  NRESET;...Tls_Er
2630: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 28  ror(statePtr, "(
2640: 75 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46 20  unexpected) EOF 
2650: 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20  reached");...   
2660: 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b   } else if (back
2670: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26  ingError == 0 &&
2680: 20 65 72 72 20 3d 3d 20 2d 31 29 20 7b 0a 09 09   err == -1) {...
2690: 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72  dprintf("I/O err
26a0: 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 72 72  or occurred (err
26b0: 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  no = %lu)", (uns
26c0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f  igned long) Tcl_
26d0: 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a  GetErrno());...*
26e0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54  errorCodePtr = T
26f0: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09  cl_GetErrno();..
2700: 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50  .if (*errorCodeP
2710: 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54  tr == ECONNRESET
2720: 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 6f 72  ) {...    *error
2730: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41  CodePtr = ECONNA
2740: 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 09 54 6c  BORTED;...}...Tl
2750: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
2760: 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a  , Tcl_ErrnoMsg(*
2770: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a  errorCodePtr));.
2780: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
2790: 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72  .dprintf("I/O er
27a0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 61  ror occurred (ba
27b0: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75  ckingError = %lu
27c0: 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  )", backingError
27d0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  );...*errorCodeP
27e0: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e  tr = Tcl_GetErrn
27f0: 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f  o();...if (*erro
2800: 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e  rCodePtr == ECON
2810: 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20  NRESET) {...    
2820: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2830: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09  ECONNABORTED;...
2840: 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74  }...Tls_Error(st
2850: 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 61 73  atePtr, ERR_reas
2860: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  on_error_string(
2870: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a  backingError));.
2880: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73 74 61  .    }...    sta
2890: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
28a0: 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b  TLS_TCL_HANDSHAK
28b0: 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 72  E_FAILED;..    r
28c0: 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65  eturn -1;...case
28d0: 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f   SSL_ERROR_ZERO_
28e0: 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f 2a 20  RETURN:..    /* 
28f0: 50 65 65 72 20 68 61 73 20 63 6c 65 61 6e 6c 79  Peer has cleanly
2900: 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e   closed the conn
2910: 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64 69 6e  ection by sendin
2920: 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69  g the close_noti
2930: 66 79 0a 09 20 20 20 20 20 20 20 61 6c 65 72 74  fy..       alert
2940: 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20 62 75  . Can't read, bu
2950: 74 20 63 61 6e 20 77 72 69 74 65 2e 20 4e 65 65  t can write. Nee
2960: 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 45  d to return an E
2970: 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20 20 20 20  OF, so the..    
2980: 20 20 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c     channel is cl
2990: 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c 6c 20  osed which will 
29a0: 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 75 74  send an SSL_shut
29b0: 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 20 20  down(). */..    
29c0: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52  dprintf("SSL_ERR
29d0: 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 20  OR_ZERO_RETURN: 
29e0: 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20  Peer has closed 
29f0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 22 29  the connection")
2a00: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
2a10: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45  ePtr = ECONNRESE
2a20: 54 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  T;..    Tls_Erro
2a30: 72 28 73 74 61 74 65 50 74 72 2c 20 22 50 65 65  r(statePtr, "Pee
2a40: 72 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65  r has closed the
2a50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
2a60: 77 72 69 74 69 6e 67 20 62 79 20 73 65 6e 64 69  writing by sendi
2a70: 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74  ng the close_not
2a80: 69 66 79 20 61 6c 65 72 74 22 29 3b 0a 09 20 20  ify alert");..  
2a90: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63    return -1;...c
2aa0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
2ab0: 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09 20 20 20  NT_CONNECT:..   
2ac0: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   /* The operatio
2ad0: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  n did not comple
2ae0: 74 65 20 61 6e 64 20 63 6f 6e 6e 65 63 74 20 77  te and connect w
2af0: 6f 75 6c 64 20 68 61 76 65 20 62 6c 6f 63 6b 65  ould have blocke
2b00: 64 2e 0a 09 20 20 20 20 20 20 20 52 65 74 72 79  d...       Retry
2b10: 20 61 67 61 69 6e 20 61 66 74 65 72 20 63 6f 6e   again after con
2b20: 6e 65 63 74 69 6f 6e 20 69 73 20 65 73 74 61 62  nection is estab
2b30: 6c 69 73 68 65 64 2e 20 2a 2f 0a 09 20 20 20 20  lished. */..    
2b40: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52  dprintf("SSL_ERR
2b50: 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 22  OR_WANT_CONNECT"
2b60: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f  );..    BIO_set_
2b70: 72 65 74 72 79 5f 73 70 65 63 69 61 6c 28 73 74  retry_special(st
2b80: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20  atePtr->bio);.. 
2b90: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
2ba0: 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72  _reason(statePtr
2bb0: 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52 5f 43 4f  ->bio, BIO_RR_CO
2bc0: 4e 4e 45 43 54 29 3b 0a 09 20 20 20 20 2a 65 72  NNECT);..    *er
2bd0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47  rorCodePtr = EAG
2be0: 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74  AIN;..    dprint
2bf0: 66 28 22 45 52 52 28 53 53 4c 5f 45 52 52 4f 52  f("ERR(SSL_ERROR
2c00: 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 2c 20 45  _WANT_CONNECT, E
2c10: 41 47 41 49 4e 29 22 29 3b 0a 09 20 20 20 20 72  AGAIN)");..    r
2c20: 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20  eturn 0;...case 
2c30: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41  SSL_ERROR_WANT_A
2c40: 43 43 45 50 54 3a 0a 09 20 20 20 20 2f 2a 20 54  CCEPT:..    /* T
2c50: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64  he operation did
2c60: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 61 6e   not complete an
2c70: 64 20 61 63 63 65 70 74 20 77 6f 75 6c 64 20 68  d accept would h
2c80: 61 76 65 20 62 6c 6f 63 6b 65 64 2e 0a 09 20 20  ave blocked...  
2c90: 20 20 20 20 20 52 65 74 72 79 20 61 67 61 69 6e       Retry again
2ca0: 20 61 66 74 65 72 20 63 6f 6e 6e 65 63 74 69 6f   after connectio
2cb0: 6e 20 69 73 20 65 73 74 61 62 6c 69 73 68 65 64  n is established
2cc0: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  . */..    dprint
2cd0: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  f("SSL_ERROR_WAN
2ce0: 54 5f 41 43 43 45 50 54 22 29 3b 0a 09 20 20 20  T_ACCEPT");..   
2cf0: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 73   BIO_set_retry_s
2d00: 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d  pecial(statePtr-
2d10: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42 49 4f 5f  >bio);..    BIO_
2d20: 73 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e  set_retry_reason
2d30: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20  (statePtr->bio, 
2d40: 42 49 4f 5f 52 52 5f 41 43 43 45 50 54 29 3b 0a  BIO_RR_ACCEPT);.
2d50: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
2d60: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
2d70: 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 53    dprintf("ERR(S
2d80: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43  SL_ERROR_WANT_AC
2d90: 43 45 50 54 2c 20 45 41 47 41 49 4e 29 22 29 3b  CEPT, EAGAIN)");
2da0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ..    return 0;.
2db0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
2dc0: 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a 09 20 20  _WANT_ASYNC:..  
2dd0: 20 20 2f 2a 20 55 73 65 64 20 77 69 74 68 20 66    /* Used with f
2de0: 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f 41 53 59  lag SSL_MODE_ASY
2df0: 4e 43 2c 20 6f 70 20 64 69 64 6e 27 74 20 63 6f  NC, op didn't co
2e00: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 61  mplete because a
2e10: 6e 0a 09 20 20 20 20 20 20 20 61 73 79 6e 63 20  n..       async 
2e20: 65 6e 67 69 6e 65 20 69 73 20 73 74 69 6c 6c 20  engine is still 
2e30: 70 72 6f 63 65 73 73 69 6e 67 20 64 61 74 61 20  processing data 
2e40: 2a 2f 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  */..case SSL_ERR
2e50: 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 5f 4a 4f  OR_WANT_ASYNC_JO
2e60: 42 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 61  B:..    /* The a
2e70: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6a 6f 62 20  synchronous job 
2e80: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 74 61  could not be sta
2e90: 72 74 65 64 20 62 65 63 61 75 73 65 20 74 68 65  rted because the
2ea0: 72 65 20 77 65 72 65 20 6e 6f 0a 09 20 20 20 20  re were no..    
2eb0: 20 20 20 61 73 79 6e 63 20 6a 6f 62 73 20 61 76     async jobs av
2ec0: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 70  ailable in the p
2ed0: 6f 6f 6c 2e 20 2a 2f 0a 09 63 61 73 65 20 53 53  ool. */..case SS
2ee0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4c 49  L_ERROR_WANT_CLI
2ef0: 45 4e 54 5f 48 45 4c 4c 4f 5f 43 42 3a 0a 09 20  ENT_HELLO_CB:.. 
2f00: 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74     /* The operat
2f10: 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70  ion did not comp
2f20: 6c 65 74 65 20 62 65 63 61 75 73 65 20 61 6e 20  lete because an 
2f30: 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c  application call
2f40: 62 61 63 6b 0a 09 20 20 20 20 20 20 20 73 65 74  back..       set
2f50: 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f   by SSL_CTX_set_
2f60: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28  client_hello_cb(
2f70: 29 20 68 61 73 20 61 73 6b 65 64 20 74 6f 20 62  ) has asked to b
2f80: 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20  e called again. 
2f90: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  */.#if OPENSSL_V
2fa0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
2fb0: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 63 61   0x30000000L..ca
2fc0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  se SSL_ERROR_WAN
2fd0: 54 5f 52 45 54 52 59 5f 56 45 52 49 46 59 3a 0a  T_RETRY_VERIFY:.
2fe0: 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72  .    /* The oper
2ff0: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f  ation did not co
3000: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 61  mplete because a
3010: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72   certificate ver
3020: 69 66 69 63 61 74 69 6f 6e 0a 09 20 20 20 20 20  ification..     
3030: 20 20 63 61 6c 6c 62 61 63 6b 20 68 61 73 20 61    callback has a
3040: 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  sked to be calle
3050: 64 20 61 67 61 69 6e 20 76 69 61 20 53 53 4c 5f  d again via SSL_
3060: 73 65 74 5f 72 65 74 72 79 5f 76 65 72 69 66 79  set_retry_verify
3070: 28 33 29 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 09  (3). */.#endif..
3080: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 2f 2a  default:..    /*
3090: 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   The operation d
30a0: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  id not complete 
30b0: 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 72 65  and should be re
30c0: 74 72 69 65 64 20 6c 61 74 65 72 2e 20 2a 2f 0a  tried later. */.
30d0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 70  .    dprintf("Op
30e0: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
30f0: 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66  complete, call f
3100: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  unction again la
3110: 74 65 72 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  ter");..    *err
3120: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
3130: 49 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  IN;..    dprintf
3140: 28 22 45 52 52 28 4f 74 68 65 72 2c 20 45 41 47  ("ERR(Other, EAG
3150: 41 49 4e 29 22 29 3b 0a 09 20 20 20 20 72 65 74  AIN)");..    ret
3160: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
3170: 20 20 64 70 72 69 6e 74 66 28 22 52 65 6d 6f 76    dprintf("Remov
3180: 69 6e 67 20 74 68 65 20 5c 22 54 4c 53 5f 54 43  ing the \"TLS_TC
3190: 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67 20 73 69  L_INIT\" flag si
31a0: 6e 63 65 20 77 65 20 68 61 76 65 20 63 6f 6d 70  nce we have comp
31b0: 6c 65 74 65 64 20 74 68 65 20 68 61 6e 64 73 68  leted the handsh
31c0: 61 6b 65 22 29 3b 0a 20 20 20 20 73 74 61 74 65  ake");.    state
31d0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54  Ptr->flags &= ~T
31e0: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20 20  LS_TCL_INIT;..  
31f0: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
3200: 6e 69 6e 67 20 73 75 63 63 65 73 73 22 29 3b 0a  ning success");.
3210: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
3220: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
3230: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  n 1;.}../*. *---
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3290: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d   TlsInputProc --
32a0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
32b0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
32c0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
32d0: 49 2f 4f 20 6c 61 79 65 72 20 74 6f 20 72 65 61  I/O layer to rea
32e0: 64 20 64 61 74 61 20 66 72 6f 6d 0a 20 2a 09 74  d data from. *.t
32f0: 68 65 20 42 49 4f 20 77 68 65 6e 65 76 65 72 20  he BIO whenever 
3300: 74 68 65 20 54 63 6c 5f 52 65 61 64 28 29 2c 20  the Tcl_Read(), 
3310: 54 63 6c 5f 52 65 61 64 43 68 61 72 73 2c 20 54  Tcl_ReadChars, T
3320: 63 6c 5f 47 65 74 73 2c 20 61 6e 64 0a 20 2a 09  cl_Gets, and. *.
3330: 54 63 6c 5f 47 65 74 73 4f 62 6a 20 66 75 6e 63  Tcl_GetsObj func
3340: 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 2e 20  tions are used. 
3350: 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 53 53  Equivalent to SS
3360: 4c 5f 72 65 61 64 5f 65 78 20 61 6e 64 20 53 53  L_read_ex and SS
3370: 4c 5f 72 65 61 64 2e 0a 20 2a 0a 20 2a 20 52 65  L_read.. *. * Re
3380: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e  sults:. *.Return
3390: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
33a0: 62 79 74 65 73 20 72 65 61 64 20 6f 72 20 2d 31  bytes read or -1
33b0: 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20   on error. Sets 
33c0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 74 6f 0a  errorCodePtr to.
33d0: 20 2a 09 61 20 50 4f 53 49 58 20 65 72 72 6f 72   *.a POSIX error
33e0: 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
33f0: 72 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30  r occurred, or 0
3400: 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20   if none.. *. * 
3410: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
3420: 09 52 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f  .Reads input fro
3430: 6d 20 74 68 65 20 69 6e 70 75 74 20 64 65 76 69  m the input devi
3440: 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65  ce of the channe
3450: 6c 2e 0a 20 2a 0a 20 2a 20 44 61 74 61 20 69 73  l.. *. * Data is
3460: 20 72 65 63 65 69 76 65 64 20 69 6e 20 77 68 6f   received in who
3470: 6c 65 20 62 6c 6f 63 6b 73 20 6b 6e 6f 77 6e 20  le blocks known 
3480: 61 73 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  as records from 
3490: 74 68 65 20 70 65 65 72 2e 20 41 20 77 68 6f 6c  the peer. A whol
34a0: 65 0a 20 2a 20 72 65 63 6f 72 64 20 69 73 20 70  e. * record is p
34b0: 72 6f 63 65 73 73 65 64 20 28 65 2e 67 2e 20 64  rocessed (e.g. d
34c0: 65 63 72 79 70 74 65 64 29 20 69 6e 20 6f 6e 65  ecrypted) in one
34d0: 20 67 6f 20 61 6e 64 20 69 73 20 62 75 66 66 65   go and is buffe
34e0: 72 65 64 20 62 79 20 4f 70 65 6e 53 53 4c 0a 20  red by OpenSSL. 
34f0: 2a 20 75 6e 74 69 6c 20 69 74 20 69 73 20 72 65  * until it is re
3500: 61 64 20 62 79 20 74 68 65 20 61 70 70 6c 69 63  ad by the applic
3510: 61 74 69 6f 6e 20 76 69 61 20 61 20 63 61 6c 6c  ation via a call
3520: 20 74 6f 20 53 53 4c 5f 72 65 61 64 2e 0a 20 2a   to SSL_read.. *
3530: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3580: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
3590: 54 6c 73 49 6e 70 75 74 50 72 6f 63 28 0a 20 20  TlsInputProc(.  
35a0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
35b0: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43 6f  tanceData,./* Co
35c0: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69  nnection state i
35d0: 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nfo */.    char 
35e0: 2a 62 75 66 2c 09 09 09 2f 2a 20 42 75 66 66 65  *buf,.../* Buffe
35f0: 72 20 74 6f 20 73 74 6f 72 65 20 64 61 74 61 20  r to store data 
3600: 72 65 61 64 20 66 72 6f 6d 20 42 49 4f 20 2a 2f  read from BIO */
3610: 0a 20 20 20 20 69 6e 74 20 62 75 66 53 69 7a 65  .    int bufSize
3620: 2c 09 09 2f 2a 20 42 75 66 66 65 72 20 73 69 7a  ,../* Buffer siz
3630: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
3640: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
3650: 50 74 72 29 09 09 2f 2a 20 53 74 6f 72 61 67 65  Ptr)../* Storage
3660: 20 66 6f 72 20 65 72 72 6f 72 20 63 6f 64 65 20   for error code 
3670: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 7b 0a 20  to return */.{. 
3680: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
3690: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20   backingError;. 
36a0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
36b0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69  tr = (State *) i
36c0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20  nstanceData;.   
36d0: 20 69 6e 74 20 62 79 74 65 73 52 65 61 64 2c 20   int bytesRead, 
36e0: 65 72 72 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43  err;.    *errorC
36f0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  odePtr = 0;..   
3700: 20 64 70 72 69 6e 74 66 28 22 52 65 61 64 28 25   dprintf("Read(%
3710: 64 29 22 2c 20 62 75 66 53 69 7a 65 29 3b 0a 0a  d)", bufSize);..
3720: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
3730: 74 68 65 20 75 73 65 72 20 76 65 72 69 66 79 20  the user verify 
3740: 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 69 6c  callback is stil
3750: 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61 76 6f  l running to avo
3760: 69 64 20 74 72 69 67 67 65 72 69 6e 67 0a 20 20  id triggering.  
3770: 20 20 20 2a 20 61 6e 6f 74 68 65 72 20 63 61 6c     * another cal
3780: 6c 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  l before the cur
3790: 72 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f 6d 70  rent one is comp
37a0: 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20  lete. */.    if 
37b0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
37c0: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42   & TLS_TCL_CALLB
37d0: 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  ACK) {..dprintf(
37e0: 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e  "Callback is run
37f0: 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 20 30 20  ning, reading 0 
3800: 62 79 74 65 73 22 29 3b 0a 09 72 65 74 75 72 6e  bytes");..return
3810: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3820: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
3830: 69 7a 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63 74  ized, do connect
3840: 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 61 6e 20 61   */.    /* Can a
3850: 6c 73 6f 20 63 68 65 63 6b 20 53 53 4c 5f 69 73  lso check SSL_is
3860: 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73  _init_finished(s
3870: 73 6c 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  sl) */.    if (s
3880: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
3890: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b   TLS_TCL_INIT) {
38a0: 0a 09 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74  ..int tlsConnect
38b0: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c  ;...dprintf("Cal
38c0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
38d0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73  Connect");...tls
38e0: 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61  Connect = Tls_Wa
38f0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61  itForConnect(sta
3900: 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65  tePtr, errorCode
3910: 50 74 72 2c 20 30 29 3b 0a 09 69 66 20 28 74 6c  Ptr, 0);..if (tl
3920: 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a  sConnect < 0) {.
3930: 09 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 2c  .    /* Failure,
3940: 20 73 6f 20 61 62 6f 72 74 20 2a 2f 0a 09 20 20   so abort */..  
3950: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
3960: 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20  n error waiting 
3970: 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43  to connect (tlsC
3980: 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72  onnect = %i, *er
3990: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29  rorCodePtr = %i)
39a0: 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a  ", tlsConnect, *
39b0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a  errorCodePtr);..
39c0: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
39d0: 20 2d 31 3b 0a 09 20 20 20 20 69 66 20 28 2a 65   -1;..    if (*e
39e0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45  rrorCodePtr == E
39f0: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 64  CONNRESET) {...d
3a00: 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e  printf("Got conn
3a10: 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a  ection reset");.
3a20: 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f  ../* Soft EOF */
3a30: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
3a40: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61   = 0;...bytesRea
3a50: 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20  d = 0;..    }.. 
3a60: 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 52     return bytesR
3a70: 65 61 64 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  ead;..} else if 
3a80: 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 3d 20 30  (tlsConnect == 0
3a90: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 54 72 79 20  ) {..    /* Try 
3aa0: 61 67 61 69 6e 20 2a 2f 0a 09 20 20 20 20 62 79  again */..    by
3ab0: 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20  tesRead = -1;.. 
3ac0: 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 52     return bytesR
3ad0: 65 61 64 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ead;..}.    }.. 
3ae0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20     /*.     * We 
3af0: 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68  need to clear th
3b00: 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63  e SSL error stac
3b10: 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65  k now because we
3b20: 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68   sometimes reach
3b30: 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e  .     * this fun
3b40: 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f  ction with lefto
3b50: 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68  ver errors in th
3b60: 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f  e stack.  If BIO
3b70: 5f 72 65 61 64 0a 20 20 20 20 20 2a 20 72 65 74  _read.     * ret
3b80: 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65  urns -1 and inte
3b90: 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72  nds EAGAIN, ther
3ba0: 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20  e is a leftover 
3bb0: 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62  error, it will b
3bc0: 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73  e.     * miscons
3bd0: 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f  trued as an erro
3be0: 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20  r, not EAGAIN.. 
3bf0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74      *.     * Alt
3c00: 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d  ernatively, we m
3c10: 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c  ay want to handl
3c20: 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20  e the <0 return 
3c30: 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  codes from.     
3c40: 2a 20 42 49 4f 5f 72 65 61 64 20 73 70 65 63 69  * BIO_read speci
3c50: 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73 65 64  ally (as advised
3c60: 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73   in the RSA docs
3c70: 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20  ).  TLS's lower 
3c80: 6c 65 76 65 6c 20 42 49 4f 0a 20 20 20 20 20 2a  level BIO.     *
3c90: 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20   functions play 
3ca0: 77 69 74 68 20 74 68 65 20 72 65 74 72 79 20 66  with the retry f
3cb0: 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64  lags though, and
3cc0: 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f 20 77   this seems to w
3cd0: 6f 72 6b 0a 20 20 20 20 20 2a 20 63 6f 72 72 65  ork.     * corre
3ce0: 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66  ctly.  Similar f
3cf0: 69 78 20 69 6e 20 54 6c 73 4f 75 74 70 75 74 50  ix in TlsOutputP
3d00: 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20  roc. - hobbs.   
3d10: 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65    */.    ERR_cle
3d20: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20  ar_error();.    
3d30: 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f  BIO_clear_retry_
3d40: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e  flags(statePtr->
3d50: 62 69 6f 29 3b 0a 20 20 20 20 62 79 74 65 73 52  bio);.    bytesR
3d60: 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73  ead = BIO_read(s
3d70: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75  tatePtr->bio, bu
3d80: 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20  f, bufSize);.   
3d90: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65   dprintf("BIO_re
3da0: 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73  ad -> %d", bytes
3db0: 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  Read);..    /* S
3dc0: 61 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c  ame as SSL_want,
3dd0: 20 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73   but also checks
3de0: 20 74 68 65 20 65 72 72 6f 72 20 71 75 65 75 65   the error queue
3df0: 20 2a 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 53   */.    err = SS
3e00: 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74  L_get_error(stat
3e10: 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73  ePtr->ssl, bytes
3e20: 52 65 61 64 29 3b 0a 20 20 20 20 62 61 63 6b 69  Read);.    backi
3e30: 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65  ngError = ERR_ge
3e40: 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  t_error();..    
3e50: 69 66 20 28 62 79 74 65 73 52 65 61 64 20 3c 3d  if (bytesRead <=
3e60: 20 30 29 20 7b 0a 09 2f 2a 20 54 68 65 20 72 65   0) {../* The re
3e70: 74 72 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  try flag is set 
3e80: 62 79 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72  by the BIO_set_r
3e90: 65 74 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73  etry_* functions
3ea0: 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f   */..if (BIO_sho
3eb0: 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50  uld_retry(stateP
3ec0: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20  tr->bio)) {..   
3ed0: 20 64 70 72 69 6e 74 66 28 22 52 65 61 64 20 66   dprintf("Read f
3ee0: 61 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 3d  ailed with code=
3ef0: 25 64 2c 20 62 79 74 65 73 20 72 65 61 64 3d 25  %d, bytes read=%
3f00: 64 3a 20 73 68 6f 75 6c 64 20 72 65 74 72 79 22  d: should retry"
3f10: 2c 20 65 72 72 2c 20 62 79 74 65 73 52 65 61 64  , err, bytesRead
3f20: 29 3b 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20  );..    /* Some 
3f30: 64 6f 63 73 20 69 6d 70 6c 79 20 77 65 20 73 68  docs imply we sh
3f40: 6f 75 6c 64 20 72 65 64 6f 20 74 68 65 20 42 49  ould redo the BI
3f50: 4f 5f 72 65 61 64 20 6e 6f 77 20 2a 2f 0a 09 7d  O_read now */..}
3f60: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72   else {..    dpr
3f70: 69 6e 74 66 28 22 52 65 61 64 20 66 61 69 6c 65  intf("Read faile
3f80: 64 20 77 69 74 68 20 63 6f 64 65 3d 25 64 2c 20  d with code=%d, 
3f90: 62 79 74 65 73 20 72 65 61 64 3d 25 64 3a 20 65  bytes read=%d: e
3fa0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 22 2c  rror condition",
3fb0: 20 65 72 72 2c 20 62 79 74 65 73 52 65 61 64 29   err, bytesRead)
3fc0: 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22  ;..}...dprintf("
3fd0: 42 49 4f 20 69 73 20 45 4f 46 20 25 64 22 2c 20  BIO is EOF %d", 
3fe0: 42 49 4f 5f 65 6f 66 28 73 74 61 74 65 50 74 72  BIO_eof(statePtr
3ff0: 2d 3e 62 69 6f 29 29 3b 0a 0a 09 2f 2a 20 54 68  ->bio));.../* Th
4000: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
4010: 20 61 73 20 42 49 4f 5f 72 65 74 72 79 5f 74 79   as BIO_retry_ty
4020: 70 65 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73  pe */..if (BIO_s
4030: 68 6f 75 6c 64 5f 72 65 61 64 28 73 74 61 74 65  hould_read(state
4040: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20  Ptr->bio)) {..  
4050: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68    dprintf("BIO h
4060: 61 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  as insufficient 
4070: 64 61 74 61 20 74 6f 20 72 65 61 64 20 61 6e 64  data to read and
4080: 20 72 65 74 75 72 6e 22 29 3b 0a 09 20 20 20 20   return");..    
4090: 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c  statePtr->want |
40a0: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a  = TCL_READABLE;.
40b0: 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75  .}..if (BIO_shou
40c0: 6c 64 5f 77 72 69 74 65 28 73 74 61 74 65 50 74  ld_write(statePt
40d0: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20  r->bio)) {..    
40e0: 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73  dprintf("BIO has
40f0: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f   pending data to
4100: 20 77 72 69 74 65 22 29 3b 0a 09 20 20 20 20 73   write");..    s
4110: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d  tatePtr->want |=
4120: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09   TCL_WRITABLE;..
4130: 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c  }..if (BIO_shoul
4140: 64 5f 69 6f 5f 73 70 65 63 69 61 6c 28 73 74 61  d_io_special(sta
4150: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09  tePtr->bio)) {..
4160: 20 20 20 20 69 6e 74 20 72 65 61 73 6f 6e 20 3d      int reason =
4170: 20 42 49 4f 5f 67 65 74 5f 72 65 74 72 79 5f 72   BIO_get_retry_r
4180: 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  eason(statePtr->
4190: 62 69 6f 29 3b 0a 09 20 20 20 20 64 70 72 69 6e  bio);..    dprin
41a0: 74 66 28 22 42 49 4f 20 68 61 73 20 73 6f 6d 65  tf("BIO has some
41b0: 20 73 70 65 63 69 61 6c 20 63 6f 6e 64 69 74 69   special conditi
41c0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 72 65  on other than re
41d0: 61 64 20 6f 72 20 77 72 69 74 65 3a 20 63 6f 64  ad or write: cod
41e0: 65 3d 25 64 22 2c 20 72 65 61 73 6f 6e 29 3b 0a  e=%d", reason);.
41f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  .}.    }..    sw
4200: 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 63 61  itch (err) {..ca
4210: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e  se SSL_ERROR_NON
4220: 45 3a 0a 09 20 20 20 20 2f 2a 20 49 2f 4f 20 6f  E:..    /* I/O o
4230: 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74  peration complet
4240: 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  ed */..    dprin
4250: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f  tf("SSL_ERROR_NO
4260: 4e 45 22 29 3b 0a 09 20 20 20 20 64 70 72 69 6e  NE");..    dprin
4270: 74 42 75 66 66 65 72 28 62 75 66 2c 20 62 79 74  tBuffer(buf, byt
4280: 65 73 52 65 61 64 29 3b 0a 09 20 20 20 20 62 72  esRead);..    br
4290: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
42a0: 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20  ERROR_SSL:..    
42b0: 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72  /* A non-recover
42c0: 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72 72 6f  able, fatal erro
42d0: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62  r in the SSL lib
42e0: 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c 0a 09  rary occurred,..
42f0: 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 20 61         usually a
4300: 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 2e   protocol error.
4310: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
4320: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a  ("SSL_ERROR_SSL:
4330: 20 46 61 74 61 6c 20 53 53 4c 20 70 72 6f 74 6f   Fatal SSL proto
4340: 63 6f 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72  col error occurr
4350: 65 64 22 29 3b 0a 09 20 20 20 20 69 66 20 28 62  ed");..    if (b
4360: 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20 30  ackingError != 0
4370: 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28  ) {...Tls_Error(
4380: 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65  statePtr, ERR_re
4390: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
43a0: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29  g(backingError))
43b0: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
43c0: 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79   (SSL_get_verify
43d0: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  _result(statePtr
43e0: 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56  ->ssl) != X509_V
43f0: 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72  _OK) {...Tls_Err
4400: 6f 72 28 73 74 61 74 65 50 74 72 2c 0a 09 09 20  or(statePtr,... 
4410: 20 20 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63     X509_verify_c
4420: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
4430: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
4440: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
4450: 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20  >ssl)));..    } 
4460: 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72  else {...Tls_Err
4470: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e  or(statePtr, "Un
4480: 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22  known SSL error"
4490: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a  );..    }..    *
44a0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
44b0: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20  CONNABORTED;..  
44c0: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31    bytesRead = -1
44d0: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
44e0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
44f0: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
4500: 20 20 2f 2a 20 55 6e 65 78 70 65 63 74 65 64 20    /* Unexpected 
4510: 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 65 65  EOF from the pee
4520: 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 33 2e  r for OpenSSL 3.
4530: 30 2b 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 45  0+ */..    if (E
4540: 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e 28 62 61  RR_GET_REASON(ba
4550: 63 6b 69 6e 67 45 72 72 6f 72 29 20 3d 3d 20 53  ckingError) == S
4560: 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54 45 44 5f  SL_R_UNEXPECTED_
4570: 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41 44 49 4e  EOF_WHILE_READIN
4580: 47 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  G) {...dprintf("
4590: 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46  (Unexpected) EOF
45a0: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72   reached")...*er
45b0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
45c0: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b  ..bytesRead = 0;
45d0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
45e0: 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 61 63  tePtr, "EOF reac
45f0: 68 65 64 22 29 3b 0a 09 20 20 20 20 7d 0a 23 65  hed");..    }.#e
4600: 6e 64 69 66 0a 09 20 20 20 20 62 72 65 61 6b 3b  ndif..    break;
4610: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
4620: 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20  R_WANT_READ:..  
4630: 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 20 64    /* Operation d
4640: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  id not complete 
4650: 64 75 65 20 74 6f 20 6e 6f 74 20 65 6e 6f 75 67  due to not enoug
4660: 68 20 64 61 74 61 20 77 61 73 20 61 76 61 69 6c  h data was avail
4670: 61 62 6c 65 2e 0a 09 20 20 20 20 20 20 20 52 65  able...       Re
4680: 74 72 79 20 61 67 61 69 6e 20 6c 61 74 65 72 2e  try again later.
4690: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
46a0: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
46b0: 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69  WANT_READ, mappi
46c0: 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49  ng this to EAGAI
46d0: 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  N");..    *error
46e0: 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e  CodePtr = EAGAIN
46f0: 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64  ;..    bytesRead
4700: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74   = -1;..    stat
4710: 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43  ePtr->want |= TC
4720: 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20  L_READABLE;..   
4730: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72   BIO_set_retry_r
4740: 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ead(statePtr->bi
4750: 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  o);..    break;.
4760: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
4770: 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20  _WANT_WRITE:..  
4780: 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 20 64    /* Operation d
4790: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  id not complete 
47a0: 64 75 65 20 74 6f 20 75 6e 61 62 6c 65 20 74 6f  due to unable to
47b0: 20 73 65 6e 64 20 61 6c 6c 20 64 61 74 61 20 74   send all data t
47c0: 6f 20 74 68 65 0a 09 20 20 20 20 20 20 20 42 49  o the..       BI
47d0: 4f 2e 20 52 65 74 72 79 20 61 67 61 69 6e 20 6c  O. Retry again l
47e0: 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70  ater. */..    dp
47f0: 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45  rintf("Got SSL_E
4800: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c  RROR_WANT_WRITE,
4810: 20 6d 61 70 70 69 6e 67 20 74 68 69 73 20 74 6f   mapping this to
4820: 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20   EAGAIN");..    
4830: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
4840: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 62 79 74  EAGAIN;..    byt
4850: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20  esRead = -1;..  
4860: 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74    statePtr->want
4870: 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45   |= TCL_WRITABLE
4880: 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72  ;..    BIO_set_r
4890: 65 74 72 79 5f 77 72 69 74 65 28 73 74 61 74 65  etry_write(state
48a0: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20  Ptr->bio);..    
48b0: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
48c0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30  L_ERROR_WANT_X50
48d0: 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 2f  9_LOOKUP:..    /
48e0: 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * The operation 
48f0: 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  did not complete
4900: 20 62 65 63 61 75 73 65 20 61 6e 20 61 70 70 6c   because an appl
4910: 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ication callback
4920: 0a 09 20 20 20 20 20 20 20 73 65 74 20 62 79 20  ..       set by 
4930: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
4940: 6e 74 5f 63 65 72 74 5f 63 62 28 29 20 68 61 73  nt_cert_cb() has
4950: 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c   asked to be cal
4960: 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 09 20  led again. */.. 
4970: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
4980: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58  SSL_ERROR_WANT_X
4990: 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d 61 70 70  509_LOOKUP, mapp
49a0: 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e  ing it to EAGAIN
49b0: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
49c0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
49d0: 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20  ..    bytesRead 
49e0: 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b  = -1;..    break
49f0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
4a00: 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20  OR_SYSCALL:..   
4a10: 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63   /* Some non-rec
4a20: 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20  overable, fatal 
4a30: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72  I/O error occurr
4a40: 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  ed */..    dprin
4a50: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59  tf("SSL_ERROR_SY
4a60: 53 43 41 4c 4c 3a 20 46 61 74 61 6c 20 49 2f 4f  SCALL: Fatal I/O
4a70: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 22   error occurred"
4a80: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63  );...    if (bac
4a90: 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26  kingError == 0 &
4aa0: 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20 30  & bytesRead == 0
4ab0: 29 20 7b 0a 09 09 2f 2a 20 55 6e 65 78 70 65 63  ) {.../* Unexpec
4ac0: 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 74 68 65  ted EOF from the
4ad0: 20 70 65 65 72 20 66 6f 72 20 4f 70 65 6e 53 53   peer for OpenSS
4ae0: 4c 20 31 2e 31 20 2a 2f 0a 09 09 64 70 72 69 6e  L 1.1 */...dprin
4af0: 74 66 28 22 28 55 6e 65 78 70 65 63 74 65 64 29  tf("(Unexpected)
4b00: 20 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09   EOF reached")..
4b10: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
4b20: 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20   0;...bytesRead 
4b30: 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72  = 0;...Tls_Error
4b40: 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20  (statePtr, "EOF 
4b50: 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20  reached");...   
4b60: 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b   } else if (back
4b70: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26  ingError == 0 &&
4b80: 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20 2d 31   bytesRead == -1
4b90: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49  ) {...dprintf("I
4ba0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
4bb0: 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22  d (errno = %lu)"
4bc0: 2c 0a 09 09 20 20 20 20 28 75 6e 73 69 67 6e 65  ,...    (unsigne
4bd0: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45  d long) Tcl_GetE
4be0: 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f  rrno());...*erro
4bf0: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
4c00: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74  etErrno();...byt
4c10: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 54  esRead = -1;...T
4c20: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4c30: 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28  r, Tcl_ErrnoMsg(
4c40: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b  *errorCodePtr));
4c50: 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ...    } else {.
4c60: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65  ..dprintf("I/O e
4c70: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62  rror occurred (b
4c80: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c  ackingError = %l
4c90: 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f  u)", backingErro
4ca0: 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65  r);...*errorCode
4cb0: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72  Ptr = Tcl_GetErr
4cc0: 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73 52 65 61  no();...bytesRea
4cd0: 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72  d = -1;...Tls_Er
4ce0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52  ror(statePtr, ER
4cf0: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73  R_reason_error_s
4d00: 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72  tring(backingErr
4d10: 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  or));..    }..  
4d20: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
4d30: 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52  SSL_ERROR_ZERO_R
4d40: 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f 2a 20 50  ETURN:..    /* P
4d50: 65 65 72 20 68 61 73 20 63 6c 65 61 6e 6c 79 20  eer has cleanly 
4d60: 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65  closed the conne
4d70: 63 74 69 6f 6e 20 62 79 20 73 65 6e 64 69 6e 67  ction by sending
4d80: 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66   the close_notif
4d90: 79 0a 09 20 20 20 20 20 20 20 61 6c 65 72 74 2e  y..       alert.
4da0: 20 43 61 6e 27 74 20 72 65 61 64 2c 20 62 75 74   Can't read, but
4db0: 20 63 61 6e 20 77 72 69 74 65 2e 20 4e 65 65 64   can write. Need
4dc0: 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 45 4f   to return an EO
4dd0: 46 2c 20 73 6f 20 74 68 65 0a 09 20 20 20 20 20  F, so the..     
4de0: 20 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f    channel is clo
4df0: 73 65 64 20 77 68 69 63 68 20 77 69 6c 6c 20 73  sed which will s
4e00: 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 75 74 64  end an SSL_shutd
4e10: 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 20 20 64  own(). */..    d
4e20: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f  printf("SSL_ERRO
4e30: 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 20 50  R_ZERO_RETURN: P
4e40: 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20 74  eer has closed t
4e50: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 3b  he connection");
4e60: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
4e70: 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 79  Ptr = 0;..    by
4e80: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20  tesRead = 0;..  
4e90: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74    Tls_Error(stat
4ea0: 65 50 74 72 2c 20 22 50 65 65 72 20 68 61 73 20  ePtr, "Peer has 
4eb0: 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65  closed the conne
4ec0: 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e  ction for writin
4ed0: 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65  g by sending the
4ee0: 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c   close_notify al
4ef0: 65 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65 61  ert");..    brea
4f00: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
4f10: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a  ROR_WANT_ASYNC:.
4f20: 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69 74  .    /* Used wit
4f30: 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f  h flag SSL_MODE_
4f40: 41 53 59 4e 43 2c 20 6f 70 65 72 61 74 69 6f 6e  ASYNC, operation
4f50: 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65   didn't complete
4f60: 20 62 65 63 61 75 73 65 0a 09 20 20 20 20 20 20   because..      
4f70: 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69 6e 65   an async engine
4f80: 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63 65 73   is still proces
4f90: 73 69 6e 67 20 64 61 74 61 2e 20 2a 2f 0a 09 20  sing data. */.. 
4fa0: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
4fb0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41  SSL_ERROR_WANT_A
4fc0: 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20 74 68  SYNC, mapping th
4fd0: 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a  is to EAGAIN");.
4fe0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
4ff0: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
5000: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b    bytesRead = 0;
5010: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64  ..    break;...d
5020: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72  efault:..    dpr
5030: 69 6e 74 66 28 22 55 6e 6b 6e 6f 77 6e 20 65 72  intf("Unknown er
5040: 72 6f 72 20 28 65 72 72 20 3d 20 25 69 29 2c 20  ror (err = %i), 
5050: 6d 61 70 70 69 6e 67 20 74 6f 20 45 4f 46 22 2c  mapping to EOF",
5060: 20 65 72 72 29 3b 0a 09 20 20 20 20 2a 65 72 72   err);..    *err
5070: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09  orCodePtr = 0;..
5080: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20      bytesRead = 
5090: 30 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  0;..    Tls_Erro
50a0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b  r(statePtr, "Unk
50b0: 6e 6f 77 6e 20 65 72 72 6f 72 22 29 3b 0a 09 20  nown error");.. 
50c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
50d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 49 6e  .    dprintf("In
50e0: 70 75 74 28 25 64 29 20 2d 3e 20 25 64 20 5b 25  put(%d) -> %d [%
50f0: 64 5d 22 2c 20 62 75 66 53 69 7a 65 2c 20 62 79  d]", bufSize, by
5100: 74 65 73 52 65 61 64 2c 20 2a 65 72 72 6f 72 43  tesRead, *errorC
5110: 6f 64 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74  odePtr);.    ret
5120: 75 72 6e 20 62 79 74 65 73 52 65 61 64 3b 0a 7d  urn bytesRead;.}
5130: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75  ----. *. * TlsOu
5190: 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tputProc --. *. 
51a0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
51b0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74   is invoked by t
51c0: 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c  he generic I/O l
51d0: 61 79 65 72 20 74 6f 20 77 72 69 74 65 20 64 61  ayer to write da
51e0: 74 61 20 74 6f 20 74 68 65 0a 20 2a 09 42 49 4f  ta to the. *.BIO
51f0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68   whenever the th
5200: 65 20 54 63 6c 5f 57 72 69 74 65 28 29 2c 20 54  e Tcl_Write(), T
5210: 63 6c 5f 57 72 69 74 65 43 68 61 72 73 2c 20 61  cl_WriteChars, a
5220: 6e 64 20 54 63 6c 5f 57 72 69 74 65 4f 62 6a 0a  nd Tcl_WriteObj.
5230: 20 2a 09 66 75 6e 63 74 69 6f 6e 73 20 61 72 65   *.functions are
5240: 20 75 73 65 64 2e 20 45 71 75 69 76 61 6c 65 6e   used. Equivalen
5250: 74 20 74 6f 20 53 53 4c 5f 77 72 69 74 65 5f 65  t to SSL_write_e
5260: 78 20 61 6e 64 20 53 53 4c 5f 77 72 69 74 65 2e  x and SSL_write.
5270: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
5280: 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 6e   *.Returns the n
5290: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
52a0: 72 69 74 74 65 6e 20 6f 72 20 2d 31 20 6f 6e 20  ritten or -1 on 
52b0: 65 72 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f  error. Sets erro
52c0: 72 43 6f 64 65 50 74 72 0a 20 2a 09 74 6f 20 61  rCodePtr. *.to a
52d0: 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64   POSIX error cod
52e0: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
52f0: 63 75 72 72 65 64 2c 20 6f 72 20 30 20 69 66 20  curred, or 0 if 
5300: 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  none.. *. * Side
5310: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 72 69   effects:. *.Wri
5320: 74 65 73 20 6f 75 74 70 75 74 20 6f 6e 20 74 68  tes output on th
5330: 65 20 6f 75 74 70 75 74 20 64 65 76 69 63 65 20  e output device 
5340: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a  of the channel..
5350: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
53b0: 74 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 28  t TlsOutputProc(
53c0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
53d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a  instanceData,./*
53e0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74   Connection stat
53f0: 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 6f  e info */.    co
5400: 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c 09 09  nst char *buf,..
5410: 2f 2a 20 42 75 66 66 65 72 20 77 69 74 68 20 64  /* Buffer with d
5420: 61 74 61 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ata to write to 
5430: 42 49 4f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  BIO */.    int t
5440: 6f 57 72 69 74 65 2c 09 09 2f 2a 20 53 69 7a 65  oWrite,../* Size
5450: 20 6f 66 20 64 61 74 61 20 74 6f 20 77 72 69 74   of data to writ
5460: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
5470: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
5480: 50 74 72 29 09 09 2f 2a 20 53 74 6f 72 61 67 65  Ptr)../* Storage
5490: 20 66 6f 72 20 65 72 72 6f 72 20 63 6f 64 65 20   for error code 
54a0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 7b 0a 20  to return */.{. 
54b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
54c0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20   backingError;. 
54d0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
54e0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69  tr = (State *) i
54f0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20  nstanceData;.   
5500: 20 69 6e 74 20 77 72 69 74 74 65 6e 2c 20 65 72   int written, er
5510: 72 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  r;.    *errorCod
5520: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64  ePtr = 0;..    d
5530: 70 72 69 6e 74 66 28 22 57 72 69 74 65 28 25 70  printf("Write(%p
5540: 2c 20 25 64 29 22 2c 20 28 76 6f 69 64 20 2a 29  , %d)", (void *)
5550: 20 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72 69   statePtr, toWri
5560: 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 42  te);.    dprintB
5570: 75 66 66 65 72 28 62 75 66 2c 20 74 6f 57 72 69  uffer(buf, toWri
5580: 74 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f  te);..    /* Abo
5590: 72 74 20 69 66 20 74 68 65 20 75 73 65 72 20 76  rt if the user v
55a0: 65 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69  erify callback i
55b0: 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20  s still running 
55c0: 74 6f 20 61 76 6f 69 64 20 74 72 69 67 67 65 72  to avoid trigger
55d0: 69 6e 67 0a 20 20 20 20 20 2a 20 61 6e 6f 74 68  ing.     * anoth
55e0: 65 72 20 63 61 6c 6c 20 62 65 66 6f 72 65 20 74  er call before t
55f0: 68 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 20 69  he current one i
5600: 73 20 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20  s complete. */. 
5610: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
5620: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
5630: 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70  _CALLBACK) {..dp
5640: 72 69 6e 74 66 28 22 44 6f 6e 27 74 20 70 72 6f  rintf("Don't pro
5650: 63 65 73 73 20 6f 75 74 70 75 74 20 77 68 69 6c  cess output whil
5660: 65 20 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20  e callbacks are 
5670: 72 75 6e 6e 69 6e 67 22 29 3b 0a 09 77 72 69 74  running");..writ
5680: 74 65 6e 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f  ten = -1;..*erro
5690: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
56a0: 4e 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20  N;..return -1;. 
56b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
56c0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  not initialized,
56d0: 20 64 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20   do connect */. 
56e0: 20 20 20 2f 2a 20 43 61 6e 20 61 6c 73 6f 20 63     /* Can also c
56f0: 68 65 63 6b 20 53 53 4c 5f 69 73 5f 69 6e 69 74  heck SSL_is_init
5700: 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 20 2a  _finished(ssl) *
5710: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
5720: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
5730: 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 69 6e 74  TCL_INIT) {..int
5740: 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64   tlsConnect;...d
5750: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
5760: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
5770: 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65  ct");...tlsConne
5780: 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  ct = Tls_WaitFor
5790: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
57a0: 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20  , errorCodePtr, 
57b0: 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f 6e 6e  1);..if (tlsConn
57c0: 65 63 74 20 3c 20 30 29 20 7b 0a 09 20 20 20 20  ect < 0) {..    
57d0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20  dprintf("Got an 
57e0: 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f  error waiting to
57f0: 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e   connect (tlsCon
5800: 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f  nect = %i, *erro
5810: 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c  rCodePtr = %i)",
5820: 0a 09 09 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a  ...tlsConnect, *
5830: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a  errorCodePtr);..
5840: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d  .    written = -
5850: 31 3b 0a 09 20 20 20 20 69 66 20 28 2a 65 72 72  1;..    if (*err
5860: 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f  orCodePtr == ECO
5870: 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 64 70 72  NNRESET) {...dpr
5880: 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63  intf("Got connec
5890: 74 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 09  tion reset");...
58a0: 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09  /* Soft EOF */..
58b0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
58c0: 20 30 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20   0;...written = 
58d0: 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72  0;..    }..    r
58e0: 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a 09  eturn written;..
58f0: 7d 20 65 6c 73 65 20 69 66 20 28 74 6c 73 43 6f  } else if (tlsCo
5900: 6e 6e 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 20  nnect == 0) {.. 
5910: 20 20 20 2f 2a 20 54 72 79 20 61 67 61 69 6e 20     /* Try again 
5920: 2a 2f 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  */..    written 
5930: 3d 20 2d 31 3b 0a 09 20 20 20 20 72 65 74 75 72  = -1;..    retur
5940: 6e 20 77 72 69 74 74 65 6e 3b 0a 09 7d 0a 20 20  n written;..}.  
5950: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f 57    }..    if (toW
5960: 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70  rite == 0) {..dp
5970: 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69 74  rintf("zero-writ
5980: 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f 5f  e");..err = BIO_
5990: 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e  flush(statePtr->
59a0: 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72 20  bio);...if (err 
59b0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72  <= 0) {..    dpr
59c0: 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 66  intf("Flushing f
59d0: 61 69 6c 65 64 22 29 3b 0a 09 20 20 20 20 54 6c  ailed");..    Tl
59e0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
59f0: 2c 20 22 46 6c 75 73 68 20 66 61 69 6c 65 64 22  , "Flush failed"
5a00: 29 3b 0a 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  );...    *errorC
5a10: 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 09 20  odePtr = EIO;.. 
5a20: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a     written = 0;.
5a30: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
5a40: 09 7d 0a 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50  .}...*errorCodeP
5a50: 74 72 20 3d 20 30 3b 0a 09 77 72 69 74 74 65 6e  tr = 0;..written
5a60: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 30 3b   = 0;..return 0;
5a70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
5a80: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f      * We need to
5a90: 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65   clear the SSL e
5aa0: 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62  rror stack now b
5ab0: 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69  ecause we someti
5ac0: 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 20 2a  mes reach.     *
5ad0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
5ae0: 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72 72  ith leftover err
5af0: 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b  ors in the stack
5b00: 2e 20 20 49 66 20 42 49 4f 5f 77 72 69 74 65 0a  .  If BIO_write.
5b10: 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d       * returns -
5b20: 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41  1 and intends EA
5b30: 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61  GAIN, there is a
5b40: 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c   leftover error,
5b50: 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20   it will be.    
5b60: 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20   * misconstrued 
5b70: 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74  as an error, not
5b80: 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a   EAGAIN..     *.
5b90: 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69       * Alternati
5ba0: 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e  vely, we may wan
5bb0: 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  t to handle the 
5bc0: 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  <0 return codes 
5bd0: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f  from.     * BIO_
5be0: 77 72 69 74 65 20 73 70 65 63 69 61 6c 6c 79 20  write specially 
5bf0: 28 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 74  (as advised in t
5c00: 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54  he RSA docs).  T
5c10: 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c  LS's lower level
5c20: 0a 20 20 20 20 20 2a 20 42 49 4f 20 66 75 6e 63  .     * BIO func
5c30: 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20  tions play with 
5c40: 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 20  the retry flags 
5c50: 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73  though, and this
5c60: 20 73 65 65 6d 73 20 74 6f 0a 20 20 20 20 20 2a   seems to.     *
5c70: 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
5c80: 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e    Similar fix in
5c90: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2e 20 2d   TlsInputProc. -
5ca0: 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20   hobbs.     */. 
5cb0: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
5cc0: 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f 5f 63 6c  or();.    BIO_cl
5cd0: 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 73 28  ear_retry_flags(
5ce0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
5cf0: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 42 49      written = BI
5d00: 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72  O_write(statePtr
5d10: 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72  ->bio, buf, toWr
5d20: 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ite);.    dprint
5d30: 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 70 2c  f("BIO_write(%p,
5d40: 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28   %d) -> [%d]", (
5d50: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72  void *) statePtr
5d60: 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74  , toWrite, writt
5d70: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 61 6d  en);..    /* Sam
5d80: 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62  e as SSL_want, b
5d90: 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74  ut also checks t
5da0: 68 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a  he error queue *
5db0: 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f  /.    err = SSL_
5dc0: 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50  get_error(stateP
5dd0: 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 6e  tr->ssl, written
5de0: 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67 45 72  );.    backingEr
5df0: 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  ror = ERR_get_er
5e00: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 66 20 28  ror();..    if (
5e10: 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 20 7b 0a  written <= 0) {.
5e20: 09 2f 2a 20 54 68 65 20 72 65 74 72 79 20 66 6c  ./* The retry fl
5e30: 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68 65  ag is set by the
5e40: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 2a   BIO_set_retry_*
5e50: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 09 69   functions */..i
5e60: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65  f (BIO_should_re
5e70: 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69  try(statePtr->bi
5e80: 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  o)) {..    dprin
5e90: 74 66 28 22 57 72 69 74 65 20 66 61 69 6c 65 64  tf("Write failed
5ea0: 20 77 69 74 68 20 63 6f 64 65 20 25 64 2c 20 62   with code %d, b
5eb0: 79 74 65 73 20 77 72 69 74 74 65 6e 3d 25 64 3a  ytes written=%d:
5ec0: 20 73 68 6f 75 6c 64 20 72 65 74 72 79 22 2c 0a   should retry",.
5ed0: 09 09 65 72 72 2c 20 77 72 69 74 74 65 6e 29 3b  ..err, written);
5ee0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
5ef0: 64 70 72 69 6e 74 66 28 22 57 72 69 74 65 20 66  dprintf("Write f
5f00: 61 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 20  ailed with code 
5f10: 25 64 2c 20 62 79 74 65 73 20 77 72 69 74 74 65  %d, bytes writte
5f20: 6e 3d 25 64 3a 20 65 72 72 6f 72 20 63 6f 6e 64  n=%d: error cond
5f30: 69 74 69 6f 6e 22 2c 0a 09 09 65 72 72 2c 20 77  ition",...err, w
5f40: 72 69 74 74 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a  ritten);..}.../*
5f50: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 73   These are the s
5f60: 61 6d 65 20 61 73 20 42 49 4f 5f 72 65 74 72 79  ame as BIO_retry
5f70: 5f 74 79 70 65 20 2a 2f 0a 09 69 66 20 28 42 49  _type */..if (BI
5f80: 4f 5f 73 68 6f 75 6c 64 5f 72 65 61 64 28 73 74  O_should_read(st
5f90: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a  atePtr->bio)) {.
5fa0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49  .    dprintf("BI
5fb0: 4f 20 68 61 73 20 69 6e 73 75 66 66 69 63 69 65  O has insufficie
5fc0: 6e 74 20 64 61 74 61 20 74 6f 20 72 65 61 64 20  nt data to read 
5fd0: 61 6e 64 20 72 65 74 75 72 6e 22 29 3b 0a 09 7d  and return");..}
5fe0: 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64  ..if (BIO_should
5ff0: 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d  _write(statePtr-
6000: 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70  >bio)) {..    dp
6010: 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20 70  rintf("BIO has p
6020: 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f 20 77  ending data to w
6030: 72 69 74 65 22 29 3b 0a 09 7d 0a 09 69 66 20 28  rite");..}..if (
6040: 42 49 4f 5f 73 68 6f 75 6c 64 5f 69 6f 5f 73 70  BIO_should_io_sp
6050: 65 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d 3e  ecial(statePtr->
6060: 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 69 6e 74  bio)) {..    int
6070: 20 72 65 61 73 6f 6e 20 3d 20 42 49 4f 5f 67 65   reason = BIO_ge
6080: 74 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e 28 73  t_retry_reason(s
6090: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
60a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f      dprintf("BIO
60b0: 20 68 61 73 20 73 6f 6d 65 20 73 70 65 63 69 61   has some specia
60c0: 6c 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 74 68 65  l condition othe
60d0: 72 20 74 68 61 6e 20 72 65 61 64 20 6f 72 20 77  r than read or w
60e0: 72 69 74 65 3a 20 63 6f 64 65 3d 25 64 22 2c 20  rite: code=%d", 
60f0: 72 65 61 73 6f 6e 29 3b 0a 09 7d 0a 0a 20 20 20  reason);..}..   
6100: 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f 66   } else {..BIO_f
6110: 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e 62  lush(statePtr->b
6120: 69 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  io);.    }..    
6130: 73 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09  switch (err) {..
6140: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e  case SSL_ERROR_N
6150: 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20 49 2f 4f  ONE:..    /* I/O
6160: 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c   operation compl
6170: 65 74 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72  eted */..    dpr
6180: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f  intf("SSL_ERROR_
6190: 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20 69 66 20  NONE");..    if 
61a0: 28 77 72 69 74 74 65 6e 20 3c 20 30 29 20 7b 0a  (written < 0) {.
61b0: 09 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09  ..written = 0;..
61c0: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b      }..    break
61d0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
61e0: 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20  OR_SSL:..    /* 
61f0: 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c  A non-recoverabl
6200: 65 2c 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69  e, fatal error i
6210: 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72  n the SSL librar
6220: 79 20 6f 63 63 75 72 72 65 64 2c 0a 09 20 20 20  y occurred,..   
6230: 20 20 20 20 75 73 75 61 6c 6c 79 20 61 20 70 72      usually a pr
6240: 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a  otocol error */.
6250: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
6260: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 20 46 61 74  L_ERROR_SSL: Fat
6270: 61 6c 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  al SSL protocol 
6280: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 22 29  error occurred")
6290: 3b 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69  ;..    if (backi
62a0: 6e 67 45 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a  ngError != 0) {.
62b0: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
62c0: 65 50 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e  ePtr, ERR_reason
62d0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61  _error_string(ba
62e0: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20  ckingError));.. 
62f0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 53 53     } else if (SS
6300: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
6310: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
6320: 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29  l) != X509_V_OK)
6330: 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73   {...Tls_Error(s
6340: 74 61 74 65 50 74 72 2c 0a 09 09 20 20 20 20 58  tatePtr,...    X
6350: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f  509_verify_cert_
6360: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c  error_string(SSL
6370: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75  _get_verify_resu
6380: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  lt(statePtr->ssl
6390: 29 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  )));..    } else
63a0: 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73   {...Tls_Error(s
63b0: 74 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77  tatePtr, "Unknow
63c0: 6e 20 53 53 4c 20 65 72 72 6f 72 22 29 3b 0a 09  n SSL error");..
63d0: 20 20 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f      }..    *erro
63e0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e  rCodePtr = ECONN
63f0: 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 77 72  ABORTED;..    wr
6400: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20  itten = -1;..   
6410: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
6420: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
6430: 41 44 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 65 72  AD:..    /* Oper
6440: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f  ation did not co
6450: 6d 70 6c 65 74 65 20 64 75 65 20 74 6f 20 6e 6f  mplete due to no
6460: 74 20 65 6e 6f 75 67 68 20 64 61 74 61 20 77 61  t enough data wa
6470: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 09 20 20  s available...  
6480: 20 20 20 20 20 52 65 74 72 79 20 61 67 61 69 6e       Retry again
6490: 20 6c 61 74 65 72 20 77 69 74 68 20 73 61 6d 65   later with same
64a0: 20 64 61 74 61 2e 20 2a 2f 0a 09 20 20 20 20 64   data. */..    d
64b0: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f  printf("Got SSL_
64c0: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 2c  ERROR_WANT_READ,
64d0: 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45   mapping it to E
64e0: 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65  AGAIN");..    *e
64f0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
6500: 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74  GAIN;..    writt
6510: 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74  en = -1;..    st
6520: 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20  atePtr->want |= 
6530: 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20  TCL_READABLE;.. 
6540: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
6550: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e  _read(statePtr->
6560: 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  bio);..    break
6570: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
6580: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09  OR_WANT_WRITE:..
6590: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
65a0: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
65b0: 65 20 64 75 65 20 74 6f 20 75 6e 61 62 6c 65 20  e due to unable 
65c0: 74 6f 20 73 65 6e 64 20 61 6c 6c 20 64 61 74 61  to send all data
65d0: 20 74 6f 20 74 68 65 0a 09 20 20 20 20 20 20 20   to the..       
65e0: 42 49 4f 2e 20 52 65 74 72 79 20 6c 61 74 65 72  BIO. Retry later
65f0: 20 77 69 74 68 20 73 61 6d 65 20 64 61 74 61 2e   with same data.
6600: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
6610: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
6620: 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d 61 70 70  WANT_WRITE, mapp
6630: 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e  ing it to EAGAIN
6640: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
6650: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
6660: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ..    written = 
6670: 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74  -1;..    statePt
6680: 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 57  r->want |= TCL_W
6690: 52 49 54 41 42 4c 45 3b 0a 09 20 20 20 20 42 49  RITABLE;..    BI
66a0: 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77 72 69 74  O_set_retry_writ
66b0: 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  e(statePtr->bio)
66c0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
66d0: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57  case SSL_ERROR_W
66e0: 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a  ANT_X509_LOOKUP:
66f0: 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65  ..    /* The ope
6700: 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63  ration did not c
6710: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
6720: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  an application c
6730: 61 6c 6c 62 61 63 6b 0a 09 20 20 20 20 20 20 20  allback..       
6740: 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73  set by SSL_CTX_s
6750: 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63  et_client_cert_c
6760: 62 28 29 20 68 61 73 20 61 73 6b 65 64 20 74 6f  b() has asked to
6770: 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e   be called again
6780: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  . */..    dprint
6790: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52  f("Got SSL_ERROR
67a0: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55  _WANT_X509_LOOKU
67b0: 50 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f  P, mapping it to
67c0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20   EAGAIN");..    
67d0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
67e0: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69  EAGAIN;..    wri
67f0: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20  tten = -1;..    
6800: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
6810: 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a  L_ERROR_SYSCALL:
6820: 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f  ..    /* Some no
6830: 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66  n-recoverable, f
6840: 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f  atal I/O error o
6850: 63 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 20  ccurred */..    
6860: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52  dprintf("SSL_ERR
6870: 4f 52 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74 61  OR_SYSCALL: Fata
6880: 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  l I/O error occu
6890: 72 72 65 64 22 29 3b 0a 0a 09 20 20 20 20 69 66  rred");...    if
68a0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d   (backingError =
68b0: 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e 20 3d  = 0 && written =
68c0: 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66  = 0) {...dprintf
68d0: 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a  ("EOF reached").
68e0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
68f0: 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d  = 0;...written =
6900: 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28   0;...Tls_Error(
6910: 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72  statePtr, "EOF r
6920: 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 20  eached");...    
6930: 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b 69  } else if (backi
6940: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20  ngError == 0 && 
6950: 77 72 69 74 74 65 6e 20 3d 3d 20 2d 31 29 20 7b  written == -1) {
6960: 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20  ...dprintf("I/O 
6970: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28  error occurred (
6980: 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28  errno = %lu)", (
6990: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54  unsigned long) T
69a0: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a  cl_GetErrno());.
69b0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
69c0: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  = Tcl_GetErrno()
69d0: 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31  ;...written = -1
69e0: 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74  ;...Tls_Error(st
69f0: 61 74 65 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e  atePtr, Tcl_Errn
6a00: 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50  oMsg(*errorCodeP
6a10: 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c  tr));...    } el
6a20: 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  se {...dprintf("
6a30: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72  I/O error occurr
6a40: 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  ed (backingError
6a50: 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e   = %lu)", backin
6a60: 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f  gError);...*erro
6a70: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
6a80: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69  etErrno();...wri
6a90: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c 73  tten = -1;...Tls
6aa0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
6ab0: 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f   ERR_reason_erro
6ac0: 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67  r_string(backing
6ad0: 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a  Error));..    }.
6ae0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
6af0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52  se SSL_ERROR_ZER
6b00: 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f  O_RETURN:..    /
6b10: 2a 20 50 65 65 72 20 68 61 73 20 63 6c 65 61 6e  * Peer has clean
6b20: 6c 79 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f  ly closed the co
6b30: 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64  nnection by send
6b40: 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f  ing the close_no
6b50: 74 69 66 79 0a 09 20 20 20 20 20 20 20 61 6c 65  tify..       ale
6b60: 72 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20  rt. Can't read, 
6b70: 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 4e  but can write. N
6b80: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  eed to return an
6b90: 20 45 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20 20   EOF, so the..  
6ba0: 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 69 73 20       channel is 
6bb0: 63 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c  closed which wil
6bc0: 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68  l send an SSL_sh
6bd0: 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20  utdown(). */..  
6be0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45    dprintf("SSL_E
6bf0: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e  RROR_ZERO_RETURN
6c00: 3a 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65  : Peer has close
6c10: 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  d the connection
6c20: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
6c30: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20  odePtr = 0;..   
6c40: 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20   written = 0;.. 
6c50: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61     Tls_Error(sta
6c60: 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 61 73  tePtr, "Peer has
6c70: 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e   closed the conn
6c80: 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69  ection for writi
6c90: 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68  ng by sending th
6ca0: 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61  e close_notify a
6cb0: 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65  lert");..    bre
6cc0: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
6cd0: 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a  RROR_WANT_ASYNC:
6ce0: 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69  ..    /* Used wi
6cf0: 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45  th flag SSL_MODE
6d00: 5f 41 53 59 4e 43 2c 20 6f 70 65 72 61 74 69 6f  _ASYNC, operatio
6d10: 6e 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74  n didn't complet
6d20: 65 20 62 65 63 61 75 73 65 0a 09 20 20 20 20 20  e because..     
6d30: 20 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69 6e    an async engin
6d40: 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63 65  e is still proce
6d50: 73 73 69 6e 67 20 64 61 74 61 2e 20 2a 2f 0a 09  ssing data. */..
6d60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
6d70: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
6d80: 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20 74  ASYNC, mapping t
6d90: 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b  his to EAGAIN");
6da0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
6db0: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
6dc0: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a     written = 0;.
6dd0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64 65  .    break;...de
6de0: 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 69  fault:..    dpri
6df0: 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  ntf("unknown err
6e00: 6f 72 3a 20 25 64 22 2c 20 65 72 72 29 3b 0a 09  or: %d", err);..
6e10: 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74      Tls_Error(st
6e20: 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 6e  atePtr, "Unknown
6e30: 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 62   error");..    b
6e40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
6e50: 20 64 70 72 69 6e 74 66 28 22 4f 75 74 70 75 74   dprintf("Output
6e60: 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f 57  (%d) -> %d", toW
6e70: 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a  rite, written);.
6e80: 20 20 20 20 72 65 74 75 72 6e 20 77 72 69 74 74      return writt
6e90: 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  en;.}../*. *----
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6ef0: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 20 2d 2d  Tls_GetParent --
6f00: 0a 20 2a 0a 20 2a 09 47 65 74 20 70 61 72 65 6e  . *. *.Get paren
6f10: 74 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20 61 20  t channel for a 
6f20: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2e  stacked channel.
6f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
6f40: 20 2a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 6f   *.Tcl_Channel o
6f50: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 2e 0a  r NULL if none..
6f60: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 43 68 61 6e 6e  --. */.Tcl_Chann
6fc0: 65 6c 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74  el Tls_GetParent
6fd0: 28 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  (.    State *sta
6fe0: 74 65 50 74 72 2c 09 09 2f 2a 20 43 6f 6e 6e 65  tePtr,../* Conne
6ff0: 63 74 69 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f  ction state info
7000: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b   */.    int mask
7010: 46 6c 61 67 73 29 09 09 2f 2a 20 57 68 69 63 68  Flags)../* Which
7020: 20 66 6c 61 67 73 20 74 6f 20 70 72 6f 63 65 73   flags to proces
7030: 73 20 2a 2f 0a 7b 0a 20 20 20 20 64 70 72 69 6e  s */.{.    dprin
7040: 74 66 28 22 52 65 71 75 65 73 74 65 64 20 74 6f  tf("Requested to
7050: 20 67 65 74 20 70 61 72 65 6e 74 20 6f 66 20 63   get parent of c
7060: 68 61 6e 6e 65 6c 20 25 70 22 2c 20 73 74 61 74  hannel %p", stat
7070: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 20 20  ePtr->self);..  
7080: 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 2d    if ((statePtr-
7090: 3e 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 46 6c  >flags & ~maskFl
70a0: 61 67 73 29 20 26 20 54 4c 53 5f 54 43 4c 5f 46  ags) & TLS_TCL_F
70b0: 41 53 54 50 41 54 48 29 20 7b 0a 09 64 70 72 69  ASTPATH) {..dpri
70c0: 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 67 65  ntf("Asked to ge
70d0: 74 20 74 68 65 20 70 61 72 65 6e 74 20 63 68 61  t the parent cha
70e0: 6e 6e 65 6c 20 77 68 69 6c 65 20 77 65 20 61 72  nnel while we ar
70f0: 65 20 75 73 69 6e 67 20 46 61 73 74 50 61 74 68  e using FastPath
7100: 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 4e 55   -- returning NU
7110: 4c 4c 22 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  LL");..return NU
7120: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
7130: 74 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63  turn Tcl_GetStac
7140: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
7150: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 7d 0a 0a 2f  Ptr->self);.}../
7160: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 74 4f 70  -. *. * TlsSetOp
71c0: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tionProc --. *. 
71d0: 2a 09 53 65 74 73 20 61 6e 20 6f 70 74 69 6f 6e  *.Sets an option
71e0: 20 74 6f 20 76 61 6c 75 65 20 66 6f 72 20 61 20   to value for a 
71f0: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
7200: 20 63 68 61 6e 6e 65 6c 2e 20 43 61 6c 6c 65 64   channel. Called
7210: 20 62 79 20 74 68 65 0a 20 2a 09 67 65 6e 65 72   by the. *.gener
7220: 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65  ic I/O layer whe
7230: 6e 65 76 65 72 20 74 68 65 20 54 63 6c 5f 53 65  never the Tcl_Se
7240: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 29  tChannelOption()
7250: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
7260: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  d.. *. * Results
7270: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73  :. *.TCL_OK if s
7280: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c  uccessful or TCL
7290: 5f 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64  _ERROR if failed
72a0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
72b0: 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73  ects:. *.Updates
72c0: 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20   channel option 
72d0: 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a  to new value.. *
72e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
72f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7330: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
7340: 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63  TlsSetOptionProc
7350: 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61  (.    ClientData
7360: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f   instanceData,./
7370: 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20  * Socket state. 
7380: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  */.    Tcl_Inter
7390: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46  p *interp,../* F
73a0: 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20  or errors - can 
73b0: 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20  be NULL. */.    
73c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69  const char *opti
73d0: 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20  onName,./* Name 
73e0: 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f  of the option to
73f0: 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 66   set the value f
7400: 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e 55  or, or..... * NU
7410: 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70  LL to get all op
7420: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20  tions and their 
7430: 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 63  values. */.    c
7440: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f  onst char *optio
7450: 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61 6c 75 65  nValue)./* Value
7460: 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20 2a 2f 0a   for option. */.
7470: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
7480: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
7490: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
74a0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
74b0: 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f 47 65 74  parent = Tls_Get
74c0: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c  Parent(statePtr,
74d0: 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54   TLS_TCL_FASTPAT
74e0: 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76  H);.    Tcl_Driv
74f0: 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20  erSetOptionProc 
7500: 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a  *setOptionProc;.
7510: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7520: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
7530: 50 61 73 73 20 74 6f 20 70 61 72 65 6e 74 20 2a  Pass to parent *
7540: 2f 0a 20 20 20 20 73 65 74 4f 70 74 69 6f 6e 50  /.    setOptionP
7550: 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65  roc = Tcl_Channe
7560: 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54  lSetOptionProc(T
7570: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
7580: 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  e(parent));.    
7590: 69 66 20 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f  if (setOptionPro
75a0: 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  c != NULL) {..re
75b0: 74 75 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e  turn (*setOption
75c0: 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61  Proc)(Tcl_GetCha
75d0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
75e0: 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70  (parent), interp
75f0: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70  , optionName, op
7600: 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20  tionValue);.    
7610: 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  }.    /*.     * 
7620: 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 70  Request for a sp
7630: 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61  ecific option ha
7640: 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f  s to fail, we do
7650: 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20  n't have any..  
7660: 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
7670: 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f   Tcl_BadChannelO
7680: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70  ption(interp, op
7690: 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d  tionName, "");.}
76a0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
76f0: 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f   TlsGetOptionPro
7700: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61  c --. *. *.Get a
7710: 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 20   option's value 
7720: 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  for a SSL socket
7730: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20   based channel, 
7740: 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c  or a list of all
7750: 0a 20 2a 09 6f 70 74 69 6f 6e 73 20 61 6e 64 20  . *.options and 
7760: 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20 43 61  their values. Ca
7770: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  lled by the gene
7780: 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68  ric I/O layer wh
7790: 65 6e 65 76 65 72 20 74 68 65 0a 20 2a 09 54 63  enever the. *.Tc
77a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
77b0: 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  on() function is
77c0: 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 0a 20 2a 20   used.. *. *. * 
77d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
77e0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
77f0: 74 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  t. The value of 
7800: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 70  the specified op
7810: 74 69 6f 6e 20 6f 72 20 61 20 6c 69 73 74 20 6f  tion or a list o
7820: 66 0a 20 2a 09 61 6c 6c 20 6f 70 74 69 6f 6e 73  f. *.all options
7830: 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65   and their value
7840: 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  s is returned in
7850: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 44 53   the supplied DS
7860: 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64  tring.. *. * Sid
7870: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
7880: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
7890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
78d0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 47  .static int.TlsG
78e0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 0a 20 20  etOptionProc(.  
78f0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
7900: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f  tanceData,./* So
7910: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20  cket state. */. 
7920: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
7930: 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65  nterp,../* For e
7940: 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 4e  rrors - can be N
7950: 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ULL. */.    cons
7960: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61  t char *optionNa
7970: 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  me,./* Name of t
7980: 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20 72 65 74  he option to ret
7990: 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 65 20  rieve the value 
79a0: 66 6f 72 2c 0a 09 09 09 09 20 2a 20 6f 72 20 4e  for,..... * or N
79b0: 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f  ULL to get all o
79c0: 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72  ptions and their
79d0: 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20   values. */.    
79e0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74  Tcl_DString *opt
79f0: 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 57 68 65  ionValue)./* Whe
7a00: 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  re to store the 
7a10: 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 20 69  computed value i
7a20: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 63 61  nitialized by ca
7a30: 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53  ller. */.{.    S
7a40: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
7a50: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61   (State *) insta
7a60: 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c  nceData;.    Tcl
7a70: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20  _Channel parent 
7a80: 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28  = Tls_GetParent(
7a90: 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43  statePtr, TLS_TC
7aa0: 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20  L_FASTPATH);.   
7ab0: 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70   Tcl_DriverGetOp
7ac0: 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74  tionProc *getOpt
7ad0: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70  ionProc;..    dp
7ae0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
7af0: 0a 0a 20 20 20 20 2f 2a 20 50 61 73 73 20 74 6f  ..    /* Pass to
7b00: 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 67   parent */.    g
7b10: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54  etOptionProc = T
7b20: 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74  cl_ChannelGetOpt
7b30: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43  ionProc(Tcl_GetC
7b40: 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e  hannelType(paren
7b50: 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74  t));.    if (get
7b60: 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55  OptionProc != NU
7b70: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a  LL) {..return (*
7b80: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54  getOptionProc)(T
7b90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
7ba0: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74  tanceData(parent
7bb0: 29 2c 20 69 6e 74 65 72 70 2c 0a 09 20 20 20 20  ), interp,..    
7bc0: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69  optionName, opti
7bd0: 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20  onValue);.    } 
7be0: 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e  else if (optionN
7bf0: 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e  ame == (char*) N
7c00: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52  ULL) {../*.. * R
7c10: 65 71 75 65 73 74 20 69 73 20 71 75 65 72 79 20  equest is query 
7c20: 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c  for all options,
7c30: 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a   this is ok... *
7c40: 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  /..return TCL_OK
7c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20  ;.    }.    /*. 
7c60: 20 20 20 20 2a 20 52 65 71 75 65 73 74 20 66 6f      * Request fo
7c70: 72 20 61 20 73 70 65 63 69 66 69 63 20 6f 70 74  r a specific opt
7c80: 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 69 6c 2c  ion has to fail,
7c90: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 61   we don't have a
7ca0: 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ny..     */.    
7cb0: 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68  return Tcl_BadCh
7cc0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
7cd0: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20  rp, optionName, 
7ce0: 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  "");.}../*. *---
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
7d40: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c   TlsChannelHandl
7d50: 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a  erTimer --. *. *
7d60: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 6e  .Called by the n
7d70: 6f 74 69 66 69 65 72 20 76 69 61 20 61 20 74 69  otifier via a ti
7d80: 6d 65 72 2c 20 74 6f 20 66 6c 75 73 68 20 6f 75  mer, to flush ou
7d90: 74 20 64 61 74 61 20 77 61 69 74 69 6e 67 20 69  t data waiting i
7da0: 6e 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 62 75 66  n. *.channel buf
7db0: 66 65 72 73 2e 20 63 61 6c 6c 65 64 20 62 79 20  fers. called by 
7dc0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20  the generic I/O 
7dd0: 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72 20 74  layer whenever t
7de0: 68 65 0a 20 2a 09 54 63 6c 5f 47 65 74 43 68 61  he. *.Tcl_GetCha
7df0: 6e 6e 65 6c 48 61 6e 64 6c 65 28 29 20 66 75 6e  nnelHandle() fun
7e00: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 20  ction is used.. 
7e10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
7e20: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  .None.. *. * Sid
7e30: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72  e effects:. *.Cr
7e40: 65 61 74 65 73 20 6e 6f 74 69 66 69 63 61 74 69  eates notificati
7e50: 6f 6e 20 65 76 65 6e 74 2e 0a 20 2a 0a 20 2a 2d  on event.. *. *-
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
7eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73  .static void Tls
7ec0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69  ChannelHandlerTi
7ed0: 6d 65 72 28 0a 20 20 20 20 43 6c 69 65 6e 74 44  mer(.    ClientD
7ee0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 09  ata clientData).
7ef0: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e  /* Socket state.
7f00: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20   */.{.    State 
7f10: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
7f20: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
7f30: 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d  ;.    int mask =
7f40: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 3b   statePtr->want;
7f50: 20 2f 2a 20 49 6e 69 74 20 74 6f 20 53 53 4c 5f   /* Init to SSL_
7f60: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 20  ERROR_WANT_READ 
7f70: 61 6e 64 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  and SSL_ERROR_WA
7f80: 4e 54 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20  NT_WRITE */..   
7f90: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
7fa0: 20 77 69 74 68 20 6d 61 73 6b 20 30 78 25 30 32   with mask 0x%02
7fb0: 78 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20  x", mask);..    
7fc0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
7fd0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
7fe0: 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a  n) NULL;..    /*
7ff0: 20 43 68 65 63 6b 20 66 6f 72 20 61 6d 6f 75 6e   Check for amoun
8000: 74 20 6f 66 20 64 61 74 61 20 70 65 6e 64 69 6e  t of data pendin
8010: 67 20 69 6e 20 49 4f 20 6f 72 20 42 49 4f 20 77  g in IO or BIO w
8020: 72 69 74 65 20 62 75 66 66 65 72 20 2a 2f 0a 20  rite buffer */. 
8030: 20 20 20 69 66 20 28 54 63 6c 5f 4f 75 74 70 75     if (Tcl_Outpu
8040: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50  tBuffered(stateP
8050: 74 72 2d 3e 73 65 6c 66 29 20 7c 7c 20 42 49 4f  tr->self) || BIO
8060: 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50  _wpending(stateP
8070: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70 72  tr->bio)) {..dpr
8080: 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20  intf("[chan=%p] 
8090: 42 49 4f 20 77 72 69 74 61 62 6c 65 22 2c 20 73  BIO writable", s
80a0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a  tatePtr->self);.
80b0: 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52  ..mask |= TCL_WR
80c0: 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20  ITABLE;.    }.. 
80d0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
80e0: 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 70  amount of data p
80f0: 65 6e 64 69 6e 67 20 69 6e 20 49 4f 20 6f 72 20  ending in IO or 
8100: 42 49 4f 20 72 65 61 64 20 62 75 66 66 65 72 20  BIO read buffer 
8110: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49  */.    if (Tcl_I
8120: 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61  nputBuffered(sta
8130: 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 7c 7c 20  tePtr->self) || 
8140: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74  BIO_pending(stat
8150: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64  ePtr->bio)) {..d
8160: 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70  printf("[chan=%p
8170: 5d 20 42 49 4f 20 72 65 61 64 61 62 6c 65 22 2c  ] BIO readable",
8180: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29   statePtr->self)
8190: 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f  ;...mask |= TCL_
81a0: 52 45 41 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a  READABLE;.    }.
81b0: 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 66 79 20 74  .    /* Notify t
81c0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 61  he generic IO la
81d0: 79 65 72 20 74 68 61 74 20 6d 61 73 6b 20 65 76  yer that mask ev
81e0: 65 6e 74 73 20 68 61 76 65 20 6f 63 63 75 72 72  ents have occurr
81f0: 65 64 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65  ed on the channe
8200: 6c 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66  l */.    dprintf
8210: 28 22 4e 6f 74 69 66 79 69 6e 67 20 6f 75 72 73  ("Notifying ours
8220: 65 6c 76 65 73 20 77 69 74 68 20 6d 61 73 6b 3d  elves with mask=
8230: 25 64 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20  %d", mask);.    
8240: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65  Tcl_NotifyChanne
8250: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  l(statePtr->self
8260: 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 73 74 61  , mask);.    sta
8270: 74 65 50 74 72 2d 3e 77 61 6e 74 20 3d 20 30 3b  tePtr->want = 0;
8280: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .    return;.}..
8290: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
82a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82e0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 61 74 63  --. *. * TlsWatc
82f0: 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 53  hProc --. *. *.S
8300: 65 74 20 75 70 20 74 68 65 20 65 76 65 6e 74 20  et up the event 
8310: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63  notifier to watc
8320: 68 20 66 6f 72 20 65 76 65 6e 74 73 20 6f 66 20  h for events of 
8330: 69 6e 74 65 72 65 73 74 20 66 72 6f 6d 20 74 68  interest from th
8340: 69 73 0a 20 2a 09 63 68 61 6e 6e 65 6c 2e 20 43  is. *.channel. C
8350: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e  alled by the gen
8360: 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77  eric I/O layer w
8370: 68 65 6e 65 76 65 72 20 74 68 65 20 75 73 65 72  henever the user
8380: 20 28 6f 72 20 74 68 65 0a 20 2a 09 73 79 73 74   (or the. *.syst
8390: 65 6d 29 20 61 6e 6e 6f 75 6e 63 65 73 20 69 74  em) announces it
83a0: 73 20 28 64 69 73 29 69 6e 74 65 72 65 73 74 20  s (dis)interest 
83b0: 69 6e 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65  in events on the
83c0: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 20 69   channel. This i
83d0: 73 0a 20 2a 09 63 61 6c 6c 65 64 20 72 65 70 65  s. *.called repe
83e0: 61 74 65 64 6c 79 2e 0a 20 2a 0a 20 2a 20 52 65  atedly.. *. * Re
83f0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
8400: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8410: 74 73 3a 0a 20 2a 09 53 65 74 73 20 75 70 20 74  ts:. *.Sets up t
8420: 68 65 20 74 69 6d 65 2d 62 61 73 65 64 20 6e 6f  he time-based no
8430: 74 69 66 69 65 72 20 73 6f 20 74 68 61 74 20 66  tifier so that f
8440: 75 74 75 72 65 20 65 76 65 6e 74 73 20 6f 6e 20  uture events on 
8450: 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 77  the channel. *.w
8460: 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54  ill be seen by T
8470: 43 4c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  CL.. *. *-------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
84d0: 63 20 76 6f 69 64 0a 54 6c 73 57 61 74 63 68 50  c void.TlsWatchP
84e0: 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44  roc(.    ClientD
84f0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
8500: 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  ,./* Connection 
8510: 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20  state info */.  
8520: 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a    int mask).../*
8530: 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 72   Events of inter
8540: 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 20 63 6f  est; an OR-ed co
8550: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 09 09 09  mbination of....
8560: 09 20 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  . * TCL_READABLE
8570: 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61  , TCL_WRITABLE a
8580: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e  nd TCL_EXCEPTION
8590: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43  . */.{.    Tcl_C
85a0: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20  hannel parent;. 
85b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
85c0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69  tr = (State *) i
85d0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20  nstanceData;.   
85e0: 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68   Tcl_DriverWatch
85f0: 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b  Proc *watchProc;
8600: 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e 67  .    int pending
8610: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
8620: 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68 20  tf("Called with 
8630: 6d 61 73 6b 20 30 78 25 30 32 78 22 2c 20 6d 61  mask 0x%02x", ma
8640: 73 6b 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 46  sk);.    dprintF
8650: 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 3b 0a  lags(statePtr);.
8660: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66  .    /* Abort if
8670: 20 74 68 65 20 75 73 65 72 20 76 65 72 69 66 79   the user verify
8680: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 69   callback is sti
8690: 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61 76  ll running to av
86a0: 6f 69 64 20 74 72 69 67 67 65 72 69 6e 67 0a 20  oid triggering. 
86b0: 20 20 20 20 2a 20 61 6e 6f 74 68 65 72 20 63 61      * another ca
86c0: 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ll before the cu
86d0: 72 72 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f 6d  rrent one is com
86e0: 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69 66  plete. */.    if
86f0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
8700: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  s & TLS_TCL_CALL
8710: 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66  BACK) {..dprintf
8720: 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e  ("Callback is on
8730: 2d 67 6f 69 6e 67 2c 20 64 6f 69 6e 67 20 6e 6f  -going, doing no
8740: 74 68 69 6e 67 22 29 3b 0a 09 72 65 74 75 72 6e  thing");..return
8750: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72  ;.    }..    par
8760: 65 6e 74 20 3d 20 54 6c 73 5f 47 65 74 50 61 72  ent = Tls_GetPar
8770: 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c  ent(statePtr, TL
8780: 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b  S_TCL_FASTPATH);
8790: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
87a0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
87b0: 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41  TCL_HANDSHAKE_FA
87c0: 49 4c 45 44 29 20 7b 0a 09 64 70 72 69 6e 74 66  ILED) {..dprintf
87d0: 28 22 41 73 6b 65 64 20 74 6f 20 77 61 74 63 68  ("Asked to watch
87e0: 20 61 20 73 6f 63 6b 65 74 20 77 69 74 68 20 61   a socket with a
87f0: 20 66 61 69 6c 65 64 20 68 61 6e 64 73 68 61 6b   failed handshak
8800: 65 20 2d 2d 20 6e 6f 74 68 69 6e 67 20 63 61 6e  e -- nothing can
8810: 20 68 61 70 70 65 6e 20 68 65 72 65 22 29 3b 0a   happen here");.
8820: 09 64 70 72 69 6e 74 66 28 22 55 6e 72 65 67 69  .dprintf("Unregi
8830: 73 74 65 72 69 6e 67 20 69 6e 74 65 72 65 73 74  stering interest
8840: 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68   in the lower ch
8850: 61 6e 6e 65 6c 22 29 3b 0a 0a 09 77 61 74 63 68  annel");...watch
8860: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e  Proc = Tcl_Chann
8870: 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f  elWatchProc(Tcl_
8880: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70  GetChannelType(p
8890: 61 72 65 6e 74 29 29 3b 0a 09 77 61 74 63 68 50  arent));..watchP
88a0: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
88b0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70  elInstanceData(p
88c0: 61 72 65 6e 74 29 2c 20 30 29 3b 0a 09 73 74 61  arent), 0);..sta
88d0: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
88e0: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 3b 0a 20   = 0;..return;. 
88f0: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50     }..    stateP
8900: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20  tr->watchMask = 
8910: 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  mask;..    /*.  
8920: 20 20 20 2a 20 4e 6f 20 63 68 61 6e 6e 65 6c 20     * No channel 
8930: 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d 6f 72  handlers any mor
8940: 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20 6e 6f  e. We will be no
8950: 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74 69 63  tified automatic
8960: 61 6c 6c 79 20 61 62 6f 75 74 0a 20 20 20 20 20  ally about.     
8970: 2a 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 20  * events on the 
8980: 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69  channel below vi
8990: 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f 75 72 20  a a call to our 
89a0: 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 79  'TransformNotify
89b0: 50 72 6f 63 27 2e 20 42 75 74 0a 20 20 20 20 20  Proc'. But.     
89c0: 2a 20 77 65 20 68 61 76 65 20 74 6f 20 70 61 73  * we have to pas
89d0: 73 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 64  s the interest d
89e0: 6f 77 6e 20 6e 6f 77 2e 20 57 65 20 61 72 65 20  own now. We are 
89f0: 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64 20 61  allowed to add a
8a00: 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 20 2a  dditional.     *
8a10: 20 27 69 6e 74 65 72 65 73 74 27 20 74 6f 20 74   'interest' to t
8a20: 68 65 20 6d 61 73 6b 20 69 66 20 77 65 20 77 61  he mask if we wa
8a30: 6e 74 20 74 6f 2c 20 62 75 74 20 74 68 69 73 20  nt to, but this 
8a40: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68  transformation h
8a50: 61 73 20 6e 6f 0a 20 20 20 20 20 2a 20 73 75 63  as no.     * suc
8a60: 68 20 69 6e 74 65 72 65 73 74 2e 20 49 74 20 6a  h interest. It j
8a70: 75 73 74 20 70 61 73 73 65 73 20 74 68 65 20 72  ust passes the r
8a80: 65 71 75 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63  equest down, unc
8a90: 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a  hanged..     */.
8aa0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 67      dprintf("Reg
8ab0: 69 73 74 65 72 69 6e 67 20 6f 75 72 20 69 6e 74  istering our int
8ac0: 65 72 65 73 74 20 69 6e 20 74 68 65 20 6c 6f 77  erest in the low
8ad0: 65 72 20 63 68 61 6e 6e 65 6c 20 28 63 68 61 6e  er channel (chan
8ae0: 3d 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20  =%p)", (void *) 
8af0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 77 61 74  parent);.    wat
8b00: 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  chProc = Tcl_Cha
8b10: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63  nnelWatchProc(Tc
8b20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8b30: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77  (parent));.    w
8b40: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
8b50: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
8b60: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73  ata(parent), mas
8b70: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 77  k);..    /* Do w
8b80: 65 20 68 61 76 65 20 61 6e 79 20 70 65 6e 64 69  e have any pendi
8b90: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 70  ng data */.    p
8ba0: 65 6e 64 69 6e 67 20 3d 20 28 73 74 61 74 65 50  ending = (stateP
8bb0: 74 72 2d 3e 77 61 6e 74 20 7c 7c 20 5c 0a 09 28  tr->want || \..(
8bc0: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44  (mask & TCL_READ
8bd0: 41 42 4c 45 29 20 26 26 20 28 28 54 63 6c 5f 49  ABLE) && ((Tcl_I
8be0: 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61  nputBuffered(sta
8bf0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30  tePtr->self) > 0
8c00: 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72 6c 5f 70  ) || (BIO_ctrl_p
8c10: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d  ending(statePtr-
8c20: 3e 62 69 6f 29 20 3e 20 30 29 29 29 20 7c 7c 0a  >bio) > 0))) ||.
8c30: 09 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 57 52  .((mask & TCL_WR
8c40: 49 54 41 42 4c 45 29 20 26 26 20 28 28 54 63 6c  ITABLE) && ((Tcl
8c50: 5f 4f 75 74 70 75 74 42 75 66 66 65 72 65 64 28  _OutputBuffered(
8c60: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20  statePtr->self) 
8c70: 3e 20 30 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72  > 0) || (BIO_ctr
8c80: 6c 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65  l_wpending(state
8c90: 50 74 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29 29  Ptr->bio) > 0)))
8ca0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
8cb0: 22 49 4f 20 57 61 6e 74 3d 25 64 2c 20 69 6e 70  "IO Want=%d, inp
8cc0: 75 74 20 62 75 66 66 65 72 3d 25 64 2c 20 6f 75  ut buffer=%d, ou
8cd0: 74 70 75 74 20 62 75 66 66 65 72 3d 25 64 2c 20  tput buffer=%d, 
8ce0: 42 49 4f 20 70 65 6e 64 69 6e 67 3d 25 7a 64 2c  BIO pending=%zd,
8cf0: 20 42 49 4f 20 77 70 65 6e 64 69 6e 67 3d 25 7a   BIO wpending=%z
8d00: 64 2c 20 70 65 6e 64 69 6e 67 3d 25 64 22 2c 20  d, pending=%d", 
8d10: 5c 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 6e  \..statePtr->wan
8d20: 74 2c 20 54 63 6c 5f 49 6e 70 75 74 42 75 66 66  t, Tcl_InputBuff
8d30: 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73  ered(statePtr->s
8d40: 65 6c 66 29 2c 20 54 63 6c 5f 4f 75 74 70 75 74  elf), Tcl_Output
8d50: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74  Buffered(statePt
8d60: 72 2d 3e 73 65 6c 66 29 2c 20 5c 0a 09 42 49 4f  r->self), \..BIO
8d70: 5f 63 74 72 6c 5f 70 65 6e 64 69 6e 67 28 73 74  _ctrl_pending(st
8d80: 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c 20 42 49  atePtr->bio), BI
8d90: 4f 5f 63 74 72 6c 5f 77 70 65 6e 64 69 6e 67 28  O_ctrl_wpending(
8da0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c 20  statePtr->bio), 
8db0: 70 65 6e 64 69 6e 67 29 3b 0a 0a 20 20 20 20 2f  pending);..    /
8dc0: 2a 20 53 63 68 65 64 75 6c 65 20 6e 65 78 74 20  * Schedule next 
8dd0: 65 76 65 6e 74 20 69 66 20 64 61 74 61 20 69 73  event if data is
8de0: 20 70 65 6e 64 69 6e 67 2c 20 6f 74 68 65 72 77   pending, otherw
8df0: 69 73 65 20 63 65 61 73 65 20 65 76 65 6e 74 73  ise cease events
8e00: 20 66 6f 72 20 6e 6f 77 20 2a 2f 0a 20 20 20 20   for now */.    
8e10: 69 66 20 28 21 28 6d 61 73 6b 20 26 20 54 43 4c  if (!(mask & TCL
8e20: 5f 52 45 41 44 41 42 4c 45 29 20 7c 7c 20 70 65  _READABLE) || pe
8e30: 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 09 2f  nding == 0) {../
8e40: 2a 20 52 65 6d 6f 76 65 20 74 69 6d 65 72 2c 20  * Remove timer, 
8e50: 69 66 20 61 6e 79 20 2a 2f 0a 09 69 66 20 28 73  if any */..if (s
8e60: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
8e70: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
8e80: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  n) NULL) {..    
8e90: 64 70 72 69 6e 74 66 28 22 41 20 74 69 6d 65 72  dprintf("A timer
8ea0: 20 77 61 73 20 66 6f 75 6e 64 2c 20 64 65 6c 65   was found, dele
8eb0: 74 69 6e 67 20 69 74 22 29 3b 0a 09 20 20 20 20  ting it");..    
8ec0: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
8ed0: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
8ee0: 3e 74 69 6d 65 72 29 3b 0a 09 20 20 20 20 73 74  >timer);..    st
8ef0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
8f00: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
8f10: 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20 20 20 20 7d   NULL;..}..    }
8f20: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 41 64 64 20   else {../* Add 
8f30: 74 69 6d 65 72 2c 20 69 66 20 6e 6f 6e 65 20 2a  timer, if none *
8f40: 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  /..if (statePtr-
8f50: 3e 74 69 6d 65 72 20 3d 3d 20 28 54 63 6c 5f 54  >timer == (Tcl_T
8f60: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29  imerToken) NULL)
8f70: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
8f80: 22 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20  "Creating a new 
8f90: 74 69 6d 65 72 20 73 69 6e 63 65 20 64 61 74 61  timer since data
8fa0: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 77   appears to be w
8fb0: 61 69 74 69 6e 67 22 29 3b 0a 09 20 20 20 20 73  aiting");..    s
8fc0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
8fd0: 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72   Tcl_CreateTimer
8fe0: 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f  Handler(TLS_TCL_
8ff0: 44 45 4c 41 59 2c 20 54 6c 73 43 68 61 6e 6e 65  DELAY, TlsChanne
9000: 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28  lHandlerTimer, (
9010: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
9020: 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ePtr);..}.    }.
9030: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
9040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9080: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47  -----. *. * TlsG
9090: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a  etHandleProc --.
90a0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
90b0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
90c0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
90d0: 4f 20 6c 65 76 65 6c 20 74 6f 20 72 65 74 72 69  O level to retri
90e0: 65 76 65 20 61 6e 20 4f 53 0a 20 2a 09 73 70 65  eve an OS. *.spe
90f0: 63 69 66 69 63 20 68 61 6e 64 6c 65 20 61 73 73  cific handle ass
9100: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
9110: 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73   channel. Not us
9120: 65 64 20 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d  ed for transform
9130: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
9140: 3a 0a 20 2a 09 54 68 65 20 61 70 70 72 6f 70 72  :. *.The appropr
9150: 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 20 68 61  iate Tcl_File ha
9160: 6e 64 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ndle or NULL if 
9170: 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  none.. *. * Side
9180: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
9190: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
91f0: 20 69 6e 74 20 54 6c 73 47 65 74 48 61 6e 64 6c   int TlsGetHandl
9200: 65 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e  eProc(.    Clien
9210: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
9220: 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74  ta,./* Socket st
9230: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ate. */.    int 
9240: 64 69 72 65 63 74 69 6f 6e 2c 09 09 2f 2a 20 54  direction,../* T
9250: 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 54  CL_READABLE or T
9260: 43 4c 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20  CL_WRITABLE */. 
9270: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68     ClientData *h
9280: 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e  andlePtr)./* Han
9290: 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
92a0: 69 74 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  ith the channel 
92b0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
92c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
92d0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
92e0: 61 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  a;..    return T
92f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e  cl_GetChannelHan
9300: 64 6c 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e  dle(Tls_GetParen
9310: 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f  t(statePtr, TLS_
9320: 54 43 4c 5f 46 41 53 54 50 41 54 48 29 2c 0a 09  TCL_FASTPATH),..
9330: 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c  direction, handl
9340: 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  ePtr);.}../*. *-
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
93a0: 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63   * TlsNotifyProc
93b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
93c0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
93d0: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  ked by the gener
93e0: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 6e  ic IO level to n
93f0: 6f 74 69 66 79 20 74 68 65 20 63 68 61 6e 6e 65  otify the channe
9400: 6c 0a 20 2a 09 74 68 61 74 20 61 6e 20 65 76 65  l. *.that an eve
9410: 6e 74 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  nt has occurred 
9420: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  on the underlyin
9430: 67 20 63 68 61 6e 6e 65 6c 2e 20 49 74 20 69 73  g channel. It is
9440: 20 75 73 65 64 20 62 79 0a 20 2a 09 73 74 61 63   used by. *.stac
9450: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 64 72 69 76  ked channel driv
9460: 65 72 73 20 74 68 61 74 20 77 69 73 68 20 74 6f  ers that wish to
9470: 20 62 65 20 6e 6f 74 69 66 69 65 64 20 6f 66 20   be notified of 
9480: 65 76 65 6e 74 73 20 74 68 61 74 20 6f 63 63 75  events that occu
9490: 72 0a 20 2a 09 6f 6e 20 74 68 65 20 75 6e 64 65  r. *.on the unde
94a0: 72 6c 79 69 6e 67 20 28 73 74 61 63 6b 65 64 29  rlying (stacked)
94b0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20   channel.. *. * 
94c0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 79 70 65  Results:. *.Type
94d0: 20 6f 66 20 65 76 65 6e 74 20 6f 72 20 30 20 69   of event or 0 i
94e0: 66 20 66 61 69 6c 65 64 0a 20 2a 0a 20 2a 20 53  f failed. *. * S
94f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
9500: 4d 61 79 20 70 72 6f 63 65 73 73 20 74 68 65 20  May process the 
9510: 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 62  incoming event b
9520: 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d  y itself.. *. *-
9530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
9580: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4e  .static int TlsN
9590: 6f 74 69 66 79 50 72 6f 63 28 0a 20 20 20 20 43  otifyProc(.    C
95a0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
95b0: 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65  ceData,./* Socke
95c0: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20  t state. */.    
95d0: 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 74  int mask).../* t
95e0: 79 70 65 20 6f 66 20 65 76 65 6e 74 20 74 68 61  ype of event tha
95f0: 74 20 6f 63 63 75 72 72 65 64 3a 20 4f 52 2d 65  t occurred: OR-e
9600: 64 0a 09 09 09 09 20 2a 20 63 6f 6d 62 69 6e 61  d..... * combina
9610: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44  tion of TCL_READ
9620: 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54  ABLE or TCL_WRIT
9630: 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 20 53 74  ABLE */.{.    St
9640: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
9650: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
9660: 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  ceData;.    int 
9670: 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 0a  errorCode = 0;..
9680: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
9690: 6c 65 64 20 77 69 74 68 20 6d 61 73 6b 20 30 78  led with mask 0x
96a0: 25 30 32 78 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20  %02x", mask);.. 
96b0: 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 74     /* Abort if t
96c0: 68 65 20 75 73 65 72 20 76 65 72 69 66 79 20 63  he user verify c
96d0: 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 69 6c 6c  allback is still
96e0: 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61 76 6f 69   running to avoi
96f0: 64 20 74 72 69 67 67 65 72 69 6e 67 0a 20 20 20  d triggering.   
9700: 20 20 2a 20 61 6e 6f 74 68 65 72 20 63 61 6c 6c    * another call
9710: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
9720: 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f 6d 70 6c  ent one is compl
9730: 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  ete. */.    if (
9740: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
9750: 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41  & TLS_TCL_CALLBA
9760: 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  CK) {..dprintf("
9770: 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67  Callback is on-g
9780: 6f 69 6e 67 2c 20 72 65 74 75 72 6e 69 6e 67 20  oing, returning 
9790: 66 61 69 6c 65 64 22 29 3b 0a 09 72 65 74 75 72  failed");..retur
97a0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
97b0: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
97c0: 6c 69 7a 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63  lized, do connec
97d0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  t */.    if (sta
97e0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
97f0: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09  LS_TCL_INIT) {..
9800: 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a  int tlsConnect;.
9810: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69  ..dprintf("Calli
9820: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
9830: 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f  nnect");...tlsCo
9840: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74  nnect = Tls_Wait
9850: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
9860: 50 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c  Ptr, &errorCode,
9870: 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f 6e   1);..if (tlsCon
9880: 6e 65 63 74 20 3c 20 31 29 20 7b 0a 09 20 20 20  nect < 1) {..   
9890: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e   dprintf("Got an
98a0: 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74   error waiting t
98b0: 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f  o connect (tlsCo
98c0: 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72  nnect = %i, *err
98d0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22  orCodePtr = %i)"
98e0: 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 65 72  , tlsConnect, er
98f0: 72 6f 72 43 6f 64 65 29 3b 0a 09 20 20 20 20 69  rorCode);..    i
9900: 66 20 28 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20  f (errorCode == 
9910: 45 41 47 41 49 4e 29 20 7b 0a 09 09 64 70 72 69  EAGAIN) {...dpri
9920: 6e 74 66 28 22 41 73 79 6e 63 20 66 6c 61 67 20  ntf("Async flag 
9930: 63 6f 75 6c 64 20 62 65 20 73 65 74 20 28 64 69  could be set (di
9940: 64 6e 27 74 20 63 68 65 63 6b 29 20 61 6e 64 20  dn't check) and 
9950: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47  errorCode == EAG
9960: 41 49 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67 20  AIN:  Returning 
9970: 66 61 69 6c 65 64 22 29 3b 0a 0a 09 09 72 65 74  failed");....ret
9980: 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 0a 09  urn 0;..    }...
9990: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73      dprintf("Tls
99a0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
99b0: 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
99c0: 72 22 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  r");..}.    }.. 
99d0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 65 6c     /*.     * Del
99e0: 65 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ete an existing 
99f0: 74 69 6d 65 72 2e 20 49 74 20 77 61 73 20 6e 6f  timer. It was no
9a00: 74 20 66 69 72 65 64 2c 20 79 65 74 20 77 65 20  t fired, yet we 
9a10: 61 72 65 20 68 65 72 65 2c 20 73 6f 20 74 68 65  are here, so the
9a20: 0a 20 20 20 20 20 2a 20 63 68 61 6e 6e 65 6c 20  .     * channel 
9a30: 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 64 20  below generated 
9a40: 73 75 63 68 20 61 6e 20 65 76 65 6e 74 20 61 6e  such an event an
9a50: 64 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  d we don't have 
9a60: 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 61 6c 0a  to. The renewal.
9a70: 20 20 20 20 20 2a 20 6f 66 20 74 68 65 20 69 6e       * of the in
9a80: 74 65 72 65 73 74 20 61 66 74 65 72 20 74 68 65  terest after the
9a90: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 68   execution of ch
9aa0: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 77  annel handlers w
9ab0: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 20  ill eventually. 
9ac0: 20 20 20 20 2a 20 63 61 75 73 65 20 75 73 20 74      * cause us t
9ad0: 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74  o recreate the t
9ae0: 69 6d 65 72 20 28 69 6e 20 54 6c 73 57 61 74 63  imer (in TlsWatc
9af0: 68 50 72 6f 63 29 2e 0a 20 20 20 20 20 2a 2f 0a  hProc)..     */.
9b00: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
9b10: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
9b20: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
9b30: 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54  ) {..Tcl_DeleteT
9b40: 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74  imerHandler(stat
9b50: 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73  ePtr->timer);..s
9b60: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
9b70: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
9b80: 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  ) NULL;.    }.. 
9b90: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20     /*.     * An 
9ba0: 65 76 65 6e 74 20 6f 63 63 75 72 72 65 64 20 69  event occurred i
9bb0: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  n the underlying
9bc0: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 20 74   channel. This t
9bd0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 64 6f  ransformation do
9be0: 65 73 6e 27 74 0a 20 20 20 20 20 2a 20 70 72 6f  esn't.     * pro
9bf0: 63 65 73 73 20 73 75 63 68 20 65 76 65 6e 74 73  cess such events
9c00: 20 74 68 75 73 20 72 65 74 75 72 6e 73 20 74 68   thus returns th
9c10: 65 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 6b 20  e incoming mask 
9c20: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  unchanged..     
9c30: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  */.    dprintf("
9c40: 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 6d  Returning %i", m
9c50: 61 73 6b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ask);.    return
9c60: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d   mask;.}../*. *-
9c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
9cc0: 20 2a 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79   * Tls_ChannelTy
9cd0: 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 44 65 66 69  pe --. *. *.Defi
9ce0: 6e 65 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  nes the correct 
9cf0: 54 4c 53 20 63 68 61 6e 6e 65 6c 20 64 72 69 76  TLS channel driv
9d00: 65 72 20 68 61 6e 64 6c 65 72 73 20 66 6f 72 20  er handlers for 
9d10: 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 74 79 70  this channel typ
9d20: 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  e.. *. * Results
9d30: 3a 0a 20 2a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c  :. *.Tcl_Channel
9d40: 54 79 70 65 20 73 74 72 75 63 74 75 72 65 2e 0a  Type structure..
9d50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
9d60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
9d70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
9d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9dc0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
9dd0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tcl_ChannelType
9de0: 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 20   tlsChannelType 
9df0: 3d 20 7b 0a 20 20 20 20 22 74 6c 73 22 2c 09 09  = {.    "tls",..
9e00: 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f  ./* Type name */
9e10: 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c  .    TCL_CHANNEL
9e20: 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76  _VERSION_5,./* v
9e30: 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  5 channel */.   
9e40: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c 09 09   TlsCloseProc,..
9e50: 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f  /* Close proc */
9e60: 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 50 72 6f  .    TlsInputPro
9e70: 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f  c,../* Input pro
9e80: 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4f 75 74 70  c */.    TlsOutp
9e90: 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70  utProc,../* Outp
9ea0: 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e  ut proc */.    N
9eb0: 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 6b 20 70  ULL,.../* Seek p
9ec0: 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 53 65  roc */.    TlsSe
9ed0: 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a  tOptionProc,../*
9ee0: 20 53 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63   Set option proc
9ef0: 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 4f 70   */.    TlsGetOp
9f00: 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 47 65  tionProc,../* Ge
9f10: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f  t option proc */
9f20: 0a 20 20 20 20 54 6c 73 57 61 74 63 68 50 72 6f  .    TlsWatchPro
9f30: 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  c,../* Initializ
9f40: 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20  e notifier */.  
9f50: 20 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72    TlsGetHandlePr
9f60: 6f 63 2c 09 09 2f 2a 20 47 65 74 20 4f 53 20 68  oc,../* Get OS h
9f70: 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 68  andles out of ch
9f80: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73  annel */.    Tls
9f90: 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20  Close2Proc,../* 
9fa0: 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20  close2proc */.  
9fb0: 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72    TlsBlockModePr
9fc0: 6f 63 2c 09 09 2f 2a 20 53 65 74 20 62 6c 6f 63  oc,../* Set bloc
9fd0: 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67  king/nonblocking
9fe0: 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c   mode*/.    NULL
9ff0: 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f  ,.../* Flush pro
a000: 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4e 6f 74 69  c */.    TlsNoti
a010: 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64  fyProc,../* Hand
a020: 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74 73 20 62  ling of events b
a030: 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20  ubbling up */.  
a040: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64    NULL,.../* Wid
a050: 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20  e seek proc */. 
a060: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68     NULL,.../* Th
a070: 72 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  read action */. 
a080: 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75     NULL.../* Tru
a090: 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 63 6f 6e  ncate */.};..con
a0a0: 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79  st Tcl_ChannelTy
a0b0: 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  pe *Tls_ChannelT
a0c0: 79 70 65 28 76 6f 69 64 29 20 7b 0a 20 20 20 20  ype(void) {.    
a0d0: 72 65 74 75 72 6e 20 26 74 6c 73 43 68 61 6e 6e  return &tlsChann
a0e0: 65 6c 54 79 70 65 3b 0a 7d 0a                    elType;.}.