Hex Artifact Content

Artifact fc485d283534b1ca1e486454703d55698c05c00543fb9aa57583c758ce473f1a:


0000: 2f 2a 0a 20 2a 20 50 72 6f 76 69 64 65 73 20 49  /*. * Provides I
0010: 4f 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 69  O functions to i
0020: 6e 74 65 72 66 61 63 65 20 62 65 74 77 65 65 6e  nterface between
0030: 20 74 68 65 20 42 49 4f 20 62 75 66 66 65 72 73   the BIO buffers
0040: 20 61 6e 64 20 54 43 4c 0a 20 2a 20 61 70 70 6c   and TCL. * appl
0050: 69 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 75 73  ications when us
0060: 69 6e 67 20 73 74 61 63 6b 65 64 20 63 68 61 6e  ing stacked chan
0070: 6e 65 6c 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79  nels.. *. * Copy
0080: 72 69 67 68 74 20 28 43 29 20 31 39 39 37 2d 32  right (C) 1997-2
0090: 30 30 30 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20  000 Matt Newman 
00a0: 3c 6d 61 74 74 40 6e 6f 76 61 64 69 67 6d 2e 63  <matt@novadigm.c
00b0: 6f 6d 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74  om>. * Copyright
00c0: 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 20   (C) 2000 Ajuba 
00d0: 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 20 43 6f 70  Solutions. * Cop
00e0: 79 72 69 67 68 74 20 28 43 29 20 32 30 32 34 20  yright (C) 2024 
00f0: 42 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a  Brian O'Hagan. *
0100: 0a 20 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 63  . * Additional c
0110: 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f 72  redit is due for
0120: 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73   Andreas Kupries
0130: 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74   (a.kupries@west
0140: 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a  end.com), for. *
0150: 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54   providing the T
0160: 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65  cl_ReplaceChanne
0170: 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20  l mechanism and 
0180: 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20  working closely 
0190: 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e  with me. * to en
01a0: 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70  hance it to supp
01b0: 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65  ort full fileeve
01c0: 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a  nt semantics.. *
01d0: 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f  . * Also work do
01e0: 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ne by the follow
01f0: 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64   people provided
0200: 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20   the impetus to 
0210: 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 3a  do this "right":
0220: 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69  . *.tclSSL (Coli
0230: 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61  n McCormack, Sha
0240: 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a  red Technology).
0250: 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72   *.SSLtcl (Peter
0260: 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a   Antman). *. */.
0270: 0a 2f 2a 0a 09 09 09 09 4e 6f 72 6d 61 6c 0a 09  ./*.....Normal..
0280: 09 74 6c 73 42 49 4f 2e 63 09 09 09 09 74 6c 73  .tlsBIO.c....tls
0290: 49 4f 2e 63 0a 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20  IO.c. +------+  
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02b0: 20 20 20 20 20 20 2b 2d 2d 2d 2b 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 20 20 2b 2d 2d 2d              +---
02e0: 2b 0a 20 7c 20 20 20 20 20 20 7c 54 63 6c 5f 57  +. |      |Tcl_W
02f0: 72 69 74 65 52 61 77 3c 2d 2d 42 69 6f 4f 75 74  riteRaw<--BioOut
0300: 70 75 74 7c 53 53 4c 7c 42 49 4f 5f 77 72 69 74  put|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 42 49 4f 7c 20 20 20 20 20 20 20 20 20 20 20  |BIO|           
0360: 20 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e 20 20   <unencrypted>  
0370: 20 20 20 20 20 20 7c 41 70 70 7c 0a 20 7c 20 20        |App|. |  
0380: 20 20 20 20 7c 54 63 6c 5f 52 65 61 64 52 61 77      |Tcl_ReadRaw
0390: 20 2d 2d 3e 20 42 69 6f 49 6e 70 75 74 7c 20 20   --> BioInput|  
03a0: 20 7c 42 49 4f 5f 52 65 61 64 20 2d 2d 3e 54 6c   |BIO_Read -->Tl
03b0: 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d 3e 20 52  sInputProc --> R
03c0: 65 61 64 7c 20 20 20 7c 0a 20 2b 2d 2d 2d 2d 2d  ead|   |. +-----
03d0: 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -+              
03e0: 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2b 20            +---+ 
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 2b 2d 2d 2d 2b 0a 0a 0a 09 09 09 09 46 61 73 74  +---+.......Fast
0420: 20 50 61 74 68 0a 09 09 09 09 09 74 6c 73 49 4f   Path......tlsIO
0430: 2e 63 0a 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20  .c.  +------+   
0440: 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d            +-----
0450: 2b 20 20 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 2b 2d 2d 2d 2d 2d 2b 0a 20 20        +-----+.  
0480: 7c 20 20 20 20 20 20 7c 3c 2d 2d 20 77 72 69 74  |      |<-- writ
0490: 65 20 3c 2d 2d 7c 20 53 53 4c 20 7c 42 49 4f 5f  e <--| SSL |BIO_
04a0: 77 72 69 74 65 20 3c 2d 2d 20 54 6c 73 4f 75 74  write <-- TlsOut
04b0: 70 75 74 50 72 6f 63 20 3c 2d 2d 20 57 72 69 74  putProc <-- Writ
04c0: 65 7c 20 20 20 20 20 7c 0a 20 20 7c 73 6f 63 6b  e|     |.  |sock
04d0: 65 74 7c 20 3c 65 6e 63 72 79 70 74 65 64 3e 20  et| <encrypted> 
04e0: 7c 20 42 49 4f 20 7c 20 20 20 20 20 20 20 20 20  | BIO |         
04f0: 20 20 20 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e     <unencrypted>
0500: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 41 70              | Ap
0510: 70 20 7c 0a 20 20 7c 20 20 20 20 20 20 7c 3c 2d  p |.  |      |<-
0520: 2d 20 20 72 65 61 64 20 3c 2d 2d 7c 20 20 20 20  -  read <--|    
0530: 20 7c 42 49 4f 5f 52 65 61 64 20 20 2d 2d 3e 20   |BIO_Read  --> 
0540: 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 20 2d 2d  TlsInputProc  --
0550: 3e 20 20 52 65 61 64 7c 20 20 20 20 20 7c 0a 20  >  Read|     |. 
0560: 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20   +------+       
0570: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 20 20 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 2b 2d 2d 2d 2d 2d 2b 0a 2a 2f 0a 0a 23 69    +-----+.*/..#i
05b0: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
05c0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e  ".#include <errn
05d0: 6f 2e 68 3e 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  o.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 0a 20 2a 0a 20 2a 20 54  --------. *. * T
0630: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20  lsBlockModeProc 
0640: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
0650: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
0660: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
0670: 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 73 65  c IO level to se
0680: 74 20 63 68 61 6e 6e 65 6c 20 74 6f 0a 20 2a 09  t channel to. *.
0690: 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62  blocking or nonb
06a0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 20 43 61  locking mode. Ca
06b0: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  lled by the gene
06c0: 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68  ric I/O layer wh
06d0: 65 6e 65 76 65 72 0a 20 2a 09 74 68 65 20 54 63  enever. *.the Tc
06e0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
06f0: 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  on() function is
0700: 20 75 73 65 64 20 77 69 74 68 20 6f 70 74 69 6f   used with optio
0710: 6e 20 2d 62 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 0a  n -blocking.. *.
0720: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30   * Results:. *.0
0730: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
0740: 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f  r POSIX error co
0750: 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a  de if failed.. *
0760: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
0770: 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64 65  :. *.Sets the de
0780: 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b 69  vice into blocki
0790: 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e  ng or nonblockin
07a0: 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  g 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 0a 20 2a 2f 0a 73  ----------. */.s
0800: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42 6c 6f  tatic int TlsBlo
0810: 63 6b 4d 6f 64 65 50 72 6f 63 28 0a 20 20 20 20  ckModeProc(.    
0820: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
0830: 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43 6f 6e 6e  nceData,./* Conn
0840: 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69 6e 66  ection state inf
0850: 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64  o */.    int mod
0860: 65 29 09 09 09 2f 2a 20 42 6c 6f 63 6b 69 6e 67  e).../* Blocking
0870: 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67   or non-blocking
0880: 20 6d 6f 64 65 20 2a 2f 0a 7b 0a 20 20 20 20 53   mode */.{.    S
0890: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
08a0: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61   (State *) insta
08b0: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66  nceData;..    if
08c0: 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f   (mode == TCL_MO
08d0: 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20  DE_NONBLOCKING) 
08e0: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  {..statePtr->fla
08f0: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53  gs |= TLS_TCL_AS
0900: 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  YNC;.    } else 
0910: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  {..statePtr->fla
0920: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
0930: 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20  ASYNC);.    }.  
0940: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
0950: 2a 0a 20 2a 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65  -. *. * TlsClose
09b0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
09c0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
09d0: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67  invoked by the g
09e0: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20  eneric IO level 
09f0: 74 6f 20 70 65 72 66 6f 72 6d 20 63 68 61 6e 6e  to perform chann
0a00: 65 6c 0a 20 2a 09 74 79 70 65 20 73 70 65 63 69  el. *.type speci
0a10: 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e  fic cleanup when
0a20: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
0a30: 73 65 64 20 63 68 61 6e 6e 65 6c 20 69 73 20 63  sed channel is c
0a40: 6c 6f 73 65 64 2e 20 43 61 6c 6c 65 64 0a 20 2a  losed. Called. *
0a50: 09 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20  .by the generic 
0a60: 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e 65 76  I/O layer whenev
0a70: 65 72 20 74 68 65 20 54 63 6c 5f 43 6c 6f 73 65  er the Tcl_Close
0a80: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  () function is u
0a90: 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  sed.. *. * Resul
0aa0: 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63  ts:. *.0 if succ
0ab0: 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20  essful or POSIX 
0ac0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61  error code if fa
0ad0: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  iled.. *. * Side
0ae0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6c 6f   effects:. *.Clo
0af0: 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f  ses the socket o
0b00: 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20  f the channel.. 
0b10: 2a 0a 20 2a 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
0b70: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 0a 20   TlsCloseProc(. 
0b80: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e     ClientData in
0b90: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43  stanceData,./* C
0ba0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20  onnection state 
0bb0: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  info */.    Tcl_
0bc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 09  Interp *interp).
0bd0: 09 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65  ./* Tcl interpre
0be0: 74 65 72 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ter to report er
0bf0: 72 6f 72 73 20 74 6f 20 2a 2f 0a 7b 0a 20 20 20  rors to */.{.   
0c00: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
0c10: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
0c20: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20  tanceData;..    
0c30: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73  dprintf("TlsClos
0c40: 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f 69  eProc(%p)", (voi
0c50: 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  d *) statePtr);.
0c60: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 73 68 75  .    /* Send shu
0c70: 74 64 6f 77 6e 20 6e 6f 74 69 66 69 63 61 74 69  tdown notificati
0c80: 6f 6e 2e 20 57 69 6c 6c 20 72 65 74 75 72 6e 20  on. Will return 
0c90: 30 20 77 68 69 6c 65 20 69 6e 20 70 72 6f 63 65  0 while in proce
0ca0: 73 73 2c 20 74 68 65 6e 20 31 20 77 68 65 6e 0a  ss, then 1 when.
0cb0: 20 20 20 20 20 20 20 63 6f 6d 70 6c 65 74 65 2e         complete.
0cc0: 20 4f 6e 6c 79 20 63 6c 6f 73 65 73 20 74 68 65   Only closes the
0cd0: 20 77 72 69 74 65 20 64 69 72 65 63 74 69 6f 6e   write direction
0ce0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
0cf0: 6f 6e 3b 20 74 68 65 20 72 65 61 64 0a 20 20 20  on; the read.   
0d00: 20 20 20 20 64 69 72 65 63 74 69 6f 6e 20 69 73      direction is
0d10: 20 63 6c 6f 73 65 64 20 62 79 20 74 68 65 20 70   closed by the p
0d20: 65 65 72 2e 20 44 6f 65 73 20 6e 6f 74 20 61 66  eer. Does not af
0d30: 66 65 63 74 20 73 6f 63 6b 65 74 20 73 74 61 74  fect socket stat
0d40: 65 2e 20 44 6f 6e 27 74 0a 20 20 20 20 20 20 20  e. Don't.       
0d50: 63 61 6c 6c 20 61 66 74 65 72 20 66 61 74 61 6c  call after fatal
0d60: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 69   error. */.    i
0d70: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  f (statePtr->ssl
0d80: 20 21 3d 20 4e 55 4c 4c 20 26 26 20 21 28 73 74   != NULL && !(st
0d90: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
0da0: 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b  TLS_TCL_HANDSHAK
0db0: 45 5f 46 41 49 4c 45 44 29 29 20 7b 0a 09 42 49  E_FAILED)) {..BI
0dc0: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72  O_flush(statePtr
0dd0: 2d 3e 62 69 6f 29 3b 0a 09 53 53 4c 5f 73 68 75  ->bio);..SSL_shu
0de0: 74 64 6f 77 6e 28 73 74 61 74 65 50 74 72 2d 3e  tdown(statePtr->
0df0: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ssl);.    }..   
0e00: 20 2f 2a 20 54 6c 73 5f 46 72 65 65 20 63 61 6c   /* Tls_Free cal
0e10: 6c 73 20 54 6c 73 5f 43 6c 65 61 6e 20 2a 2f 0a  ls Tls_Clean */.
0e20: 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c      Tcl_Eventual
0e30: 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44 61  lyFree((ClientDa
0e40: 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c 73  ta)statePtr, Tls
0e50: 5f 46 72 65 65 29 3b 0a 20 20 20 20 72 65 74 75  _Free);.    retu
0e60: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  rn 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 0a 20 2a 0a 20  -----------. *. 
0ec0: 2a 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 20  * TlsClose2Proc 
0ed0: 2d 2d 0a 20 2a 0a 20 2a 09 53 69 6d 69 6c 61 72  --. *. *.Similar
0ee0: 20 74 6f 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63   to TlsCloseProc
0ef0: 2c 20 62 75 74 20 61 6c 6c 6f 77 73 20 66 6f 72  , but allows for
0f00: 20 73 65 70 61 72 61 74 65 20 63 6c 6f 73 65 20   separate close 
0f10: 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 0a 20  read and write. 
0f20: 2a 09 73 69 64 65 20 6f 66 20 63 68 61 6e 6e 65  *.side of channe
0f30: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
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 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
0f90: 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32 50 72   int TlsClose2Pr
0fa0: 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  oc(.    ClientDa
0fb0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
0fc0: 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73  ./* Connection s
0fd0: 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  tate info */.   
0fe0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0ff0: 65 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69 6e 74  erp,../* Tcl int
1000: 65 72 70 72 65 74 65 72 20 74 6f 20 72 65 70 6f  erpreter to repo
1010: 72 74 20 65 72 72 6f 72 73 20 74 6f 20 2a 2f 0a  rt errors to */.
1020: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09      int flags)..
1030: 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 6c 6f  ./* Flags to clo
1040: 73 65 20 72 65 61 64 2f 77 72 69 74 65 20 73 69  se read/write si
1050: 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f  de of channel */
1060: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
1070: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
1080: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
1090: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54  ..    dprintf("T
10a0: 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 25 70 29  lsClose2Proc(%p)
10b0: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74  ", (void *) stat
10c0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28  ePtr);..    if (
10d0: 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c  (flags & (TCL_CL
10e0: 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 4c 4f  OSE_READ|TCL_CLO
10f0: 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29  SE_WRITE)) == 0)
1100: 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73 43 6c   {..return TlsCl
1110: 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e 63 65  oseProc(instance
1120: 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a 20  Data, interp);. 
1130: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1140: 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  EINVAL;.}../*. *
1150: 2d 2d 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 0a 20 2a  -------------. *
11a0: 0a 20 2a 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  . * Tls_WaitForC
11b0: 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09  onnect --. *. *.
11c0: 50 65 72 66 6f 72 6d 20 63 6f 6e 6e 65 63 74 20  Perform connect 
11d0: 28 63 6c 69 65 6e 74 29 20 6f 72 20 61 63 63 65  (client) or acce
11e0: 70 74 20 28 73 65 72 76 65 72 29 20 66 75 6e 63  pt (server) func
11f0: 74 69 6f 6e 2e 20 41 6c 73 6f 20 70 65 72 66 6f  tion. Also perfo
1200: 72 6d 73 0a 20 2a 09 65 71 75 69 76 61 6c 65 6e  rms. *.equivalen
1210: 74 20 6f 66 20 68 61 6e 64 73 68 61 6b 65 20 66  t of handshake f
1220: 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  unction.. *. * R
1230: 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 31 20 69  esult:. *    1 i
1240: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 30 20  f successful, 0 
1250: 69 66 20 77 61 69 74 20 66 6f 72 20 63 6f 6e 6e  if wait for conn
1260: 65 63 74 2c 20 61 6e 64 20 2d 31 20 69 66 20 66  ect, and -1 if f
1270: 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64  ailed.. *. * Sid
1280: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 73  e effects:. *.Is
1290: 73 75 65 73 20 53 53 4c 5f 61 63 63 65 70 74 20  sues SSL_accept 
12a0: 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 0a 20  or SSL_connect. 
12b0: 2a 0a 20 2a 2d 2d 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 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 57 61  -. */.int Tls_Wa
1310: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 0a 20 20  itForConnect(.  
1320: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
1330: 72 2c 09 09 09 2f 2a 20 43 6f 6e 6e 65 63 74 69  r,.../* Connecti
1340: 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f  on state info */
1350: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  .    int *errorC
1360: 6f 64 65 50 74 72 2c 09 09 09 2f 2a 20 53 74 6f  odePtr,.../* Sto
1370: 72 61 67 65 20 66 6f 72 20 65 72 72 6f 72 20 63  rage for error c
1380: 6f 64 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ode to return */
1390: 0a 20 20 20 20 69 6e 74 20 68 61 6e 64 73 68 61  .    int handsha
13a0: 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61  keFailureIsPerma
13b0: 6e 65 6e 74 29 09 2f 2a 20 49 73 20 74 68 65 20  nent)./* Is the 
13c0: 63 6f 6e 6e 65 63 74 20 66 61 69 6c 75 72 65 20  connect failure 
13d0: 70 65 72 6d 61 6e 65 6e 74 20 2a 2f 0a 7b 0a 20  permanent */.{. 
13e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
13f0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20   backingError;. 
1400: 20 20 20 69 6e 74 20 65 72 72 2c 20 72 63 20 3d     int err, rc =
1410: 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 69 6f 53   0;.    int bioS
1420: 68 6f 75 6c 64 52 65 74 72 79 3b 0a 20 20 20 20  houldRetry;.    
1430: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1440: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
1450: 22 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28  "WaitForConnect(
1460: 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73  %p)", (void *) s
1470: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 64 70  tatePtr);.    dp
1480: 72 69 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50  rintFlags(stateP
1490: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e  tr);..    /* Can
14a0: 20 61 6c 73 6f 20 63 68 65 63 6b 20 53 53 4c 5f   also check SSL_
14b0: 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64  is_init_finished
14c0: 28 73 73 6c 29 20 2a 2f 0a 20 20 20 20 69 66 20  (ssl) */.    if 
14d0: 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  (!(statePtr->fla
14e0: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  gs & TLS_TCL_INI
14f0: 54 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  T)) {..dprintf("
1500: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
1510: 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 72  ct called on alr
1520: 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
1530: 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72 65 74 75   channel -- retu
1540: 72 6e 69 6e 67 20 77 69 74 68 20 69 6d 6d 65 64  rning with immed
1550: 69 61 74 65 20 73 75 63 63 65 73 73 22 29 3b 0a  iate success");.
1560: 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d  .return 1;.    }
1570: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
1580: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
1590: 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41  TCL_HANDSHAKE_FA
15a0: 49 4c 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  ILED) {../*.. * 
15b0: 44 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20  Different types 
15c0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 68 61  of operations ha
15d0: 76 65 20 64 69 66 66 65 72 65 6e 74 20 72 65 71  ve different req
15e0: 75 69 72 65 6d 65 6e 74 73 0a 09 20 2a 20 53 53  uirements.. * SS
15f0: 4c 20 62 65 69 6e 67 20 65 73 74 61 62 6c 69 73  L being establis
1600: 68 65 64 0a 09 20 2a 2f 0a 09 69 66 20 28 68 61  hed.. */..if (ha
1610: 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73  ndshakeFailureIs
1620: 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20  Permanent) {..  
1630: 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64    dprintf("Asked
1640: 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54   to wait for a T
1650: 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61  LS handshake tha
1660: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61  t has already fa
1670: 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67  iled.  Returning
1680: 20 66 61 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a   fatal error");.
1690: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
16a0: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45  tr = ECONNABORTE
16b0: 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  D;..} else {..  
16c0: 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64    dprintf("Asked
16d0: 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54   to wait for a T
16e0: 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61  LS handshake tha
16f0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61  t has already fa
1700: 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67  iled.  Returning
1710: 20 73 6f 66 74 20 65 72 72 6f 72 22 29 3b 0a 09   soft error");..
1720: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
1730: 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a  r = ECONNRESET;.
1740: 09 7d 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20  .}..return -1;. 
1750: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 3b     }..    for (;
1760: 3b 29 20 7b 0a 09 45 52 52 5f 63 6c 65 61 72 5f  ;) {..ERR_clear_
1770: 65 72 72 6f 72 28 29 3b 0a 09 42 49 4f 5f 63 6c  error();..BIO_cl
1780: 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 73 28  ear_retry_flags(
1790: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
17a0: 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 69 61 6c  ../* Not initial
17b0: 69 7a 65 64 20 79 65 74 21 20 41 6c 73 6f 20 63  ized yet! Also c
17c0: 61 6c 6c 73 20 53 53 4c 5f 64 6f 5f 68 61 6e 64  alls SSL_do_hand
17d0: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20  shake(). */..if 
17e0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
17f0: 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45   & TLS_TCL_SERVE
1800: 52 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  R) {..    dprint
1810: 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c 5f 61  f("Calling SSL_a
1820: 63 63 65 70 74 28 29 22 29 3b 0a 09 20 20 20 20  ccept()");..    
1830: 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 65 70 74  err = SSL_accept
1840: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
1850: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ...} else {..   
1860: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e   dprintf("Callin
1870: 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 29 22  g SSL_connect()"
1880: 29 3b 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53  );..    err = SS
1890: 4c 5f 63 6f 6e 6e 65 63 74 28 73 74 61 74 65 50  L_connect(stateP
18a0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f  tr->ssl);..}.../
18b0: 2a 20 31 3d 73 75 63 63 65 73 73 66 75 6c 2c 20  * 1=successful, 
18c0: 30 3d 6e 6f 74 20 73 75 63 63 65 73 73 66 75 6c  0=not successful
18d0: 20 61 6e 64 20 73 68 75 74 20 64 6f 77 6e 2c 20   and shut down, 
18e0: 3c 30 3d 66 61 74 61 6c 20 65 72 72 6f 72 20 2a  <0=fatal error *
18f0: 2f 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29 20  /..if (err > 0) 
1900: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
1910: 41 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e 65 63  Accept or connec
1920: 74 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  t was successful
1930: 22 29 3b 0a 0a 09 20 20 20 20 65 72 72 20 3d 20  ");...    err = 
1940: 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50  BIO_flush(stateP
1950: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 69  tr->bio);..    i
1960: 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09  f (err <= 0) {..
1970: 09 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69  .dprintf("Flushi
1980: 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 6c 61 79  ng the lower lay
1990: 65 72 73 20 66 61 69 6c 65 64 2c 20 74 68 69 73  ers failed, this
19a0: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 74   will probably t
19b0: 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20 73 65  erminate this se
19c0: 73 73 69 6f 6e 22 29 3b 0a 09 20 20 20 20 7d 0a  ssion");..    }.
19d0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64  .} else {..    d
19e0: 70 72 69 6e 74 66 28 22 41 63 63 65 70 74 20 6f  printf("Accept o
19f0: 72 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64  r connect failed
1a00: 22 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 61 6d 65  ");..}.../* Same
1a10: 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62 75   as SSL_want, bu
1a20: 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68  t also checks th
1a30: 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a 2f  e error queue */
1a40: 0a 09 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65  ..rc = SSL_get_e
1a50: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73  rror(statePtr->s
1a60: 73 6c 2c 20 65 72 72 29 3b 0a 09 62 61 63 6b 69  sl, err);..backi
1a70: 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65  ngError = ERR_ge
1a80: 74 5f 65 72 72 6f 72 28 29 3b 0a 09 69 66 20 28  t_error();..if (
1a90: 72 63 20 21 3d 20 53 53 4c 5f 45 52 52 4f 52 5f  rc != SSL_ERROR_
1aa0: 4e 4f 4e 45 29 20 7b 0a 09 20 20 20 20 64 70 72  NONE) {..    dpr
1ab0: 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a  intf("Got error:
1ac0: 20 25 69 20 28 72 63 20 3d 20 25 69 29 22 2c 20   %i (rc = %i)", 
1ad0: 65 72 72 2c 20 72 63 29 3b 0a 09 20 20 20 20 64  err, rc);..    d
1ae0: 70 72 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f  printf("Got erro
1af0: 72 3a 20 25 73 22 2c 20 45 52 52 5f 72 65 61 73  r: %s", ERR_reas
1b00: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  on_error_string(
1b10: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a  backingError));.
1b20: 09 7d 0a 0a 09 2f 2a 20 54 68 65 20 72 65 74 72  .}.../* The retr
1b30: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79  y flag is set by
1b40: 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 65 74   the BIO_set_ret
1b50: 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ry_* functions *
1b60: 2f 0a 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72  /..bioShouldRetr
1b70: 79 20 3d 20 42 49 4f 5f 73 68 6f 75 6c 64 5f 72  y = BIO_should_r
1b80: 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62  etry(statePtr->b
1b90: 69 6f 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 62  io);..dprintf("b
1ba0: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20  ioShouldRetry = 
1bb0: 25 64 22 2c 20 62 69 6f 53 68 6f 75 6c 64 52 65  %d", bioShouldRe
1bc0: 74 72 79 29 3b 0a 0a 09 69 66 20 28 65 72 72 20  try);...if (err 
1bd0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20  <= 0) {..    if 
1be0: 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52  (rc == SSL_ERROR
1bf0: 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 20 7c 7c  _WANT_CONNECT ||
1c00: 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52   rc == SSL_ERROR
1c10: 5f 57 41 4e 54 5f 41 43 43 45 50 54 29 20 7b 0a  _WANT_ACCEPT) {.
1c20: 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79  ..bioShouldRetry
1c30: 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73   = 1;..    } els
1c40: 65 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f  e if (rc == SSL_
1c50: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 29  ERROR_WANT_READ)
1c60: 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65   {...bioShouldRe
1c70: 74 72 79 20 3d 20 31 3b 0a 09 09 73 74 61 74 65  try = 1;...state
1c80: 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c  Ptr->want |= TCL
1c90: 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20  _READABLE;..    
1ca0: 7d 20 65 6c 73 65 20 69 66 20 28 72 63 20 3d 3d  } else if (rc ==
1cb0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
1cc0: 57 52 49 54 45 29 20 7b 0a 09 09 62 69 6f 53 68  WRITE) {...bioSh
1cd0: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09  ouldRetry = 1;..
1ce0: 09 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20  .statePtr->want 
1cf0: 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b  |= TCL_WRITABLE;
1d00: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20  ..    }..}...if 
1d10: 28 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 29  (bioShouldRetry)
1d20: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
1d30: 22 54 68 65 20 49 2f 4f 20 64 69 64 20 6e 6f 74  "The I/O did not
1d40: 20 63 6f 6d 70 6c 65 74 65 20 2d 2d 20 62 75 74   complete -- but
1d50: 20 77 65 20 73 68 6f 75 6c 64 20 74 72 79 20 69   we should try i
1d60: 74 20 61 67 61 69 6e 22 29 3b 0a 0a 09 20 20 20  t again");...   
1d70: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
1d80: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41  lags & TLS_TCL_A
1d90: 53 59 4e 43 29 20 7b 0a 09 09 64 70 72 69 6e 74  SYNC) {...dprint
1da0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 45 41 47  f("Returning EAG
1db0: 41 49 4e 20 73 6f 20 74 68 61 74 20 69 74 20 63  AIN so that it c
1dc0: 61 6e 20 62 65 20 72 65 74 72 69 65 64 20 6c 61  an be retried la
1dd0: 74 65 72 22 29 3b 0a 09 09 2a 65 72 72 6f 72 43  ter");...*errorC
1de0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
1df0: 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20  ...return 0;..  
1e00: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72    } else {...dpr
1e10: 69 6e 74 66 28 22 44 6f 69 6e 67 20 73 6f 20 6e  intf("Doing so n
1e20: 6f 77 22 29 3b 0a 09 09 63 6f 6e 74 69 6e 75 65  ow");...continue
1e30: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 64 70  ;..    }..}...dp
1e40: 72 69 6e 74 66 28 22 57 65 20 68 61 76 65 20 65  rintf("We have e
1e50: 69 74 68 65 72 20 63 6f 6d 70 6c 65 74 65 6c 79  ither completely
1e60: 20 65 73 74 61 62 6c 69 73 68 65 64 20 74 68 65   established the
1e70: 20 73 65 73 73 69 6f 6e 20 6f 72 20 63 6f 6d 70   session or comp
1e80: 6c 65 74 65 6c 79 20 66 61 69 6c 65 64 20 69 74  letely failed it
1e90: 20 2d 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20   -- there is no 
1ea0: 6d 6f 72 65 20 6e 65 65 64 20 74 6f 20 65 76 65  more need to eve
1eb0: 72 20 72 65 74 72 79 20 69 74 20 74 68 6f 75 67  r retry it thoug
1ec0: 68 22 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  h");..break;.   
1ed0: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28   }..    switch (
1ee0: 72 63 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f  rc) {..case SSL_
1ef0: 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20  ERROR_NONE:..   
1f00: 20 2f 2a 20 54 68 65 20 54 4c 53 2f 53 53 4c 20   /* The TLS/SSL 
1f10: 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f  I/O operation co
1f20: 6d 70 6c 65 74 65 64 20 73 75 63 63 65 73 73 66  mpleted successf
1f30: 75 6c 6c 79 20 2a 2f 0a 09 20 20 20 20 64 70 72  ully */..    dpr
1f40: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f  intf("SSL_ERROR_
1f50: 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20 2a 65 72  NONE");..    *er
1f60: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
1f70: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
1f80: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c  se SSL_ERROR_SSL
1f90: 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d  :..    /* A non-
1fa0: 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74  recoverable, fat
1fb0: 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  al error in the 
1fc0: 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 63 63 75  SSL library occu
1fd0: 72 72 65 64 2c 0a 09 20 20 20 20 20 20 20 75 73  rred,..       us
1fe0: 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f 63 6f 6c  ually a protocol
1ff0: 20 65 72 72 6f 72 2e 20 54 68 69 73 20 69 6e 63   error. This inc
2000: 6c 75 64 65 73 20 63 65 72 74 69 66 69 63 61 74  ludes certificat
2010: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 09 20 20  e validation..  
2020: 20 20 20 20 20 65 72 72 6f 72 73 2e 20 2a 2f 0a       errors. */.
2030: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
2040: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 20 46 61 74  L_ERROR_SSL: Fat
2050: 61 6c 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  al SSL protocol 
2060: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 22 29  error occurred")
2070: 3b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 67  ;..    if (SSL_g
2080: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
2090: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  (statePtr->ssl) 
20a0: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a  != X509_V_OK) {.
20b0: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
20c0: 65 50 74 72 2c 0a 09 09 20 20 20 20 58 35 30 39  ePtr,...    X509
20d0: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
20e0: 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65  or_string(SSL_ge
20f0: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
2100: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 29  statePtr->ssl)))
2110: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66  ;..    }..    if
2120: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21   (backingError !
2130: 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72  = 0) {...Tls_Err
2140: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 52  or(statePtr, ERR
2150: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74  _reason_error_st
2160: 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f  ring(backingErro
2170: 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  r));..    }..   
2180: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
2190: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44   |= TLS_TCL_HAND
21a0: 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20  SHAKE_FAILED;.. 
21b0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
21c0: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b   = ECONNABORTED;
21d0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
21e0: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
21f0: 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20  R_WANT_READ:..  
2200: 20 20 2f 2a 20 4d 6f 72 65 20 64 61 74 61 20 6d    /* More data m
2210: 75 73 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ust be read from
2220: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2230: 42 49 4f 20 6c 61 79 65 72 20 69 6e 20 6f 72 64  BIO layer in ord
2240: 65 72 20 74 6f 0a 09 20 20 20 20 20 20 20 63 6f  er to..       co
2250: 6d 70 6c 65 74 65 20 74 68 65 20 61 63 74 75 61  mplete the actua
2260: 6c 20 53 53 4c 5f 2a 28 29 20 6f 70 65 72 61 74  l SSL_*() operat
2270: 69 6f 6e 2e 20 20 2a 2f 0a 09 20 20 20 20 64 70  ion.  */..    dp
2280: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52  rintf("SSL_ERROR
2290: 5f 57 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20  _WANT_READ");.. 
22a0: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
22b0: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e  _read(statePtr->
22c0: 62 69 6f 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  bio);..    *erro
22d0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
22e0: 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  N;..    dprintf(
22f0: 22 45 52 52 28 53 53 4c 5f 45 52 52 4f 52 5f 57  "ERR(SSL_ERROR_W
2300: 41 4e 54 5f 52 45 41 44 2c 20 45 41 47 41 49 4e  ANT_READ, EAGAIN
2310: 29 22 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50  )");..    stateP
2320: 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f  tr->want |= TCL_
2330: 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 72  READABLE;..    r
2340: 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20  eturn 0;...case 
2350: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57  SSL_ERROR_WANT_W
2360: 52 49 54 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68  RITE:..    /* Th
2370: 65 72 65 20 69 73 20 64 61 74 61 20 69 6e 20 74  ere is data in t
2380: 68 65 20 53 53 4c 20 62 75 66 66 65 72 20 74 68  he SSL buffer th
2390: 61 74 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  at must be writt
23a0: 65 6e 20 74 6f 20 74 68 65 0a 09 20 20 20 20 20  en to the..     
23b0: 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 42 49 4f    underlying BIO
23c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
23d0: 70 6c 65 74 65 20 74 68 65 20 53 53 4c 5f 2a 28  plete the SSL_*(
23e0: 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a  ) operation. */.
23f0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
2400: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49  L_ERROR_WANT_WRI
2410: 54 45 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73  TE");..    BIO_s
2420: 65 74 5f 72 65 74 72 79 5f 77 72 69 74 65 28 73  et_retry_write(s
2430: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
2440: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2450: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20  r = EAGAIN;..   
2460: 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 53 53   dprintf("ERR(SS
2470: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49  L_ERROR_WANT_WRI
2480: 54 45 2c 20 45 41 47 41 49 4e 29 22 29 3b 0a 09  TE, EAGAIN)");..
2490: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61      statePtr->wa
24a0: 6e 74 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42  nt |= TCL_WRITAB
24b0: 4c 45 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  LE;..    return 
24c0: 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  0;...case SSL_ER
24d0: 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f  ROR_WANT_X509_LO
24e0: 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 2a 20 54 68  OKUP:..    /* Th
24f0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  e operation did 
2500: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
2510: 61 75 73 65 20 61 6e 20 61 70 70 6c 69 63 61 74  ause an applicat
2520: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 09 20 20  ion callback..  
2530: 20 20 20 20 20 73 65 74 20 62 79 20 53 53 4c 5f       set by SSL_
2540: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63  CTX_set_client_c
2550: 65 72 74 5f 63 62 28 29 20 68 61 73 20 61 73 6b  ert_cb() has ask
2560: 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
2570: 61 67 61 69 6e 2e 20 2a 2f 0a 09 20 20 20 20 64  again. */..    d
2580: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f  printf("SSL_ERRO
2590: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b  R_WANT_X509_LOOK
25a0: 55 50 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73  UP");..    BIO_s
25b0: 65 74 5f 72 65 74 72 79 5f 73 70 65 63 69 61 6c  et_retry_special
25c0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
25d0: 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65  ..    BIO_set_re
25e0: 74 72 79 5f 72 65 61 73 6f 6e 28 73 74 61 74 65  try_reason(state
25f0: 50 74 72 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52  Ptr->bio, BIO_RR
2600: 5f 53 53 4c 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50  _SSL_X509_LOOKUP
2610: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
2620: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
2630: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 52  .    dprintf("ER
2640: 52 28 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  R(SSL_ERROR_WANT
2650: 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 45 41  _X509_LOOKUP, EA
2660: 47 41 49 4e 29 22 29 3b 0a 09 20 20 20 20 72 65  GAIN)");..    re
2670: 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53  turn 0;...case S
2680: 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c  SL_ERROR_SYSCALL
2690: 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e  :..    /* Some n
26a0: 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20  on-recoverable, 
26b0: 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20  fatal I/O error 
26c0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20  occurred */..   
26d0: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52   dprintf("SSL_ER
26e0: 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74  ROR_SYSCALL: Fat
26f0: 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  al I/O error occ
2700: 75 72 72 65 64 22 29 3b 0a 0a 09 20 20 20 20 69  urred");...    i
2710: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  f (backingError 
2720: 3d 3d 20 30 20 26 26 20 65 72 72 20 3d 3d 20 30  == 0 && err == 0
2730: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 45  ) {...dprintf("E
2740: 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a  OF reached")...*
2750: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
2760: 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 54 6c 73  CONNRESET;...Tls
2770: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
2780: 20 22 28 75 6e 65 78 70 65 63 74 65 64 29 20 45   "(unexpected) E
2790: 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09  OF reached");...
27a0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62      } else if (b
27b0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30  ackingError == 0
27c0: 20 26 26 20 65 72 72 20 3d 3d 20 2d 31 29 20 7b   && err == -1) {
27d0: 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20  ...dprintf("I/O 
27e0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28  error occurred (
27f0: 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28  errno = %lu)", (
2800: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54  unsigned long) T
2810: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a  cl_GetErrno());.
2820: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
2830: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  = Tcl_GetErrno()
2840: 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f  ;...if (*errorCo
2850: 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45  dePtr == ECONNRE
2860: 53 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72  SET) {...    *er
2870: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f  rorCodePtr = ECO
2880: 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09  NNABORTED;...}..
2890: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65  .Tls_Error(state
28a0: 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73  Ptr, Tcl_ErrnoMs
28b0: 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  g(*errorCodePtr)
28c0: 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
28d0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f  {...dprintf("I/O
28e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
28f0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20  (backingError = 
2900: 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 72  %lu)", backingEr
2910: 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f  ror);...*errorCo
2920: 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45  dePtr = Tcl_GetE
2930: 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65  rrno();...if (*e
2940: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45  rrorCodePtr == E
2950: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 20  CONNRESET) {... 
2960: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
2970: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b   = ECONNABORTED;
2980: 0a 09 09 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72  ...}...Tls_Error
2990: 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72  (statePtr, ERR_r
29a0: 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69  eason_error_stri
29b0: 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29  ng(backingError)
29c0: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  );..    }...    
29d0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
29e0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53  |= TLS_TCL_HANDS
29f0: 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20  HAKE_FAILED;..  
2a00: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63    return -1;...c
2a10: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45  ase SSL_ERROR_ZE
2a20: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20  RO_RETURN:..    
2a30: 2f 2a 20 50 65 65 72 20 68 61 73 20 63 6c 65 61  /* Peer has clea
2a40: 6e 6c 79 20 63 6c 6f 73 65 64 20 74 68 65 20 63  nly closed the c
2a50: 6f 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e  onnection by sen
2a60: 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e  ding the close_n
2a70: 6f 74 69 66 79 0a 09 20 20 20 20 20 20 20 61 6c  otify..       al
2a80: 65 72 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c  ert. Can't read,
2a90: 20 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20   but can write. 
2aa0: 4e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61  Need to return a
2ab0: 6e 20 45 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20  n EOF, so the.. 
2ac0: 20 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 69 73        channel is
2ad0: 20 63 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69   closed which wi
2ae0: 6c 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73  ll send an SSL_s
2af0: 68 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20  hutdown(). */.. 
2b00: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
2b10: 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52  ERROR_ZERO_RETUR
2b20: 4e 3a 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73  N: Peer has clos
2b30: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ed the connectio
2b40: 6e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  n");..    *error
2b50: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52  CodePtr = ECONNR
2b60: 45 53 45 54 3b 0a 09 20 20 20 20 54 6c 73 5f 45  ESET;..    Tls_E
2b70: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22  rror(statePtr, "
2b80: 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20  Peer has closed 
2b90: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  the connection f
2ba0: 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 73 65  or writing by se
2bb0: 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f  nding the close_
2bc0: 6e 6f 74 69 66 79 20 61 6c 65 72 74 22 29 3b 0a  notify alert");.
2bd0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
2be0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
2bf0: 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09  _WANT_CONNECT:..
2c00: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61      /* The opera
2c10: 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d  tion did not com
2c20: 70 6c 65 74 65 20 61 6e 64 20 63 6f 6e 6e 65 63  plete and connec
2c30: 74 20 77 6f 75 6c 64 20 68 61 76 65 20 62 6c 6f  t would have blo
2c40: 63 6b 65 64 2e 0a 09 20 20 20 20 20 20 20 52 65  cked...       Re
2c50: 74 72 79 20 61 67 61 69 6e 20 61 66 74 65 72 20  try again after 
2c60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 65 73  connection is es
2c70: 74 61 62 6c 69 73 68 65 64 2e 20 2a 2f 0a 09 20  tablished. */.. 
2c80: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
2c90: 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45  ERROR_WANT_CONNE
2ca0: 43 54 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73  CT");..    BIO_s
2cb0: 65 74 5f 72 65 74 72 79 5f 73 70 65 63 69 61 6c  et_retry_special
2cc0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
2cd0: 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65  ..    BIO_set_re
2ce0: 74 72 79 5f 72 65 61 73 6f 6e 28 73 74 61 74 65  try_reason(state
2cf0: 50 74 72 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52  Ptr->bio, BIO_RR
2d00: 5f 43 4f 4e 4e 45 43 54 29 3b 0a 09 20 20 20 20  _CONNECT);..    
2d10: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2d20: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 72  EAGAIN;..    dpr
2d30: 69 6e 74 66 28 22 45 52 52 28 53 53 4c 5f 45 52  intf("ERR(SSL_ER
2d40: 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54  ROR_WANT_CONNECT
2d50: 2c 20 45 41 47 41 49 4e 29 22 29 3b 0a 09 20 20  , EAGAIN)");..  
2d60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61    return 0;...ca
2d70: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  se SSL_ERROR_WAN
2d80: 54 5f 41 43 43 45 50 54 3a 0a 09 20 20 20 20 2f  T_ACCEPT:..    /
2d90: 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * The operation 
2da0: 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  did not complete
2db0: 20 61 6e 64 20 61 63 63 65 70 74 20 77 6f 75 6c   and accept woul
2dc0: 64 20 68 61 76 65 20 62 6c 6f 63 6b 65 64 2e 0a  d have blocked..
2dd0: 09 20 20 20 20 20 20 20 52 65 74 72 79 20 61 67  .       Retry ag
2de0: 61 69 6e 20 61 66 74 65 72 20 63 6f 6e 6e 65 63  ain after connec
2df0: 74 69 6f 6e 20 69 73 20 65 73 74 61 62 6c 69 73  tion is establis
2e00: 68 65 64 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72  hed. */..    dpr
2e10: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f  intf("SSL_ERROR_
2e20: 57 41 4e 54 5f 41 43 43 45 50 54 22 29 3b 0a 09  WANT_ACCEPT");..
2e30: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72      BIO_set_retr
2e40: 79 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65 50  y_special(stateP
2e50: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42  tr->bio);..    B
2e60: 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61  IO_set_retry_rea
2e70: 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69  son(statePtr->bi
2e80: 6f 2c 20 42 49 4f 5f 52 52 5f 41 43 43 45 50 54  o, BIO_RR_ACCEPT
2e90: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
2ea0: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
2eb0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 52  .    dprintf("ER
2ec0: 52 28 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  R(SSL_ERROR_WANT
2ed0: 5f 41 43 43 45 50 54 2c 20 45 41 47 41 49 4e 29  _ACCEPT, EAGAIN)
2ee0: 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ");..    return 
2ef0: 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  0;...case SSL_ER
2f00: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a  ROR_WANT_ASYNC:.
2f10: 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69 74  .    /* Used wit
2f20: 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f  h flag SSL_MODE_
2f30: 41 53 59 4e 43 2c 20 6f 70 20 64 69 64 6e 27 74  ASYNC, op didn't
2f40: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
2f50: 65 20 61 6e 0a 09 20 20 20 20 20 20 20 61 73 79  e an..       asy
2f60: 6e 63 20 65 6e 67 69 6e 65 20 69 73 20 73 74 69  nc engine is sti
2f70: 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 64 61  ll processing da
2f80: 74 61 20 2a 2f 0a 09 63 61 73 65 20 53 53 4c 5f  ta */..case SSL_
2f90: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43  ERROR_WANT_ASYNC
2fa0: 5f 4a 4f 42 3a 0a 09 20 20 20 20 2f 2a 20 54 68  _JOB:..    /* Th
2fb0: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6a  e asynchronous j
2fc0: 6f 62 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ob could not be 
2fd0: 73 74 61 72 74 65 64 20 62 65 63 61 75 73 65 20  started because 
2fe0: 74 68 65 72 65 20 77 65 72 65 20 6e 6f 0a 09 20  there were no.. 
2ff0: 20 20 20 20 20 20 61 73 79 6e 63 20 6a 6f 62 73        async jobs
3000: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
3010: 65 20 70 6f 6f 6c 2e 20 2a 2f 0a 09 63 61 73 65  e pool. */..case
3020: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
3030: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 43 42 3a  CLIENT_HELLO_CB:
3040: 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65  ..    /* The ope
3050: 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63  ration did not c
3060: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
3070: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  an application c
3080: 61 6c 6c 62 61 63 6b 0a 09 20 20 20 20 20 20 20  allback..       
3090: 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73  set by SSL_CTX_s
30a0: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  et_client_hello_
30b0: 63 62 28 29 20 68 61 73 20 61 73 6b 65 64 20 74  cb() has asked t
30c0: 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69  o be called agai
30d0: 6e 2e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  n. */.#if OPENSS
30e0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
30f0: 20 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c 0a   >= 0x30000000L.
3100: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
3110: 57 41 4e 54 5f 52 45 54 52 59 5f 56 45 52 49 46  WANT_RETRY_VERIF
3120: 59 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f  Y:..    /* The o
3130: 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
3140: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
3150: 65 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20  e a certificate 
3160: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 09 20 20  verification..  
3170: 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 20 68 61       callback ha
3180: 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61  s asked to be ca
3190: 6c 6c 65 64 20 61 67 61 69 6e 20 76 69 61 20 53  lled again via S
31a0: 53 4c 5f 73 65 74 5f 72 65 74 72 79 5f 76 65 72  SL_set_retry_ver
31b0: 69 66 79 28 33 29 2e 20 2a 2f 0a 23 65 6e 64 69  ify(3). */.#endi
31c0: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20  f..default:..   
31d0: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   /* The operatio
31e0: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  n did not comple
31f0: 74 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  te and should be
3200: 20 72 65 74 72 69 65 64 20 6c 61 74 65 72 2e 20   retried later. 
3210: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
3220: 22 4f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e  "Operation did n
3230: 6f 74 20 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c  ot complete, cal
3240: 6c 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  l function again
3250: 20 6c 61 74 65 72 22 29 3b 0a 09 20 20 20 20 2a   later");..    *
3260: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
3270: 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 69  AGAIN;..    dpri
3280: 6e 74 66 28 22 45 52 52 28 4f 74 68 65 72 2c 20  ntf("ERR(Other, 
3290: 45 41 47 41 49 4e 29 22 29 3b 0a 09 20 20 20 20  EAGAIN)");..    
32a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
32b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
32c0: 6d 6f 76 69 6e 67 20 74 68 65 20 5c 22 54 4c 53  moving the \"TLS
32d0: 5f 54 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67  _TCL_INIT\" flag
32e0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 63   since we have c
32f0: 6f 6d 70 6c 65 74 65 64 20 74 68 65 20 68 61 6e  ompleted the han
3300: 64 73 68 61 6b 65 22 29 3b 0a 20 20 20 20 73 74  dshake");.    st
3310: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d  atePtr->flags &=
3320: 20 7e 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a   ~TLS_TCL_INIT;.
3330: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
3340: 74 75 72 6e 69 6e 67 20 73 75 63 63 65 73 73 22  turning success"
3350: 29 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  );.    *errorCod
3360: 65 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 72 65  ePtr = 0;.    re
3370: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  turn 1;.}../*. *
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
33d0: 0a 20 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f 63  . * TlsInputProc
33e0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
33f0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
3400: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  ked by the gener
3410: 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 74 6f 20  ic I/O layer to 
3420: 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 0a 20  read data from. 
3430: 2a 09 74 68 65 20 42 49 4f 20 77 68 65 6e 65 76  *.the BIO whenev
3440: 65 72 20 74 68 65 20 54 63 6c 5f 52 65 61 64 28  er the Tcl_Read(
3450: 29 2c 20 54 63 6c 5f 52 65 61 64 43 68 61 72 73  ), Tcl_ReadChars
3460: 2c 20 54 63 6c 5f 47 65 74 73 2c 20 61 6e 64 0a  , Tcl_Gets, and.
3470: 20 2a 09 54 63 6c 5f 47 65 74 73 4f 62 6a 20 66   *.Tcl_GetsObj f
3480: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  unctions are use
3490: 64 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 74 6f  d. Equivalent to
34a0: 20 53 53 4c 5f 72 65 61 64 5f 65 78 20 61 6e 64   SSL_read_ex and
34b0: 20 53 53 4c 5f 72 65 61 64 2e 0a 20 2a 0a 20 2a   SSL_read.. *. *
34c0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74   Results:. *.Ret
34d0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
34e0: 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 6f 72  of bytes read or
34f0: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65   -1 on error. Se
3500: 74 73 20 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ts errorCodePtr 
3510: 74 6f 0a 20 2a 09 61 20 50 4f 53 49 58 20 65 72  to. *.a POSIX er
3520: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
3530: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 6f  rror occurred, o
3540: 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a  r 0 if none.. *.
3550: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3560: 0a 20 2a 09 52 65 61 64 73 20 69 6e 70 75 74 20  . *.Reads input 
3570: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 64  from the input d
3580: 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 61  evice of the cha
3590: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 44 61 74 61  nnel.. *. * Data
35a0: 20 69 73 20 72 65 63 65 69 76 65 64 20 69 6e 20   is received in 
35b0: 77 68 6f 6c 65 20 62 6c 6f 63 6b 73 20 6b 6e 6f  whole blocks kno
35c0: 77 6e 20 61 73 20 72 65 63 6f 72 64 73 20 66 72  wn as records fr
35d0: 6f 6d 20 74 68 65 20 70 65 65 72 2e 20 41 20 77  om the peer. A w
35e0: 68 6f 6c 65 0a 20 2a 20 72 65 63 6f 72 64 20 69  hole. * record i
35f0: 73 20 70 72 6f 63 65 73 73 65 64 20 28 65 2e 67  s processed (e.g
3600: 2e 20 64 65 63 72 79 70 74 65 64 29 20 69 6e 20  . decrypted) in 
3610: 6f 6e 65 20 67 6f 20 61 6e 64 20 69 73 20 62 75  one go and is bu
3620: 66 66 65 72 65 64 20 62 79 20 4f 70 65 6e 53 53  ffered by OpenSS
3630: 4c 0a 20 2a 20 75 6e 74 69 6c 20 69 74 20 69 73  L. * until it is
3640: 20 72 65 61 64 20 62 79 20 74 68 65 20 61 70 70   read by the app
3650: 6c 69 63 61 74 69 6f 6e 20 76 69 61 20 61 20 63  lication via a c
3660: 61 6c 6c 20 74 6f 20 53 53 4c 5f 72 65 61 64 2e  all to SSL_read.
3670: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
36d0: 6e 74 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 28  nt TlsInputProc(
36e0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
36f0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a  instanceData,./*
3700: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74   Connection stat
3710: 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 68  e info */.    ch
3720: 61 72 20 2a 62 75 66 2c 09 09 09 2f 2a 20 42 75  ar *buf,.../* Bu
3730: 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 64 61  ffer to store da
3740: 74 61 20 72 65 61 64 20 66 72 6f 6d 20 42 49 4f  ta read from BIO
3750: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 75 66 53   */.    int bufS
3760: 69 7a 65 2c 09 09 2f 2a 20 42 75 66 66 65 72 20  ize,../* Buffer 
3770: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  size in bytes */
3780: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  .    int *errorC
3790: 6f 64 65 50 74 72 29 09 09 2f 2a 20 53 74 6f 72  odePtr)../* Stor
37a0: 61 67 65 20 66 6f 72 20 65 72 72 6f 72 20 63 6f  age for error co
37b0: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  de to return */.
37c0: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  {.    unsigned l
37d0: 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  ong backingError
37e0: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  ;.    State *sta
37f0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
3800: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
3810: 20 20 20 20 69 6e 74 20 62 79 74 65 73 52 65 61      int bytesRea
3820: 64 2c 20 65 72 72 3b 0a 20 20 20 20 2a 65 72 72  d, err;.    *err
3830: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a  orCodePtr = 0;..
3840: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 61      dprintf("Rea
3850: 64 28 25 64 29 22 2c 20 62 75 66 53 69 7a 65 29  d(%d)", bufSize)
3860: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20  ;..    /* Abort 
3870: 69 66 20 74 68 65 20 75 73 65 72 20 76 65 72 69  if the user veri
3880: 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73  fy callback is s
3890: 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20  till running to 
38a0: 61 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e 67  avoid triggering
38b0: 0a 20 20 20 20 20 2a 20 61 6e 6f 74 68 65 72 20  .     * another 
38c0: 63 61 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20  call before the 
38d0: 63 75 72 72 65 6e 74 20 6f 6e 65 20 69 73 20 63  current one is c
38e0: 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20  omplete. */.    
38f0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  if (statePtr->fl
3900: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41  ags & TLS_TCL_CA
3910: 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e  LLBACK) {..dprin
3920: 74 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20  tf("Callback is 
3930: 72 75 6e 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67  running, reading
3940: 20 30 20 62 79 74 65 73 22 29 3b 0a 09 72 65 74   0 bytes");..ret
3950: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
3960: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
3970: 69 61 6c 69 7a 65 64 2c 20 64 6f 20 63 6f 6e 6e  ialized, do conn
3980: 65 63 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 61  ect */.    /* Ca
3990: 6e 20 61 6c 73 6f 20 63 68 65 63 6b 20 53 53 4c  n also check SSL
39a0: 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65  _is_init_finishe
39b0: 64 28 73 73 6c 29 20 2a 2f 0a 20 20 20 20 69 66  d(ssl) */.    if
39c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
39d0: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54  s & TLS_TCL_INIT
39e0: 29 20 7b 0a 09 69 6e 74 20 74 6c 73 43 6f 6e 6e  ) {..int tlsConn
39f0: 65 63 74 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22  ect;...dprintf("
3a00: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74  Calling Tls_Wait
3a10: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09  ForConnect");...
3a20: 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73  tlsConnect = Tls
3a30: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28  _WaitForConnect(
3a40: 73 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43  statePtr, errorC
3a50: 6f 64 65 50 74 72 2c 20 30 29 3b 0a 09 69 66 20  odePtr, 0);..if 
3a60: 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29  (tlsConnect < 0)
3a70: 20 7b 0a 09 20 20 20 20 2f 2a 20 46 61 69 6c 75   {..    /* Failu
3a80: 72 65 2c 20 73 6f 20 61 62 6f 72 74 20 2a 2f 0a  re, so abort */.
3a90: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
3aa0: 74 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69  t an error waiti
3ab0: 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74  ng to connect (t
3ac0: 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20  lsConnect = %i, 
3ad0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3ae0: 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74  %i)", tlsConnect
3af0: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  , *errorCodePtr)
3b00: 3b 0a 0a 09 20 20 20 20 62 79 74 65 73 52 65 61  ;...    bytesRea
3b10: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 69 66 20  d = -1;..    if 
3b20: 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  (*errorCodePtr =
3b30: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a  = ECONNRESET) {.
3b40: 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63  ..dprintf("Got c
3b50: 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22  onnection reset"
3b60: 29 3b 0a 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46  );.../* Soft EOF
3b70: 20 2a 2f 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65   */...*errorCode
3b80: 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73  Ptr = 0;...bytes
3b90: 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d  Read = 0;..    }
3ba0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 62 79 74  ..    return byt
3bb0: 65 73 52 65 61 64 3b 0a 09 7d 20 65 6c 73 65 20  esRead;..} else 
3bc0: 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d  if (tlsConnect =
3bd0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 20 54  = 0) {..    /* T
3be0: 72 79 20 61 67 61 69 6e 20 2a 2f 0a 09 20 20 20  ry again */..   
3bf0: 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b   bytesRead = -1;
3c00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 62 79 74  ..    return byt
3c10: 65 73 52 65 61 64 3b 0a 09 7d 0a 20 20 20 20 7d  esRead;..}.    }
3c20: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
3c30: 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72  We need to clear
3c40: 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73   the SSL error s
3c50: 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65  tack now because
3c60: 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65   we sometimes re
3c70: 61 63 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20  ach.     * this 
3c80: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65  function with le
3c90: 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e  ftover errors in
3ca0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20   the stack.  If 
3cb0: 42 49 4f 5f 72 65 61 64 0a 20 20 20 20 20 2a 20  BIO_read.     * 
3cc0: 72 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69  returns -1 and i
3cd0: 6e 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74  ntends EAGAIN, t
3ce0: 68 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76  here is a leftov
3cf0: 65 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c  er error, it wil
3d00: 6c 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63  l be.     * misc
3d10: 6f 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 65  onstrued as an e
3d20: 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e  rror, not EAGAIN
3d30: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
3d40: 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77  Alternatively, w
3d50: 65 20 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61  e may want to ha
3d60: 6e 64 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75  ndle the <0 retu
3d70: 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20  rn codes from.  
3d80: 20 20 20 2a 20 42 49 4f 5f 72 65 61 64 20 73 70     * BIO_read sp
3d90: 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69  ecially (as advi
3da0: 73 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64  sed in the RSA d
3db0: 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77  ocs).  TLS's low
3dc0: 65 72 20 6c 65 76 65 6c 20 42 49 4f 0a 20 20 20  er level BIO.   
3dd0: 20 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c    * functions pl
3de0: 61 79 20 77 69 74 68 20 74 68 65 20 72 65 74 72  ay with the retr
3df0: 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20  y flags though, 
3e00: 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 74  and this seems t
3e10: 6f 20 77 6f 72 6b 0a 20 20 20 20 20 2a 20 63 6f  o work.     * co
3e20: 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61  rrectly.  Simila
3e30: 72 20 66 69 78 20 69 6e 20 54 6c 73 4f 75 74 70  r fix in TlsOutp
3e40: 75 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a  utProc. - hobbs.
3e50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f       */.    ERR_
3e60: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20  clear_error();. 
3e70: 20 20 20 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74     BIO_clear_ret
3e80: 72 79 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74  ry_flags(statePt
3e90: 72 2d 3e 62 69 6f 29 3b 0a 20 20 20 20 62 79 74  r->bio);.    byt
3ea0: 65 73 52 65 61 64 20 3d 20 42 49 4f 5f 72 65 61  esRead = BIO_rea
3eb0: 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c  d(statePtr->bio,
3ec0: 20 62 75 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a   buf, bufSize);.
3ed0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f      dprintf("BIO
3ee0: 5f 72 65 61 64 20 2d 3e 20 25 64 22 2c 20 62 79  _read -> %d", by
3ef0: 74 65 73 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f  tesRead);..    /
3f00: 2a 20 53 61 6d 65 20 61 73 20 53 53 4c 5f 77 61  * Same as SSL_wa
3f10: 6e 74 2c 20 62 75 74 20 61 6c 73 6f 20 63 68 65  nt, but also che
3f20: 63 6b 73 20 74 68 65 20 65 72 72 6f 72 20 71 75  cks the error qu
3f30: 65 75 65 20 2a 2f 0a 20 20 20 20 65 72 72 20 3d  eue */.    err =
3f40: 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73   SSL_get_error(s
3f50: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79  tatePtr->ssl, by
3f60: 74 65 73 52 65 61 64 29 3b 0a 20 20 20 20 62 61  tesRead);.    ba
3f70: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52  ckingError = ERR
3f80: 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  _get_error();.. 
3f90: 20 20 20 69 66 20 28 62 79 74 65 73 52 65 61 64     if (bytesRead
3fa0: 20 3c 3d 20 30 29 20 7b 0a 09 2f 2a 20 54 68 65   <= 0) {../* The
3fb0: 20 72 65 74 72 79 20 66 6c 61 67 20 69 73 20 73   retry flag is s
3fc0: 65 74 20 62 79 20 74 68 65 20 42 49 4f 5f 73 65  et by the BIO_se
3fd0: 74 5f 72 65 74 72 79 5f 2a 20 66 75 6e 63 74 69  t_retry_* functi
3fe0: 6f 6e 73 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f  ons */..if (BIO_
3ff0: 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61  should_retry(sta
4000: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09  tePtr->bio)) {..
4010: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 61      dprintf("Rea
4020: 64 20 66 61 69 6c 65 64 20 77 69 74 68 20 63 6f  d failed with co
4030: 64 65 3d 25 64 2c 20 62 79 74 65 73 20 72 65 61  de=%d, bytes rea
4040: 64 3d 25 64 3a 20 73 68 6f 75 6c 64 20 72 65 74  d=%d: should ret
4050: 72 79 22 2c 20 65 72 72 2c 20 62 79 74 65 73 52  ry", err, bytesR
4060: 65 61 64 29 3b 0a 09 20 20 20 20 2f 2a 20 53 6f  ead);..    /* So
4070: 6d 65 20 64 6f 63 73 20 69 6d 70 6c 79 20 77 65  me docs imply we
4080: 20 73 68 6f 75 6c 64 20 72 65 64 6f 20 74 68 65   should redo the
4090: 20 42 49 4f 5f 72 65 61 64 20 6e 6f 77 20 2a 2f   BIO_read now */
40a0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
40b0: 64 70 72 69 6e 74 66 28 22 52 65 61 64 20 66 61  dprintf("Read fa
40c0: 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 3d 25  iled with code=%
40d0: 64 2c 20 62 79 74 65 73 20 72 65 61 64 3d 25 64  d, bytes read=%d
40e0: 3a 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  : error conditio
40f0: 6e 22 2c 20 65 72 72 2c 20 62 79 74 65 73 52 65  n", err, bytesRe
4100: 61 64 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74  ad);..}...dprint
4110: 66 28 22 42 49 4f 20 69 73 20 45 4f 46 20 25 64  f("BIO is EOF %d
4120: 22 2c 20 42 49 4f 5f 65 6f 66 28 73 74 61 74 65  ", BIO_eof(state
4130: 50 74 72 2d 3e 62 69 6f 29 29 3b 0a 0a 09 2f 2a  Ptr->bio));.../*
4140: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 73   These are the s
4150: 61 6d 65 20 61 73 20 42 49 4f 5f 72 65 74 72 79  ame as BIO_retry
4160: 5f 74 79 70 65 20 2a 2f 0a 09 69 66 20 28 42 49  _type */..if (BI
4170: 4f 5f 73 68 6f 75 6c 64 5f 72 65 61 64 28 73 74  O_should_read(st
4180: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a  atePtr->bio)) {.
4190: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49  .    dprintf("BI
41a0: 4f 20 68 61 73 20 69 6e 73 75 66 66 69 63 69 65  O has insufficie
41b0: 6e 74 20 64 61 74 61 20 74 6f 20 72 65 61 64 20  nt data to read 
41c0: 61 6e 64 20 72 65 74 75 72 6e 22 29 3b 0a 09 20  and return");.. 
41d0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e     statePtr->wan
41e0: 74 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c  t |= TCL_READABL
41f0: 45 3b 0a 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73  E;..}..if (BIO_s
4200: 68 6f 75 6c 64 5f 77 72 69 74 65 28 73 74 61 74  hould_write(stat
4210: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20  ePtr->bio)) {.. 
4220: 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20     dprintf("BIO 
4230: 68 61 73 20 70 65 6e 64 69 6e 67 20 64 61 74 61  has pending data
4240: 20 74 6f 20 77 72 69 74 65 22 29 3b 0a 09 20 20   to write");..  
4250: 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74    statePtr->want
4260: 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45   |= TCL_WRITABLE
4270: 3b 0a 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68  ;..}..if (BIO_sh
4280: 6f 75 6c 64 5f 69 6f 5f 73 70 65 63 69 61 6c 28  ould_io_special(
4290: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20  statePtr->bio)) 
42a0: 7b 0a 09 20 20 20 20 69 6e 74 20 72 65 61 73 6f  {..    int reaso
42b0: 6e 20 3d 20 42 49 4f 5f 67 65 74 5f 72 65 74 72  n = BIO_get_retr
42c0: 79 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 50 74  y_reason(statePt
42d0: 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 64 70  r->bio);..    dp
42e0: 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20 73  rintf("BIO has s
42f0: 6f 6d 65 20 73 70 65 63 69 61 6c 20 63 6f 6e 64  ome special cond
4300: 69 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ition other than
4310: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 3a 20   read or write: 
4320: 63 6f 64 65 3d 25 64 22 2c 20 72 65 61 73 6f 6e  code=%d", reason
4330: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
4340: 20 73 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a   switch (err) {.
4350: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
4360: 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20 49 2f  NONE:..    /* I/
4370: 4f 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70  O operation comp
4380: 6c 65 74 65 64 20 2a 2f 0a 09 20 20 20 20 64 70  leted */..    dp
4390: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52  rintf("SSL_ERROR
43a0: 5f 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20 64 70  _NONE");..    dp
43b0: 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c 20  rintBuffer(buf, 
43c0: 62 79 74 65 73 52 65 61 64 29 3b 0a 09 20 20 20  bytesRead);..   
43d0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
43e0: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20  SL_ERROR_SSL:.. 
43f0: 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f     /* A non-reco
4400: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65  verable, fatal e
4410: 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20  rror in the SSL 
4420: 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64  library occurred
4430: 2c 0a 09 20 20 20 20 20 20 20 75 73 75 61 6c 6c  ,..       usuall
4440: 79 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72  y a protocol err
4450: 6f 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  or. */..    dpri
4460: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53  ntf("SSL_ERROR_S
4470: 53 4c 3a 20 46 61 74 61 6c 20 53 53 4c 20 70 72  SL: Fatal SSL pr
4480: 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 6f 63 63  otocol error occ
4490: 75 72 72 65 64 22 29 3b 0a 09 20 20 20 20 69 66  urred");..    if
44a0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21   (backingError !
44b0: 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72  = 0) {...Tls_Err
44c0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 52  or(statePtr, ERR
44d0: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74  _reason_error_st
44e0: 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f  ring(backingErro
44f0: 72 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  r));..    } else
4500: 20 69 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 72   if (SSL_get_ver
4510: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
4520: 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30  Ptr->ssl) != X50
4530: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f  9_V_OK) {...Tls_
4540: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 0a  Error(statePtr,.
4550: 09 09 20 20 20 20 58 35 30 39 5f 76 65 72 69 66  ..    X509_verif
4560: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72  y_cert_error_str
4570: 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69  ing(SSL_get_veri
4580: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50  fy_result(stateP
4590: 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20  tr->ssl)));..   
45a0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f   } else {...Tls_
45b0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
45c0: 22 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72  "Unknown SSL err
45d0: 6f 72 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  or");..    }..  
45e0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
45f0: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a  = ECONNABORTED;.
4600: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
4610: 20 2d 31 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53   -1;..#if OPENSS
4620: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
4630: 20 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c 0a   >= 0x30000000L.
4640: 09 20 20 20 20 2f 2a 20 55 6e 65 78 70 65 63 74  .    /* Unexpect
4650: 65 64 20 45 4f 46 20 66 72 6f 6d 20 74 68 65 20  ed EOF from the 
4660: 70 65 65 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c  peer for OpenSSL
4670: 20 33 2e 30 2b 20 2a 2f 0a 09 20 20 20 20 69 66   3.0+ */..    if
4680: 20 28 45 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e   (ERR_GET_REASON
4690: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 20 3d  (backingError) =
46a0: 3d 20 53 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54  = SSL_R_UNEXPECT
46b0: 45 44 5f 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41  ED_EOF_WHILE_REA
46c0: 44 49 4e 47 29 20 7b 0a 09 09 64 70 72 69 6e 74  DING) {...dprint
46d0: 66 28 22 28 55 6e 65 78 70 65 63 74 65 64 29 20  f("(Unexpected) 
46e0: 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09  EOF reached")...
46f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
4700: 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d  0;...bytesRead =
4710: 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28   0;...Tls_Error(
4720: 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72  statePtr, "EOF r
4730: 65 61 63 68 65 64 22 29 3b 0a 09 20 20 20 20 7d  eached");..    }
4740: 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 62 72 65  .#endif..    bre
4750: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
4760: 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a  RROR_WANT_READ:.
4770: 09 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f  .    /* Operatio
4780: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  n did not comple
4790: 74 65 20 64 75 65 20 74 6f 20 6e 6f 74 20 65 6e  te due to not en
47a0: 6f 75 67 68 20 64 61 74 61 20 77 61 73 20 61 76  ough data was av
47b0: 61 69 6c 61 62 6c 65 2e 0a 09 20 20 20 20 20 20  ailable...      
47c0: 20 52 65 74 72 79 20 61 67 61 69 6e 20 6c 61 74   Retry again lat
47d0: 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  er. */..    dpri
47e0: 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52  ntf("Got SSL_ERR
47f0: 4f 52 5f 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61  OR_WANT_READ, ma
4800: 70 70 69 6e 67 20 74 68 69 73 20 74 6f 20 45 41  pping this to EA
4810: 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72  GAIN");..    *er
4820: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47  rorCodePtr = EAG
4830: 41 49 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52  AIN;..    bytesR
4840: 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73  ead = -1;..    s
4850: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d  tatePtr->want |=
4860: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09   TCL_READABLE;..
4870: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72      BIO_set_retr
4880: 79 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d  y_read(statePtr-
4890: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61  >bio);..    brea
48a0: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
48b0: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a  ROR_WANT_WRITE:.
48c0: 09 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f  .    /* Operatio
48d0: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  n did not comple
48e0: 74 65 20 64 75 65 20 74 6f 20 75 6e 61 62 6c 65  te due to unable
48f0: 20 74 6f 20 73 65 6e 64 20 61 6c 6c 20 64 61 74   to send all dat
4900: 61 20 74 6f 20 74 68 65 0a 09 20 20 20 20 20 20  a to the..      
4910: 20 42 49 4f 2e 20 52 65 74 72 79 20 61 67 61 69   BIO. Retry agai
4920: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20  n later. */..   
4930: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53   dprintf("Got SS
4940: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49  L_ERROR_WANT_WRI
4950: 54 45 2c 20 6d 61 70 70 69 6e 67 20 74 68 69 73  TE, mapping this
4960: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20   to EAGAIN");.. 
4970: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
4980: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20   = EAGAIN;..    
4990: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a  bytesRead = -1;.
49a0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77  .    statePtr->w
49b0: 61 6e 74 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41  ant |= TCL_WRITA
49c0: 42 4c 45 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65  BLE;..    BIO_se
49d0: 74 5f 72 65 74 72 79 5f 77 72 69 74 65 28 73 74  t_retry_write(st
49e0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20  atePtr->bio);.. 
49f0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
4a00: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
4a10: 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20  X509_LOOKUP:..  
4a20: 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69    /* The operati
4a30: 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c  on did not compl
4a40: 65 74 65 20 62 65 63 61 75 73 65 20 61 6e 20 61  ete because an a
4a50: 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62  pplication callb
4a60: 61 63 6b 0a 09 20 20 20 20 20 20 20 73 65 74 20  ack..       set 
4a70: 62 79 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  by SSL_CTX_set_c
4a80: 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62 28 29 20  lient_cert_cb() 
4a90: 68 61 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20  has asked to be 
4aa0: 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f  called again. */
4ab0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47  ..    dprintf("G
4ac0: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  ot SSL_ERROR_WAN
4ad0: 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d  T_X509_LOOKUP, m
4ae0: 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47  apping it to EAG
4af0: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  AIN");..    *err
4b00: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
4b10: 49 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65  IN;..    bytesRe
4b20: 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72  ad = -1;..    br
4b30: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
4b40: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09  ERROR_SYSCALL:..
4b50: 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d      /* Some non-
4b60: 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74  recoverable, fat
4b70: 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  al I/O error occ
4b80: 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 20 64 70  urred */..    dp
4b90: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52  rintf("SSL_ERROR
4ba0: 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74 61 6c 20  _SYSCALL: Fatal 
4bb0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72  I/O error occurr
4bc0: 65 64 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28  ed");...    if (
4bd0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20  backingError == 
4be0: 30 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d  0 && bytesRead =
4bf0: 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 55 6e 65 78  = 0) {.../* Unex
4c00: 70 65 63 74 65 64 20 45 4f 46 20 66 72 6f 6d 20  pected EOF from 
4c10: 74 68 65 20 70 65 65 72 20 66 6f 72 20 4f 70 65  the peer for Ope
4c20: 6e 53 53 4c 20 31 2e 31 20 2a 2f 0a 09 09 64 70  nSSL 1.1 */...dp
4c30: 72 69 6e 74 66 28 22 28 55 6e 65 78 70 65 63 74  rintf("(Unexpect
4c40: 65 64 29 20 45 4f 46 20 72 65 61 63 68 65 64 22  ed) EOF reached"
4c50: 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  )...*errorCodePt
4c60: 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65  r = 0;...bytesRe
4c70: 61 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72  ad = 0;...Tls_Er
4c80: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45  ror(statePtr, "E
4c90: 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09  OF reached");...
4ca0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62      } else if (b
4cb0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30  ackingError == 0
4cc0: 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d   && bytesRead ==
4cd0: 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66   -1) {...dprintf
4ce0: 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  ("I/O error occu
4cf0: 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c  rred (errno = %l
4d00: 75 29 22 2c 0a 09 09 20 20 20 20 28 75 6e 73 69  u)",...    (unsi
4d10: 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47  gned long) Tcl_G
4d20: 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65  etErrno());...*e
4d30: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63  rrorCodePtr = Tc
4d40: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09  l_GetErrno();...
4d50: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a  bytesRead = -1;.
4d60: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
4d70: 65 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d  ePtr, Tcl_ErrnoM
4d80: 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  sg(*errorCodePtr
4d90: 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65  ));...    } else
4da0: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f   {...dprintf("I/
4db0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  O error occurred
4dc0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d   (backingError =
4dd0: 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45   %lu)", backingE
4de0: 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43  rror);...*errorC
4df0: 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74  odePtr = Tcl_Get
4e00: 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73  Errno();...bytes
4e10: 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73  Read = -1;...Tls
4e20: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
4e30: 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f   ERR_reason_erro
4e40: 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67  r_string(backing
4e50: 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a  Error));..    }.
4e60: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
4e70: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52  se SSL_ERROR_ZER
4e80: 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f  O_RETURN:..    /
4e90: 2a 20 50 65 65 72 20 68 61 73 20 63 6c 65 61 6e  * Peer has clean
4ea0: 6c 79 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f  ly closed the co
4eb0: 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64  nnection by send
4ec0: 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f  ing the close_no
4ed0: 74 69 66 79 0a 09 20 20 20 20 20 20 20 61 6c 65  tify..       ale
4ee0: 72 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20  rt. Can't read, 
4ef0: 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 4e  but can write. N
4f00: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  eed to return an
4f10: 20 45 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20 20   EOF, so the..  
4f20: 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 69 73 20       channel is 
4f30: 63 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c  closed which wil
4f40: 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68  l send an SSL_sh
4f50: 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20  utdown(). */..  
4f60: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45    dprintf("SSL_E
4f70: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e  RROR_ZERO_RETURN
4f80: 3a 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65  : Peer has close
4f90: 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  d the connection
4fa0: 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65  ");..    bytesRe
4fb0: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72  ad = 0;..    *er
4fc0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
4fd0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73  .    Tls_Error(s
4fe0: 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68  tatePtr, "Peer h
4ff0: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f  as closed the co
5000: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69  nnection for wri
5010: 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20  ting by sending 
5020: 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79  the close_notify
5030: 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62   alert");..    b
5040: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c  reak;...case SSL
5050: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e  _ERROR_WANT_ASYN
5060: 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20  C:..    /* Used 
5070: 77 69 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f  with flag SSL_MO
5080: 44 45 5f 41 53 59 4e 43 2c 20 6f 70 65 72 61 74  DE_ASYNC, operat
5090: 69 6f 6e 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c  ion didn't compl
50a0: 65 74 65 20 62 65 63 61 75 73 65 0a 09 20 20 20  ete because..   
50b0: 20 20 20 20 61 6e 20 61 73 79 6e 63 20 65 6e 67      an async eng
50c0: 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f  ine is still pro
50d0: 63 65 73 73 69 6e 67 20 64 61 74 61 2e 20 2a 2f  cessing data. */
50e0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47  ..    dprintf("G
50f0: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  ot SSL_ERROR_WAN
5100: 54 5f 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67  T_ASYNC, mapping
5110: 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22   this to EAGAIN"
5120: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
5130: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
5140: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
5150: 20 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a   0;..    break;.
5160: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20  ..default:..    
5170: 64 70 72 69 6e 74 66 28 22 55 6e 6b 6e 6f 77 6e  dprintf("Unknown
5180: 20 65 72 72 6f 72 20 28 65 72 72 20 3d 20 25 69   error (err = %i
5190: 29 2c 20 6d 61 70 70 69 6e 67 20 74 6f 20 45 4f  ), mapping to EO
51a0: 46 22 2c 20 65 72 72 29 3b 0a 09 20 20 20 20 2a  F", err);..    *
51b0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
51c0: 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64  ;..    bytesRead
51d0: 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73 5f 45   = 0;..    Tls_E
51e0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22  rror(statePtr, "
51f0: 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 29 3b  Unknown error");
5200: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ..    break;.   
5210: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
5220: 22 49 6e 70 75 74 28 25 64 29 20 2d 3e 20 25 64  "Input(%d) -> %d
5230: 20 5b 25 64 5d 22 2c 20 62 75 66 53 69 7a 65 2c   [%d]", bufSize,
5240: 20 62 79 74 65 73 52 65 61 64 2c 20 2a 65 72 72   bytesRead, *err
5250: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20 20 20 20  orCodePtr);.    
5260: 72 65 74 75 72 6e 20 62 79 74 65 73 52 65 61 64  return bytesRead
5270: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
52d0: 73 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20  sOutputProc --. 
52e0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
52f0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ure is invoked b
5300: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f  y the generic I/
5310: 4f 20 6c 61 79 65 72 20 74 6f 20 77 72 69 74 65  O layer to write
5320: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 20 2a 09   data to the. *.
5330: 42 49 4f 20 77 68 65 6e 65 76 65 72 20 74 68 65  BIO whenever the
5340: 20 74 68 65 20 54 63 6c 5f 57 72 69 74 65 28 29   the Tcl_Write()
5350: 2c 20 54 63 6c 5f 57 72 69 74 65 43 68 61 72 73  , Tcl_WriteChars
5360: 2c 20 61 6e 64 20 54 63 6c 5f 57 72 69 74 65 4f  , and Tcl_WriteO
5370: 62 6a 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 73 20  bj. *.functions 
5380: 61 72 65 20 75 73 65 64 2e 20 45 71 75 69 76 61  are used. Equiva
5390: 6c 65 6e 74 20 74 6f 20 53 53 4c 5f 77 72 69 74  lent to SSL_writ
53a0: 65 5f 65 78 20 61 6e 64 20 53 53 4c 5f 77 72 69  e_ex and SSL_wri
53b0: 74 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  te.. *. * Result
53c0: 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68  s:. *.Returns th
53d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
53e0: 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31 20  s written or -1 
53f0: 6f 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20 65  on error. Sets e
5400: 72 72 6f 72 43 6f 64 65 50 74 72 0a 20 2a 09 74  rrorCodePtr. *.t
5410: 6f 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20  o a POSIX error 
5420: 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
5430: 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30 20   occurred, or 0 
5440: 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53  if none.. *. * S
5450: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
5460: 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 6f 6e  Writes output on
5470: 20 74 68 65 20 6f 75 74 70 75 74 20 64 65 76 69   the output devi
5480: 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65  ce of the channe
5490: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
54f0: 20 69 6e 74 20 54 6c 73 4f 75 74 70 75 74 50 72   int TlsOutputPr
5500: 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  oc(.    ClientDa
5510: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
5520: 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73  ./* Connection s
5530: 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  tate info */.   
5540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66   const char *buf
5550: 2c 09 09 2f 2a 20 42 75 66 66 65 72 20 77 69 74  ,../* Buffer wit
5560: 68 20 64 61 74 61 20 74 6f 20 77 72 69 74 65 20  h data to write 
5570: 74 6f 20 42 49 4f 20 2a 2f 0a 20 20 20 20 69 6e  to BIO */.    in
5580: 74 20 74 6f 57 72 69 74 65 2c 09 09 2f 2a 20 53  t toWrite,../* S
5590: 69 7a 65 20 6f 66 20 64 61 74 61 20 74 6f 20 77  ize of data to w
55a0: 72 69 74 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  rite in bytes */
55b0: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  .    int *errorC
55c0: 6f 64 65 50 74 72 29 09 09 2f 2a 20 53 74 6f 72  odePtr)../* Stor
55d0: 61 67 65 20 66 6f 72 20 65 72 72 6f 72 20 63 6f  age for error co
55e0: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  de to return */.
55f0: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  {.    unsigned l
5600: 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  ong backingError
5610: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  ;.    State *sta
5620: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
5630: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
5640: 20 20 20 20 69 6e 74 20 77 72 69 74 74 65 6e 2c      int written,
5650: 20 65 72 72 3b 0a 20 20 20 20 2a 65 72 72 6f 72   err;.    *error
5660: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20  CodePtr = 0;..  
5670: 20 20 64 70 72 69 6e 74 66 28 22 57 72 69 74 65    dprintf("Write
5680: 28 25 70 2c 20 25 64 29 22 2c 20 28 76 6f 69 64  (%p, %d)", (void
5690: 20 2a 29 20 73 74 61 74 65 50 74 72 2c 20 74 6f   *) statePtr, to
56a0: 57 72 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69  Write);.    dpri
56b0: 6e 74 42 75 66 66 65 72 28 62 75 66 2c 20 74 6f  ntBuffer(buf, to
56c0: 57 72 69 74 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  Write);..    /* 
56d0: 41 62 6f 72 74 20 69 66 20 74 68 65 20 75 73 65  Abort if the use
56e0: 72 20 76 65 72 69 66 79 20 63 61 6c 6c 62 61 63  r verify callbac
56f0: 6b 20 69 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69  k is still runni
5700: 6e 67 20 74 6f 20 61 76 6f 69 64 20 74 72 69 67  ng to avoid trig
5710: 67 65 72 69 6e 67 0a 20 20 20 20 20 2a 20 61 6e  gering.     * an
5720: 6f 74 68 65 72 20 63 61 6c 6c 20 62 65 66 6f 72  other call befor
5730: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e  e the current on
5740: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20 2a  e is complete. *
5750: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
5760: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
5770: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a  TCL_CALLBACK) {.
5780: 09 64 70 72 69 6e 74 66 28 22 44 6f 6e 27 74 20  .dprintf("Don't 
5790: 70 72 6f 63 65 73 73 20 6f 75 74 70 75 74 20 77  process output w
57a0: 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 61  hile callbacks a
57b0: 72 65 20 72 75 6e 6e 69 6e 67 22 29 3b 0a 09 77  re running");..w
57c0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 2a 65  ritten = -1;..*e
57d0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
57e0: 47 41 49 4e 3b 0a 09 72 65 74 75 72 6e 20 2d 31  GAIN;..return -1
57f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5800: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
5810: 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63 74 20 2a  ed, do connect *
5820: 2f 0a 20 20 20 20 2f 2a 20 43 61 6e 20 61 6c 73  /.    /* Can als
5830: 6f 20 63 68 65 63 6b 20 53 53 4c 5f 69 73 5f 69  o check SSL_is_i
5840: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c  nit_finished(ssl
5850: 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  ) */.    if (sta
5860: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
5870: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09  LS_TCL_INIT) {..
5880: 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a  int tlsConnect;.
5890: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69  ..dprintf("Calli
58a0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
58b0: 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f  nnect");...tlsCo
58c0: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74  nnect = Tls_Wait
58d0: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
58e0: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74  Ptr, errorCodePt
58f0: 72 2c 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43  r, 1);..if (tlsC
5900: 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09 20  onnect < 0) {.. 
5910: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
5920: 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67  an error waiting
5930: 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73   to connect (tls
5940: 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65  Connect = %i, *e
5950: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69  rrorCodePtr = %i
5960: 29 22 2c 0a 09 09 74 6c 73 43 6f 6e 6e 65 63 74  )",...tlsConnect
5970: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  , *errorCodePtr)
5980: 3b 0a 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  ;...    written 
5990: 3d 20 2d 31 3b 0a 09 20 20 20 20 69 66 20 28 2a  = -1;..    if (*
59a0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20  errorCodePtr == 
59b0: 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09  ECONNRESET) {...
59c0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e  dprintf("Got con
59d0: 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b  nection reset");
59e0: 0a 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a  .../* Soft EOF *
59f0: 2f 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  /...*errorCodePt
5a00: 72 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 6e  r = 0;...written
5a10: 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20   = 0;..    }..  
5a20: 20 20 72 65 74 75 72 6e 20 77 72 69 74 74 65 6e    return written
5a30: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 74 6c  ;..} else if (tl
5a40: 73 43 6f 6e 6e 65 63 74 20 3d 3d 20 30 29 20 7b  sConnect == 0) {
5a50: 0a 09 20 20 20 20 2f 2a 20 54 72 79 20 61 67 61  ..    /* Try aga
5a60: 69 6e 20 2a 2f 0a 09 20 20 20 20 77 72 69 74 74  in */..    writt
5a70: 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 72 65  en = -1;..    re
5a80: 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a 09 7d  turn written;..}
5a90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
5aa0: 74 6f 57 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a  toWrite == 0) {.
5ab0: 09 64 70 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77  .dprintf("zero-w
5ac0: 72 69 74 65 22 29 3b 0a 09 65 72 72 20 3d 20 42  rite");..err = B
5ad0: 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74  IO_flush(statePt
5ae0: 72 2d 3e 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65  r->bio);...if (e
5af0: 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  rr <= 0) {..    
5b00: 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e  dprintf("Flushin
5b10: 67 20 66 61 69 6c 65 64 22 29 3b 0a 09 20 20 20  g failed");..   
5b20: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65   Tls_Error(state
5b30: 50 74 72 2c 20 22 46 6c 75 73 68 20 66 61 69 6c  Ptr, "Flush fail
5b40: 65 64 22 29 3b 0a 0a 09 20 20 20 20 2a 65 72 72  ed");...    *err
5b50: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b  orCodePtr = EIO;
5b60: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ..    written = 
5b70: 30 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d  0;..    return -
5b80: 31 3b 0a 09 7d 0a 0a 09 77 72 69 74 74 65 6e 20  1;..}...written 
5b90: 3d 20 30 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65  = 0;..*errorCode
5ba0: 50 74 72 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  Ptr = 0;..return
5bb0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
5bc0: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64  *.     * We need
5bd0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53   to clear the SS
5be0: 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f  L error stack no
5bf0: 77 20 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d  w because we som
5c00: 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20  etimes reach.   
5c10: 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f    * this functio
5c20: 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20  n with leftover 
5c30: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74  errors in the st
5c40: 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 77 72 69  ack.  If BIO_wri
5c50: 74 65 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e  te.     * return
5c60: 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73  s -1 and intends
5c70: 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69   EAGAIN, there i
5c80: 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72  s a leftover err
5c90: 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20  or, it will be. 
5ca0: 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75      * misconstru
5cb0: 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20  ed as an error, 
5cc0: 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20  not EAGAIN..    
5cd0: 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e   *.     * Altern
5ce0: 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20  atively, we may 
5cf0: 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74  want to handle t
5d00: 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64  he <0 return cod
5d10: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42  es from.     * B
5d20: 49 4f 5f 77 72 69 74 65 20 73 70 65 63 69 61 6c  IO_write special
5d30: 6c 79 20 28 61 73 20 61 64 76 69 73 65 64 20 69  ly (as advised i
5d40: 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e  n the RSA docs).
5d50: 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65    TLS's lower le
5d60: 76 65 6c 0a 20 20 20 20 20 2a 20 42 49 4f 20 66  vel.     * BIO f
5d70: 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69  unctions play wi
5d80: 74 68 20 74 68 65 20 72 65 74 72 79 20 66 6c 61  th the retry fla
5d90: 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74  gs though, and t
5da0: 68 69 73 20 73 65 65 6d 73 20 74 6f 0a 20 20 20  his seems to.   
5db0: 20 20 2a 20 77 6f 72 6b 20 63 6f 72 72 65 63 74    * work correct
5dc0: 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78  ly.  Similar fix
5dd0: 20 69 6e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63   in TlsInputProc
5de0: 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a  . - hobbs.     *
5df0: 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  /.    ERR_clear_
5e00: 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f  error();.    BIO
5e10: 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c 61  _clear_retry_fla
5e20: 67 73 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  gs(statePtr->bio
5e30: 29 3b 0a 20 20 20 20 77 72 69 74 74 65 6e 20 3d  );.    written =
5e40: 20 42 49 4f 5f 77 72 69 74 65 28 73 74 61 74 65   BIO_write(state
5e50: 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74  Ptr->bio, buf, t
5e60: 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 64 70 72  oWrite);.    dpr
5e70: 69 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28  intf("BIO_write(
5e80: 25 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22  %p, %d) -> [%d]"
5e90: 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65  , (void *) state
5ea0: 50 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72  Ptr, toWrite, wr
5eb0: 69 74 74 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  itten);..    /* 
5ec0: 53 61 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74  Same as SSL_want
5ed0: 2c 20 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b  , but also check
5ee0: 73 20 74 68 65 20 65 72 72 6f 72 20 71 75 65 75  s the error queu
5ef0: 65 20 2a 2f 0a 20 20 20 20 65 72 72 20 3d 20 53  e */.    err = S
5f00: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61  SL_get_error(sta
5f10: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74  tePtr->ssl, writ
5f20: 74 65 6e 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e  ten);.    backin
5f30: 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74  gError = ERR_get
5f40: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69  _error();..    i
5f50: 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29  f (written <= 0)
5f60: 20 7b 0a 09 2f 2a 20 54 68 65 20 72 65 74 72 79   {../* The retry
5f70: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
5f80: 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 65 74 72  the BIO_set_retr
5f90: 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  y_* functions */
5fa0: 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64  ..if (BIO_should
5fb0: 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d  _retry(statePtr-
5fc0: 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70  >bio)) {..    dp
5fd0: 72 69 6e 74 66 28 22 57 72 69 74 65 20 66 61 69  rintf("Write fai
5fe0: 6c 65 64 20 77 69 74 68 20 63 6f 64 65 20 25 64  led with code %d
5ff0: 2c 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 3d  , bytes written=
6000: 25 64 3a 20 73 68 6f 75 6c 64 20 72 65 74 72 79  %d: should retry
6010: 22 2c 0a 09 09 65 72 72 2c 20 77 72 69 74 74 65  ",...err, writte
6020: 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  n);..} else {.. 
6030: 20 20 20 64 70 72 69 6e 74 66 28 22 57 72 69 74     dprintf("Writ
6040: 65 20 66 61 69 6c 65 64 20 77 69 74 68 20 63 6f  e failed with co
6050: 64 65 20 25 64 2c 20 62 79 74 65 73 20 77 72 69  de %d, bytes wri
6060: 74 74 65 6e 3d 25 64 3a 20 65 72 72 6f 72 20 63  tten=%d: error c
6070: 6f 6e 64 69 74 69 6f 6e 22 2c 0a 09 09 65 72 72  ondition",...err
6080: 2c 20 77 72 69 74 74 65 6e 29 3b 0a 09 7d 0a 0a  , written);..}..
6090: 09 2f 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  ./* These are th
60a0: 65 20 73 61 6d 65 20 61 73 20 42 49 4f 5f 72 65  e same as BIO_re
60b0: 74 72 79 5f 74 79 70 65 20 2a 2f 0a 09 69 66 20  try_type */..if 
60c0: 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 61 64  (BIO_should_read
60d0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29  (statePtr->bio))
60e0: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
60f0: 22 42 49 4f 20 68 61 73 20 69 6e 73 75 66 66 69  "BIO has insuffi
6100: 63 69 65 6e 74 20 64 61 74 61 20 74 6f 20 72 65  cient data to re
6110: 61 64 20 61 6e 64 20 72 65 74 75 72 6e 22 29 3b  ad and return");
6120: 0a 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f  ..}..if (BIO_sho
6130: 75 6c 64 5f 77 72 69 74 65 28 73 74 61 74 65 50  uld_write(stateP
6140: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20  tr->bio)) {..   
6150: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61   dprintf("BIO ha
6160: 73 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 74  s pending data t
6170: 6f 20 77 72 69 74 65 22 29 3b 0a 09 7d 0a 09 69  o write");..}..i
6180: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 69 6f  f (BIO_should_io
6190: 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65 50 74  _special(statePt
61a0: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20  r->bio)) {..    
61b0: 69 6e 74 20 72 65 61 73 6f 6e 20 3d 20 42 49 4f  int reason = BIO
61c0: 5f 67 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f  _get_retry_reaso
61d0: 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  n(statePtr->bio)
61e0: 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
61f0: 42 49 4f 20 68 61 73 20 73 6f 6d 65 20 73 70 65  BIO has some spe
6200: 63 69 61 6c 20 63 6f 6e 64 69 74 69 6f 6e 20 6f  cial condition o
6210: 74 68 65 72 20 74 68 61 6e 20 72 65 61 64 20 6f  ther than read o
6220: 72 20 77 72 69 74 65 3a 20 63 6f 64 65 3d 25 64  r write: code=%d
6230: 22 2c 20 72 65 61 73 6f 6e 29 3b 0a 09 7d 0a 0a  ", reason);..}..
6240: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49      } else {..BI
6250: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72  O_flush(statePtr
6260: 2d 3e 62 69 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->bio);.    }.. 
6270: 20 20 20 73 77 69 74 63 68 20 28 65 72 72 29 20     switch (err) 
6280: 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  {..case SSL_ERRO
6290: 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20  R_NONE:..    /* 
62a0: 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f  I/O operation co
62b0: 6d 70 6c 65 74 65 64 20 2a 2f 0a 09 20 20 20 20  mpleted */..    
62c0: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52  dprintf("SSL_ERR
62d0: 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20  OR_NONE");..    
62e0: 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20 30 29  if (written < 0)
62f0: 20 7b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 30   {...written = 0
6300: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72  ;..    }..    br
6310: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
6320: 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20  ERROR_SSL:..    
6330: 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72  /* A non-recover
6340: 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72 72 6f  able, fatal erro
6350: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62  r in the SSL lib
6360: 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c 0a 09  rary occurred,..
6370: 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 20 61         usually a
6380: 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20   protocol error 
6390: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
63a0: 22 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 20  "SSL_ERROR_SSL: 
63b0: 46 61 74 61 6c 20 53 53 4c 20 70 72 6f 74 6f 63  Fatal SSL protoc
63c0: 6f 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  ol error occurre
63d0: 64 22 29 3b 0a 09 20 20 20 20 69 66 20 28 62 61  d");..    if (ba
63e0: 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20 30 29  ckingError != 0)
63f0: 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73   {...Tls_Error(s
6400: 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 61  tatePtr, ERR_rea
6410: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  son_error_string
6420: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b  (backingError));
6430: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
6440: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
6450: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
6460: 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f  >ssl) != X509_V_
6470: 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f  OK) {...Tls_Erro
6480: 72 28 73 74 61 74 65 50 74 72 2c 0a 09 09 20 20  r(statePtr,...  
6490: 20 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65    X509_verify_ce
64a0: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
64b0: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
64c0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
64d0: 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20 65  ssl)));..    } e
64e0: 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f  lse {...Tls_Erro
64f0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b  r(statePtr, "Unk
6500: 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22 29  nown SSL error")
6510: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a 65  ;..    }..    *e
6520: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
6530: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20  ONNABORTED;..   
6540: 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09   written = -1;..
6550: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
6560: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  e SSL_ERROR_WANT
6570: 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f 2a 20 4f  _READ:..    /* O
6580: 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
6590: 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20 74 6f   complete due to
65a0: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 64 61 74 61   not enough data
65b0: 20 77 61 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a   was available..
65c0: 09 20 20 20 20 20 20 20 52 65 74 72 79 20 61 67  .       Retry ag
65d0: 61 69 6e 20 6c 61 74 65 72 20 77 69 74 68 20 73  ain later with s
65e0: 61 6d 65 20 64 61 74 61 2e 20 2a 2f 0a 09 20 20  ame data. */..  
65f0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53    dprintf("Got S
6600: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
6610: 41 44 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74  AD, mapping it t
6620: 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20  o EAGAIN");..   
6630: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
6640: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72   EAGAIN;..    wr
6650: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20  itten = -1;..   
6660: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20   statePtr->want 
6670: 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b  |= TCL_READABLE;
6680: 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65  ..    BIO_set_re
6690: 74 72 79 5f 72 65 61 64 28 73 74 61 74 65 50 74  try_read(statePt
66a0: 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72  r->bio);..    br
66b0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
66c0: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45  ERROR_WANT_WRITE
66d0: 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 65 72 61 74  :..    /* Operat
66e0: 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70  ion did not comp
66f0: 6c 65 74 65 20 64 75 65 20 74 6f 20 75 6e 61 62  lete due to unab
6700: 6c 65 20 74 6f 20 73 65 6e 64 20 61 6c 6c 20 64  le to send all d
6710: 61 74 61 20 74 6f 20 74 68 65 0a 09 20 20 20 20  ata to the..    
6720: 20 20 20 42 49 4f 2e 20 52 65 74 72 79 20 6c 61     BIO. Retry la
6730: 74 65 72 20 77 69 74 68 20 73 61 6d 65 20 64 61  ter with same da
6740: 74 61 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  ta. */..    dpri
6750: 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52  ntf("Got SSL_ERR
6760: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d  OR_WANT_WRITE, m
6770: 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47  apping it to EAG
6780: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  AIN");..    *err
6790: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
67a0: 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e  IN;..    written
67b0: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74   = -1;..    stat
67c0: 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43  ePtr->want |= TC
67d0: 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 20  L_WRITABLE;..   
67e0: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77   BIO_set_retry_w
67f0: 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62  rite(statePtr->b
6800: 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  io);..    break;
6810: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
6820: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b  R_WANT_X509_LOOK
6830: 55 50 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20  UP:..    /* The 
6840: 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f  operation did no
6850: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
6860: 73 65 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f  se an applicatio
6870: 6e 20 63 61 6c 6c 62 61 63 6b 0a 09 20 20 20 20  n callback..    
6880: 20 20 20 73 65 74 20 62 79 20 53 53 4c 5f 43 54     set by SSL_CT
6890: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72  X_set_client_cer
68a0: 74 5f 63 62 28 29 20 68 61 73 20 61 73 6b 65 64  t_cb() has asked
68b0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 67   to be called ag
68c0: 61 69 6e 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72  ain. */..    dpr
68d0: 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52  intf("Got SSL_ER
68e0: 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f  ROR_WANT_X509_LO
68f0: 4f 4b 55 50 2c 20 6d 61 70 70 69 6e 67 20 69 74  OKUP, mapping it
6900: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20   to EAGAIN");.. 
6910: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
6920: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20   = EAGAIN;..    
6930: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20  written = -1;.. 
6940: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
6950: 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41   SSL_ERROR_SYSCA
6960: 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65  LL:..    /* Some
6970: 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65   non-recoverable
6980: 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f  , fatal I/O erro
6990: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20  r occurred */.. 
69a0: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
69b0: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 20 46  ERROR_SYSCALL: F
69c0: 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f  atal I/O error o
69d0: 63 63 75 72 72 65 64 22 29 3b 0a 0a 09 20 20 20  ccurred");...   
69e0: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f   if (backingErro
69f0: 72 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65  r == 0 && writte
6a00: 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69  n == 0) {...dpri
6a10: 6e 74 66 28 22 45 4f 46 20 72 65 61 63 68 65 64  ntf("EOF reached
6a20: 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  ")...*errorCodeP
6a30: 74 72 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65  tr = 0;...writte
6a40: 6e 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72  n = 0;...Tls_Err
6a50: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f  or(statePtr, "EO
6a60: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20  F reached");... 
6a70: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61     } else if (ba
6a80: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20  ckingError == 0 
6a90: 26 26 20 77 72 69 74 74 65 6e 20 3d 3d 20 2d 31  && written == -1
6aa0: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49  ) {...dprintf("I
6ab0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
6ac0: 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22  d (errno = %lu)"
6ad0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
6ae0: 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  ) Tcl_GetErrno()
6af0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  );...*errorCodeP
6b00: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e  tr = Tcl_GetErrn
6b10: 6f 28 29 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d  o();...written =
6b20: 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72   -1;...Tls_Error
6b30: 28 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 45  (statePtr, Tcl_E
6b40: 72 72 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f  rrnoMsg(*errorCo
6b50: 64 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d  dePtr));...    }
6b60: 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74   else {...dprint
6b70: 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  f("I/O error occ
6b80: 75 72 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72  urred (backingEr
6b90: 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63  ror = %lu)", bac
6ba0: 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65  kingError);...*e
6bb0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63  rrorCodePtr = Tc
6bc0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09  l_GetErrno();...
6bd0: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09  written = -1;...
6be0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
6bf0: 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65  tr, ERR_reason_e
6c00: 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b  rror_string(back
6c10: 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20  ingError));..   
6c20: 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a   }..    break;..
6c30: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
6c40: 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20  ZERO_RETURN:..  
6c50: 20 20 2f 2a 20 50 65 65 72 20 68 61 73 20 63 6c    /* Peer has cl
6c60: 65 61 6e 6c 79 20 63 6c 6f 73 65 64 20 74 68 65  eanly closed the
6c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73   connection by s
6c80: 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65  ending the close
6c90: 5f 6e 6f 74 69 66 79 0a 09 20 20 20 20 20 20 20  _notify..       
6ca0: 61 6c 65 72 74 2e 20 43 61 6e 27 74 20 72 65 61  alert. Can't rea
6cb0: 64 2c 20 62 75 74 20 63 61 6e 20 77 72 69 74 65  d, but can write
6cc0: 2e 20 4e 65 65 64 20 74 6f 20 72 65 74 75 72 6e  . Need to return
6cd0: 20 61 6e 20 45 4f 46 2c 20 73 6f 20 74 68 65 0a   an EOF, so the.
6ce0: 09 20 20 20 20 20 20 20 63 68 61 6e 6e 65 6c 20  .       channel 
6cf0: 69 73 20 63 6c 6f 73 65 64 20 77 68 69 63 68 20  is closed which 
6d00: 77 69 6c 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c  will send an SSL
6d10: 5f 73 68 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a  _shutdown(). */.
6d20: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
6d30: 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54  L_ERROR_ZERO_RET
6d40: 55 52 4e 3a 20 50 65 65 72 20 68 61 73 20 63 6c  URN: Peer has cl
6d50: 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74  osed the connect
6d60: 69 6f 6e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  ion");..    *err
6d70: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09  orCodePtr = 0;..
6d80: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b      written = 0;
6d90: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28  ..    Tls_Error(
6da0: 73 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20  statePtr, "Peer 
6db0: 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63  has closed the c
6dc0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72  onnection for wr
6dd0: 69 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67  iting by sending
6de0: 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66   the close_notif
6df0: 79 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20  y alert");..    
6e00: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
6e10: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59  L_ERROR_WANT_ASY
6e20: 4e 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65 64  NC:..    /* Used
6e30: 20 77 69 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d   with flag SSL_M
6e40: 4f 44 45 5f 41 53 59 4e 43 2c 20 6f 70 65 72 61  ODE_ASYNC, opera
6e50: 74 69 6f 6e 20 64 69 64 6e 27 74 20 63 6f 6d 70  tion didn't comp
6e60: 6c 65 74 65 20 62 65 63 61 75 73 65 0a 09 20 20  lete because..  
6e70: 20 20 20 20 20 61 6e 20 61 73 79 6e 63 20 65 6e       an async en
6e80: 67 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72  gine is still pr
6e90: 6f 63 65 73 73 69 6e 67 20 64 61 74 61 2e 20 2a  ocessing data. *
6ea0: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
6eb0: 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  Got SSL_ERROR_WA
6ec0: 4e 54 5f 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e  NT_ASYNC, mappin
6ed0: 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e  g this to EAGAIN
6ee0: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
6ef0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
6f00: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ..    written = 
6f10: 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  0;..    break;..
6f20: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64  .default:..    d
6f30: 70 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20  printf("unknown 
6f40: 65 72 72 6f 72 3a 20 25 64 22 2c 20 65 72 72 29  error: %d", err)
6f50: 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72  ;..    Tls_Error
6f60: 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e  (statePtr, "Unkn
6f70: 6f 77 6e 20 65 72 72 6f 72 22 29 3b 0a 09 20 20  own error");..  
6f80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6f90: 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 75 74      dprintf("Out
6fa0: 70 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20  put(%d) -> %d", 
6fb0: 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e  toWrite, written
6fc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 72  );.    return wr
6fd0: 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  itten;.}../*. *-
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
7030: 20 2a 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74   * Tls_GetParent
7040: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 70 61   --. *. *.Get pa
7050: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 66 6f 72  rent channel for
7060: 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e   a stacked chann
7070: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  el.. *. * Result
7080: 73 3a 0a 20 2a 09 54 63 6c 5f 43 68 61 6e 6e 65  s:. *.Tcl_Channe
7090: 6c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e  l or NULL if non
70a0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
70b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 43 68  -----. */.Tcl_Ch
7100: 61 6e 6e 65 6c 20 54 6c 73 5f 47 65 74 50 61 72  annel Tls_GetPar
7110: 65 6e 74 28 0a 20 20 20 20 53 74 61 74 65 20 2a  ent(.    State *
7120: 73 74 61 74 65 50 74 72 2c 09 09 2f 2a 20 43 6f  statePtr,../* Co
7130: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69  nnection state i
7140: 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  nfo */.    int m
7150: 61 73 6b 46 6c 61 67 73 29 09 09 2f 2a 20 57 68  askFlags)../* Wh
7160: 69 63 68 20 66 6c 61 67 73 20 74 6f 20 70 72 6f  ich flags to pro
7170: 63 65 73 73 20 2a 2f 0a 7b 0a 20 20 20 20 64 70  cess */.{.    dp
7180: 72 69 6e 74 66 28 22 52 65 71 75 65 73 74 65 64  rintf("Requested
7190: 20 74 6f 20 67 65 74 20 70 61 72 65 6e 74 20 6f   to get parent o
71a0: 66 20 63 68 61 6e 6e 65 6c 20 25 70 22 2c 20 73  f channel %p", s
71b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a  tatePtr->self);.
71c0: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50  .    if ((stateP
71d0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 7e 6d 61 73  tr->flags & ~mas
71e0: 6b 46 6c 61 67 73 29 20 26 20 54 4c 53 5f 54 43  kFlags) & TLS_TC
71f0: 4c 5f 46 41 53 54 50 41 54 48 29 20 7b 0a 09 64  L_FASTPATH) {..d
7200: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
7210: 20 67 65 74 20 74 68 65 20 70 61 72 65 6e 74 20   get the parent 
7220: 63 68 61 6e 6e 65 6c 20 77 68 69 6c 65 20 77 65  channel while we
7230: 20 61 72 65 20 75 73 69 6e 67 20 46 61 73 74 50   are using FastP
7240: 61 74 68 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67  ath -- returning
7250: 20 4e 55 4c 4c 22 29 3b 0a 09 72 65 74 75 72 6e   NULL");..return
7260: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
7270: 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 53   return Tcl_GetS
7280: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74  tackedChannel(st
7290: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 7d  atePtr->self);.}
72a0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
72b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72f0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65  ----. *. * TlsSe
7300: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20  tOptionProc --. 
7310: 2a 0a 20 2a 09 53 65 74 73 20 61 6e 20 6f 70 74  *. *.Sets an opt
7320: 69 6f 6e 20 74 6f 20 76 61 6c 75 65 20 66 6f 72  ion to value for
7330: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
7340: 73 65 64 20 63 68 61 6e 6e 65 6c 2e 20 43 61 6c  sed channel. Cal
7350: 6c 65 64 20 62 79 20 74 68 65 0a 20 2a 09 67 65  led by the. *.ge
7360: 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20  neric I/O layer 
7370: 77 68 65 6e 65 76 65 72 20 74 68 65 20 54 63 6c  whenever the Tcl
7380: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
7390: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  n() function is 
73a0: 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  used.. *. * Resu
73b0: 6c 74 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69  lts:. *.TCL_OK i
73c0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
73d0: 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 69  TCL_ERROR if fai
73e0: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  led.. *. * Side 
73f0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61  effects:. *.Upda
7400: 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69  tes channel opti
7410: 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e  on to new value.
7420: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
7430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7470: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
7480: 6e 74 0a 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50  nt.TlsSetOptionP
7490: 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44  roc(.    ClientD
74a0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
74b0: 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74  ,./* Socket stat
74c0: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  e. */.    Tcl_In
74d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
74e0: 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63  * For errors - c
74f0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  an be NULL. */. 
7500: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f     const char *o
7510: 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61  ptionName,./* Na
7520: 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e  me of the option
7530: 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
7540: 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a  e for, or..... *
7550: 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c   NULL to get all
7560: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65   options and the
7570: 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20  ir values. */.  
7580: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70    const char *op
7590: 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61  tionValue)./* Va
75a0: 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20  lue for option. 
75b0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
75c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
75d0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
75e0: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
75f0: 65 6c 20 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f  el parent = Tls_
7600: 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50  GetParent(stateP
7610: 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54  tr, TLS_TCL_FAST
7620: 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44  PATH);.    Tcl_D
7630: 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 72  riverSetOptionPr
7640: 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f  oc *setOptionPro
7650: 63 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  c;..    dprintf(
7660: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
7670: 2f 2a 20 50 61 73 73 20 74 6f 20 70 61 72 65 6e  /* Pass to paren
7680: 74 20 2a 2f 0a 20 20 20 20 73 65 74 4f 70 74 69  t */.    setOpti
7690: 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  onProc = Tcl_Cha
76a0: 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f  nnelSetOptionPro
76b0: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  c(Tcl_GetChannel
76c0: 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20  Type(parent));. 
76d0: 20 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f 6e     if (setOption
76e0: 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Proc != NULL) {.
76f0: 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70 74  .return (*setOpt
7700: 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74  ionProc)(Tcl_Get
7710: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
7720: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74  ata(parent), int
7730: 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c  erp, optionName,
7740: 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20   optionValue);. 
7750: 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20     }.    /*.    
7760: 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 61   * Request for a
7770: 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e   specific option
7780: 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65   has to fail, we
7790: 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e   don't have any.
77a0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  .     */.    ret
77b0: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e  urn Tcl_BadChann
77c0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
77d0: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29   optionName, "")
77e0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7830: 0a 20 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e  . * TlsGetOption
7840: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65  Proc --. *. *.Ge
7850: 74 20 61 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c  t a option's val
7860: 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63  ue for a SSL soc
7870: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
7880: 6c 2c 20 6f 72 20 61 20 6c 69 73 74 20 6f 66 20  l, or a list of 
7890: 61 6c 6c 0a 20 2a 09 6f 70 74 69 6f 6e 73 20 61  all. *.options a
78a0: 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e  nd their values.
78b0: 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67   Called by the g
78c0: 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72  eneric I/O layer
78d0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 2a   whenever the. *
78e0: 09 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f  .Tcl_GetChannelO
78f0: 70 74 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e  ption() function
7900: 20 69 73 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 0a   is used.. *. *.
7910: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
7920: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
7930: 73 75 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 20  sult. The value 
7940: 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
7950: 20 6f 70 74 69 6f 6e 20 6f 72 20 61 20 6c 69 73   option or a lis
7960: 74 20 6f 66 0a 20 2a 09 61 6c 6c 20 6f 70 74 69  t of. *.all opti
7970: 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61  ons and their va
7980: 6c 75 65 73 20 69 73 20 72 65 74 75 72 6e 65 64  lues is returned
7990: 20 69 6e 20 74 68 65 20 73 75 70 70 6c 69 65 64   in the supplied
79a0: 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20   DString.. *. * 
79b0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
79c0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7a10: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54   */.static int.T
7a20: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  lsGetOptionProc(
7a30: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
7a40: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a  instanceData,./*
7a50: 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a   Socket state. *
7a60: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  /.    Tcl_Interp
7a70: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f   *interp,../* Fo
7a80: 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62  r errors - can b
7a90: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63  e NULL. */.    c
7aa0: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f  onst char *optio
7ab0: 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f  nName,./* Name o
7ac0: 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20  f the option to 
7ad0: 72 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c  retrieve the val
7ae0: 75 65 20 66 6f 72 2c 0a 09 09 09 09 20 2a 20 6f  ue for,..... * o
7af0: 72 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c  r NULL to get al
7b00: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68  l options and th
7b10: 65 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20  eir values. */. 
7b20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a     Tcl_DString *
7b30: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20  optionValue)./* 
7b40: 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74  Where to store t
7b50: 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75  he computed valu
7b60: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
7b70: 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20   caller. */.{.  
7b80: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
7b90: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e  r = (State *) in
7ba0: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20  stanceData;.    
7bb0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65  Tcl_Channel pare
7bc0: 6e 74 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65  nt = Tls_GetPare
7bd0: 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53  nt(statePtr, TLS
7be0: 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a  _TCL_FASTPATH);.
7bf0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65      Tcl_DriverGe
7c00: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74  tOptionProc *get
7c10: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20  OptionProc;..   
7c20: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
7c30: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 61 73 73  ");..    /* Pass
7c40: 20 74 6f 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20   to parent */.  
7c50: 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20    getOptionProc 
7c60: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74  = Tcl_ChannelGet
7c70: 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47  OptionProc(Tcl_G
7c80: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61  etChannelType(pa
7c90: 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28  rent));.    if (
7ca0: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d  getOptionProc !=
7cb0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
7cc0: 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63   (*getOptionProc
7cd0: 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  )(Tcl_GetChannel
7ce0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72  InstanceData(par
7cf0: 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 0a 09 20  ent), interp,.. 
7d00: 20 20 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f     optionName, o
7d10: 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20  ptionValue);.   
7d20: 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69   } else if (opti
7d30: 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a  onName == (char*
7d40: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20  ) NULL) {../*.. 
7d50: 2a 20 52 65 71 75 65 73 74 20 69 73 20 71 75 65  * Request is que
7d60: 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f  ry for all optio
7d70: 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a  ns, this is ok..
7d80: 09 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c  . */..return TCL
7d90: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  _OK;.    }.    /
7da0: 2a 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73 74  *.     * Request
7db0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
7dc0: 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61  option has to fa
7dd0: 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76  il, we don't hav
7de0: 65 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20  e any..     */. 
7df0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61     return Tcl_Ba
7e00: 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  dChannelOption(i
7e10: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d  nterp, optionNam
7e20: 65 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  e, "");.}../*. *
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a  -------------. *
7e80: 0a 20 2a 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61  . * TlsChannelHa
7e90: 6e 64 6c 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a  ndlerTimer --. *
7ea0: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68  . *.Called by th
7eb0: 65 20 6e 6f 74 69 66 69 65 72 20 76 69 61 20 61  e notifier via a
7ec0: 20 74 69 6d 65 72 2c 20 74 6f 20 66 6c 75 73 68   timer, to flush
7ed0: 20 6f 75 74 20 64 61 74 61 20 77 61 69 74 69 6e   out data waitin
7ee0: 67 20 69 6e 0a 20 2a 09 63 68 61 6e 6e 65 6c 20  g in. *.channel 
7ef0: 62 75 66 66 65 72 73 2e 20 63 61 6c 6c 65 64 20  buffers. called 
7f00: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
7f10: 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e 65 76 65  /O layer wheneve
7f20: 72 20 74 68 65 0a 20 2a 09 54 63 6c 5f 47 65 74  r the. *.Tcl_Get
7f30: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 29 20  ChannelHandle() 
7f40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
7f50: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
7f60: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
7f70: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
7f80: 09 43 72 65 61 74 65 73 20 6e 6f 74 69 66 69 63  .Creates notific
7f90: 61 74 69 6f 6e 20 65 76 65 6e 74 2e 0a 20 2a 0a  ation event.. *.
7fa0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7ff0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
8000: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  TlsChannelHandle
8010: 72 54 69 6d 65 72 28 0a 20 20 20 20 43 6c 69 65  rTimer(.    Clie
8020: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
8030: 61 29 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61  a)./* Socket sta
8040: 74 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61  te. */.{.    Sta
8050: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
8060: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
8070: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73  ata;.    int mas
8080: 6b 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 77 61  k = statePtr->wa
8090: 6e 74 3b 20 2f 2a 20 49 6e 69 74 20 74 6f 20 53  nt; /* Init to S
80a0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
80b0: 41 44 20 61 6e 64 20 53 53 4c 5f 45 52 52 4f 52  AD and SSL_ERROR
80c0: 5f 57 41 4e 54 5f 57 52 49 54 45 20 2a 2f 0a 0a  _WANT_WRITE */..
80d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
80e0: 6c 65 64 20 77 69 74 68 20 6d 61 73 6b 20 30 78  led with mask 0x
80f0: 25 30 32 78 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20  %02x", mask);.. 
8100: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d     statePtr->tim
8110: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
8120: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20  oken) NULL;..   
8130: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 6d   /* Check for am
8140: 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 70 65 6e  ount of data pen
8150: 64 69 6e 67 20 69 6e 20 49 4f 20 6f 72 20 42 49  ding in IO or BI
8160: 4f 20 77 72 69 74 65 20 62 75 66 66 65 72 20 2a  O write buffer *
8170: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 4f 75  /.    if (Tcl_Ou
8180: 74 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61  tputBuffered(sta
8190: 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 7c 7c 20  tePtr->self) || 
81a0: 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61  BIO_wpending(sta
81b0: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09  tePtr->bio)) {..
81c0: 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25  dprintf("[chan=%
81d0: 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c 65 22  p] BIO writable"
81e0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
81f0: 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c  );...mask |= TCL
8200: 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d  _WRITABLE;.    }
8210: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
8220: 6f 72 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74  or amount of dat
8230: 61 20 70 65 6e 64 69 6e 67 20 69 6e 20 49 4f 20  a pending in IO 
8240: 6f 72 20 42 49 4f 20 72 65 61 64 20 62 75 66 66  or BIO read buff
8250: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63  er */.    if (Tc
8260: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28  l_InputBuffered(
8270: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20  statePtr->self) 
8280: 7c 7c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73  || BIO_pending(s
8290: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b  tatePtr->bio)) {
82a0: 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e  ..dprintf("[chan
82b0: 3d 25 70 5d 20 42 49 4f 20 72 65 61 64 61 62 6c  =%p] BIO readabl
82c0: 65 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  e", statePtr->se
82d0: 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54  lf);...mask |= T
82e0: 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20 20  CL_READABLE;.   
82f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 66   }..    /* Notif
8300: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
8310: 20 6c 61 79 65 72 20 74 68 61 74 20 6d 61 73 6b   layer that mask
8320: 20 65 76 65 6e 74 73 20 68 61 76 65 20 6f 63 63   events have occ
8330: 75 72 72 65 64 20 6f 6e 20 74 68 65 20 63 68 61  urred on the cha
8340: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 64 70 72 69  nnel */.    dpri
8350: 6e 74 66 28 22 4e 6f 74 69 66 79 69 6e 67 20 6f  ntf("Notifying o
8360: 75 72 73 65 6c 76 65 73 20 77 69 74 68 20 6d 61  urselves with ma
8370: 73 6b 3d 25 64 22 2c 20 6d 61 73 6b 29 3b 0a 20  sk=%d", mask);. 
8380: 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61     Tcl_NotifyCha
8390: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73  nnel(statePtr->s
83a0: 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20  elf, mask);.    
83b0: 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 3d  statePtr->want =
83c0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   0;.    return;.
83d0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8420: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57  -----. *. * TlsW
8430: 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  atchProc --. *. 
8440: 2a 09 53 65 74 20 75 70 20 74 68 65 20 65 76 65  *.Set up the eve
8450: 6e 74 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77  nt notifier to w
8460: 61 74 63 68 20 66 6f 72 20 65 76 65 6e 74 73 20  atch for events 
8470: 6f 66 20 69 6e 74 65 72 65 73 74 20 66 72 6f 6d  of interest from
8480: 20 74 68 69 73 0a 20 2a 09 63 68 61 6e 6e 65 6c   this. *.channel
8490: 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  . Called by the 
84a0: 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65  generic I/O laye
84b0: 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 75  r whenever the u
84c0: 73 65 72 20 28 6f 72 20 74 68 65 0a 20 2a 09 73  ser (or the. *.s
84d0: 79 73 74 65 6d 29 20 61 6e 6e 6f 75 6e 63 65 73  ystem) announces
84e0: 20 69 74 73 20 28 64 69 73 29 69 6e 74 65 72 65   its (dis)intere
84f0: 73 74 20 69 6e 20 65 76 65 6e 74 73 20 6f 6e 20  st in events on 
8500: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69  the channel. Thi
8510: 73 20 69 73 0a 20 2a 09 63 61 6c 6c 65 64 20 72  s is. *.called r
8520: 65 70 65 61 74 65 64 6c 79 2e 0a 20 2a 0a 20 2a  epeatedly.. *. *
8530: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
8540: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
8550: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 75  fects:. *.Sets u
8560: 70 20 74 68 65 20 74 69 6d 65 2d 62 61 73 65 64  p the time-based
8570: 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 74 68 61   notifier so tha
8580: 74 20 66 75 74 75 72 65 20 65 76 65 6e 74 73 20  t future events 
8590: 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20  on the channel. 
85a0: 2a 09 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62  *.will be seen b
85b0: 79 20 54 43 4c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  y TCL.. *. *----
85c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
8610: 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 57 61 74  atic void.TlsWat
8620: 63 68 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65  chProc(.    Clie
8630: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
8640: 61 74 61 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69  ata,./* Connecti
8650: 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f  on state info */
8660: 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09  .    int mask)..
8670: 09 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e  ./* Events of in
8680: 74 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64  terest; an OR-ed
8690: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
86a0: 09 09 09 09 20 2a 20 54 43 4c 5f 52 45 41 44 41  .... * TCL_READA
86b0: 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c  BLE, TCL_WRITABL
86c0: 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54  E and TCL_EXCEPT
86d0: 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63  ION. */.{.    Tc
86e0: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74  l_Channel parent
86f0: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  ;.    State *sta
8700: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
8710: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
8720: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61      Tcl_DriverWa
8730: 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72  tchProc *watchPr
8740: 6f 63 3b 0a 20 20 20 20 69 6e 74 20 70 65 6e 64  oc;.    int pend
8750: 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70  ing = 0;..    dp
8760: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 77 69  rintf("Called wi
8770: 74 68 20 6d 61 73 6b 20 30 78 25 30 32 78 22 2c  th mask 0x%02x",
8780: 20 6d 61 73 6b 29 3b 0a 20 20 20 20 64 70 72 69   mask);.    dpri
8790: 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 72  ntFlags(statePtr
87a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74  );..    /* Abort
87b0: 20 69 66 20 74 68 65 20 75 73 65 72 20 76 65 72   if the user ver
87c0: 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ify callback is 
87d0: 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f  still running to
87e0: 20 61 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e   avoid triggerin
87f0: 67 0a 20 20 20 20 20 2a 20 61 6e 6f 74 68 65 72  g.     * another
8800: 20 63 61 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   call before the
8810: 20 63 75 72 72 65 6e 74 20 6f 6e 65 20 69 73 20   current one is 
8820: 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20  complete. */.   
8830: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
8840: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43  lags & TLS_TCL_C
8850: 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69  ALLBACK) {..dpri
8860: 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73  ntf("Callback is
8870: 20 6f 6e 2d 67 6f 69 6e 67 2c 20 64 6f 69 6e 67   on-going, doing
8880: 20 6e 6f 74 68 69 6e 67 22 29 3b 0a 09 72 65 74   nothing");..ret
8890: 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  urn;.    }..    
88a0: 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f 47 65 74  parent = Tls_Get
88b0: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c  Parent(statePtr,
88c0: 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54   TLS_TCL_FASTPAT
88d0: 48 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  H);..    if (sta
88e0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
88f0: 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45  LS_TCL_HANDSHAKE
8900: 5f 46 41 49 4c 45 44 29 20 7b 0a 09 64 70 72 69  _FAILED) {..dpri
8910: 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 77 61  ntf("Asked to wa
8920: 74 63 68 20 61 20 73 6f 63 6b 65 74 20 77 69 74  tch a socket wit
8930: 68 20 61 20 66 61 69 6c 65 64 20 68 61 6e 64 73  h a failed hands
8940: 68 61 6b 65 20 2d 2d 20 6e 6f 74 68 69 6e 67 20  hake -- nothing 
8950: 63 61 6e 20 68 61 70 70 65 6e 20 68 65 72 65 22  can happen here"
8960: 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 55 6e 72  );..dprintf("Unr
8970: 65 67 69 73 74 65 72 69 6e 67 20 69 6e 74 65 72  egistering inter
8980: 65 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72  est in the lower
8990: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 0a 09 77 61   channel");...wa
89a0: 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68  tchProc = Tcl_Ch
89b0: 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54  annelWatchProc(T
89c0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
89d0: 65 28 70 61 72 65 6e 74 29 29 3b 0a 09 77 61 74  e(parent));..wat
89e0: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  chProc(Tcl_GetCh
89f0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
8a00: 61 28 70 61 72 65 6e 74 29 2c 20 30 29 3b 0a 09  a(parent), 0);..
8a10: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d  statePtr->watchM
8a20: 61 73 6b 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  ask = 0;..return
8a30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61  ;.    }..    sta
8a40: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
8a50: 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a   = mask;..    /*
8a60: 0a 20 20 20 20 20 2a 20 4e 6f 20 63 68 61 6e 6e  .     * No chann
8a70: 65 6c 20 68 61 6e 64 6c 65 72 73 20 61 6e 79 20  el handlers any 
8a80: 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c 20 62 65  more. We will be
8a90: 20 6e 6f 74 69 66 69 65 64 20 61 75 74 6f 6d 61   notified automa
8aa0: 74 69 63 61 6c 6c 79 20 61 62 6f 75 74 0a 20 20  tically about.  
8ab0: 20 20 20 2a 20 65 76 65 6e 74 73 20 6f 6e 20 74     * events on t
8ac0: 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77  he channel below
8ad0: 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f   via a call to o
8ae0: 75 72 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74  ur 'TransformNot
8af0: 69 66 79 50 72 6f 63 27 2e 20 42 75 74 0a 20 20  ifyProc'. But.  
8b00: 20 20 20 2a 20 77 65 20 68 61 76 65 20 74 6f 20     * we have to 
8b10: 70 61 73 73 20 74 68 65 20 69 6e 74 65 72 65 73  pass the interes
8b20: 74 20 64 6f 77 6e 20 6e 6f 77 2e 20 57 65 20 61  t down now. We a
8b30: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64  re allowed to ad
8b40: 64 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  d additional.   
8b50: 20 20 2a 20 27 69 6e 74 65 72 65 73 74 27 20 74    * 'interest' t
8b60: 6f 20 74 68 65 20 6d 61 73 6b 20 69 66 20 77 65  o the mask if we
8b70: 20 77 61 6e 74 20 74 6f 2c 20 62 75 74 20 74 68   want to, but th
8b80: 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  is transformatio
8b90: 6e 20 68 61 73 20 6e 6f 0a 20 20 20 20 20 2a 20  n has no.     * 
8ba0: 73 75 63 68 20 69 6e 74 65 72 65 73 74 2e 20 49  such interest. I
8bb0: 74 20 6a 75 73 74 20 70 61 73 73 65 73 20 74 68  t just passes th
8bc0: 65 20 72 65 71 75 65 73 74 20 64 6f 77 6e 2c 20  e request down, 
8bd0: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  unchanged..     
8be0: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  */.    dprintf("
8bf0: 52 65 67 69 73 74 65 72 69 6e 67 20 6f 75 72 20  Registering our 
8c00: 69 6e 74 65 72 65 73 74 20 69 6e 20 74 68 65 20  interest in the 
8c10: 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 20 28 63  lower channel (c
8c20: 68 61 6e 3d 25 70 29 22 2c 20 28 76 6f 69 64 20  han=%p)", (void 
8c30: 2a 29 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  *) parent);.    
8c40: 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f  watchProc = Tcl_
8c50: 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63  ChannelWatchProc
8c60: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
8c70: 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20  ype(parent));.  
8c80: 20 20 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f    watchProc(Tcl_
8c90: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
8ca0: 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20  ceData(parent), 
8cb0: 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mask);..    /* D
8cc0: 6f 20 77 65 20 68 61 76 65 20 61 6e 79 20 70 65  o we have any pe
8cd0: 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  nding data */.  
8ce0: 20 20 70 65 6e 64 69 6e 67 20 3d 20 28 73 74 61    pending = (sta
8cf0: 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 7c 20 5c  tePtr->want || \
8d00: 0a 09 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52  ..((mask & TCL_R
8d10: 45 41 44 41 42 4c 45 29 20 26 26 20 28 28 54 63  EADABLE) && ((Tc
8d20: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28  l_InputBuffered(
8d30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20  statePtr->self) 
8d40: 3e 20 30 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72  > 0) || (BIO_ctr
8d50: 6c 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50  l_pending(stateP
8d60: 74 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29 29 20  tr->bio) > 0))) 
8d70: 7c 7c 0a 09 28 28 6d 61 73 6b 20 26 20 54 43 4c  ||..((mask & TCL
8d80: 5f 57 52 49 54 41 42 4c 45 29 20 26 26 20 28 28  _WRITABLE) && ((
8d90: 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72  Tcl_OutputBuffer
8da0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
8db0: 66 29 20 3e 20 30 29 20 7c 7c 20 28 42 49 4f 5f  f) > 0) || (BIO_
8dc0: 63 74 72 6c 5f 77 70 65 6e 64 69 6e 67 28 73 74  ctrl_wpending(st
8dd0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 3e 20 30  atePtr->bio) > 0
8de0: 29 29 29 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ))));..    dprin
8df0: 74 66 28 22 49 4f 20 57 61 6e 74 3d 25 64 2c 20  tf("IO Want=%d, 
8e00: 69 6e 70 75 74 20 62 75 66 66 65 72 3d 25 64 2c  input buffer=%d,
8e10: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 3d 25   output buffer=%
8e20: 64 2c 20 42 49 4f 20 70 65 6e 64 69 6e 67 3d 25  d, BIO pending=%
8e30: 7a 64 2c 20 42 49 4f 20 77 70 65 6e 64 69 6e 67  zd, BIO wpending
8e40: 3d 25 7a 64 2c 20 70 65 6e 64 69 6e 67 3d 25 64  =%zd, pending=%d
8e50: 22 2c 20 5c 0a 09 73 74 61 74 65 50 74 72 2d 3e  ", \..statePtr->
8e60: 77 61 6e 74 2c 20 54 63 6c 5f 49 6e 70 75 74 42  want, Tcl_InputB
8e70: 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72  uffered(statePtr
8e80: 2d 3e 73 65 6c 66 29 2c 20 54 63 6c 5f 4f 75 74  ->self), Tcl_Out
8e90: 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74  putBuffered(stat
8ea0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 5c 0a 09  ePtr->self), \..
8eb0: 42 49 4f 5f 63 74 72 6c 5f 70 65 6e 64 69 6e 67  BIO_ctrl_pending
8ec0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c  (statePtr->bio),
8ed0: 20 42 49 4f 5f 63 74 72 6c 5f 77 70 65 6e 64 69   BIO_ctrl_wpendi
8ee0: 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ng(statePtr->bio
8ef0: 29 2c 20 70 65 6e 64 69 6e 67 29 3b 0a 0a 20 20  ), pending);..  
8f00: 20 20 2f 2a 20 53 63 68 65 64 75 6c 65 20 6e 65    /* Schedule ne
8f10: 78 74 20 65 76 65 6e 74 20 69 66 20 64 61 74 61  xt event if data
8f20: 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 6f 74 68   is pending, oth
8f30: 65 72 77 69 73 65 20 63 65 61 73 65 20 65 76 65  erwise cease eve
8f40: 6e 74 73 20 66 6f 72 20 6e 6f 77 20 2a 2f 0a 20  nts for now */. 
8f50: 20 20 20 69 66 20 28 21 28 6d 61 73 6b 20 26 20     if (!(mask & 
8f60: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 7c 7c  TCL_READABLE) ||
8f70: 20 70 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b   pending == 0) {
8f80: 0a 09 2f 2a 20 52 65 6d 6f 76 65 20 74 69 6d 65  ../* Remove time
8f90: 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 09 69 66  r, if any */..if
8fa0: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
8fb0: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
8fc0: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 20  oken) NULL) {.. 
8fd0: 20 20 20 64 70 72 69 6e 74 66 28 22 41 20 74 69     dprintf("A ti
8fe0: 6d 65 72 20 77 61 73 20 66 6f 75 6e 64 2c 20 64  mer was found, d
8ff0: 65 6c 65 74 69 6e 67 20 69 74 22 29 3b 0a 09 20  eleting it");.. 
9000: 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d     Tcl_DeleteTim
9010: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
9020: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 20 20 20  tr->timer);..   
9030: 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72   statePtr->timer
9040: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b   = (Tcl_TimerTok
9050: 65 6e 29 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20 20  en) NULL;..}..  
9060: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 41    } else {../* A
9070: 64 64 20 74 69 6d 65 72 2c 20 69 66 20 6e 6f 6e  dd timer, if non
9080: 65 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50  e */..if (stateP
9090: 74 72 2d 3e 74 69 6d 65 72 20 3d 3d 20 28 54 63  tr->timer == (Tc
90a0: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
90b0: 4c 4c 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  LL) {..    dprin
90c0: 74 66 28 22 43 72 65 61 74 69 6e 67 20 61 20 6e  tf("Creating a n
90d0: 65 77 20 74 69 6d 65 72 20 73 69 6e 63 65 20 64  ew timer since d
90e0: 61 74 61 20 61 70 70 65 61 72 73 20 74 6f 20 62  ata appears to b
90f0: 65 20 77 61 69 74 69 6e 67 22 29 3b 0a 09 20 20  e waiting");..  
9100: 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65    statePtr->time
9110: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69  r = Tcl_CreateTi
9120: 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54  merHandler(TLS_T
9130: 43 4c 5f 44 45 4c 41 59 2c 20 54 6c 73 43 68 61  CL_DELAY, TlsCha
9140: 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72  nnelHandlerTimer
9150: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
9160: 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20  tatePtr);..}.   
9170: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d   }.}../*. *-----
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 54  --------. *. * T
91d0: 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 20  lsGetHandleProc 
91e0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
91f0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
9200: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
9210: 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 72 65  c IO level to re
9220: 74 72 69 65 76 65 20 61 6e 20 4f 53 0a 20 2a 09  trieve an OS. *.
9230: 73 70 65 63 69 66 69 63 20 68 61 6e 64 6c 65 20  specific handle 
9240: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9250: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74  the channel. Not
9260: 20 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66   used for transf
9270: 6f 72 6d 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  orms.. *. * Resu
9280: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 70 70 72  lts:. *.The appr
9290: 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69 6c 65  opriate Tcl_File
92a0: 20 68 61 6e 64 6c 65 20 6f 72 20 4e 55 4c 4c 20   handle or NULL 
92b0: 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53  if none.. *. * S
92c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
92d0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
9330: 74 69 63 20 69 6e 74 20 54 6c 73 47 65 74 48 61  tic int TlsGetHa
9340: 6e 64 6c 65 50 72 6f 63 28 0a 20 20 20 20 43 6c  ndleProc(.    Cl
9350: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
9360: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74  eData,./* Socket
9370: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69   state. */.    i
9380: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 09 09 2f  nt direction,../
9390: 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f  * TCL_READABLE o
93a0: 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 2a  r TCL_WRITABLE *
93b0: 2f 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61  /.    ClientData
93c0: 20 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20   *handlePtr)./* 
93d0: 48 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  Handle associate
93e0: 64 20 77 69 74 68 20 74 68 65 20 63 68 61 6e 6e  d with the chann
93f0: 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74  el */.{.    Stat
9400: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
9410: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65  tate *) instance
9420: 44 61 74 61 3b 0a 0a 20 20 20 20 72 65 74 75 72  Data;..    retur
9430: 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  n Tcl_GetChannel
9440: 48 61 6e 64 6c 65 28 54 6c 73 5f 47 65 74 50 61  Handle(Tls_GetPa
9450: 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54  rent(statePtr, T
9460: 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29  LS_TCL_FASTPATH)
9470: 2c 0a 09 64 69 72 65 63 74 69 6f 6e 2c 20 68 61  ,..direction, ha
9480: 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a  ndlePtr);.}../*.
9490: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
94e0: 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50   *. * TlsNotifyP
94f0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
9500: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
9510: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65  nvoked by the ge
9520: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74  neric IO level t
9530: 6f 20 6e 6f 74 69 66 79 20 74 68 65 20 63 68 61  o notify the cha
9540: 6e 6e 65 6c 0a 20 2a 09 74 68 61 74 20 61 6e 20  nnel. *.that an 
9550: 65 76 65 6e 74 20 68 61 73 20 6f 63 63 75 72 72  event has occurr
9560: 65 64 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c  ed on the underl
9570: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 49 74  ying channel. It
9580: 20 69 73 20 75 73 65 64 20 62 79 0a 20 2a 09 73   is used by. *.s
9590: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 64  tacked channel d
95a0: 72 69 76 65 72 73 20 74 68 61 74 20 77 69 73 68  rivers that wish
95b0: 20 74 6f 20 62 65 20 6e 6f 74 69 66 69 65 64 20   to be notified 
95c0: 6f 66 20 65 76 65 6e 74 73 20 74 68 61 74 20 6f  of events that o
95d0: 63 63 75 72 0a 20 2a 09 6f 6e 20 74 68 65 20 75  ccur. *.on the u
95e0: 6e 64 65 72 6c 79 69 6e 67 20 28 73 74 61 63 6b  nderlying (stack
95f0: 65 64 29 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  ed) channel.. *.
9600: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
9610: 79 70 65 20 6f 66 20 65 76 65 6e 74 20 6f 72 20  ype of event or 
9620: 30 20 69 66 20 66 61 69 6c 65 64 0a 20 2a 0a 20  0 if failed. *. 
9630: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
9640: 20 2a 09 4d 61 79 20 70 72 6f 63 65 73 73 20 74   *.May process t
9650: 68 65 20 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e  he incoming even
9660: 74 20 62 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a  t by itself.. *.
9670: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
9680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
96a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
96b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
96c0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
96d0: 6c 73 4e 6f 74 69 66 79 50 72 6f 63 28 0a 20 20  lsNotifyProc(.  
96e0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
96f0: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f  tanceData,./* So
9700: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20  cket state. */. 
9710: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f     int mask).../
9720: 2a 20 74 79 70 65 20 6f 66 20 65 76 65 6e 74 20  * type of event 
9730: 74 68 61 74 20 6f 63 63 75 72 72 65 64 3a 20 4f  that occurred: O
9740: 52 2d 65 64 0a 09 09 09 09 20 2a 20 63 6f 6d 62  R-ed..... * comb
9750: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52  ination of TCL_R
9760: 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57  EADABLE or TCL_W
9770: 52 49 54 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20  RITABLE */.{.   
9780: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
9790: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
97a0: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69  tanceData;.    i
97b0: 6e 74 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30  nt errorCode = 0
97c0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
97d0: 43 61 6c 6c 65 64 20 77 69 74 68 20 6d 61 73 6b  Called with mask
97e0: 20 30 78 25 30 32 78 22 2c 20 6d 61 73 6b 29 3b   0x%02x", mask);
97f0: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
9800: 66 20 74 68 65 20 75 73 65 72 20 76 65 72 69 66  f the user verif
9810: 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74  y callback is st
9820: 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61  ill running to a
9830: 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e 67 0a  void triggering.
9840: 20 20 20 20 20 2a 20 61 6e 6f 74 68 65 72 20 63       * another c
9850: 61 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 63  all before the c
9860: 75 72 72 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f  urrent one is co
9870: 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69  mplete. */.    i
9880: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  f (statePtr->fla
9890: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c  gs & TLS_TCL_CAL
98a0: 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74  LBACK) {..dprint
98b0: 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f  f("Callback is o
98c0: 6e 2d 67 6f 69 6e 67 2c 20 72 65 74 75 72 6e 69  n-going, returni
98d0: 6e 67 20 66 61 69 6c 65 64 22 29 3b 0a 09 72 65  ng failed");..re
98e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
98f0: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69     /* If not ini
9900: 74 69 61 6c 69 7a 65 64 2c 20 64 6f 20 63 6f 6e  tialized, do con
9910: 6e 65 63 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  nect */.    if (
9920: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
9930: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20  & TLS_TCL_INIT) 
9940: 7b 0a 09 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63  {..int tlsConnec
9950: 74 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61  t;...dprintf("Ca
9960: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f  lling Tls_WaitFo
9970: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c  rConnect");...tl
9980: 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57  sConnect = Tls_W
9990: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
99a0: 61 74 65 50 74 72 2c 20 26 65 72 72 6f 72 43 6f  atePtr, &errorCo
99b0: 64 65 2c 20 31 29 3b 0a 09 69 66 20 28 74 6c 73  de, 1);..if (tls
99c0: 43 6f 6e 6e 65 63 74 20 3c 20 31 29 20 7b 0a 09  Connect < 1) {..
99d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
99e0: 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e   an error waitin
99f0: 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c  g to connect (tl
9a00: 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a  sConnect = %i, *
9a10: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25  errorCodePtr = %
9a20: 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c  i)", tlsConnect,
9a30: 20 65 72 72 6f 72 43 6f 64 65 29 3b 0a 09 20 20   errorCode);..  
9a40: 20 20 69 66 20 28 65 72 72 6f 72 43 6f 64 65 20    if (errorCode 
9a50: 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 09 64  == EAGAIN) {...d
9a60: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 66 6c  printf("Async fl
9a70: 61 67 20 63 6f 75 6c 64 20 62 65 20 73 65 74 20  ag could be set 
9a80: 28 64 69 64 6e 27 74 20 63 68 65 63 6b 29 20 61  (didn't check) a
9a90: 6e 64 20 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20  nd errorCode == 
9aa0: 45 41 47 41 49 4e 3a 20 20 52 65 74 75 72 6e 69  EAGAIN:  Returni
9ab0: 6e 67 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 09  ng failed");....
9ac0: 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d  return 0;..    }
9ad0: 0a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  ...    dprintf("
9ae0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
9af0: 63 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  ct returned an e
9b00: 72 72 6f 72 22 29 3b 0a 09 7d 0a 20 20 20 20 7d  rror");..}.    }
9b10: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
9b20: 44 65 6c 65 74 65 20 61 6e 20 65 78 69 73 74 69  Delete an existi
9b30: 6e 67 20 74 69 6d 65 72 2e 20 49 74 20 77 61 73  ng timer. It was
9b40: 20 6e 6f 74 20 66 69 72 65 64 2c 20 79 65 74 20   not fired, yet 
9b50: 77 65 20 61 72 65 20 68 65 72 65 2c 20 73 6f 20  we are here, so 
9b60: 74 68 65 0a 20 20 20 20 20 2a 20 63 68 61 6e 6e  the.     * chann
9b70: 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  el below generat
9b80: 65 64 20 73 75 63 68 20 61 6e 20 65 76 65 6e 74  ed such an event
9b90: 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 68 61   and we don't ha
9ba0: 76 65 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77  ve to. The renew
9bb0: 61 6c 0a 20 20 20 20 20 2a 20 6f 66 20 74 68 65  al.     * of the
9bc0: 20 69 6e 74 65 72 65 73 74 20 61 66 74 65 72 20   interest after 
9bd0: 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
9be0: 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72   channel handler
9bf0: 73 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  s will eventuall
9c00: 79 0a 20 20 20 20 20 2a 20 63 61 75 73 65 20 75  y.     * cause u
9c10: 73 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  s to recreate th
9c20: 65 20 74 69 6d 65 72 20 28 69 6e 20 54 6c 73 57  e timer (in TlsW
9c30: 61 74 63 68 50 72 6f 63 29 2e 0a 20 20 20 20 20  atchProc)..     
9c40: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
9c50: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54  Ptr->timer != (T
9c60: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
9c70: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65  ULL) {..Tcl_Dele
9c80: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73  teTimerHandler(s
9c90: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b  tatePtr->timer);
9ca0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
9cb0: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f  r = (Tcl_TimerTo
9cc0: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ken) NULL;.    }
9cd0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
9ce0: 41 6e 20 65 76 65 6e 74 20 6f 63 63 75 72 72 65  An event occurre
9cf0: 64 20 69 6e 20 74 68 65 20 75 6e 64 65 72 6c 79  d in the underly
9d00: 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69  ing channel. Thi
9d10: 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
9d20: 20 64 6f 65 73 6e 27 74 0a 20 20 20 20 20 2a 20   doesn't.     * 
9d30: 70 72 6f 63 65 73 73 20 73 75 63 68 20 65 76 65  process such eve
9d40: 6e 74 73 20 74 68 75 73 20 72 65 74 75 72 6e 73  nts thus returns
9d50: 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 6d 61   the incoming ma
9d60: 73 6b 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  sk unchanged..  
9d70: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74     */.    dprint
9d80: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  f("Returning %i"
9d90: 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 72 65 74  , mask);.    ret
9da0: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  urn mask;.}../*.
9db0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
9dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9e00: 20 2a 0a 20 2a 20 54 6c 73 5f 43 68 61 6e 6e 65   *. * Tls_Channe
9e10: 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 44  lType --. *. *.D
9e20: 65 66 69 6e 65 73 20 74 68 65 20 63 6f 72 72 65  efines the corre
9e30: 63 74 20 54 4c 53 20 63 68 61 6e 6e 65 6c 20 64  ct TLS channel d
9e40: 72 69 76 65 72 20 68 61 6e 64 6c 65 72 73 20 66  river handlers f
9e50: 6f 72 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 20  or this channel 
9e60: 74 79 70 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  type.. *. * Resu
9e70: 6c 74 73 3a 0a 20 2a 09 54 63 6c 5f 43 68 61 6e  lts:. *.Tcl_Chan
9e80: 6e 65 6c 54 79 70 65 20 73 74 72 75 63 74 75 72  nelType structur
9e90: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
9ea0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
9eb0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f00: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  --. */.static co
9f10: 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54  nst Tcl_ChannelT
9f20: 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79  ype tlsChannelTy
9f30: 70 65 20 3d 20 7b 0a 20 20 20 20 22 74 6c 73 22  pe = {.    "tls"
9f40: 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65  ,.../* Type name
9f50: 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e   */.    TCL_CHAN
9f60: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f  NEL_VERSION_5,./
9f70: 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  * v5 channel */.
9f80: 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63      TlsCloseProc
9f90: 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63  ,../* Close proc
9fa0: 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74   */.    TlsInput
9fb0: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20  Proc,../* Input 
9fc0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4f  proc */.    TlsO
9fd0: 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f  utputProc,../* O
9fe0: 75 74 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20  utput proc */.  
9ff0: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65    NULL,.../* See
a000: 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c  k proc */.    Tl
a010: 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09  sSetOptionProc,.
a020: 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20 70  ./* Set option p
a030: 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65  roc */.    TlsGe
a040: 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a  tOptionProc,../*
a050: 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63   Get option proc
a060: 20 2a 2f 0a 20 20 20 20 54 6c 73 57 61 74 63 68   */.    TlsWatch
a070: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61  Proc,../* Initia
a080: 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f  lize notifier */
a090: 0a 20 20 20 20 54 6c 73 47 65 74 48 61 6e 64 6c  .    TlsGetHandl
a0a0: 65 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 4f  eProc,../* Get O
a0b0: 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66  S handles out of
a0c0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
a0d0: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09  TlsClose2Proc,..
a0e0: 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f  /* close2proc */
a0f0: 0a 20 20 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64  .    TlsBlockMod
a100: 65 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20 62  eProc,../* Set b
a110: 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b  locking/nonblock
a120: 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e  ing mode*/.    N
a130: 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20  ULL,.../* Flush 
a140: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4e  proc */.    TlsN
a150: 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48  otifyProc,../* H
a160: 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74  andling of event
a170: 73 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f  s bubbling up */
a180: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20  .    NULL,.../* 
a190: 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a  Wide seek proc *
a1a0: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  /.    NULL,.../*
a1b0: 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e 20 2a   Thread action *
a1c0: 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20  /.    NULL.../* 
a1d0: 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a  Truncate */.};..
a1e0: 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65  const Tcl_Channe
a1f0: 6c 54 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e  lType *Tls_Chann
a200: 65 6c 54 79 70 65 28 76 6f 69 64 29 20 7b 0a 20  elType(void) {. 
a210: 20 20 20 72 65 74 75 72 6e 20 26 74 6c 73 43 68     return &tlsCh
a220: 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d 0a           annelType;.}.