Hex Artifact Content

Artifact cfc491fa0ce6d9baa19eb5e7e708645a3ab232cbd624bbac6ba849bfe9fd5d66:


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 2d  yright (C) 2024-
00f0: 32 30 32 35 20 42 72 69 61 6e 20 4f 27 48 61 67  2025 Brian O'Hag
0100: 61 6e 0a 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f  an. *. * Additio
0110: 6e 61 6c 20 63 72 65 64 69 74 20 69 73 20 64 75  nal credit is du
0120: 65 20 66 6f 72 20 41 6e 64 72 65 61 73 20 4b 75  e for Andreas Ku
0130: 70 72 69 65 73 20 28 61 2e 6b 75 70 72 69 65 73  pries (a.kupries
0140: 40 77 65 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 66  @westend.com), f
0150: 6f 72 0a 20 2a 20 70 72 6f 76 69 64 69 6e 67 20  or. * providing 
0160: 74 68 65 20 54 63 6c 5f 52 65 70 6c 61 63 65 43  the Tcl_ReplaceC
0170: 68 61 6e 6e 65 6c 20 6d 65 63 68 61 6e 69 73 6d  hannel mechanism
0180: 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 63 6c 6f   and working clo
0190: 73 65 6c 79 20 77 69 74 68 20 6d 65 0a 20 2a 20  sely with me. * 
01a0: 74 6f 20 65 6e 68 61 6e 63 65 20 69 74 20 74 6f  to enhance it to
01b0: 20 73 75 70 70 6f 72 74 20 66 75 6c 6c 20 66 69   support full fi
01c0: 6c 65 65 76 65 6e 74 20 73 65 6d 61 6e 74 69 63  leevent semantic
01d0: 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f  s.. *. * Also wo
01e0: 72 6b 20 64 6f 6e 65 20 62 79 20 74 68 65 20 66  rk done by the f
01f0: 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 20 70 72 6f  ollow people pro
0200: 76 69 64 65 64 20 74 68 65 20 69 6d 70 65 74 75  vided the impetu
0210: 73 20 74 6f 20 64 6f 20 74 68 69 73 20 22 72 69  s to do this "ri
0220: 67 68 74 22 3a 0a 20 2a 09 74 63 6c 53 53 4c 20  ght":. *.tclSSL 
0230: 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b  (Colin McCormack
0240: 2c 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c  , Shared Technol
0250: 6f 67 79 29 0a 20 2a 09 53 53 4c 74 63 6c 20 28  ogy). *.SSLtcl (
0260: 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a 20 2a  Peter Antman). *
0270: 0a 20 2a 2f 0a 0a 2f 2a 0a 4e 6f 72 6d 61 6c 0a  . */../*.Normal.
0280: 09 09 74 6c 73 42 49 4f 2e 63 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 2d 2d 2b 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 20 20 2b 2d                +-
02e0: 2d 2d 2b 0a 20 7c 20 20 20 20 20 20 7c 54 63 6c  --+. |      |Tcl
02f0: 5f 57 72 69 74 65 52 61 77 3c 2d 2d 42 69 6f 4f  _WriteRaw<--BioO
0300: 75 74 70 75 74 7c 20 53 53 4c 20 7c 42 49 4f 5f  utput| SSL |BIO_
0310: 77 72 69 74 65 3c 2d 2d 54 6c 73 4f 75 74 70 75  write<--TlsOutpu
0320: 74 50 72 6f 63 20 3c 2d 2d 70 75 74 73 7c 20 20  tProc <--puts|  
0330: 20 7c 0a 20 7c 73 6f 63 6b 65 74 7c 20 20 20 20   |. |socket|    
0340: 20 20 3c 65 6e 63 72 79 70 74 65 64 3e 20 20 20    <encrypted>   
0350: 20 20 20 20 7c 20 42 49 4f 20 7c 20 20 20 20 20      | BIO |     
0360: 20 20 20 20 20 20 20 3c 75 6e 65 6e 63 72 79 70         <unencryp
0370: 74 65 64 3e 20 20 20 20 20 20 20 20 7c 41 70 70  ted>        |App
0380: 7c 0a 20 7c 20 20 20 20 20 20 7c 54 63 6c 5f 52  |. |      |Tcl_R
0390: 65 61 64 52 61 77 20 2d 2d 3e 20 42 69 6f 49 6e  eadRaw --> BioIn
03a0: 70 75 74 7c 20 20 20 20 20 7c 42 49 4f 5f 52 65  put|     |BIO_Re
03b0: 61 64 20 2d 2d 3e 54 6c 73 49 6e 70 75 74 50 72  ad -->TlsInputPr
03c0: 6f 63 20 2d 2d 3e 20 72 65 61 64 7c 20 20 20 7c  oc --> read|   |
03d0: 0a 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20  . +------+      
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03f0: 20 20 2b 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20    +-----+       
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2b 0a            +---+.
0420: 0a 0a 46 61 73 74 20 50 61 74 68 0a 09 09 09 09  ..Fast Path.....
0430: 09 09 74 6c 73 49 4f 2e 63 0a 20 20 2b 2d 2d 2d  ..tlsIO.c.  +---
0440: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20  ---+            
0450: 20 2b 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20   +-----+        
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0470: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
0480: 2d 2d 2b 0a 20 20 7c 20 20 20 20 20 20 7c 3c 2d  --+.  |      |<-
0490: 2d 20 77 72 69 74 65 20 3c 2d 2d 7c 20 53 53 4c  - write <--| SSL
04a0: 20 7c 42 49 4f 5f 77 72 69 74 65 20 3c 2d 2d 20   |BIO_write <-- 
04b0: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 3c 2d  TlsOutputProc <-
04c0: 2d 20 70 75 74 73 7c 20 20 20 20 20 7c 0a 20 20  - puts|     |.  
04d0: 7c 73 6f 63 6b 65 74 7c 20 3c 65 6e 63 72 79 70  |socket| <encryp
04e0: 74 65 64 3e 20 7c 20 42 49 4f 20 7c 20 20 20 20  ted> | BIO |    
04f0: 20 20 20 20 20 20 20 20 3c 75 6e 65 6e 63 72 79          <unencry
0500: 70 74 65 64 3e 20 20 20 20 20 20 20 20 20 20 20  pted>           
0510: 7c 20 41 70 70 20 7c 0a 20 20 7c 20 20 20 20 20  | App |.  |     
0520: 20 7c 2d 2d 3e 20 20 72 65 61 64 20 2d 2d 3e 7c   |-->  read -->|
0530: 20 20 20 20 20 7c 42 49 4f 5f 52 65 61 64 20 20       |BIO_Read  
0540: 2d 2d 3e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63  --> TlsInputProc
0550: 20 2d 2d 3e 20 20 72 65 61 64 7c 20 20 20 20 20   -->  read|     
0560: 7c 0a 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20  |.  +------+    
0570: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2b           +-----+
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 0a 2a 2f 0a 0a      +-----+.*/..
05b0: 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74  #include "tlsInt
05c0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72  .h".#include <er
05d0: 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  rno.h>../*. *---
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0630: 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f   TlsBlockModePro
0640: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
0650: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
0660: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  oked by the gene
0670: 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20  ric IO level to 
0680: 73 65 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  set the channel 
0690: 74 6f 0a 20 2a 09 62 6c 6f 63 6b 69 6e 67 20 6f  to. *.blocking o
06a0: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f  r nonblocking mo
06b0: 64 65 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68  de. Called by th
06c0: 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61  e generic I/O la
06d0: 79 65 72 20 77 68 65 6e 65 76 65 72 0a 20 2a 09  yer whenever. *.
06e0: 74 68 65 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e  the Tcl_SetChann
06f0: 65 6c 4f 70 74 69 6f 6e 28 29 20 66 75 6e 63 74  elOption() funct
0700: 69 6f 6e 20 69 73 20 75 73 65 64 20 77 69 74 68  ion is used with
0710: 20 6f 70 74 69 6f 6e 20 2d 62 6c 6f 63 6b 69 6e   option -blockin
0720: 67 2e 20 45 61 63 68 0a 20 2a 09 73 74 61 63 6b  g. Each. *.stack
0730: 65 64 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6f  ed channel is co
0740: 6e 66 69 67 75 72 65 64 20 69 6e 64 69 76 69 64  nfigured individ
0750: 75 61 6c 6c 79 2e 0a 20 2a 0a 20 2a 20 52 65 73  ually.. *. * Res
0760: 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75  ults:. *.0 if su
0770: 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49  ccessful or POSI
0780: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  X error code if 
0790: 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69  failed.. *. * Si
07a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
07b0: 65 74 73 20 74 68 65 20 64 65 76 69 63 65 20 69  ets the device i
07c0: 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20  nto blocking or 
07d0: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  nonblocking mode
07e0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
0840: 69 6e 74 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65  int TlsBlockMode
0850: 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74  Proc(.    Client
0860: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
0870: 61 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e  a,./* Connection
0880: 20 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20   state info */. 
0890: 20 20 20 69 6e 74 20 6d 6f 64 65 29 09 09 09 2f     int mode).../
08a0: 2a 20 42 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f  * Blocking or no
08b0: 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  n-blocking mode 
08c0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
08d0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
08e0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
08f0: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
0900: 22 43 61 6c 6c 65 64 20 77 69 74 68 20 6d 6f 64  "Called with mod
0910: 65 20 25 64 22 2c 20 6d 6f 64 65 29 3b 0a 0a 20  e %d", mode);.. 
0920: 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54     if (mode == T
0930: 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b  CL_MODE_NONBLOCK
0940: 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72  ING) {..statePtr
0950: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
0960: 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20  CL_ASYNC;.    } 
0970: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72  else {..statePtr
0980: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53  ->flags &= ~(TLS
0990: 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20  _TCL_ASYNC);.   
09a0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
09b0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
0a10: 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a  CloseProc --. *.
0a20: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
0a30: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  e is invoked by 
0a40: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
0a50: 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 20  evel to perform 
0a60: 63 68 61 6e 6e 65 6c 0a 20 2a 09 74 79 70 65 20  channel. *.type 
0a70: 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70  specific cleanup
0a80: 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b   when a SSL sock
0a90: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
0aa0: 20 69 73 20 63 6c 6f 73 65 64 2e 20 43 61 6c 6c   is closed. Call
0ab0: 65 64 0a 20 2a 09 62 79 20 74 68 65 20 67 65 6e  ed. *.by the gen
0ac0: 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77  eric I/O layer w
0ad0: 68 65 6e 65 76 65 72 20 74 68 65 20 54 63 6c 5f  henever the Tcl_
0ae0: 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
0af0: 20 69 73 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 20   is used.. *. * 
0b00: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66  Results:. *.0 if
0b10: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50   successful or P
0b20: 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20  OSIX error code 
0b30: 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a  if failed.. *. *
0b40: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0b50: 2a 09 43 6c 6f 73 65 73 20 74 68 65 20 73 6f 63  *.Closes the soc
0b60: 6b 65 74 20 66 6f 72 20 74 68 65 20 63 68 61 6e  ket for the chan
0b70: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
0bd0: 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 50  ic int TlsCloseP
0be0: 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44  roc(.    ClientD
0bf0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
0c00: 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  ,./* Connection 
0c10: 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20  state info */.  
0c20: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c    TCL_UNUSED(Tcl
0c30: 5f 49 6e 74 65 72 70 20 2a 29 29 09 09 2f 2a 20  _Interp *))../* 
0c40: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20  Tcl interpreter 
0c50: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  to report errors
0c60: 20 74 6f 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61   to */.{.    Sta
0c70: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
0c80: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
0c90: 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  eData;..    dpri
0ca0: 6e 74 66 28 22 43 6c 6f 73 65 28 25 70 29 22 2c  ntf("Close(%p)",
0cb0: 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50   (void *) stateP
0cc0: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  tr);..    /* Sen
0cd0: 64 20 22 63 6c 6f 73 65 20 6e 6f 74 69 66 79 22  d "close notify"
0ce0: 20 73 68 75 74 64 6f 77 6e 20 6e 6f 74 69 66 69   shutdown notifi
0cf0: 63 61 74 69 6f 6e 2e 20 57 69 6c 6c 20 72 65 74  cation. Will ret
0d00: 75 72 6e 20 30 20 69 66 20 69 6e 20 70 72 6f 67  urn 0 if in prog
0d10: 72 65 73 73 2c 0a 09 61 6e 64 20 31 20 77 68 65  ress,..and 1 whe
0d20: 6e 20 63 6f 6d 70 6c 65 74 65 2e 20 4f 6e 6c 79  n complete. Only
0d30: 20 63 6c 6f 73 65 73 20 74 68 65 20 77 72 69 74   closes the writ
0d40: 65 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74  e direction of t
0d50: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 09  he connection;..
0d60: 74 68 65 20 72 65 61 64 20 64 69 72 65 63 74 69  the read directi
0d70: 6f 6e 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  on is closed by 
0d80: 74 68 65 20 70 65 65 72 2e 20 44 6f 65 73 20 6e  the peer. Does n
0d90: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 6f  ot affect the so
0da0: 63 6b 65 74 20 0a 09 73 74 61 74 65 2e 20 44 6f  cket ..state. Do
0db0: 6e 27 74 20 63 61 6c 6c 20 61 66 74 65 72 20 66  n't call after f
0dc0: 61 74 61 6c 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  atal error. */. 
0dd0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
0de0: 3e 73 73 6c 20 21 3d 20 4e 55 4c 4c 20 26 26 20  >ssl != NULL && 
0df0: 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  !(statePtr->flag
0e00: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54  s & TLS_TCL_INIT
0e10: 29 20 26 26 0a 09 20 20 20 20 21 28 73 74 61 74  ) &&..    !(stat
0e20: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c  ePtr->flags & TL
0e30: 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52 52 4f  S_TCL_FATAL_ERRO
0e40: 52 29 29 20 7b 0a 09 42 49 4f 5f 66 6c 75 73 68  R)) {..BIO_flush
0e50: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
0e60: 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 73  ..SSL_shutdown(s
0e70: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
0e80: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
0e90: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 4c 4f 53 45  |= TLS_TCL_CLOSE
0ea0: 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  D;.    }..    /*
0eb0: 20 54 6c 73 5f 46 72 65 65 20 63 61 6c 6c 73 20   Tls_Free calls 
0ec0: 54 6c 73 5f 43 6c 65 61 6e 20 2a 2f 0a 20 20 20  Tls_Clean */.   
0ed0: 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46   Tcl_EventuallyF
0ee0: 72 65 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ree((ClientData)
0ef0: 73 74 61 74 65 50 74 72 2c 20 54 6c 73 5f 46 72  statePtr, Tls_Fr
0f00: 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ee);.    return 
0f10: 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  0;.}../*. *-----
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 54  --------. *. * T
0f70: 6c 73 43 6c 6f 73 65 32 50 72 6f 63 20 2d 2d 0a  lsClose2Proc --.
0f80: 20 2a 0a 20 2a 09 53 69 6d 69 6c 61 72 20 74 6f   *. *.Similar to
0f90: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c 20 62   TlsCloseProc, b
0fa0: 75 74 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 65  ut allows for se
0fb0: 70 61 72 61 74 65 20 63 6c 6f 73 65 20 6f 66 20  parate close of 
0fc0: 74 68 65 20 72 65 61 64 20 6f 72 0a 20 2a 09 77  the read or. *.w
0fd0: 72 69 74 65 20 73 69 64 65 20 6f 66 20 74 68 65  rite side of the
0fe0: 20 63 68 61 6e 6e 65 6c 2e 20 57 65 20 64 6f 6e   channel. We don
0ff0: 27 74 20 73 75 70 70 6f 72 74 20 74 68 65 73 65  't support these
1000: 20 73 69 6e 63 65 20 54 4c 53 20 69 73 20 61 0a   since TLS is a.
1010: 20 2a 09 62 69 2d 64 69 72 65 63 74 69 6f 6e 61   *.bi-directiona
1020: 6c 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20 2a 0a 20  l protocol.. *. 
1030: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20  * Results:. *.0 
1040: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
1050: 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64   POSIX error cod
1060: 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a  e if failed.. *.
1070: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
1080: 0a 20 2a 09 43 6c 6f 73 65 73 20 74 68 65 20 73  . *.Closes the s
1090: 6f 63 6b 65 74 20 66 6f 72 20 74 68 65 20 63 68  ocket for the ch
10a0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
1100: 61 74 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73  atic int TlsClos
1110: 65 32 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65  e2Proc(.    Clie
1120: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1130: 61 74 61 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69  ata,./* Connecti
1140: 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f  on state info */
1150: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
1160: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 54 63 6c  *interp,../* Tcl
1170: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 6f 20   interpreter to 
1180: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 74 6f  report errors to
1190: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   */.    int flag
11a0: 73 29 09 09 09 2f 2a 20 46 6c 61 67 73 20 74 6f  s).../* Flags to
11b0: 20 63 6c 6f 73 65 20 72 65 61 64 2f 77 72 69 74   close read/writ
11c0: 65 20 73 69 64 65 20 6f 66 20 63 68 61 6e 6e 65  e side of channe
11d0: 6c 20 2a 2f 0a 7b 0a 20 20 20 20 64 70 72 69 6e  l */.{.    dprin
11e0: 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68 20  tf("Called with 
11f0: 66 6c 61 67 73 20 25 64 22 2c 20 66 6c 61 67 73  flags %d", flags
1200: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 66 6c 61  );..    if ((fla
1210: 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 5f  gs & (TCL_CLOSE_
1220: 52 45 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57  READ|TCL_CLOSE_W
1230: 52 49 54 45 29 29 20 3d 3d 20 30 29 20 7b 0a 09  RITE)) == 0) {..
1240: 72 65 74 75 72 6e 20 54 6c 73 43 6c 6f 73 65 50  return TlsCloseP
1250: 72 6f 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61  roc(instanceData
1260: 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d  , interp);.    }
1270: 0a 20 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56  .    return EINV
1280: 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  AL;.}../*. *----
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b0: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20  ---------. *. * 
12e0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
12f0: 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66  ct --. *. *.Perf
1300: 6f 72 6d 20 63 6f 6e 6e 65 63 74 20 28 63 6c 69  orm connect (cli
1310: 65 6e 74 29 20 6f 72 20 61 63 63 65 70 74 20 28  ent) or accept (
1320: 73 65 72 76 65 72 29 20 66 75 6e 63 74 69 6f 6e  server) function
1330: 2e 20 41 6c 73 6f 20 70 65 72 66 6f 72 6d 73 0a  . Also performs.
1340: 20 2a 09 65 71 75 69 76 61 6c 65 6e 74 20 6f 66   *.equivalent of
1350: 20 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74   handshake funct
1360: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
1370: 74 3a 0a 20 2a 09 31 20 69 66 20 73 75 63 63 65  t:. *.1 if succe
1380: 73 73 66 75 6c 2c 20 30 20 69 66 20 77 61 69 74  ssful, 0 if wait
1390: 69 6e 67 20 66 6f 72 20 63 6f 6e 6e 65 63 74 2c  ing for connect,
13a0: 20 61 6e 64 20 2d 31 20 69 66 20 66 61 69 6c 65   and -1 if faile
13b0: 64 2e 20 53 65 74 73 0a 20 2a 09 65 72 72 6f 72  d. Sets. *.error
13c0: 43 6f 64 65 50 74 72 20 74 6f 20 61 20 50 4f 53  CodePtr to a POS
13d0: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IX error code if
13e0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
13f0: 65 64 2c 20 6f 72 20 30 20 69 66 20 6e 6f 74 2e  ed, or 0 if not.
1400: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
1410: 63 74 73 3a 0a 20 2a 09 50 65 72 66 6f 72 6d 73  cts:. *.Performs
1420: 20 53 53 4c 5f 61 63 63 65 70 74 20 6f 72 20 53   SSL_accept or S
1430: 53 4c 5f 63 6f 6e 6e 65 63 74 2e 0a 20 2a 0a 20  SL_connect.. *. 
1440: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1490: 2a 2f 0a 69 6e 74 20 54 6c 73 5f 57 61 69 74 46  */.int Tls_WaitF
14a0: 6f 72 43 6f 6e 6e 65 63 74 28 0a 20 20 20 20 53  orConnect(.    S
14b0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 09  tate *statePtr,.
14c0: 09 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  ../* Connection 
14d0: 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20  state info */.  
14e0: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
14f0: 50 74 72 2c 09 09 09 2f 2a 20 53 74 6f 72 61 67  Ptr,.../* Storag
1500: 65 20 66 6f 72 20 65 72 72 6f 72 20 63 6f 64 65  e for error code
1510: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
1520: 20 20 69 6e 74 20 68 61 6e 64 73 68 61 6b 65 46    int handshakeF
1530: 61 69 6c 75 72 65 49 73 50 65 72 6d 61 6e 65 6e  ailureIsPermanen
1540: 74 29 09 2f 2a 20 49 73 20 74 68 65 20 63 6f 6e  t)./* Is the con
1550: 6e 65 63 74 20 66 61 69 6c 75 72 65 20 70 65 72  nect failure per
1560: 6d 61 6e 65 6e 74 20 2a 2f 0a 7b 0a 20 20 20 20  manent */.{.    
1570: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
1580: 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 2c 20  r;.    int ret, 
1590: 72 63 2c 20 72 65 61 73 6f 6e 2c 20 69 73 5f 66  rc, reason, is_f
15a0: 61 74 61 6c 2c 20 62 69 6f 53 68 6f 75 6c 64 52  atal, bioShouldR
15b0: 65 74 72 79 2c 20 69 6f 5f 65 72 72 3b 0a 20 20  etry, io_err;.  
15c0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
15d0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  = 0;.    int ret
15e0: 72 69 65 73 20 3d 20 31 30 3b 0a 0a 20 20 20 20  ries = 10;..    
15f0: 64 70 72 69 6e 74 66 28 22 57 61 69 74 46 6f 72  dprintf("WaitFor
1600: 43 6f 6e 6e 65 63 74 28 25 70 29 22 2c 20 28 76  Connect(%p)", (v
1610: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29  oid *) statePtr)
1620: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
1630: 61 6c 6c 65 64 20 77 69 74 68 20 68 61 6e 64 73  alled with hands
1640: 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72  hakeFailureIsPer
1650: 6d 61 6e 65 6e 74 20 25 64 22 2c 20 68 61 6e 64  manent %d", hand
1660: 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65  shakeFailureIsPe
1670: 72 6d 61 6e 65 6e 74 29 3b 0a 20 20 20 20 64 70  rmanent);.    dp
1680: 72 69 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50  rintFlags(stateP
1690: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e  tr);..    /* Can
16a0: 20 61 6c 73 6f 20 63 68 65 63 6b 20 53 53 4c 5f   also check SSL_
16b0: 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64  is_init_finished
16c0: 28 73 73 6c 29 20 2a 2f 0a 20 20 20 20 69 66 20  (ssl) */.    if 
16d0: 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  (!(statePtr->fla
16e0: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  gs & TLS_TCL_INI
16f0: 54 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  T)) {..dprintf("
1700: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
1710: 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 72  ct called on alr
1720: 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
1730: 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72 65 74 75   channel -- retu
1740: 72 6e 69 6e 67 20 77 69 74 68 20 69 6d 6d 65 64  rning with immed
1750: 69 61 74 65 20 73 75 63 63 65 73 73 22 29 3b 0a  iate success");.
1760: 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d  .return 1;.    }
1770: 0a 0a 20 20 20 20 2f 2a 20 44 69 66 66 65 72 65  ..    /* Differe
1780: 6e 74 20 74 79 70 65 73 20 6f 66 20 6f 70 65 72  nt types of oper
1790: 61 74 69 6f 6e 73 20 68 61 76 65 20 64 69 66 66  ations have diff
17a0: 65 72 65 6e 74 20 72 65 71 75 69 72 65 6d 65 6e  erent requiremen
17b0: 74 73 20 66 6f 72 20 53 53 4c 20 62 65 69 6e 67  ts for SSL being
17c0: 20 65 73 74 61 62 6c 69 73 68 65 64 2e 20 2a 2f   established. */
17d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
17e0: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
17f0: 43 4c 5f 46 41 54 41 4c 5f 45 52 52 4f 52 29 20  CL_FATAL_ERROR) 
1800: 7b 0a 09 69 66 20 28 68 61 6e 64 73 68 61 6b 65  {..if (handshake
1810: 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61 6e 65  FailureIsPermane
1820: 6e 74 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  nt) {..    dprin
1830: 74 66 28 22 41 73 6b 65 64 20 74 6f 20 77 61 69  tf("Asked to wai
1840: 74 20 66 6f 72 20 61 20 54 4c 53 20 68 61 6e 64  t for a TLS hand
1850: 73 68 61 6b 65 20 74 68 61 74 20 68 61 73 20 61  shake that has a
1860: 6c 72 65 61 64 79 20 66 61 69 6c 65 64 2e 20 20  lready failed.  
1870: 52 65 74 75 72 6e 69 6e 67 20 66 61 74 61 6c 20  Returning fatal 
1880: 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 2a 65  error");..    *e
1890: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
18a0: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 7d 20 65  ONNABORTED;..} e
18b0: 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  lse {..    dprin
18c0: 74 66 28 22 41 73 6b 65 64 20 74 6f 20 77 61 69  tf("Asked to wai
18d0: 74 20 66 6f 72 20 61 20 54 4c 53 20 68 61 6e 64  t for a TLS hand
18e0: 73 68 61 6b 65 20 74 68 61 74 20 68 61 73 20 61  shake that has a
18f0: 6c 72 65 61 64 79 20 66 61 69 6c 65 64 2e 20 20  lready failed.  
1900: 52 65 74 75 72 6e 69 6e 67 20 73 6f 66 74 20 65  Returning soft e
1910: 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 2a 65 72  rror");..    *er
1920: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f  rorCodePtr = ECO
1930: 4e 4e 52 45 53 45 54 3b 0a 09 7d 0a 09 72 65 74  NNRESET;..}..ret
1940: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
1950: 20 20 20 66 6f 72 20 28 3b 3b 29 20 7b 0a 09 54     for (;;) {..T
1960: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 30 29 3b 0a  cl_SetErrno(0);.
1970: 09 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72  .ERR_clear_error
1980: 28 29 3b 0a 09 42 49 4f 5f 63 6c 65 61 72 5f 72  ();..BIO_clear_r
1990: 65 74 72 79 5f 66 6c 61 67 73 28 73 74 61 74 65  etry_flags(state
19a0: 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 2f 2a 20  Ptr->bio);.../* 
19b0: 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  Not initialized 
19c0: 79 65 74 21 20 41 6c 73 6f 20 63 61 6c 6c 73 20  yet! Also calls 
19d0: 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65  SSL_do_handshake
19e0: 28 29 2e 20 2a 2f 0a 09 69 66 20 28 73 74 61 74  (). */..if (stat
19f0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c  ePtr->flags & TL
1a00: 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a  S_TCL_SERVER) {.
1a10: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
1a20: 6c 6c 69 6e 67 20 53 53 4c 5f 61 63 63 65 70 74  lling SSL_accept
1a30: 28 29 22 29 3b 0a 09 20 20 20 20 72 65 74 20 3d  ()");..    ret =
1a40: 20 53 53 4c 5f 61 63 63 65 70 74 28 73 74 61 74   SSL_accept(stat
1a50: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 0a 09 7d 20  ePtr->ssl);...} 
1a60: 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69  else {..    dpri
1a70: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c  ntf("Calling SSL
1a80: 5f 63 6f 6e 6e 65 63 74 28 29 22 29 3b 0a 09 20  _connect()");.. 
1a90: 20 20 20 72 65 74 20 3d 20 53 53 4c 5f 63 6f 6e     ret = SSL_con
1aa0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73  nect(statePtr->s
1ab0: 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 31 3d 73  sl);..}.../* 1=s
1ac0: 75 63 63 65 73 73 66 75 6c 2c 20 30 3d 6e 6f 74  uccessful, 0=not
1ad0: 20 73 75 63 63 65 73 73 66 75 6c 20 61 6e 64 20   successful and 
1ae0: 73 68 75 74 20 64 6f 77 6e 2c 20 3c 30 3d 66 61  shut down, <0=fa
1af0: 74 61 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 69 66  tal error */..if
1b00: 20 28 72 65 74 20 3e 20 30 29 20 7b 0a 09 20 20   (ret > 0) {..  
1b10: 20 20 64 70 72 69 6e 74 66 28 22 41 63 63 65 70    dprintf("Accep
1b20: 74 20 6f 72 20 63 6f 6e 6e 65 63 74 20 77 61 73  t or connect was
1b30: 20 73 75 63 63 65 73 73 66 75 6c 22 29 3b 0a 0a   successful");..
1b40: 09 20 20 20 20 69 66 20 28 42 49 4f 5f 66 6c 75  .    if (BIO_flu
1b50: 73 68 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  sh(statePtr->bio
1b60: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 64 70 72 69  ) <= 0) {...dpri
1b70: 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 74 68  ntf("Flushing th
1b80: 65 20 6c 6f 77 65 72 20 6c 61 79 65 72 73 20 66  e lower layers f
1b90: 61 69 6c 65 64 2c 20 74 68 69 73 20 77 69 6c 6c  ailed, this will
1ba0: 20 70 72 6f 62 61 62 6c 79 20 74 65 72 6d 69 6e   probably termin
1bb0: 61 74 65 20 74 68 69 73 20 73 65 73 73 69 6f 6e  ate this session
1bc0: 22 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c  ");..    }..} el
1bd0: 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  se {..    dprint
1be0: 66 28 22 41 63 63 65 70 74 20 6f 72 20 63 6f 6e  f("Accept or con
1bf0: 6e 65 63 74 20 66 61 69 6c 65 64 22 29 3b 0a 09  nect failed");..
1c00: 7d 0a 0a 09 2f 2a 20 53 61 6d 65 20 61 73 20 53  }.../* Same as S
1c10: 53 4c 5f 77 61 6e 74 2c 20 62 75 74 20 61 6c 73  SL_want, but als
1c20: 6f 20 63 68 65 63 6b 73 20 74 68 65 20 65 72 72  o checks the err
1c30: 6f 72 20 71 75 65 75 65 20 2a 2f 0a 09 72 63 20  or queue */..rc 
1c40: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28  = SSL_get_error(
1c50: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 72  statePtr->ssl, r
1c60: 65 74 29 3b 0a 09 65 72 72 20 3d 20 45 52 52 5f  et);..err = ERR_
1c70: 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 09 72 65  get_error();..re
1c80: 61 73 6f 6e 20 3d 20 45 52 52 5f 47 45 54 5f 52  ason = ERR_GET_R
1c90: 45 41 53 4f 4e 28 65 72 72 29 3b 0a 09 69 73 5f  EASON(err);..is_
1ca0: 66 61 74 61 6c 20 3d 20 45 52 52 5f 46 41 54 41  fatal = ERR_FATA
1cb0: 4c 5f 45 52 52 4f 52 28 65 72 72 29 3b 0a 09 2f  L_ERROR(err);../
1cc0: 2a 20 54 68 65 20 72 65 74 72 79 20 66 6c 61 67  * The retry flag
1cd0: 20 69 73 20 73 65 74 20 62 79 20 74 68 65 20 42   is set by the B
1ce0: 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 2a 20 66  IO_set_retry_* f
1cf0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 09 62 69 6f  unctions */..bio
1d00: 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 42 49  ShouldRetry = BI
1d10: 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73  O_should_retry(s
1d20: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
1d30: 69 6f 5f 65 72 72 20 3d 20 54 63 6c 5f 47 65 74  io_err = Tcl_Get
1d40: 45 72 72 6e 6f 28 29 3b 0a 09 64 70 72 69 6e 74  Errno();..dprint
1d50: 66 28 22 43 6f 6e 6e 65 63 74 3a 20 72 65 74 3d  f("Connect: ret=
1d60: 25 64 2c 20 72 63 3d 25 64 2c 20 65 72 72 3d 25  %d, rc=%d, err=%
1d70: 6c 64 2c 20 72 65 61 73 6f 6e 3d 25 64 2c 20 69  ld, reason=%d, i
1d80: 73 5f 66 61 74 61 6c 3d 25 64 2c 20 6c 69 62 3d  s_fatal=%d, lib=
1d90: 25 73 2c 20 6d 73 67 3d 25 73 2c 20 62 69 6f 53  %s, msg=%s, bioS
1da0: 68 6f 75 6c 64 52 65 74 72 79 3d 25 64 2c 20 65  houldRetry=%d, e
1db0: 72 72 6e 6f 3d 25 64 2c 20 69 64 3d 25 73 2c 20  rrno=%d, id=%s, 
1dc0: 6d 73 67 3d 25 73 22 2c 20 5c 0a 09 20 20 20 20  msg=%s", \..    
1dd0: 72 65 74 2c 20 72 63 2c 20 65 72 72 2c 20 72 65  ret, rc, err, re
1de0: 61 73 6f 6e 2c 20 69 73 5f 66 61 74 61 6c 2c 20  ason, is_fatal, 
1df0: 45 52 52 5f 6c 69 62 5f 65 72 72 6f 72 5f 73 74  ERR_lib_error_st
1e00: 72 69 6e 67 28 65 72 72 29 2c 20 45 52 52 5f 72  ring(err), ERR_r
1e10: 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69  eason_error_stri
1e20: 6e 67 28 65 72 72 29 2c 20 62 69 6f 53 68 6f 75  ng(err), bioShou
1e30: 6c 64 52 65 74 72 79 2c 20 69 6f 5f 65 72 72 2c  ldRetry, io_err,
1e40: 20 54 63 6c 5f 45 72 72 6e 6f 49 64 28 29 2c 20   Tcl_ErrnoId(), 
1e50: 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 69 6f 5f  Tcl_ErrnoMsg(io_
1e60: 65 72 72 29 29 3b 0a 0a 09 69 66 20 28 72 65 74  err));...if (ret
1e70: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 66   <= 0) {..    if
1e80: 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f   (rc == SSL_ERRO
1e90: 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 20 7c  R_WANT_CONNECT |
1ea0: 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f  | rc == SSL_ERRO
1eb0: 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 29 20 7b  R_WANT_ACCEPT) {
1ec0: 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72  ...bioShouldRetr
1ed0: 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c  y = 1;..    } el
1ee0: 73 65 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c  se if (rc == SSL
1ef0: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44  _ERROR_WANT_READ
1f00: 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52  ) {...bioShouldR
1f10: 65 74 72 79 20 3d 20 31 3b 0a 09 09 73 74 61 74  etry = 1;...stat
1f20: 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43  ePtr->want |= TC
1f30: 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20  L_READABLE;..   
1f40: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 63 20 3d   } else if (rc =
1f50: 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  = SSL_ERROR_WANT
1f60: 5f 57 52 49 54 45 29 20 7b 0a 09 09 62 69 6f 53  _WRITE) {...bioS
1f70: 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a  houldRetry = 1;.
1f80: 09 09 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74  ..statePtr->want
1f90: 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45   |= TCL_WRITABLE
1fa0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66  ;..    }..}...if
1fb0: 20 28 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79   (bioShouldRetry
1fc0: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
1fd0: 28 22 54 68 65 20 49 2f 4f 20 64 69 64 20 6e 6f  ("The I/O did no
1fe0: 74 20 63 6f 6d 70 6c 65 74 65 20 2d 2d 20 62 75  t complete -- bu
1ff0: 74 20 77 65 20 73 68 6f 75 6c 64 20 74 72 79 20  t we should try 
2000: 69 74 20 61 67 61 69 6e 22 29 3b 0a 0a 09 20 20  it again");...  
2010: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
2020: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
2030: 41 53 59 4e 43 29 20 7b 0a 09 09 64 70 72 69 6e  ASYNC) {...dprin
2040: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 45 41  tf("Returning EA
2050: 47 41 49 4e 20 73 6f 20 74 68 61 74 20 69 74 20  GAIN so that it 
2060: 63 61 6e 20 62 65 20 72 65 74 72 69 65 64 20 6c  can be retried l
2070: 61 74 65 72 22 29 3b 0a 09 09 2a 65 72 72 6f 72  ater");...*error
2080: 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e  CodePtr = EAGAIN
2090: 3b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20  ;...return 0;.. 
20a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65     } else if (re
20b0: 74 72 69 65 73 20 3e 20 30 29 20 7b 0a 09 09 64  tries > 0) {...d
20c0: 70 72 69 6e 74 66 28 22 44 6f 69 6e 67 20 73 6f  printf("Doing so
20d0: 20 6e 6f 77 22 29 3b 0a 09 09 54 63 6c 5f 53 6c   now");...Tcl_Sl
20e0: 65 65 70 28 35 30 29 3b 0a 09 09 72 65 74 72 69  eep(50);...retri
20f0: 65 73 2d 2d 3b 0a 09 09 63 6f 6e 74 69 6e 75 65  es--;...continue
2100: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 64 70  ;..    }..}...dp
2110: 72 69 6e 74 66 28 22 57 65 20 68 61 76 65 20 65  rintf("We have e
2120: 69 74 68 65 72 20 63 6f 6d 70 6c 65 74 65 6c 79  ither completely
2130: 20 65 73 74 61 62 6c 69 73 68 65 64 20 74 68 65   established the
2140: 20 73 65 73 73 69 6f 6e 20 6f 72 20 63 6f 6d 70   session or comp
2150: 6c 65 74 65 6c 79 20 66 61 69 6c 65 64 20 69 74  letely failed it
2160: 20 2d 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20   -- there is no 
2170: 6d 6f 72 65 20 6e 65 65 64 20 74 6f 20 65 76 65  more need to eve
2180: 72 20 72 65 74 72 79 20 69 74 20 74 68 6f 75 67  r retry it thoug
2190: 68 22 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  h");..break;.   
21a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 61 73 65 64   }..    /* Based
21b0: 20 6f 6e 20 65 72 72 6f 72 2c 20 64 6f 20 72 65   on error, do re
21c0: 74 72 79 20 6f 72 20 61 62 6f 72 74 20 2a 2f 0a  try or abort */.
21d0: 20 20 20 20 73 77 69 74 63 68 20 28 72 63 29 20      switch (rc) 
21e0: 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  {..case SSL_ERRO
21f0: 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20  R_NONE:..    /* 
2200: 54 68 65 20 54 4c 53 2f 53 53 4c 20 49 2f 4f 20  The TLS/SSL I/O 
2210: 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65  operation comple
2220: 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ted successfully
2230: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
2240: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45  ("SSL_ERROR_NONE
2250: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
2260: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20  odePtr = 0;..   
2270: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
2280: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20  SL_ERROR_SSL:.. 
2290: 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f     /* A non-reco
22a0: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65  verable, fatal e
22b0: 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20  rror in the SSL 
22c0: 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64  library occurred
22d0: 2c 0a 09 20 20 20 20 20 20 20 75 73 75 61 6c 6c  ,..       usuall
22e0: 79 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72  y a protocol err
22f0: 6f 72 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65  or. This include
2300: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61  s certificate va
2310: 6c 69 64 61 74 69 6f 6e 0a 09 20 20 20 20 20 20  lidation..      
2320: 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 09 20 20 20   errors. */..   
2330: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52   dprintf("SSL_ER
2340: 52 4f 52 5f 53 53 4c 3a 20 46 61 74 61 6c 20 53  ROR_SSL: Fatal S
2350: 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f  SL protocol erro
2360: 72 20 6f 63 63 75 72 72 65 64 22 29 3b 0a 09 20  r occurred");.. 
2370: 20 20 20 69 66 20 28 53 53 4c 5f 67 65 74 5f 76     if (SSL_get_v
2380: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
2390: 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58  tePtr->ssl) != X
23a0: 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c  509_V_OK) {...Tl
23b0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
23c0: 2c 0a 09 09 20 20 20 20 58 35 30 39 5f 76 65 72  ,...    X509_ver
23d0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
23e0: 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65  tring(SSL_get_ve
23f0: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
2400: 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20  ePtr->ssl)));.. 
2410: 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 65 72     }..    if (er
2420: 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f  r != 0) {...Tls_
2430: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
2440: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
2450: 5f 73 74 72 69 6e 67 28 65 72 72 29 29 3b 0a 09  _string(err));..
2460: 20 20 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f      }..    *erro
2470: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e  rCodePtr = ECONN
2480: 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 73 74  ABORTED;..    st
2490: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
24a0: 20 54 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45   TLS_TCL_FATAL_E
24b0: 52 52 4f 52 3b 0a 09 20 20 20 20 73 74 61 74 65  RROR;..    state
24c0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
24d0: 53 5f 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20  S_TCL_EOF;..    
24e0: 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73  return -1;...cas
24f0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  e SSL_ERROR_WANT
2500: 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f 2a 20 4d  _READ:..    /* M
2510: 6f 72 65 20 64 61 74 61 20 6d 75 73 74 20 62 65  ore data must be
2520: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 75   read from the u
2530: 6e 64 65 72 6c 79 69 6e 67 20 42 49 4f 20 6c 61  nderlying BIO la
2540: 79 65 72 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  yer in order to.
2550: 09 20 20 20 20 20 20 20 63 6f 6d 70 6c 65 74 65  .       complete
2560: 20 74 68 65 20 61 63 74 75 61 6c 20 53 53 4c 5f   the actual SSL_
2570: 2a 28 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  *() operation.  
2580: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
2590: 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f  "SSL_ERROR_WANT_
25a0: 52 45 41 44 3a 20 45 41 47 41 49 4e 22 29 3b 0a  READ: EAGAIN");.
25b0: 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74  .    BIO_set_ret
25c0: 72 79 5f 72 65 61 64 28 73 74 61 74 65 50 74 72  ry_read(statePtr
25d0: 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 2a 65 72  ->bio);..    *er
25e0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47  rorCodePtr = EAG
25f0: 41 49 4e 3b 0a 09 20 20 20 20 73 74 61 74 65 50  AIN;..    stateP
2600: 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f  tr->want |= TCL_
2610: 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 72  READABLE;..    r
2620: 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20  eturn 0;...case 
2630: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57  SSL_ERROR_WANT_W
2640: 52 49 54 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68  RITE:..    /* Th
2650: 65 72 65 20 69 73 20 64 61 74 61 20 69 6e 20 74  ere is data in t
2660: 68 65 20 53 53 4c 20 62 75 66 66 65 72 20 74 68  he SSL buffer th
2670: 61 74 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  at must be writt
2680: 65 6e 20 74 6f 20 74 68 65 0a 09 20 20 20 20 20  en to the..     
2690: 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 42 49 4f    underlying BIO
26a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
26b0: 70 6c 65 74 65 20 74 68 65 20 53 53 4c 5f 2a 28  plete the SSL_*(
26c0: 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a  ) operation. */.
26d0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
26e0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49  L_ERROR_WANT_WRI
26f0: 54 45 3a 20 45 41 47 41 49 4e 22 29 3b 0a 09 20  TE: EAGAIN");.. 
2700: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
2710: 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d  _write(statePtr-
2720: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 2a 65 72 72  >bio);..    *err
2730: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
2740: 49 4e 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74  IN;..    statePt
2750: 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 57  r->want |= TCL_W
2760: 52 49 54 41 42 4c 45 3b 0a 09 20 20 20 20 72 65  RITABLE;..    re
2770: 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53  turn 0;...case S
2780: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
2790: 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20  09_LOOKUP:..    
27a0: 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  /* The operation
27b0: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
27c0: 65 20 62 65 63 61 75 73 65 20 61 6e 20 61 70 70  e because an app
27d0: 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  lication callbac
27e0: 6b 0a 09 20 20 20 20 20 20 20 73 65 74 20 62 79  k..       set by
27f0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69   SSL_CTX_set_cli
2800: 65 6e 74 5f 63 65 72 74 5f 63 62 28 29 20 68 61  ent_cert_cb() ha
2810: 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61  s asked to be ca
2820: 6c 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 09  lled again. */..
2830: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c      dprintf("SSL
2840: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39  _ERROR_WANT_X509
2850: 5f 4c 4f 4f 4b 55 50 3a 20 45 41 47 41 49 4e 22  _LOOKUP: EAGAIN"
2860: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f  );..    BIO_set_
2870: 72 65 74 72 79 5f 73 70 65 63 69 61 6c 28 73 74  retry_special(st
2880: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20  atePtr->bio);.. 
2890: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
28a0: 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72  _reason(statePtr
28b0: 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52 5f 53 53  ->bio, BIO_RR_SS
28c0: 4c 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 29 3b 0a  L_X509_LOOKUP);.
28d0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
28e0: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
28f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61    return 0;...ca
2900: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53  se SSL_ERROR_SYS
2910: 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53 6f  CALL:..    /* So
2920: 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62  me non-recoverab
2930: 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65 72  le, fatal I/O er
2940: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
2950: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
2960: 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a  L_ERROR_SYSCALL:
2970: 20 46 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72   Fatal I/O error
2980: 20 6f 63 63 75 72 72 65 64 22 29 3b 0a 0a 09 20   occurred");... 
2990: 20 20 20 69 66 20 28 65 72 72 20 3d 3d 20 30 20     if (err == 0 
29a0: 26 26 20 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09  && ret == 0) {..
29b0: 09 2f 2a 20 55 6e 65 78 70 65 63 74 65 64 20 45  ./* Unexpected E
29c0: 4f 46 20 66 6f 72 20 31 2e 31 2e 31 20 2a 2f 0a  OF for 1.1.1 */.
29d0: 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20 72  ..dprintf("EOF r
29e0: 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72 6f  eached")...*erro
29f0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e  rCodePtr = ECONN
2a00: 52 45 53 45 54 3b 0a 09 09 54 6c 73 5f 45 72 72  RESET;...Tls_Err
2a10: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 28 75  or(statePtr, "(u
2a20: 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46 20 72  nexpected) EOF r
2a30: 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 20  eached");...    
2a40: 7d 20 65 6c 73 65 20 69 66 20 28 65 72 72 20 3d  } else if (err =
2a50: 3d 20 30 20 26 26 20 72 65 74 20 3d 3d 20 2d 31  = 0 && ret == -1
2a60: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49  ) {...dprintf("I
2a70: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
2a80: 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22  d (errno = %lu)"
2a90: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2aa0: 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  ) Tcl_GetErrno()
2ab0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50  );...*errorCodeP
2ac0: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e  tr = Tcl_GetErrn
2ad0: 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f  o();...if (*erro
2ae0: 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e  rCodePtr == ECON
2af0: 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20  NRESET) {...    
2b00: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2b10: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09  ECONNABORTED;...
2b20: 7d 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 66 6c  }...statePtr->fl
2b30: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 46  ags |= TLS_TCL_F
2b40: 41 54 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 54 6c  ATAL_ERROR;...Tl
2b50: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
2b60: 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a  , Tcl_ErrnoMsg(*
2b70: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a  errorCodePtr));.
2b80: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
2b90: 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72  .dprintf("I/O er
2ba0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 72  ror occurred (er
2bb0: 72 20 3d 20 25 6c 75 29 22 2c 20 65 72 72 29 3b  r = %lu)", err);
2bc0: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
2bd0: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28   = Tcl_GetErrno(
2be0: 29 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43  );...if (*errorC
2bf0: 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52  odePtr == ECONNR
2c00: 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65  ESET) {...    *e
2c10: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
2c20: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a  ONNABORTED;...}.
2c30: 09 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
2c40: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 46 41 54  s |= TLS_TCL_FAT
2c50: 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 54 6c 73 5f  AL_ERROR;...Tls_
2c60: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
2c70: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
2c80: 5f 73 74 72 69 6e 67 28 65 72 72 29 29 3b 0a 09  _string(err));..
2c90: 20 20 20 20 7d 0a 09 20 20 20 20 73 74 61 74 65      }..    state
2ca0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
2cb0: 53 5f 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20  S_TCL_EOF;..    
2cc0: 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73  return -1;...cas
2cd0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f  e SSL_ERROR_ZERO
2ce0: 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f 2a  _RETURN:..    /*
2cf0: 20 50 65 65 72 20 68 61 73 20 63 6c 65 61 6e 6c   Peer has cleanl
2d00: 79 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e  y closed the con
2d10: 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64 69  nection by sendi
2d20: 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74  ng the close_not
2d30: 69 66 79 0a 09 20 20 20 20 20 20 20 61 6c 65 72  ify..       aler
2d40: 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20 62  t. Can't read, b
2d50: 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 4e 65  ut can write. Ne
2d60: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ed to return an 
2d70: 45 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20 20 20  EOF, so the..   
2d80: 20 20 20 20 63 68 61 6e 6e 65 6c 20 69 73 20 63      channel is c
2d90: 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c 6c  losed which will
2da0: 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 75   send an SSL_shu
2db0: 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 20  tdown(). */..   
2dc0: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52   dprintf("SSL_ER
2dd0: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a  ROR_ZERO_RETURN:
2de0: 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64   Peer has closed
2df0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 22   the connection"
2e00: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
2e10: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53  dePtr = ECONNRES
2e20: 45 54 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ET;..    statePt
2e30: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
2e40: 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20 54 6c  TCL_EOF;..    Tl
2e50: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
2e60: 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f 73  , "Peer has clos
2e70: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ed the connectio
2e80: 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79  n for writing by
2e90: 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f   sending the clo
2ea0: 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 22  se_notify alert"
2eb0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d  );..    return -
2ec0: 31 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  1;...case SSL_ER
2ed0: 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54  ROR_WANT_CONNECT
2ee0: 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  :..    /* The op
2ef0: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
2f00: 63 6f 6d 70 6c 65 74 65 20 61 6e 64 20 63 6f 6e  complete and con
2f10: 6e 65 63 74 20 77 6f 75 6c 64 20 68 61 76 65 20  nect would have 
2f20: 62 6c 6f 63 6b 65 64 2e 0a 09 20 20 20 20 20 20  blocked...      
2f30: 20 52 65 74 72 79 20 61 67 61 69 6e 20 61 66 74   Retry again aft
2f40: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
2f50: 20 65 73 74 61 62 6c 69 73 68 65 64 2e 20 2a 2f   established. */
2f60: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
2f70: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f  SL_ERROR_WANT_CO
2f80: 4e 4e 45 43 54 3a 20 45 41 47 41 49 4e 22 29 3b  NNECT: EAGAIN");
2f90: 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65  ..    BIO_set_re
2fa0: 74 72 79 5f 73 70 65 63 69 61 6c 28 73 74 61 74  try_special(stat
2fb0: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20  ePtr->bio);..   
2fc0: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72   BIO_set_retry_r
2fd0: 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  eason(statePtr->
2fe0: 62 69 6f 2c 20 42 49 4f 5f 52 52 5f 43 4f 4e 4e  bio, BIO_RR_CONN
2ff0: 45 43 54 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  ECT);..    *erro
3000: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
3010: 4e 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30  N;..    return 0
3020: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
3030: 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 3a 0a  OR_WANT_ACCEPT:.
3040: 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72  .    /* The oper
3050: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f  ation did not co
3060: 6d 70 6c 65 74 65 20 61 6e 64 20 61 63 63 65 70  mplete and accep
3070: 74 20 77 6f 75 6c 64 20 68 61 76 65 20 62 6c 6f  t would have blo
3080: 63 6b 65 64 2e 0a 09 20 20 20 20 20 20 20 52 65  cked...       Re
3090: 74 72 79 20 61 67 61 69 6e 20 61 66 74 65 72 20  try again after 
30a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 65 73  connection is es
30b0: 74 61 62 6c 69 73 68 65 64 2e 20 2a 2f 0a 09 20  tablished. */.. 
30c0: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
30d0: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50  ERROR_WANT_ACCEP
30e0: 54 3a 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20  T: EAGAIN");..  
30f0: 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f    BIO_set_retry_
3100: 73 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 72  special(statePtr
3110: 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42 49 4f  ->bio);..    BIO
3120: 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f  _set_retry_reaso
3130: 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c  n(statePtr->bio,
3140: 20 42 49 4f 5f 52 52 5f 41 43 43 45 50 54 29 3b   BIO_RR_ACCEPT);
3150: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
3160: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
3170: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 63     return 0;...c
3180: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
3190: 4e 54 5f 41 53 59 4e 43 3a 0a 09 20 20 20 20 2f  NT_ASYNC:..    /
31a0: 2a 20 55 73 65 64 20 77 69 74 68 20 66 6c 61 67  * Used with flag
31b0: 20 53 53 4c 5f 4d 4f 44 45 5f 41 53 59 4e 43 2c   SSL_MODE_ASYNC,
31c0: 20 6f 70 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c   op didn't compl
31d0: 65 74 65 20 62 65 63 61 75 73 65 20 61 6e 0a 09  ete because an..
31e0: 20 20 20 20 20 20 20 61 73 79 6e 63 20 65 6e 67         async eng
31f0: 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f  ine is still pro
3200: 63 65 73 73 69 6e 67 20 64 61 74 61 20 2a 2f 0a  cessing data */.
3210: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
3220: 57 41 4e 54 5f 41 53 59 4e 43 5f 4a 4f 42 3a 0a  WANT_ASYNC_JOB:.
3230: 09 20 20 20 20 2f 2a 20 54 68 65 20 61 73 79 6e  .    /* The asyn
3240: 63 68 72 6f 6e 6f 75 73 20 6a 6f 62 20 63 6f 75  chronous job cou
3250: 6c 64 20 6e 6f 74 20 62 65 20 73 74 61 72 74 65  ld not be starte
3260: 64 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20  d because there 
3270: 77 65 72 65 20 6e 6f 0a 09 20 20 20 20 20 20 20  were no..       
3280: 61 73 79 6e 63 20 6a 6f 62 73 20 61 76 61 69 6c  async jobs avail
3290: 61 62 6c 65 20 69 6e 20 74 68 65 20 70 6f 6f 6c  able in the pool
32a0: 2e 20 2a 2f 0a 09 63 61 73 65 20 53 53 4c 5f 45  . */..case SSL_E
32b0: 52 52 4f 52 5f 57 41 4e 54 5f 43 4c 49 45 4e 54  RROR_WANT_CLIENT
32c0: 5f 48 45 4c 4c 4f 5f 43 42 3a 0a 09 20 20 20 20  _HELLO_CB:..    
32d0: 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  /* The operation
32e0: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
32f0: 65 20 62 65 63 61 75 73 65 20 61 6e 20 61 70 70  e because an app
3300: 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  lication callbac
3310: 6b 0a 09 20 20 20 20 20 20 20 73 65 74 20 62 79  k..       set by
3320: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69   SSL_CTX_set_cli
3330: 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 29 20 68  ent_hello_cb() h
3340: 61 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63  as asked to be c
3350: 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a  alled again. */.
3360: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
3370: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
3380: 33 30 30 30 30 30 30 30 4c 0a 09 63 61 73 65 20  30000000L..case 
3390: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52  SSL_ERROR_WANT_R
33a0: 45 54 52 59 5f 56 45 52 49 46 59 3a 0a 09 20 20  ETRY_VERIFY:..  
33b0: 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69    /* The operati
33c0: 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c  on did not compl
33d0: 65 74 65 20 62 65 63 61 75 73 65 20 61 20 63 65  ete because a ce
33e0: 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66 69  rtificate verifi
33f0: 63 61 74 69 6f 6e 0a 09 20 20 20 20 20 20 20 63  cation..       c
3400: 61 6c 6c 62 61 63 6b 20 68 61 73 20 61 73 6b 65  allback has aske
3410: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61  d to be called a
3420: 67 61 69 6e 20 76 69 61 20 53 53 4c 5f 73 65 74  gain via SSL_set
3430: 5f 72 65 74 72 79 5f 76 65 72 69 66 79 28 33 29  _retry_verify(3)
3440: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 09 64 65 66  . */.#endif..def
3450: 61 75 6c 74 3a 0a 09 20 20 20 20 2f 2a 20 54 68  ault:..    /* Th
3460: 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  e operation did 
3470: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  not complete and
3480: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
3490: 65 64 20 6c 61 74 65 72 2e 20 2a 2f 0a 09 20 20  ed later. */..  
34a0: 20 20 64 70 72 69 6e 74 66 28 22 4f 70 65 72 61    dprintf("Opera
34b0: 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d  tion did not com
34c0: 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66 75 6e 63  plete, call func
34d0: 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74 65 72  tion again later
34e0: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
34f0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
3500: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45  ..    dprintf("E
3510: 52 52 28 4f 74 68 65 72 2c 20 45 41 47 41 49 4e  RR(Other, EAGAIN
3520: 29 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  )");..    return
3530: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64   0;.    }..    d
3540: 70 72 69 6e 74 66 28 22 52 65 6d 6f 76 69 6e 67  printf("Removing
3550: 20 74 68 65 20 5c 22 54 4c 53 5f 54 43 4c 5f 49   the \"TLS_TCL_I
3560: 4e 49 54 5c 22 20 66 6c 61 67 20 73 69 6e 63 65  NIT\" flag since
3570: 20 77 65 20 68 61 76 65 20 63 6f 6d 70 6c 65 74   we have complet
3580: 65 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  ed the handshake
3590: 22 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  ");.    statePtr
35a0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 4c 53 5f  ->flags &= ~TLS_
35b0: 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20 20 20 20 64  TCL_INIT;..    d
35c0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
35d0: 67 20 73 75 63 63 65 73 73 22 29 3b 0a 20 20 20  g success");.   
35e0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
35f0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   0;.    return 1
3600: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
3660: 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a  sInputProc --. *
3670: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
3680: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  re is invoked by
3690: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f   the generic I/O
36a0: 20 6c 61 79 65 72 20 74 6f 20 72 65 61 64 20 64   layer to read d
36b0: 61 74 61 20 66 72 6f 6d 0a 20 2a 09 74 68 65 20  ata from. *.the 
36c0: 42 49 4f 20 77 68 65 6e 65 76 65 72 20 74 68 65  BIO whenever the
36d0: 20 54 63 6c 5f 52 65 61 64 2c 20 54 63 6c 5f 52   Tcl_Read, Tcl_R
36e0: 65 61 64 43 68 61 72 73 2c 20 54 63 6c 5f 47 65  eadChars, Tcl_Ge
36f0: 74 73 2c 20 61 6e 64 20 54 63 6c 5f 47 65 74 73  ts, and Tcl_Gets
3700: 4f 62 6a 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 73  Obj. *.functions
3710: 20 61 72 65 20 75 73 65 64 2e 20 45 71 75 69 76   are used. Equiv
3720: 61 6c 65 6e 74 20 74 6f 20 53 53 4c 5f 72 65 61  alent to SSL_rea
3730: 64 5f 65 78 20 61 6e 64 20 53 53 4c 5f 72 65 61  d_ex and SSL_rea
3740: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  d.. *. * Results
3750: 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65  :. *.Returns the
3760: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
3770: 20 72 65 61 64 20 6f 72 20 2d 31 20 6f 6e 20 65   read or -1 on e
3780: 72 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72  rror. Sets error
3790: 43 6f 64 65 50 74 72 20 74 6f 0a 20 2a 09 61 20  CodePtr to. *.a 
37a0: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65  POSIX error code
37b0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
37c0: 75 72 72 65 64 2c 20 6f 72 20 30 20 69 66 20 73  urred, or 0 if s
37d0: 75 63 63 65 73 73 66 75 6c 2e 0a 20 2a 0a 20 2a  uccessful.. *. *
37e0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
37f0: 2a 09 52 65 61 64 73 20 64 61 74 61 20 66 72 6f  *.Reads data fro
3800: 6d 20 53 53 4c 2f 42 49 4f 2e 0a 20 2a 0a 20 2a  m SSL/BIO.. *. *
3810: 20 4e 6f 74 65 73 3a 0a 20 2a 09 44 61 74 61 20   Notes:. *.Data 
3820: 69 73 20 72 65 63 65 69 76 65 64 20 69 6e 20 77  is received in w
3830: 68 6f 6c 65 20 62 6c 6f 63 6b 73 20 6b 6e 6f 77  hole blocks know
3840: 6e 20 61 73 20 72 65 63 6f 72 64 73 20 66 72 6f  n as records fro
3850: 6d 20 74 68 65 20 70 65 65 72 2e 20 41 20 0a 20  m the peer. A . 
3860: 2a 09 77 68 6f 6c 65 20 72 65 63 6f 72 64 20 69  *.whole record i
3870: 73 20 70 72 6f 63 65 73 73 65 64 20 28 65 2e 67  s processed (e.g
3880: 2e 20 64 65 63 72 79 70 74 65 64 29 20 69 6e 20  . decrypted) in 
3890: 6f 6e 65 20 67 6f 20 61 6e 64 20 69 73 20 62 75  one go and is bu
38a0: 66 66 65 72 65 64 20 62 79 0a 20 2a 09 4f 70 65  ffered by. *.Ope
38b0: 6e 53 53 4c 20 75 6e 74 69 6c 20 69 74 20 69 73  nSSL until it is
38c0: 20 72 65 61 64 20 62 79 20 74 68 65 20 61 70 70   read by the app
38d0: 6c 69 63 61 74 69 6f 6e 20 76 69 61 20 61 20 63  lication via a c
38e0: 61 6c 6c 20 74 6f 20 53 53 4c 5f 72 65 61 64 28  all to SSL_read(
38f0: 29 20 6f 72 0a 20 2a 09 42 49 4f 5f 72 65 61 64  ) or. *.BIO_read
3900: 28 29 20 69 6e 20 6f 75 72 20 63 61 73 65 2e 20  () in our case. 
3910: 53 53 4c 5f 70 65 6e 64 69 6e 67 28 29 20 72 65  SSL_pending() re
3920: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
3930: 20 6f 66 20 62 79 74 65 73 20 77 68 69 63 68 0a   of bytes which.
3940: 20 2a 09 68 61 76 65 20 62 65 65 6e 20 70 72 6f   *.have been pro
3950: 63 65 73 73 65 64 2c 20 62 75 66 66 65 72 65 64  cessed, buffered
3960: 2c 20 61 6e 64 20 61 72 65 20 61 76 61 69 6c 61  , and are availa
3970: 62 6c 65 20 69 6e 73 69 64 65 20 73 73 6c 20 66  ble inside ssl f
3980: 6f 72 0a 20 2a 09 69 6d 6d 65 64 69 61 74 65 20  or. *.immediate 
3990: 72 65 61 64 2e 20 53 53 4c 5f 68 61 73 5f 70 65  read. SSL_has_pe
39a0: 6e 64 69 6e 67 28 29 20 72 65 74 75 72 6e 73 20  nding() returns 
39b0: 31 20 69 66 20 64 61 74 61 20 69 73 20 62 75 66  1 if data is buf
39c0: 66 65 72 65 64 0a 20 2a 09 28 77 68 65 74 68 65  fered. *.(whethe
39d0: 72 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 75  r processed or u
39e0: 6e 70 72 6f 63 65 73 73 65 64 29 20 61 6e 64 20  nprocessed) and 
39f0: 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 20 2a 0a  0 otherwise.. *.
3a00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3a50: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
3a60: 6c 73 49 6e 70 75 74 50 72 6f 63 28 0a 20 20 20  lsInputProc(.   
3a70: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
3a80: 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43 6f 6e  anceData,./* Con
3a90: 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69 6e  nection state in
3aa0: 66 6f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  fo */.    char *
3ab0: 62 75 66 2c 09 09 09 2f 2a 20 42 75 66 66 65 72  buf,.../* Buffer
3ac0: 20 74 6f 20 73 74 6f 72 65 20 64 61 74 61 20 72   to store data r
3ad0: 65 61 64 20 66 72 6f 6d 20 42 49 4f 20 2a 2f 0a  ead from BIO */.
3ae0: 20 20 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c      int bufSize,
3af0: 09 09 2f 2a 20 42 75 66 66 65 72 20 73 69 7a 65  ../* Buffer size
3b00: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
3b10: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
3b20: 74 72 29 09 09 2f 2a 20 53 74 6f 72 61 67 65 20  tr)../* Storage 
3b30: 66 6f 72 20 65 72 72 6f 72 20 63 6f 64 65 20 74  for error code t
3b40: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 7b 0a 20 20  o return */.{.  
3b50: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
3b60: 65 72 72 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  err;.    State *
3b70: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
3b80: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
3b90: 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 65 73  a;.    int bytes
3ba0: 52 65 61 64 2c 20 72 63 2c 20 72 65 61 73 6f 6e  Read, rc, reason
3bb0: 2c 20 69 73 5f 66 61 74 61 6c 2c 20 62 69 6f 53  , is_fatal, bioS
3bc0: 68 6f 75 6c 64 52 65 74 72 79 2c 20 69 6f 5f 65  houldRetry, io_e
3bd0: 72 72 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f  rr;.    *errorCo
3be0: 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  dePtr = 0;..    
3bf0: 64 70 72 69 6e 74 66 28 22 52 65 61 64 20 25 64  dprintf("Read %d
3c00: 20 62 79 74 65 73 22 2c 20 62 75 66 53 69 7a 65   bytes", bufSize
3c10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74  );..    /* Abort
3c20: 20 69 66 20 74 68 65 20 75 73 65 72 20 76 65 72   if the user ver
3c30: 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ify callback is 
3c40: 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f  still running to
3c50: 20 61 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e   avoid triggerin
3c60: 67 0a 20 20 20 20 20 2a 20 61 6e 6f 74 68 65 72  g.     * another
3c70: 20 63 61 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   call before the
3c80: 20 63 75 72 72 65 6e 74 20 6f 6e 65 20 69 73 20   current one is 
3c90: 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20  complete. */.   
3ca0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
3cb0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43  lags & TLS_TCL_C
3cc0: 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69  ALLBACK) {..dpri
3cd0: 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73  ntf("Callback is
3ce0: 20 72 75 6e 6e 69 6e 67 2c 20 72 65 61 64 69 6e   running, readin
3cf0: 67 20 30 20 62 79 74 65 73 22 29 3b 0a 09 72 65  g 0 bytes");..re
3d00: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
3d10: 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 63     /* Abort if c
3d20: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 66 61  onnection has fa
3d30: 69 6c 65 64 20 6f 72 20 45 4f 46 20 61 6c 72 65  iled or EOF alre
3d40: 61 64 79 20 64 65 74 65 63 74 65 64 2e 20 43 61  ady detected. Ca
3d50: 6e 27 74 20 72 65 61 64 2c 20 62 75 74 20 63 61  n't read, but ca
3d60: 6e 20 77 72 69 74 65 2e 20 2a 2f 0a 20 20 20 20  n write. */.    
3d70: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  if (statePtr->fl
3d80: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41  ags & TLS_TCL_FA
3d90: 54 41 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 64 70  TAL_ERROR) {..dp
3da0: 72 69 6e 74 66 28 22 46 61 74 61 6c 20 65 72 72  rintf("Fatal err
3db0: 6f 72 20 61 6c 72 65 61 64 79 20 64 65 74 65 63  or already detec
3dc0: 74 65 64 2c 20 61 62 6f 72 74 20 72 65 61 64 22  ted, abort read"
3dd0: 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  );..*errorCodePt
3de0: 72 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 30  r = 0;..return 0
3df0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
3e00: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
3e10: 20 26 20 54 4c 53 5f 54 43 4c 5f 45 4f 46 29 20   & TLS_TCL_EOF) 
3e20: 7b 0a 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20  {..dprintf("EOF 
3e30: 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
3e40: 2c 20 61 62 6f 72 74 20 72 65 61 64 22 29 3b 0a  , abort read");.
3e50: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
3e60: 20 30 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20   0;..return 0;. 
3e70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
3e80: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  not initialized,
3e90: 20 64 6f 20 63 6f 6e 6e 65 63 74 2e 20 43 61 6e   do connect. Can
3ea0: 20 61 6c 73 6f 20 63 68 65 63 6b 20 53 53 4c 5f   also check SSL_
3eb0: 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64  is_init_finished
3ec0: 28 29 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  (). */.    if (s
3ed0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
3ee0: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b   TLS_TCL_INIT) {
3ef0: 0a 09 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74  ..int tlsConnect
3f00: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c  ;...dprintf("Cal
3f10: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
3f20: 43 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73  Connect");...tls
3f30: 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61  Connect = Tls_Wa
3f40: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61  itForConnect(sta
3f50: 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65  tePtr, errorCode
3f60: 50 74 72 2c 20 30 29 3b 0a 09 69 66 20 28 74 6c  Ptr, 0);..if (tl
3f70: 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a  sConnect < 0) {.
3f80: 09 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 2c  .    /* Failure,
3f90: 20 73 6f 20 61 62 6f 72 74 20 2a 2f 0a 09 20 20   so abort */..  
3fa0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
3fb0: 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20  n error waiting 
3fc0: 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43  to connect (tlsC
3fd0: 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72  onnect = %i, *er
3fe0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29  rorCodePtr = %i)
3ff0: 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a  ", tlsConnect, *
4000: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a  errorCodePtr);..
4010: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
4020: 20 2d 31 3b 0a 09 20 20 20 20 69 66 20 28 2a 65   -1;..    if (*e
4030: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45  rrorCodePtr == E
4040: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 64  CONNRESET) {...d
4050: 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e  printf("Got conn
4060: 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a  ection reset");.
4070: 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f  ../* Soft EOF */
4080: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
4090: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61   = 0;...bytesRea
40a0: 64 20 3d 20 30 3b 0a 09 09 73 74 61 74 65 50 74  d = 0;...statePt
40b0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
40c0: 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20 7d 0a  TCL_EOF;..    }.
40d0: 09 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 65  .    return byte
40e0: 73 52 65 61 64 3b 0a 09 7d 20 65 6c 73 65 20 69  sRead;..} else i
40f0: 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 3d  f (tlsConnect ==
4100: 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 20 54 72   0) {..    /* Tr
4110: 79 20 61 67 61 69 6e 20 2a 2f 0a 09 20 20 20 20  y again */..    
4120: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a  bytesRead = -1;.
4130: 09 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 65  .    return byte
4140: 73 52 65 61 64 3b 0a 09 7d 0a 20 20 20 20 7d 0a  sRead;..}.    }.
4150: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
4160: 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20  e need to clear 
4170: 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74  the SSL error st
4180: 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20  ack now because 
4190: 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61  we sometimes rea
41a0: 63 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66  ch.     * this f
41b0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66  unction with lef
41c0: 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20  tover errors in 
41d0: 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42  the stack.  If B
41e0: 49 4f 5f 72 65 61 64 0a 20 20 20 20 20 2a 20 72  IO_read.     * r
41f0: 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e  eturns -1 and in
4200: 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68  tends EAGAIN, th
4210: 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65  ere is a leftove
4220: 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c  r error, it will
4230: 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f   be.     * misco
4240: 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72  nstrued as an er
4250: 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e  ror, not EAGAIN.
4260: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72  .     */.    dpr
4270: 69 6e 74 66 28 22 42 49 4f 5f 72 65 61 64 20 65  intf("BIO_read e
4280: 6f 66 3d 25 64 2c 20 62 75 66 66 65 72 65 64 3d  of=%d, buffered=
4290: 25 64 2c 20 69 6e 70 75 74 3d 25 64 2c 20 6f 75  %d, input=%d, ou
42a0: 74 70 75 74 3d 25 64 22 2c 20 54 63 6c 5f 45 6f  tput=%d", Tcl_Eo
42b0: 66 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  f(statePtr->self
42c0: 29 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 42 75  ), Tcl_ChannelBu
42d0: 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d  ffered(statePtr-
42e0: 3e 73 65 6c 66 29 2c 20 5c 0a 20 20 20 20 20 20  >self), \.      
42f0: 20 20 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65    Tcl_InputBuffe
4300: 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65  red(statePtr->se
4310: 6c 66 29 2c 20 54 63 6c 5f 4f 75 74 70 75 74 42  lf), Tcl_OutputB
4320: 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72  uffered(statePtr
4330: 2d 3e 73 65 6c 66 29 29 3b 20 20 20 20 45 52 52  ->self));    ERR
4340: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
4350: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f      Tcl_SetErrno
4360: 28 30 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65  (0);.    ERR_cle
4370: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20  ar_error();.    
4380: 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f  BIO_clear_retry_
4390: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e  flags(statePtr->
43a0: 62 69 6f 29 3b 0a 20 20 20 20 62 79 74 65 73 52  bio);.    bytesR
43b0: 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73  ead = BIO_read(s
43c0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75  tatePtr->bio, bu
43d0: 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20  f, bufSize);.   
43e0: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65   dprintf("BIO_re
43f0: 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73  ad -> %d", bytes
4400: 52 65 61 64 29 3b 0a 20 20 20 20 64 70 72 69 6e  Read);.    dprin
4410: 74 66 28 22 42 49 4f 5f 72 65 61 64 20 65 6f 66  tf("BIO_read eof
4420: 3d 25 64 2c 20 62 75 66 66 65 72 65 64 3d 25 64  =%d, buffered=%d
4430: 2c 20 69 6e 70 75 74 3d 25 64 2c 20 6f 75 74 70  , input=%d, outp
4440: 75 74 3d 25 64 22 2c 20 54 63 6c 5f 45 6f 66 28  ut=%d", Tcl_Eof(
4450: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
4460: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 42 75 66 66   Tcl_ChannelBuff
4470: 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73  ered(statePtr->s
4480: 65 6c 66 29 2c 20 5c 0a 20 20 20 20 20 20 20 20  elf), \.        
4490: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65  Tcl_InputBuffere
44a0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  d(statePtr->self
44b0: 29 2c 20 54 63 6c 5f 4f 75 74 70 75 74 42 75 66  ), Tcl_OutputBuf
44c0: 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e  fered(statePtr->
44d0: 73 65 6c 66 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  self));..    /* 
44e0: 53 61 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74  Same as SSL_want
44f0: 2c 20 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b  , but also check
4500: 73 20 74 68 65 20 65 72 72 6f 72 20 71 75 65 75  s the error queu
4510: 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 53  e */.    rc = SS
4520: 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74  L_get_error(stat
4530: 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73  ePtr->ssl, bytes
4540: 52 65 61 64 29 3b 0a 20 20 20 20 65 72 72 20 3d  Read);.    err =
4550: 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29   ERR_get_error()
4560: 3b 0a 20 20 20 20 72 65 61 73 6f 6e 20 3d 20 45  ;.    reason = E
4570: 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e 28 65 72  RR_GET_REASON(er
4580: 72 29 3b 0a 20 20 20 20 69 73 5f 66 61 74 61 6c  r);.    is_fatal
4590: 20 3d 20 45 52 52 5f 46 41 54 41 4c 5f 45 52 52   = ERR_FATAL_ERR
45a0: 4f 52 28 65 72 72 29 3b 0a 20 20 20 20 2f 2a 20  OR(err);.    /* 
45b0: 54 68 65 20 72 65 74 72 79 20 66 6c 61 67 20 69  The retry flag i
45c0: 73 20 73 65 74 20 62 79 20 74 68 65 20 42 49 4f  s set by the BIO
45d0: 5f 73 65 74 5f 72 65 74 72 79 5f 2a 20 66 75 6e  _set_retry_* fun
45e0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 62 69  ctions */.    bi
45f0: 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 42  oShouldRetry = B
4600: 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28  IO_should_retry(
4610: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
4620: 20 20 20 20 69 6f 5f 65 72 72 20 3d 20 54 63 6c      io_err = Tcl
4630: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 20 20 20  _GetErrno();.   
4640: 20 64 70 72 69 6e 74 66 28 22 52 65 61 64 3a 20   dprintf("Read: 
4650: 62 79 74 65 73 52 65 61 64 3d 25 64 2c 20 72 63  bytesRead=%d, rc
4660: 3d 25 64 2c 20 65 72 72 3d 25 6c 64 2c 20 72 65  =%d, err=%ld, re
4670: 61 73 6f 6e 3d 25 64 2c 20 69 73 5f 66 61 74 61  ason=%d, is_fata
4680: 6c 3d 25 64 2c 20 6c 69 62 3d 25 73 2c 20 6d 73  l=%d, lib=%s, ms
4690: 67 3d 25 73 2c 20 62 69 6f 53 68 6f 75 6c 64 52  g=%s, bioShouldR
46a0: 65 74 72 79 3d 25 64 2c 20 65 72 72 6e 6f 3d 25  etry=%d, errno=%
46b0: 64 2c 20 69 64 3d 25 73 2c 20 6d 73 67 3d 25 73  d, id=%s, msg=%s
46c0: 22 2c 20 5c 0a 20 20 20 20 20 20 20 20 62 79 74  ", \.        byt
46d0: 65 73 52 65 61 64 2c 20 72 63 2c 20 65 72 72 2c  esRead, rc, err,
46e0: 20 72 65 61 73 6f 6e 2c 20 69 73 5f 66 61 74 61   reason, is_fata
46f0: 6c 2c 20 45 52 52 5f 6c 69 62 5f 65 72 72 6f 72  l, ERR_lib_error
4700: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 45 52  _string(err), ER
4710: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73  R_reason_error_s
4720: 74 72 69 6e 67 28 65 72 72 29 2c 20 62 69 6f 53  tring(err), bioS
4730: 68 6f 75 6c 64 52 65 74 72 79 2c 20 69 6f 5f 65  houldRetry, io_e
4740: 72 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 49 64 28  rr, Tcl_ErrnoId(
4750: 29 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28  ), Tcl_ErrnoMsg(
4760: 69 6f 5f 65 72 72 29 29 3b 0a 0a 20 20 20 20 69  io_err));..    i
4770: 66 20 28 62 79 74 65 73 52 65 61 64 20 3c 3d 20  f (bytesRead <= 
4780: 30 29 20 7b 0a 09 2f 2a 20 54 68 65 20 72 65 74  0) {../* The ret
4790: 72 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 62  ry flag is set b
47a0: 79 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 65  y the BIO_set_re
47b0: 74 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20  try_* functions 
47c0: 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 52 65 61  */..dprintf("Rea
47d0: 64 20 66 61 69 6c 65 64 3a 20 69 73 20 45 4f 46  d failed: is EOF
47e0: 3d 25 64 2c 20 73 68 6f 75 6c 64 20 72 65 74 72  =%d, should retr
47f0: 79 3d 25 64 2c 20 72 65 74 72 79 20 72 65 61 64  y=%d, retry read
4800: 3d 25 64 2c 20 72 65 74 72 79 20 77 72 69 74 65  =%d, retry write
4810: 3d 25 64 2c 20 6f 74 68 65 72 3d 25 64 22 2c 0a  =%d, other=%d",.
4820: 09 20 20 20 20 42 49 4f 5f 65 6f 66 28 73 74 61  .    BIO_eof(sta
4830: 74 65 50 74 72 2d 3e 62 69 6f 29 2c 20 42 49 4f  tePtr->bio), BIO
4840: 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 74  _should_retry(st
4850: 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c 20 42 49  atePtr->bio), BI
4860: 4f 5f 73 68 6f 75 6c 64 5f 72 65 61 64 28 73 74  O_should_read(st
4870: 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c 0a 09 20  atePtr->bio),.. 
4880: 20 20 20 42 49 4f 5f 73 68 6f 75 6c 64 5f 77 72     BIO_should_wr
4890: 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ite(statePtr->bi
48a0: 6f 29 2c 20 42 49 4f 5f 73 68 6f 75 6c 64 5f 69  o), BIO_should_i
48b0: 6f 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65 50  o_special(stateP
48c0: 74 72 2d 3e 62 69 6f 29 29 3b 0a 09 69 66 20 28  tr->bio));..if (
48d0: 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79  BIO_should_retry
48e0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29  (statePtr->bio))
48f0: 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f   {..    *errorCo
4900: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
4910: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
4920: 20 42 61 73 65 64 20 6f 6e 20 65 72 72 6f 72 2c   Based on error,
4930: 20 64 6f 20 72 65 74 72 79 20 6f 72 20 61 62 6f   do retry or abo
4940: 72 74 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68  rt */.    switch
4950: 20 28 72 63 29 20 7b 0a 09 63 61 73 65 20 53 53   (rc) {..case SS
4960: 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20  L_ERROR_NONE:.. 
4970: 20 20 20 2f 2a 20 49 2f 4f 20 6f 70 65 72 61 74     /* I/O operat
4980: 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f  ion completed */
4990: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
49a0: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b  SL_ERROR_NONE");
49b0: 0a 09 20 20 20 20 64 70 72 69 6e 74 42 75 66 66  ..    dprintBuff
49c0: 65 72 28 62 75 66 2c 20 62 79 74 65 73 52 65 61  er(buf, bytesRea
49d0: 64 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  d);..    break;.
49e0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
49f0: 5f 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20  _SSL:..    /* A 
4a00: 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c  non-recoverable,
4a10: 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 6e 20   fatal error in 
4a20: 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 20  the SSL library 
4a30: 6f 63 63 75 72 72 65 64 2c 0a 09 20 20 20 20 20  occurred,..     
4a40: 20 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74    usually a prot
4a50: 6f 63 6f 6c 20 65 72 72 6f 72 2e 20 2a 2f 0a 09  ocol error. */..
4a60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c      dprintf("SSL
4a70: 5f 45 52 52 4f 52 5f 53 53 4c 3a 20 46 61 74 61  _ERROR_SSL: Fata
4a80: 6c 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 65  l SSL protocol e
4a90: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 22 29 3b  rror occurred");
4aa0: 0a 09 20 20 20 20 69 66 20 28 65 72 72 20 21 3d  ..    if (err !=
4ab0: 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f   0) {...Tls_Erro
4ac0: 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f  r(statePtr, ERR_
4ad0: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
4ae0: 69 6e 67 28 65 72 72 29 29 3b 0a 09 20 20 20 20  ing(err));..    
4af0: 7d 20 65 6c 73 65 20 69 66 20 28 53 53 4c 5f 67  } else if (SSL_g
4b00: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
4b10: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  (statePtr->ssl) 
4b20: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a  != X509_V_OK) {.
4b30: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
4b40: 65 50 74 72 2c 0a 09 09 20 20 20 20 58 35 30 39  ePtr,...    X509
4b50: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
4b60: 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65  or_string(SSL_ge
4b70: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
4b80: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 29  statePtr->ssl)))
4b90: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
4ba0: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
4bb0: 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 53  ePtr, "Unknown S
4bc0: 53 4c 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20  SL error");..   
4bd0: 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f   }..    *errorCo
4be0: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f  dePtr = ECONNABO
4bf0: 52 54 45 44 3b 0a 09 20 20 20 20 62 79 74 65 73  RTED;..    bytes
4c00: 52 65 61 64 20 3d 20 2d 31 3b 0a 0a 23 69 66 20  Read = -1;..#if 
4c10: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
4c20: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 30 30  NUMBER >= 0x3000
4c30: 30 30 30 30 4c 0a 09 20 20 20 20 2f 2a 20 55 6e  0000L..    /* Un
4c40: 65 78 70 65 63 74 65 64 20 45 4f 46 20 66 72 6f  expected EOF fro
4c50: 6d 20 74 68 65 20 70 65 65 72 20 66 6f 72 20 4f  m the peer for O
4c60: 70 65 6e 53 53 4c 20 33 2e 30 2b 20 2a 2f 0a 09  penSSL 3.0+ */..
4c70: 20 20 20 20 69 66 20 28 45 52 52 5f 47 45 54 5f      if (ERR_GET_
4c80: 52 45 41 53 4f 4e 28 65 72 72 29 20 3d 3d 20 53  REASON(err) == S
4c90: 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54 45 44 5f  SL_R_UNEXPECTED_
4ca0: 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41 44 49 4e  EOF_WHILE_READIN
4cb0: 47 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  G) {...dprintf("
4cc0: 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46  (Unexpected) EOF
4cd0: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72   reached")...*er
4ce0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
4cf0: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b  ..bytesRead = 0;
4d00: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
4d10: 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 61 63  tePtr, "EOF reac
4d20: 68 65 64 22 29 3b 0a 09 20 20 20 20 7d 20 65 6c  hed");..    } el
4d30: 73 65 20 7b 0a 09 09 73 74 61 74 65 50 74 72 2d  se {...statePtr-
4d40: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
4d50: 4c 5f 46 41 54 41 4c 5f 45 52 52 4f 52 3b 0a 09  L_FATAL_ERROR;..
4d60: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 09 20 20 20      }.#else..   
4d70: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
4d80: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 46 41 54 41   |= TLS_TCL_FATA
4d90: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a  L_ERROR;.#endif.
4da0: 09 20 20 20 20 0a 09 20 20 20 20 73 74 61 74 65  .    ..    state
4db0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
4dc0: 53 5f 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20  S_TCL_EOF;..    
4dd0: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
4de0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41  L_ERROR_WANT_REA
4df0: 44 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 65 72 61  D:..    /* Opera
4e00: 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d  tion did not com
4e10: 70 6c 65 74 65 20 64 75 65 20 74 6f 20 6e 6f 74  plete due to not
4e20: 20 65 6e 6f 75 67 68 20 64 61 74 61 20 77 61 73   enough data was
4e30: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 09 20 20 20   available...   
4e40: 20 20 20 20 52 65 74 72 79 20 61 67 61 69 6e 20      Retry again 
4e50: 6c 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64  later. */..    d
4e60: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f  printf("Got SSL_
4e70: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 2c  ERROR_WANT_READ,
4e80: 20 6d 61 70 70 69 6e 67 20 74 68 69 73 20 74 6f   mapping this to
4e90: 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20   EAGAIN");..    
4ea0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
4eb0: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 62 79 74  EAGAIN;..    byt
4ec0: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20  esRead = -1;..  
4ed0: 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74    statePtr->want
4ee0: 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   |= TCL_READABLE
4ef0: 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72  ;..    BIO_set_r
4f00: 65 74 72 79 5f 72 65 61 64 28 73 74 61 74 65 50  etry_read(stateP
4f10: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62  tr->bio);..    b
4f20: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c  reak;...case SSL
4f30: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54  _ERROR_WANT_WRIT
4f40: 45 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 65 72 61  E:..    /* Opera
4f50: 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d  tion did not com
4f60: 70 6c 65 74 65 20 64 75 65 20 74 6f 20 75 6e 61  plete due to una
4f70: 62 6c 65 20 74 6f 20 73 65 6e 64 20 61 6c 6c 20  ble to send all 
4f80: 64 61 74 61 20 74 6f 20 74 68 65 0a 09 20 20 20  data to the..   
4f90: 20 20 20 20 42 49 4f 2e 20 52 65 74 72 79 20 61      BIO. Retry a
4fa0: 67 61 69 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 09  gain later. */..
4fb0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
4fc0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
4fd0: 57 52 49 54 45 2c 20 6d 61 70 70 69 6e 67 20 74  WRITE, mapping t
4fe0: 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b  his to EAGAIN");
4ff0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
5000: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
5010: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d     bytesRead = -
5020: 31 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72  1;..    statePtr
5030: 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 57 52  ->want |= TCL_WR
5040: 49 54 41 42 4c 45 3b 0a 09 20 20 20 20 42 49 4f  ITABLE;..    BIO
5050: 5f 73 65 74 5f 72 65 74 72 79 5f 77 72 69 74 65  _set_retry_write
5060: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
5070: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
5080: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
5090: 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a  NT_X509_LOOKUP:.
50a0: 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72  .    /* The oper
50b0: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f  ation did not co
50c0: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 61  mplete because a
50d0: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61  n application ca
50e0: 6c 6c 62 61 63 6b 0a 09 20 20 20 20 20 20 20 73  llback..       s
50f0: 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 65  et by SSL_CTX_se
5100: 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62  t_client_cert_cb
5110: 28 29 20 68 61 73 20 61 73 6b 65 64 20 74 6f 20  () has asked to 
5120: 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e  be called again.
5130: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
5140: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
5150: 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50  WANT_X509_LOOKUP
5160: 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20  , mapping it to 
5170: 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a  EAGAIN");..    *
5180: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
5190: 41 47 41 49 4e 3b 0a 09 20 20 20 20 62 79 74 65  AGAIN;..    byte
51a0: 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20  sRead = -1;..   
51b0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
51c0: 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c  SL_ERROR_SYSCALL
51d0: 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e  :..    /* Some n
51e0: 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20  on-recoverable, 
51f0: 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20  fatal I/O error 
5200: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20  occurred */..   
5210: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52   dprintf("SSL_ER
5220: 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74  ROR_SYSCALL: Fat
5230: 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  al I/O error occ
5240: 75 72 72 65 64 22 29 3b 0a 0a 09 20 20 20 20 69  urred");...    i
5250: 66 20 28 65 72 72 20 3d 3d 20 30 20 26 26 20 62  f (err == 0 && b
5260: 79 74 65 73 52 65 61 64 20 3d 3d 20 30 29 20 7b  ytesRead == 0) {
5270: 0a 09 09 2f 2a 20 55 6e 65 78 70 65 63 74 65 64  .../* Unexpected
5280: 20 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 65   EOF from the pe
5290: 65 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 31  er for OpenSSL 1
52a0: 2e 31 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28  .1 */...dprintf(
52b0: 22 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 4f  "(Unexpected) EO
52c0: 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65  F reached")...*e
52d0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
52e0: 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30  ...bytesRead = 0
52f0: 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74  ;...Tls_Error(st
5300: 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 61  atePtr, "EOF rea
5310: 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d 20  ched");...    } 
5320: 65 6c 73 65 20 69 66 20 28 65 72 72 20 3d 3d 20  else if (err == 
5330: 30 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d  0 && bytesRead =
5340: 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74  = -1) {...dprint
5350: 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  f("I/O error occ
5360: 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25  urred (errno = %
5370: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
5380: 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 72  long) Tcl_GetErr
5390: 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43  no());...*errorC
53a0: 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74  odePtr = Tcl_Get
53b0: 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73  Errno();...bytes
53c0: 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 73 74 61  Read = -1;...sta
53d0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
53e0: 54 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52  TLS_TCL_FATAL_ER
53f0: 52 4f 52 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72  ROR;...Tls_Error
5400: 28 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 45  (statePtr, Tcl_E
5410: 72 72 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f  rrnoMsg(*errorCo
5420: 64 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d  dePtr));...    }
5430: 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74   else {...dprint
5440: 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  f("I/O error occ
5450: 75 72 72 65 64 20 28 65 72 72 20 3d 20 25 6c 75  urred (err = %lu
5460: 29 22 2c 20 65 72 72 29 3b 0a 09 09 2a 65 72 72  )", err);...*err
5470: 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f  orCodePtr = Tcl_
5480: 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79  GetErrno();...by
5490: 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09  tesRead = -1;...
54a0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
54b0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 46 41 54 41 4c  |= TLS_TCL_FATAL
54c0: 5f 45 52 52 4f 52 3b 0a 09 09 54 6c 73 5f 45 72  _ERROR;...Tls_Er
54d0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52  ror(statePtr, ER
54e0: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73  R_reason_error_s
54f0: 74 72 69 6e 67 28 65 72 72 29 29 3b 0a 09 20 20  tring(err));..  
5500: 20 20 7d 0a 09 20 20 20 20 73 74 61 74 65 50 74    }..    statePt
5510: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
5520: 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20 62 72  TCL_EOF;..    br
5530: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
5540: 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52  ERROR_ZERO_RETUR
5550: 4e 3a 0a 09 20 20 20 20 2f 2a 20 50 65 65 72 20  N:..    /* Peer 
5560: 68 61 73 20 63 6c 65 61 6e 6c 79 20 63 6c 6f 73  has cleanly clos
5570: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ed the connectio
5580: 6e 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65  n by sending the
5590: 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 0a 09 20   close_notify.. 
55a0: 20 20 20 20 20 20 61 6c 65 72 74 2e 20 43 61 6e        alert. Can
55b0: 27 74 20 72 65 61 64 2c 20 62 75 74 20 63 61 6e  't read, but can
55c0: 20 77 72 69 74 65 2e 20 4e 65 65 64 20 74 6f 20   write. Need to 
55d0: 72 65 74 75 72 6e 20 61 6e 20 45 4f 46 2c 20 73  return an EOF, s
55e0: 6f 20 74 68 65 0a 09 20 20 20 20 20 20 20 63 68  o the..       ch
55f0: 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 20  annel is closed 
5600: 77 68 69 63 68 20 77 69 6c 6c 20 73 65 6e 64 20  which will send 
5610: 61 6e 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28  an SSL_shutdown(
5620: 29 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  ). */..    dprin
5630: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 5a 45  tf("SSL_ERROR_ZE
5640: 52 4f 5f 52 45 54 55 52 4e 3a 20 50 65 65 72 20  RO_RETURN: Peer 
5650: 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63  has closed the c
5660: 6f 6e 6e 65 63 74 69 6f 6e 22 29 3b 0a 09 20 20  onnection");..  
5670: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
5680: 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73 52  = 0;..    bytesR
5690: 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 73 74  ead = 0;..    st
56a0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
56b0: 20 54 4c 53 5f 54 43 4c 5f 45 4f 46 3b 0a 09 20   TLS_TCL_EOF;.. 
56c0: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61     Tls_Error(sta
56d0: 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 61 73  tePtr, "Peer has
56e0: 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e   closed the conn
56f0: 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69  ection for writi
5700: 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68  ng by sending th
5710: 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61  e close_notify a
5720: 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65  lert");..    bre
5730: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
5740: 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a  RROR_WANT_ASYNC:
5750: 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69  ..    /* Used wi
5760: 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45  th flag SSL_MODE
5770: 5f 41 53 59 4e 43 2c 20 6f 70 65 72 61 74 69 6f  _ASYNC, operatio
5780: 6e 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74  n didn't complet
5790: 65 20 62 65 63 61 75 73 65 0a 09 20 20 20 20 20  e because..     
57a0: 20 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69 6e    an async engin
57b0: 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63 65  e is still proce
57c0: 73 73 69 6e 67 20 64 61 74 61 2e 20 2a 2f 0a 09  ssing data. */..
57d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
57e0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
57f0: 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20 74  ASYNC, mapping t
5800: 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b  his to EAGAIN");
5810: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
5820: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
5830: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 30     bytesRead = 0
5840: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
5850: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 2f 2a  default:..    /*
5860: 20 4f 74 68 65 72 20 65 72 72 6f 72 20 2a 2f 0a   Other error */.
5870: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 74  .    dprintf("Ot
5880: 68 65 72 20 65 72 72 6f 72 2c 20 61 62 6f 72 74  her error, abort
5890: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
58a0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20  odePtr = 0;..   
58b0: 20 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a   bytesRead = 0;.
58c0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73  .    Tls_Error(s
58d0: 74 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77  tatePtr, "Unknow
58e0: 6e 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20  n error");..    
58f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5900: 20 20 64 70 72 69 6e 74 66 28 22 49 6e 70 75 74    dprintf("Input
5910: 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 64 5d 22  (%d) -> %d [%d]"
5920: 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 74 65 73  , bufSize, bytes
5930: 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 6f 64 65  Read, *errorCode
5940: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
5950: 20 62 79 74 65 73 52 65 61 64 3b 0a 7d 0a 0a 2f   bytesRead;.}../
5960: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59b0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70 75  -. *. * TlsOutpu
59c0: 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54  tProc --. *. *.T
59d0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
59e0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
59f0: 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65  generic I/O laye
5a00: 72 20 74 6f 20 77 72 69 74 65 20 64 61 74 61 20  r to write data 
5a10: 74 6f 20 74 68 65 0a 20 2a 09 42 49 4f 20 77 68  to the. *.BIO wh
5a20: 65 6e 65 76 65 72 20 74 68 65 20 74 68 65 20 54  enever the the T
5a30: 63 6c 5f 57 72 69 74 65 28 29 2c 20 54 63 6c 5f  cl_Write(), Tcl_
5a40: 57 72 69 74 65 43 68 61 72 73 2c 20 61 6e 64 20  WriteChars, and 
5a50: 54 63 6c 5f 57 72 69 74 65 4f 62 6a 0a 20 2a 09  Tcl_WriteObj. *.
5a60: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73  functions are us
5a70: 65 64 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 74  ed. Equivalent t
5a80: 6f 20 53 53 4c 5f 77 72 69 74 65 5f 65 78 20 61  o SSL_write_ex a
5a90: 6e 64 20 53 53 4c 5f 77 72 69 74 65 2e 0a 20 2a  nd SSL_write.. *
5aa0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
5ab0: 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  Returns the numb
5ac0: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
5ad0: 74 65 6e 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ten or -1 on err
5ae0: 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72 43 6f  or. Sets errorCo
5af0: 64 65 50 74 72 0a 20 2a 09 74 6f 20 61 20 50 4f  dePtr. *.to a PO
5b00: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  SIX error code i
5b10: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5b20: 72 65 64 2c 20 6f 72 20 30 20 69 66 20 73 75 63  red, or 0 if suc
5b30: 63 65 73 73 66 75 6c 2e 0a 20 2a 0a 20 2a 20 53  cessful.. *. * S
5b40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
5b50: 57 72 69 74 65 73 20 64 61 74 61 20 74 6f 20 53  Writes data to S
5b60: 53 4c 2f 42 49 4f 2e 0a 20 2a 0a 20 2a 2d 2d 2d  SL/BIO.. *. *---
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
5bc0: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4f 75 74  tatic int TlsOut
5bd0: 70 75 74 50 72 6f 63 28 0a 20 20 20 20 43 6c 69  putProc(.    Cli
5be0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
5bf0: 44 61 74 61 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74  Data,./* Connect
5c00: 69 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20 2a  ion state info *
5c10: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
5c20: 20 2a 62 75 66 2c 09 09 2f 2a 20 42 75 66 66 65   *buf,../* Buffe
5c30: 72 20 77 69 74 68 20 64 61 74 61 20 74 6f 20 77  r with data to w
5c40: 72 69 74 65 20 74 6f 20 42 49 4f 20 2a 2f 0a 20  rite to BIO */. 
5c50: 20 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 09     int toWrite,.
5c60: 09 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61  ./* Size of data
5c70: 20 74 6f 20 77 72 69 74 65 20 69 6e 20 62 79 74   to write in byt
5c80: 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 65  es */.    int *e
5c90: 72 72 6f 72 43 6f 64 65 50 74 72 29 09 09 2f 2a  rrorCodePtr)../*
5ca0: 20 53 74 6f 72 61 67 65 20 66 6f 72 20 65 72 72   Storage for err
5cb0: 6f 72 20 63 6f 64 65 20 74 6f 20 72 65 74 75 72  or code to retur
5cc0: 6e 20 2a 2f 0a 7b 0a 20 20 20 20 75 6e 73 69 67  n */.{.    unsig
5cd0: 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20  ned long err;.  
5ce0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
5cf0: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e  r = (State *) in
5d00: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20  stanceData;.    
5d10: 69 6e 74 20 77 72 69 74 74 65 6e 2c 20 72 63 2c  int written, rc,
5d20: 20 72 65 61 73 6f 6e 2c 20 69 73 5f 66 61 74 61   reason, is_fata
5d30: 6c 2c 20 62 69 6f 53 68 6f 75 6c 64 52 65 74 72  l, bioShouldRetr
5d40: 79 2c 20 69 6f 5f 65 72 72 3b 0a 20 20 20 20 2a  y, io_err;.    *
5d50: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
5d60: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
5d70: 57 72 69 74 65 20 25 64 20 62 79 74 65 73 22 2c  Write %d bytes",
5d80: 20 74 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 64   toWrite);.    d
5d90: 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c  printBuffer(buf,
5da0: 20 74 6f 57 72 69 74 65 29 3b 0a 0a 20 20 20 20   toWrite);..    
5db0: 2f 2a 20 41 62 6f 72 74 20 69 66 20 74 68 65 20  /* Abort if the 
5dc0: 75 73 65 72 20 76 65 72 69 66 79 20 63 61 6c 6c  user verify call
5dd0: 62 61 63 6b 20 69 73 20 73 74 69 6c 6c 20 72 75  back is still ru
5de0: 6e 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 20 74  nning to avoid t
5df0: 72 69 67 67 65 72 69 6e 67 0a 20 20 20 20 20 2a  riggering.     *
5e00: 20 61 6e 6f 74 68 65 72 20 63 61 6c 6c 20 62 65   another call be
5e10: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
5e20: 20 6f 6e 65 20 69 73 20 63 6f 6d 70 6c 65 74 65   one is complete
5e30: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  . */.    if (sta
5e40: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
5e50: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29  LS_TCL_CALLBACK)
5e60: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 44 6f 6e   {..dprintf("Don
5e70: 27 74 20 70 72 6f 63 65 73 73 20 6f 75 74 70 75  't process outpu
5e80: 74 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b  t while callback
5e90: 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 22 29 3b  s are running");
5ea0: 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a  ..written = -1;.
5eb0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
5ec0: 20 45 41 47 41 49 4e 3b 0a 09 72 65 74 75 72 6e   EAGAIN;..return
5ed0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
5ee0: 2f 2a 20 41 62 6f 72 74 20 69 66 20 63 6f 6e 6e  /* Abort if conn
5ef0: 65 63 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65  ection has faile
5f00: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  d. */.    if (st
5f10: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
5f20: 54 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52  TLS_TCL_FATAL_ER
5f30: 52 4f 52 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  ROR) {..dprintf(
5f40: 22 46 61 74 61 6c 20 65 72 72 6f 72 20 61 6c 72  "Fatal error alr
5f50: 65 61 64 79 20 64 65 74 65 63 74 65 64 2c 20 61  eady detected, a
5f60: 62 6f 72 74 20 77 72 69 74 65 22 29 3b 0a 09 2a  bort write");..*
5f70: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
5f80: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 72 65  CONNABORTED;..re
5f90: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
5fa0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e      /* If not in
5fb0: 69 74 69 61 6c 69 7a 65 64 2c 20 64 6f 20 63 6f  itialized, do co
5fc0: 6e 6e 65 63 74 2e 20 43 61 6e 20 61 6c 73 6f 20  nnect. Can also 
5fd0: 63 68 65 63 6b 20 53 53 4c 5f 69 73 5f 69 6e 69  check SSL_is_ini
5fe0: 74 5f 66 69 6e 69 73 68 65 64 28 29 2e 20 2a 2f  t_finished(). */
5ff0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
6000: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
6010: 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 69 6e 74 20  CL_INIT) {..int 
6020: 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70  tlsConnect;...dp
6030: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54  rintf("Calling T
6040: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
6050: 74 22 29 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63  t");...tlsConnec
6060: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  t = Tls_WaitForC
6070: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c  onnect(statePtr,
6080: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 31   errorCodePtr, 1
6090: 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f 6e 6e 65  );..if (tlsConne
60a0: 63 74 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 64  ct < 0) {..    d
60b0: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65  printf("Got an e
60c0: 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f 20  rror waiting to 
60d0: 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e  connect (tlsConn
60e0: 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72  ect = %i, *error
60f0: 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c 0a  CodePtr = %i)",.
6100: 09 09 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a 65  ..tlsConnect, *e
6110: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a 09  rrorCodePtr);...
6120: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31      written = -1
6130: 3b 0a 09 20 20 20 20 69 66 20 28 2a 65 72 72 6f  ;..    if (*erro
6140: 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e  rCodePtr == ECON
6150: 4e 52 45 53 45 54 29 20 7b 0a 09 09 64 70 72 69  NRESET) {...dpri
6160: 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74  ntf("Got connect
6170: 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 2f  ion reset");.../
6180: 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 09  * Soft EOF */...
6190: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
61a0: 30 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 30  0;...written = 0
61b0: 3b 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 66 6c  ;...statePtr->fl
61c0: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 45  ags |= TLS_TCL_E
61d0: 4f 46 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OF;..    }..    
61e0: 72 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a  return written;.
61f0: 09 7d 20 65 6c 73 65 20 69 66 20 28 74 6c 73 43  .} else if (tlsC
6200: 6f 6e 6e 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09  onnect == 0) {..
6210: 20 20 20 20 2f 2a 20 54 72 79 20 61 67 61 69 6e      /* Try again
6220: 20 2a 2f 0a 09 20 20 20 20 77 72 69 74 74 65 6e   */..    written
6230: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 72 65 74 75   = -1;..    retu
6240: 72 6e 20 77 72 69 74 74 65 6e 3b 0a 09 7d 0a 20  rn written;..}. 
6250: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c 75     }..    /* Flu
6260: 73 68 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f  sh */.    if (to
6270: 57 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64  Write == 0) {..d
6280: 70 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69  printf("zero-wri
6290: 74 65 22 29 3b 0a 0a 09 69 66 20 28 42 49 4f 5f  te");...if (BIO_
62a0: 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e  flush(statePtr->
62b0: 62 69 6f 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  bio) <= 0) {..  
62c0: 20 20 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68    dprintf("Flush
62d0: 69 6e 67 20 66 61 69 6c 65 64 22 29 3b 0a 09 20  ing failed");.. 
62e0: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61     Tls_Error(sta
62f0: 74 65 50 74 72 2c 20 22 46 6c 75 73 68 20 66 61  tePtr, "Flush fa
6300: 69 6c 65 64 22 29 3b 0a 0a 09 20 20 20 20 2a 65  iled");...    *e
6310: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
6320: 4f 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  O;..    written 
6330: 3d 20 30 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  = 0;..    return
6340: 20 2d 31 3b 0a 09 7d 0a 0a 09 2a 65 72 72 6f 72   -1;..}...*error
6350: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 77 72  CodePtr = 0;..wr
6360: 69 74 74 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75  itten = 0;..retu
6370: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
6380: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65   /*.     * We ne
6390: 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  ed to clear the 
63a0: 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20  SSL error stack 
63b0: 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65 20 73  now because we s
63c0: 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20  ometimes reach. 
63d0: 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74      * this funct
63e0: 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65  ion with leftove
63f0: 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  r errors in the 
6400: 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 77  stack.  If BIO_w
6410: 72 69 74 65 0a 20 20 20 20 20 2a 20 72 65 74 75  rite.     * retu
6420: 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e  rns -1 and inten
6430: 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65  ds EAGAIN, there
6440: 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65   is a leftover e
6450: 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65  rror, it will be
6460: 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74  .     * misconst
6470: 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72  rued as an error
6480: 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20  , not EAGAIN..  
6490: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74     */.    dprint
64a0: 66 28 22 42 49 4f 5f 77 72 69 74 65 20 65 6f 66  f("BIO_write eof
64b0: 3d 25 64 2c 20 62 75 66 66 65 72 65 64 3d 25 64  =%d, buffered=%d
64c0: 2c 20 69 6e 70 75 74 3d 25 64 2c 20 6f 75 74 70  , input=%d, outp
64d0: 75 74 3d 25 64 22 2c 20 54 63 6c 5f 45 6f 66 28  ut=%d", Tcl_Eof(
64e0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
64f0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 42 75 66 66   Tcl_ChannelBuff
6500: 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73  ered(statePtr->s
6510: 65 6c 66 29 2c 20 5c 0a 20 20 20 20 20 20 20 20  elf), \.        
6520: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65  Tcl_InputBuffere
6530: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  d(statePtr->self
6540: 29 2c 20 54 63 6c 5f 4f 75 74 70 75 74 42 75 66  ), Tcl_OutputBuf
6550: 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e  fered(statePtr->
6560: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f  self));.    Tcl_
6570: 53 65 74 45 72 72 6e 6f 28 30 29 3b 0a 20 20 20  SetErrno(0);.   
6580: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
6590: 28 29 3b 0a 20 20 20 20 42 49 4f 5f 63 6c 65 61  ();.    BIO_clea
65a0: 72 5f 72 65 74 72 79 5f 66 6c 61 67 73 28 73 74  r_retry_flags(st
65b0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 20 20  atePtr->bio);.  
65c0: 20 20 77 72 69 74 74 65 6e 20 3d 20 42 49 4f 5f    written = BIO_
65d0: 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e  write(statePtr->
65e0: 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69 74  bio, buf, toWrit
65f0: 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  e);.    dprintf(
6600: 22 42 49 4f 5f 77 72 69 74 65 28 25 70 2c 20 25  "BIO_write(%p, %
6610: 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28 76 6f  d) -> [%d]", (vo
6620: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 2c 20  id *) statePtr, 
6630: 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e  toWrite, written
6640: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
6650: 42 49 4f 5f 77 72 69 74 65 20 65 6f 66 3d 25 64  BIO_write eof=%d
6660: 2c 20 62 75 66 66 65 72 65 64 3d 25 64 2c 20 69  , buffered=%d, i
6670: 6e 70 75 74 3d 25 64 2c 20 6f 75 74 70 75 74 3d  nput=%d, output=
6680: 25 64 22 2c 20 54 63 6c 5f 45 6f 66 28 73 74 61  %d", Tcl_Eof(sta
6690: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 63  tePtr->self), Tc
66a0: 6c 5f 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 65  l_ChannelBuffere
66b0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  d(statePtr->self
66c0: 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 54 63 6c  ), \.        Tcl
66d0: 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73  _InputBuffered(s
66e0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
66f0: 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72  Tcl_OutputBuffer
6700: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
6710: 66 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 61 6d  f));..    /* Sam
6720: 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62  e as SSL_want, b
6730: 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74  ut also checks t
6740: 68 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a  he error queue *
6750: 2f 0a 20 20 20 20 72 63 20 3d 20 53 53 4c 5f 67  /.    rc = SSL_g
6760: 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74  et_error(statePt
6770: 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 6e 29  r->ssl, written)
6780: 3b 0a 20 20 20 20 65 72 72 20 3d 20 45 52 52 5f  ;.    err = ERR_
6790: 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20  get_error();.   
67a0: 20 72 65 61 73 6f 6e 20 3d 20 45 52 52 5f 47 45   reason = ERR_GE
67b0: 54 5f 52 45 41 53 4f 4e 28 65 72 72 29 3b 0a 20  T_REASON(err);. 
67c0: 20 20 20 69 73 5f 66 61 74 61 6c 20 3d 20 45 52     is_fatal = ER
67d0: 52 5f 46 41 54 41 4c 5f 45 52 52 4f 52 28 65 72  R_FATAL_ERROR(er
67e0: 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  r);.    /* The r
67f0: 65 74 72 79 20 66 6c 61 67 20 69 73 20 73 65 74  etry flag is set
6800: 20 62 79 20 74 68 65 20 42 49 4f 5f 73 65 74 5f   by the BIO_set_
6810: 72 65 74 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e  retry_* function
6820: 73 20 2a 2f 0a 20 20 20 20 62 69 6f 53 68 6f 75  s */.    bioShou
6830: 6c 64 52 65 74 72 79 20 3d 20 42 49 4f 5f 73 68  ldRetry = BIO_sh
6840: 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65  ould_retry(state
6850: 50 74 72 2d 3e 62 69 6f 29 3b 0a 20 20 20 20 69  Ptr->bio);.    i
6860: 6f 5f 65 72 72 20 3d 20 54 63 6c 5f 47 65 74 45  o_err = Tcl_GetE
6870: 72 72 6e 6f 28 29 3b 0a 20 20 20 20 64 70 72 69  rrno();.    dpri
6880: 6e 74 66 28 22 57 72 69 74 65 3a 20 77 72 69 74  ntf("Write: writ
6890: 74 65 6e 3d 25 64 2c 20 72 63 3d 25 64 2c 20 65  ten=%d, rc=%d, e
68a0: 72 72 3d 25 6c 64 2c 20 72 65 61 73 6f 6e 3d 25  rr=%ld, reason=%
68b0: 64 2c 20 69 73 5f 66 61 74 61 6c 3d 25 64 2c 20  d, is_fatal=%d, 
68c0: 6c 69 62 3d 25 73 2c 20 6d 73 67 3d 25 73 2c 20  lib=%s, msg=%s, 
68d0: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 3d 25  bioShouldRetry=%
68e0: 64 2c 20 65 72 72 6e 6f 3d 25 64 2c 20 69 64 3d  d, errno=%d, id=
68f0: 25 73 2c 20 6d 73 67 3d 25 73 22 2c 20 5c 0a 20  %s, msg=%s", \. 
6900: 20 20 20 20 20 20 20 77 72 69 74 74 65 6e 2c 20         written, 
6910: 72 63 2c 20 65 72 72 2c 20 72 65 61 73 6f 6e 2c  rc, err, reason,
6920: 20 69 73 5f 66 61 74 61 6c 2c 20 45 52 52 5f 6c   is_fatal, ERR_l
6930: 69 62 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  ib_error_string(
6940: 65 72 72 29 2c 20 45 52 52 5f 72 65 61 73 6f 6e  err), ERR_reason
6950: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72  _error_string(er
6960: 72 29 2c 20 62 69 6f 53 68 6f 75 6c 64 52 65 74  r), bioShouldRet
6970: 72 79 2c 20 69 6f 5f 65 72 72 2c 20 54 63 6c 5f  ry, io_err, Tcl_
6980: 45 72 72 6e 6f 49 64 28 29 2c 20 54 63 6c 5f 45  ErrnoId(), Tcl_E
6990: 72 72 6e 6f 4d 73 67 28 69 6f 5f 65 72 72 29 29  rrnoMsg(io_err))
69a0: 3b 0a 0a 20 20 20 20 69 66 20 28 77 72 69 74 74  ;..    if (writt
69b0: 65 6e 20 3c 3d 20 30 29 20 7b 0a 09 64 70 72 69  en <= 0) {..dpri
69c0: 6e 74 66 28 22 57 72 69 74 65 20 66 61 69 6c 65  ntf("Write faile
69d0: 64 3a 20 69 73 20 45 4f 46 3d 25 64 2c 20 73 68  d: is EOF=%d, sh
69e0: 6f 75 6c 64 20 72 65 74 72 79 3d 25 64 2c 20 72  ould retry=%d, r
69f0: 65 74 72 79 20 72 65 61 64 3d 25 64 2c 20 72 65  etry read=%d, re
6a00: 74 72 79 20 77 72 69 74 65 3d 25 64 2c 20 6f 74  try write=%d, ot
6a10: 68 65 72 3d 25 64 22 2c 0a 09 20 20 20 20 42 49  her=%d",..    BI
6a20: 4f 5f 65 6f 66 28 73 74 61 74 65 50 74 72 2d 3e  O_eof(statePtr->
6a30: 62 69 6f 29 2c 20 42 49 4f 5f 73 68 6f 75 6c 64  bio), BIO_should
6a40: 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d  _retry(statePtr-
6a50: 3e 62 69 6f 29 2c 20 42 49 4f 5f 73 68 6f 75 6c  >bio), BIO_shoul
6a60: 64 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d  d_read(statePtr-
6a70: 3e 62 69 6f 29 2c 0a 09 20 20 20 20 42 49 4f 5f  >bio),..    BIO_
6a80: 73 68 6f 75 6c 64 5f 77 72 69 74 65 28 73 74 61  should_write(sta
6a90: 74 65 50 74 72 2d 3e 62 69 6f 29 2c 20 42 49 4f  tePtr->bio), BIO
6aa0: 5f 73 68 6f 75 6c 64 5f 69 6f 5f 73 70 65 63 69  _should_io_speci
6ab0: 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  al(statePtr->bio
6ac0: 29 29 3b 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f  ));..if (BIO_sho
6ad0: 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50  uld_retry(stateP
6ae0: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20  tr->bio)) {..   
6af0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
6b00: 20 45 41 47 41 49 4e 3b 0a 09 7d 0a 20 20 20 20   EAGAIN;..}.    
6b10: 7d 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f 66 6c  } else {..BIO_fl
6b20: 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ush(statePtr->bi
6b30: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  o);.    }..    /
6b40: 2a 20 42 61 73 65 64 20 6f 6e 20 65 72 72 6f 72  * Based on error
6b50: 2c 20 64 6f 20 72 65 74 72 79 20 6f 72 20 61 62  , do retry or ab
6b60: 6f 72 74 20 2a 2f 0a 20 20 20 20 73 77 69 74 63  ort */.    switc
6b70: 68 20 28 72 63 29 20 7b 0a 09 63 61 73 65 20 53  h (rc) {..case S
6b80: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09  SL_ERROR_NONE:..
6b90: 20 20 20 20 2f 2a 20 49 2f 4f 20 6f 70 65 72 61      /* I/O opera
6ba0: 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a  tion completed *
6bb0: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
6bc0: 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 22 29  SSL_ERROR_NONE")
6bd0: 3b 0a 09 20 20 20 20 69 66 20 28 77 72 69 74 74  ;..    if (writt
6be0: 65 6e 20 3c 20 30 29 20 7b 0a 09 09 77 72 69 74  en < 0) {...writ
6bf0: 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a  ten = 0;..    }.
6c00: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
6c10: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c  se SSL_ERROR_SSL
6c20: 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d  :..    /* A non-
6c30: 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74  recoverable, fat
6c40: 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  al error in the 
6c50: 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 63 63 75  SSL library occu
6c60: 72 72 65 64 2c 0a 09 20 20 20 20 20 20 20 75 73  rred,..       us
6c70: 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f 63 6f 6c  ually a protocol
6c80: 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 64   error */..    d
6c90: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f  printf("SSL_ERRO
6ca0: 52 5f 53 53 4c 3a 20 46 61 74 61 6c 20 53 53 4c  R_SSL: Fatal SSL
6cb0: 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20   protocol error 
6cc0: 6f 63 63 75 72 72 65 64 22 29 3b 0a 09 20 20 20  occurred");..   
6cd0: 20 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b   if (err != 0) {
6ce0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
6cf0: 74 65 50 74 72 2c 20 45 52 52 5f 72 65 61 73 6f  tePtr, ERR_reaso
6d00: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65  n_error_string(e
6d10: 72 72 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73  rr));..    } els
6d20: 65 20 69 66 20 28 53 53 4c 5f 67 65 74 5f 76 65  e if (SSL_get_ve
6d30: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
6d40: 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35  ePtr->ssl) != X5
6d50: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73  09_V_OK) {...Tls
6d60: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
6d70: 0a 09 09 20 20 20 20 58 35 30 39 5f 76 65 72 69  ...    X509_veri
6d80: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
6d90: 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72  ring(SSL_get_ver
6da0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
6db0: 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20  Ptr->ssl)));..  
6dc0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 6c 73    } else {...Tls
6dd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
6de0: 20 22 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 72   "Unknown SSL er
6df0: 72 6f 72 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20  ror");..    }.. 
6e00: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
6e10: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b   = ECONNABORTED;
6e20: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
6e30: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
6e40: 5f 46 41 54 41 4c 5f 45 52 52 4f 52 3b 0a 09 20  _FATAL_ERROR;.. 
6e50: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
6e60: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 45 4f  gs |= TLS_TCL_EO
6e70: 46 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  F;..    written 
6e80: 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b  = -1;..    break
6e90: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
6ea0: 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20  OR_WANT_READ:.. 
6eb0: 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 20     /* Operation 
6ec0: 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  did not complete
6ed0: 20 64 75 65 20 74 6f 20 6e 6f 74 20 65 6e 6f 75   due to not enou
6ee0: 67 68 20 64 61 74 61 20 77 61 73 20 61 76 61 69  gh data was avai
6ef0: 6c 61 62 6c 65 2e 0a 09 20 20 20 20 20 20 20 52  lable...       R
6f00: 65 74 72 79 20 61 67 61 69 6e 20 6c 61 74 65 72  etry again later
6f10: 20 77 69 74 68 20 73 61 6d 65 20 64 61 74 61 2e   with same data.
6f20: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
6f30: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
6f40: 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69  WANT_READ, mappi
6f50: 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e 22  ng it to EAGAIN"
6f60: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
6f70: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
6f80: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d  .    written = -
6f90: 31 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72  1;..    statePtr
6fa0: 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 52 45  ->want |= TCL_RE
6fb0: 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 42 49 4f  ADABLE;..    BIO
6fc0: 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61 64 28  _set_retry_read(
6fd0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
6fe0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
6ff0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  se SSL_ERROR_WAN
7000: 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 20 2f 2a  T_WRITE:..    /*
7010: 20 4f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   Operation did n
7020: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20  ot complete due 
7030: 74 6f 20 75 6e 61 62 6c 65 20 74 6f 20 73 65 6e  to unable to sen
7040: 64 20 61 6c 6c 20 64 61 74 61 20 74 6f 20 74 68  d all data to th
7050: 65 0a 09 20 20 20 20 20 20 20 42 49 4f 2e 20 52  e..       BIO. R
7060: 65 74 72 79 20 6c 61 74 65 72 20 77 69 74 68 20  etry later with 
7070: 73 61 6d 65 20 64 61 74 61 2e 20 2a 2f 0a 09 20  same data. */.. 
7080: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
7090: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57  SSL_ERROR_WANT_W
70a0: 52 49 54 45 2c 20 6d 61 70 70 69 6e 67 20 69 74  RITE, mapping it
70b0: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20   to EAGAIN");.. 
70c0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
70d0: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20   = EAGAIN;..    
70e0: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20  written = -1;.. 
70f0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e     statePtr->wan
7100: 74 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c  t |= TCL_WRITABL
7110: 45 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f  E;..    BIO_set_
7120: 72 65 74 72 79 5f 77 72 69 74 65 28 73 74 61 74  retry_write(stat
7130: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20  ePtr->bio);..   
7140: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53   break;...case S
7150: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
7160: 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20  09_LOOKUP:..    
7170: 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  /* The operation
7180: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
7190: 65 20 62 65 63 61 75 73 65 20 61 6e 20 61 70 70  e because an app
71a0: 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  lication callbac
71b0: 6b 0a 09 20 20 20 20 20 20 20 73 65 74 20 62 79  k..       set by
71c0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69   SSL_CTX_set_cli
71d0: 65 6e 74 5f 63 65 72 74 5f 63 62 28 29 20 68 61  ent_cert_cb() ha
71e0: 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61  s asked to be ca
71f0: 6c 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 09  lled again. */..
7200: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
7210: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
7220: 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d 61 70  X509_LOOKUP, map
7230: 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49  ping it to EAGAI
7240: 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  N");..    *error
7250: 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e  CodePtr = EAGAIN
7260: 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d  ;..    written =
7270: 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b   -1;..    break;
7280: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
7290: 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20  R_SYSCALL:..    
72a0: 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f  /* Some non-reco
72b0: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49  verable, fatal I
72c0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
72d0: 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  d */..    dprint
72e0: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53  f("SSL_ERROR_SYS
72f0: 43 41 4c 4c 3a 20 46 61 74 61 6c 20 49 2f 4f 20  CALL: Fatal I/O 
7300: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 22 29  error occurred")
7310: 3b 0a 0a 09 20 20 20 20 69 66 20 28 65 72 72 20  ;...    if (err 
7320: 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e 20  == 0 && written 
7330: 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74  == 0) {...dprint
7340: 66 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 29  f("EOF reached")
7350: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
7360: 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 6e 20   = 0;...written 
7370: 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72  = 0;...Tls_Error
7380: 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20  (statePtr, "EOF 
7390: 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20  reached");...   
73a0: 20 7d 20 65 6c 73 65 20 69 66 20 28 65 72 72 20   } else if (err 
73b0: 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e 20  == 0 && written 
73c0: 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e  == -1) {...dprin
73d0: 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63  tf("I/O error oc
73e0: 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20  curred (errno = 
73f0: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
7400: 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72   long) Tcl_GetEr
7410: 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72  rno());...*error
7420: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65  CodePtr = Tcl_Ge
7430: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69 74  tErrno();...writ
7440: 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 73 74 61 74  ten = -1;...stat
7450: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
7460: 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52 52  LS_TCL_FATAL_ERR
7470: 4f 52 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28  OR;...Tls_Error(
7480: 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 45 72  statePtr, Tcl_Er
7490: 72 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64  rnoMsg(*errorCod
74a0: 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20  ePtr));...    } 
74b0: 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66  else {...dprintf
74c0: 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  ("I/O error occu
74d0: 72 72 65 64 20 28 65 72 72 20 3d 20 25 6c 75 29  rred (err = %lu)
74e0: 22 2c 20 65 72 72 29 3b 0a 09 09 2a 65 72 72 6f  ", err);...*erro
74f0: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
7500: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69  etErrno();...wri
7510: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 73 74 61  tten = -1;...sta
7520: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
7530: 54 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52  TLS_TCL_FATAL_ER
7540: 52 4f 52 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72  ROR;...Tls_Error
7550: 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72  (statePtr, ERR_r
7560: 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69  eason_error_stri
7570: 6e 67 28 65 72 72 29 29 3b 0a 09 20 20 20 20 7d  ng(err));..    }
7580: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
7590: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
75a0: 5f 45 4f 46 3b 0a 09 20 20 20 20 62 72 65 61 6b  _EOF;..    break
75b0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
75c0: 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a  OR_ZERO_RETURN:.
75d0: 09 20 20 20 20 2f 2a 20 50 65 65 72 20 68 61 73  .    /* Peer has
75e0: 20 63 6c 65 61 6e 6c 79 20 63 6c 6f 73 65 64 20   cleanly closed 
75f0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62  the connection b
7600: 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c  y sending the cl
7610: 6f 73 65 5f 6e 6f 74 69 66 79 0a 09 20 20 20 20  ose_notify..    
7620: 20 20 20 61 6c 65 72 74 2e 20 43 61 6e 27 74 20     alert. Can't 
7630: 72 65 61 64 2c 20 62 75 74 20 63 61 6e 20 77 72  read, but can wr
7640: 69 74 65 2e 20 4e 65 65 64 20 74 6f 20 72 65 74  ite. Need to ret
7650: 75 72 6e 20 61 6e 20 45 4f 46 2c 20 73 6f 20 74  urn an EOF, so t
7660: 68 65 0a 09 20 20 20 20 20 20 20 63 68 61 6e 6e  he..       chann
7670: 65 6c 20 69 73 20 63 6c 6f 73 65 64 20 77 68 69  el is closed whi
7680: 63 68 20 77 69 6c 6c 20 73 65 6e 64 20 61 6e 20  ch will send an 
7690: 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 29 2e 20  SSL_shutdown(). 
76a0: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
76b0: 22 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f  "SSL_ERROR_ZERO_
76c0: 52 45 54 55 52 4e 3a 20 50 65 65 72 20 68 61 73  RETURN: Peer has
76d0: 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e   closed the conn
76e0: 65 63 74 69 6f 6e 22 29 3b 0a 09 20 20 20 20 2a  ection");..    *
76f0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
7700: 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d  ;..    written =
7710: 20 30 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74   0;..    statePt
7720: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
7730: 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20 54 6c  TCL_EOF;..    Tl
7740: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
7750: 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f 73  , "Peer has clos
7760: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ed the connectio
7770: 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79  n for writing by
7780: 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f   sending the clo
7790: 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 22  se_notify alert"
77a0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  );..    break;..
77b0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
77c0: 57 41 4e 54 5f 41 53 59 4e 43 3a 0a 09 20 20 20  WANT_ASYNC:..   
77d0: 20 2f 2a 20 55 73 65 64 20 77 69 74 68 20 66 6c   /* Used with fl
77e0: 61 67 20 53 53 4c 5f 4d 4f 44 45 5f 41 53 59 4e  ag SSL_MODE_ASYN
77f0: 43 2c 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64  C, operation did
7800: 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  n't complete bec
7810: 61 75 73 65 0a 09 20 20 20 20 20 20 20 61 6e 20  ause..       an 
7820: 61 73 79 6e 63 20 65 6e 67 69 6e 65 20 69 73 20  async engine is 
7830: 73 74 69 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67  still processing
7840: 20 64 61 74 61 2e 20 2a 2f 0a 09 20 20 20 20 64   data. */..    d
7850: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f  printf("Got SSL_
7860: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43  ERROR_WANT_ASYNC
7870: 2c 20 6d 61 70 70 69 6e 67 20 74 68 69 73 20 74  , mapping this t
7880: 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20  o EAGAIN");..   
7890: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
78a0: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72   EAGAIN;..    wr
78b0: 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20  itten = 0;..    
78c0: 62 72 65 61 6b 3b 0a 0a 09 64 65 66 61 75 6c 74  break;...default
78d0: 3a 0a 09 20 20 20 20 2f 2a 20 4f 74 68 65 72 20  :..    /* Other 
78e0: 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 64 70  error */..    dp
78f0: 72 69 6e 74 66 28 22 4f 74 68 65 72 20 65 72 72  rintf("Other err
7900: 6f 72 2c 20 61 62 6f 72 74 22 29 3b 0a 09 20 20  or, abort");..  
7910: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
7920: 3d 20 30 3b 0a 09 20 20 20 20 77 72 69 74 74 65  = 0;..    writte
7930: 6e 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73 5f  n = 0;..    Tls_
7940: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
7950: 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 29  "Unknown error")
7960: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
7970: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
7980: 28 22 4f 75 74 70 75 74 28 25 64 29 20 2d 3e 20  ("Output(%d) -> 
7990: 25 64 22 2c 20 74 6f 57 72 69 74 65 2c 20 77 72  %d", toWrite, wr
79a0: 69 74 74 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  itten);.    retu
79b0: 72 6e 20 77 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f  rn written;.}../
79c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
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 2d  ----------------
7a10: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 47 65 74 50  -. *. * Tls_GetP
7a20: 61 72 65 6e 74 20 2d 2d 0a 20 2a 0a 20 2a 09 47  arent --. *. *.G
7a30: 65 74 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  et parent channe
7a40: 6c 20 66 6f 72 20 61 20 73 74 61 63 6b 65 64 20  l for a stacked 
7a50: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52  channel.. *. * R
7a60: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 5f 43  esults:. *.Tcl_C
7a70: 68 61 6e 6e 65 6c 20 6f 72 20 4e 55 4c 4c 20 69  hannel or NULL i
7a80: 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  f none.. *. *---
7a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
7ae0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 54 6c 73 5f 47  cl_Channel Tls_G
7af0: 65 74 50 61 72 65 6e 74 28 0a 20 20 20 20 53 74  etParent(.    St
7b00: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 09 09  ate *statePtr,..
7b10: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  /* Connection st
7b20: 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ate info */.    
7b30: 69 6e 74 20 6d 61 73 6b 46 6c 61 67 73 29 09 09  int maskFlags)..
7b40: 2f 2a 20 57 68 69 63 68 20 66 6c 61 67 73 20 74  /* Which flags t
7b50: 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 7b 0a 20  o process */.{. 
7b60: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 71 75     dprintf("Requ
7b70: 65 73 74 65 64 20 74 6f 20 67 65 74 20 70 61 72  ested to get par
7b80: 65 6e 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 25  ent of channel %
7b90: 70 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  p", statePtr->se
7ba0: 6c 66 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 73  lf);..    if ((s
7bb0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
7bc0: 20 7e 6d 61 73 6b 46 6c 61 67 73 29 20 26 20 54   ~maskFlags) & T
7bd0: 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29  LS_TCL_FASTPATH)
7be0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b   {..dprintf("Ask
7bf0: 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 70 61  ed to get the pa
7c00: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 77 68 69  rent channel whi
7c10: 6c 65 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  le we are using 
7c20: 46 61 73 74 50 61 74 68 20 2d 2d 20 72 65 74 75  FastPath -- retu
7c30: 72 6e 69 6e 67 20 4e 55 4c 4c 22 29 3b 0a 09 72  rning NULL");..r
7c40: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
7c50: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  }.    return Tcl
7c60: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
7c70: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
7c80: 66 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  f);.}../*. *----
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
7ce0: 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63  TlsSetOptionProc
7cf0: 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65 74 73 20 61   --. *. *.Sets a
7d00: 6e 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75  n option to valu
7d10: 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b  e for a SSL sock
7d20: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
7d30: 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 0a  . Called by the.
7d40: 20 2a 09 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c   *.generic I/O l
7d50: 61 79 65 72 20 77 68 65 6e 65 76 65 72 20 74 68  ayer whenever th
7d60: 65 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  e Tcl_SetChannel
7d70: 4f 70 74 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  Option() functio
7d80: 6e 20 69 73 20 75 73 65 64 2e 0a 20 2a 0a 20 2a  n is used.. *. *
7d90: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 43 4c   Results:. *.TCL
7da0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
7db0: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69  l or TCL_ERROR i
7dc0: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20  f failed.. *. * 
7dd0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
7de0: 09 55 70 64 61 74 65 73 20 63 68 61 6e 6e 65 6c  .Updates channel
7df0: 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65 77 20 76   option to new v
7e00: 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  alue.. *. *-----
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
7e60: 74 69 63 20 69 6e 74 0a 54 6c 73 53 65 74 4f 70  tic int.TlsSetOp
7e70: 74 69 6f 6e 50 72 6f 63 28 0a 20 20 20 20 43 6c  tionProc(.    Cl
7e80: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
7e90: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74  eData,./* Socket
7ea0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54   state. */.    T
7eb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7ec0: 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72  p,../* For error
7ed0: 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  s - can be NULL.
7ee0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
7ef0: 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09  ar *optionName,.
7f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
7f10: 70 74 69 6f 6e 20 74 6f 20 73 65 74 20 74 68 65  ption to set the
7f20: 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 0a 09   value for, or..
7f30: 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 67 65  ... * NULL to ge
7f40: 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e  t all options an
7f50: 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20  d their values. 
7f60: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
7f70: 72 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 09  r *optionValue).
7f80: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 6f 70 74  /* Value for opt
7f90: 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74  ion. */.{.    St
7fa0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
7fb0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
7fc0: 63 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ceData;.    Tcl_
7fd0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d  Channel parent =
7fe0: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73   Tls_GetParent(s
7ff0: 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c  tatePtr, TLS_TCL
8000: 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20  _FASTPATH);.    
8010: 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74  Tcl_DriverSetOpt
8020: 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69  ionProc *setOpti
8030: 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70 72  onProc;..    dpr
8040: 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 74 6f 20  intf("Called to 
8050: 73 65 74 20 6f 70 74 69 6f 6e 20 25 73 20 74 6f  set option %s to
8060: 20 76 61 6c 75 65 20 25 73 22 2c 20 6f 70 74 69   value %s", opti
8070: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61  onName, optionVa
8080: 6c 75 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 61  lue);..    /* Pa
8090: 73 73 20 74 6f 20 70 61 72 65 6e 74 20 2a 2f 0a  ss to parent */.
80a0: 20 20 20 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f      setOptionPro
80b0: 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53  c = Tcl_ChannelS
80c0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c  etOptionProc(Tcl
80d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
80e0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66  parent));.    if
80f0: 20 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20   (setOptionProc 
8100: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  != NULL) {..retu
8110: 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72  rn (*setOptionPr
8120: 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  oc)(Tcl_GetChann
8130: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70  elInstanceData(p
8140: 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20  arent), interp, 
8150: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69  optionName, opti
8160: 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a  onValue);.    }.
8170: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65      /*.     * Re
8180: 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65 63  quest for a spec
8190: 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 20  ific option has 
81a0: 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27  to fail, we don'
81b0: 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 20 20  t have any..    
81c0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 54   */.    return T
81d0: 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74  cl_BadChannelOpt
81e0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 69  ion(interp, opti
81f0: 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d 0a 0a  onName, "");.}..
8200: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8250: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 4f  --. *. * TlsGetO
8260: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a  ptionProc --. *.
8270: 20 2a 09 47 65 74 20 61 20 6f 70 74 69 6f 6e 27   *.Get a option'
8280: 73 20 76 61 6c 75 65 20 66 6f 72 20 61 20 53 53  s value for a SS
8290: 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
82a0: 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 20 6c 69 73  hannel, or a lis
82b0: 74 20 6f 66 20 61 6c 6c 0a 20 2a 09 6f 70 74 69  t of all. *.opti
82c0: 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61  ons and their va
82d0: 6c 75 65 73 2e 20 43 61 6c 6c 65 64 20 62 79 20  lues. Called by 
82e0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20  the generic I/O 
82f0: 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72 20 74  layer whenever t
8300: 68 65 0a 20 2a 09 54 63 6c 5f 47 65 74 43 68 61  he. *.Tcl_GetCha
8310: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 29 20 66 75 6e  nnelOption() fun
8320: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 20  ction is used.. 
8330: 2a 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  *. *. * Results:
8340: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75  . *.TCL_OK if su
8350: 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f  ccessful or TCL_
8360: 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 2e  ERROR if failed.
8370: 20 53 65 74 73 20 6f 70 74 69 6f 6e 56 61 6c 75   Sets optionValu
8380: 65 20 74 6f 0a 20 2a 09 74 68 65 20 6f 70 74 69  e to. *.the opti
8390: 6f 6e 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a 20  on's value.. *. 
83a0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
83b0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
83c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83d0: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73  ----------. */.s
8410: 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 47 65 74  tatic int.TlsGet
8420: 4f 70 74 69 6f 6e 50 72 6f 63 28 0a 20 20 20 20  OptionProc(.    
8430: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
8440: 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b  nceData,./* Sock
8450: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20  et state. */.   
8460: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8470: 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72  erp,../* For err
8480: 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c  ors - can be NUL
8490: 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  L. */.    const 
84a0: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65  char *optionName
84b0: 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  ,./* Name of the
84c0: 20 6f 70 74 69 6f 6e 20 74 6f 20 72 65 74 72 69   option to retri
84d0: 65 76 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f  eve the value fo
84e0: 72 2c 0a 09 09 09 09 20 2a 20 6f 72 20 4e 55 4c  r,..... * or NUL
84f0: 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 74  L to get all opt
8500: 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76  ions and their v
8510: 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 54 63  alues. */.    Tc
8520: 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 6f  l_DString *optio
8530: 6e 56 61 6c 75 65 29 09 2f 2a 20 57 68 65 72 65  nValue)./* Where
8540: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
8550: 6d 70 75 74 65 64 20 76 61 6c 75 65 20 69 6e 69  mputed value ini
8560: 74 69 61 6c 69 7a 65 64 20 62 79 20 63 61 6c 6c  tialized by call
8570: 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61  er. */.{.    Sta
8580: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
8590: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
85a0: 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43  eData;.    Tcl_C
85b0: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20  hannel parent = 
85c0: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74  Tls_GetParent(st
85d0: 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f  atePtr, TLS_TCL_
85e0: 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20 54  FASTPATH);.    T
85f0: 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69  cl_DriverGetOpti
8600: 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f  onProc *getOptio
8610: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70 72 69  nProc;..    dpri
8620: 6e 74 66 28 22 43 61 6c 6c 65 64 20 74 6f 20 67  ntf("Called to g
8630: 65 74 20 6f 70 74 69 6f 6e 20 25 73 22 2c 20 6f  et option %s", o
8640: 70 74 69 6f 6e 4e 61 6d 65 29 3b 0a 0a 20 20 20  ptionName);..   
8650: 20 2f 2a 20 50 61 73 73 20 74 6f 20 70 61 72 65   /* Pass to pare
8660: 6e 74 20 2a 2f 0a 20 20 20 20 67 65 74 4f 70 74  nt */.    getOpt
8670: 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68  ionProc = Tcl_Ch
8680: 61 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72  annelGetOptionPr
8690: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  oc(Tcl_GetChanne
86a0: 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a  lType(parent));.
86b0: 20 20 20 20 69 66 20 28 67 65 74 4f 70 74 69 6f      if (getOptio
86c0: 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b  nProc != NULL) {
86d0: 0a 09 72 65 74 75 72 6e 20 28 2a 67 65 74 4f 70  ..return (*getOp
86e0: 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65  tionProc)(Tcl_Ge
86f0: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
8700: 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e  Data(parent), in
8710: 74 65 72 70 2c 0a 09 20 20 20 20 6f 70 74 69 6f  terp,..    optio
8720: 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c  nName, optionVal
8730: 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ue);.    } else 
8740: 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d  if (optionName =
8750: 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20  = (char*) NULL) 
8760: 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73  {../*.. * Reques
8770: 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 61  t is query for a
8780: 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73  ll options, this
8790: 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65   is ok... */..re
87a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
87b0: 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a   }.    /*.     *
87c0: 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73   Request for a s
87d0: 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68  pecific option h
87e0: 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64  as to fail, we d
87f0: 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20  on't have any.. 
8800: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
8810: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
8820: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
8830: 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a  ptionName, "");.
8840: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8890: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 43  -----. *. * TlsC
88a0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d  hannelHandlerTim
88b0: 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  er --. *. *.Call
88c0: 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69  ed by the notifi
88d0: 65 72 20 76 69 61 20 61 20 74 69 6d 65 72 2c 20  er via a timer, 
88e0: 74 6f 20 67 65 6e 65 72 61 74 65 20 72 65 61 64  to generate read
88f0: 2f 77 72 69 74 65 20 65 76 65 6e 74 73 20 74 6f  /write events to
8900: 0a 20 2a 09 66 6c 75 73 68 20 6f 75 74 20 64 61  . *.flush out da
8910: 74 61 20 77 61 69 74 69 6e 67 20 69 6e 20 63 68  ta waiting in ch
8920: 61 6e 6e 65 6c 20 62 75 66 66 65 72 73 2e 20 43  annel buffers. C
8930: 61 6c 6c 65 64 20 62 79 20 54 6c 73 57 61 74 63  alled by TlsWatc
8940: 68 50 72 6f 63 20 74 6f 0a 20 2a 09 70 65 72 69  hProc to. *.peri
8950: 6f 64 69 63 61 6c 6c 79 20 63 68 65 63 6b 20 66  odically check f
8960: 6f 72 20 6e 65 77 20 65 76 65 6e 74 73 2e 20 55  or new events. U
8970: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
8980: 65 76 65 6e 74 73 20 77 68 65 6e 20 64 61 74 61  events when data
8990: 20 69 73 0a 20 2a 09 62 75 66 66 65 72 65 64 20   is. *.buffered 
89a0: 69 6e 20 42 49 4f 20 61 6e 64 20 74 68 65 72 65  in BIO and there
89b0: 20 61 72 65 20 6e 6f 20 75 6e 64 65 72 6c 79 69   are no underlyi
89c0: 6e 67 20 63 68 61 6e 6e 65 6c 20 65 76 65 6e 74  ng channel event
89d0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
89e0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
89f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8a00: 09 43 72 65 61 74 65 73 20 6e 6f 74 69 66 69 63  .Creates notific
8a10: 61 74 69 6f 6e 20 65 76 65 6e 74 2e 0a 20 2a 0a  ation event.. *.
8a20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8a70: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
8a80: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  TlsChannelHandle
8a90: 72 54 69 6d 65 72 28 0a 20 20 20 20 43 6c 69 65  rTimer(.    Clie
8aa0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
8ab0: 61 29 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61  a)./* Socket sta
8ac0: 74 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61  te. */.{.    Sta
8ad0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
8ae0: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
8af0: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73  ata;.    int mas
8b00: 6b 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 77 61  k = statePtr->wa
8b10: 6e 74 3b 20 2f 2a 20 49 6e 69 74 20 74 6f 20 53  nt; /* Init to S
8b20: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
8b30: 41 44 20 61 6e 64 20 53 53 4c 5f 45 52 52 4f 52  AD and SSL_ERROR
8b40: 5f 57 41 4e 54 5f 57 52 49 54 45 20 2a 2f 0a 20  _WANT_WRITE */. 
8b50: 20 20 20 69 6e 74 20 64 6f 5f 72 65 6c 65 61 73     int do_releas
8b60: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  e = 0;..    dpri
8b70: 6e 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68  ntf("Called with
8b80: 20 6d 61 73 6b 20 30 78 25 30 32 78 22 2c 20 6d   mask 0x%02x", m
8b90: 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ask);..    /* Re
8ba0: 6d 6f 76 65 20 6f 6c 64 20 74 69 6d 65 72 20 68  move old timer h
8bb0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 66 20  andle */.    if 
8bc0: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
8bd0: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
8be0: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 73 74  ken) NULL) {..st
8bf0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
8c00: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
8c10: 20 4e 55 4c 4c 3b 0a 09 64 6f 5f 72 65 6c 65 61   NULL;..do_relea
8c20: 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  se = 1;.    }.. 
8c30: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
8c40: 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 70  amount of data p
8c50: 65 6e 64 69 6e 67 20 69 6e 20 49 4f 20 6f 72 20  ending in IO or 
8c60: 42 49 4f 20 77 72 69 74 65 20 62 75 66 66 65 72  BIO write buffer
8c70: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
8c80: 4f 75 74 70 75 74 42 75 66 66 65 72 65 64 28 73  OutputBuffered(s
8c90: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 7c  tatePtr->self) |
8ca0: 7c 20 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73  | BIO_wpending(s
8cb0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b  tatePtr->bio)) {
8cc0: 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e  ..dprintf("[chan
8cd0: 3d 25 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c  =%p] BIO writabl
8ce0: 65 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  e", statePtr->se
8cf0: 6c 66 29 3b 0a 0a 09 69 66 20 28 21 28 73 74 61  lf);...if (!(sta
8d00: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
8d10: 4c 53 5f 54 43 4c 5f 45 4f 46 29 29 20 7b 0a 09  LS_TCL_EOF)) {..
8d20: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f      mask |= TCL_
8d30: 57 52 49 54 41 42 4c 45 3b 0a 09 7d 0a 20 20 20  WRITABLE;..}.   
8d40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
8d50: 20 66 6f 72 20 61 6d 6f 75 6e 74 20 6f 66 20 64   for amount of d
8d60: 61 74 61 20 70 65 6e 64 69 6e 67 20 69 6e 20 49  ata pending in I
8d70: 4f 20 6f 72 20 42 49 4f 20 72 65 61 64 20 62 75  O or BIO read bu
8d80: 66 66 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28  ffer */.    if (
8d90: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65  Tcl_InputBuffere
8da0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  d(statePtr->self
8db0: 29 20 7c 7c 20 42 49 4f 5f 70 65 6e 64 69 6e 67  ) || BIO_pending
8dc0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29  (statePtr->bio))
8dd0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 68   {..dprintf("[ch
8de0: 61 6e 3d 25 70 5d 20 42 49 4f 20 72 65 61 64 61  an=%p] BIO reada
8df0: 62 6c 65 22 2c 20 73 74 61 74 65 50 74 72 2d 3e  ble", statePtr->
8e00: 73 65 6c 66 29 3b 0a 0a 09 69 66 20 28 21 28 73  self);...if (!(s
8e10: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
8e20: 20 54 4c 53 5f 54 43 4c 5f 43 4c 4f 53 45 44 29   TLS_TCL_CLOSED)
8e30: 29 20 7b 0a 09 20 20 20 20 6d 61 73 6b 20 7c 3d  ) {..    mask |=
8e40: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09   TCL_READABLE;..
8e50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8e60: 4e 6f 74 69 66 79 20 74 68 65 20 67 65 6e 65 72  Notify the gener
8e70: 69 63 20 49 4f 20 6c 61 79 65 72 20 74 68 61 74  ic IO layer that
8e80: 20 6d 61 73 6b 20 65 76 65 6e 74 73 20 68 61 76   mask events hav
8e90: 65 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 74 68  e occurred on th
8ea0: 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  e channel */.   
8eb0: 20 64 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79   dprintf("Notify
8ec0: 69 6e 67 20 6f 75 72 73 65 6c 76 65 73 20 77 69  ing ourselves wi
8ed0: 74 68 20 6d 61 73 6b 3d 25 64 22 2c 20 6d 61 73  th mask=%d", mas
8ee0: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69  k);.    Tcl_Noti
8ef0: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50  fyChannel(stateP
8f00: 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b  tr->self, mask);
8f10: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77  .    statePtr->w
8f20: 61 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  ant = 0;..    if
8f30: 20 28 64 6f 5f 72 65 6c 65 61 73 65 29 20 7b 0a   (do_release) {.
8f40: 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c  .Tcl_Release((Cl
8f50: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
8f60: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  tr);.    }.    r
8f70: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  eturn;.}../*. *-
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
8fd0: 20 2a 20 54 6c 73 57 61 74 63 68 50 72 6f 63 20   * TlsWatchProc 
8fe0: 2d 2d 0a 20 2a 0a 20 2a 09 53 65 74 20 75 70 20  --. *. *.Set up 
8ff0: 74 68 65 20 65 76 65 6e 74 20 6e 6f 74 69 66 69  the event notifi
9000: 65 72 20 74 6f 20 77 61 74 63 68 20 66 6f 72 20  er to watch for 
9010: 65 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 72 65  events of intere
9020: 73 74 20 66 72 6f 6d 20 74 68 69 73 0a 20 2a 09  st from this. *.
9030: 63 68 61 6e 6e 65 6c 2e 20 43 61 6c 6c 65 64 20  channel. Called 
9040: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
9050: 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e 65 76 65  /O layer wheneve
9060: 72 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 74  r the user (or t
9070: 68 65 0a 20 2a 09 73 79 73 74 65 6d 29 20 61 6e  he. *.system) an
9080: 6e 6f 75 6e 63 65 73 20 69 74 73 20 28 64 69 73  nounces its (dis
9090: 29 69 6e 74 65 72 65 73 74 20 69 6e 20 65 76 65  )interest in eve
90a0: 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e  nts on the chann
90b0: 65 6c 2e 20 54 68 69 73 20 69 73 0a 20 2a 09 63  el. This is. *.c
90c0: 61 6c 6c 65 64 20 72 65 70 65 61 74 65 64 6c 79  alled repeatedly
90d0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
90e0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
90f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
9100: 53 65 74 73 20 75 70 20 6f 72 20 63 6c 65 61 72  Sets up or clear
9110: 73 20 61 20 74 69 6d 65 2d 62 61 73 65 64 20 6e  s a time-based n
9120: 6f 74 69 66 69 65 72 20 73 6f 20 74 68 61 74 20  otifier so that 
9130: 66 75 74 75 72 65 20 65 76 65 6e 74 73 20 6f 6e  future events on
9140: 20 74 68 65 0a 20 2a 09 63 68 61 6e 6e 65 6c 20   the. *.channel 
9150: 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20  will be seen by 
9160: 54 43 4c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  TCL.. *. *------
9170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
91c0: 69 63 20 76 6f 69 64 0a 54 6c 73 57 61 74 63 68  ic void.TlsWatch
91d0: 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74  Proc(.    Client
91e0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
91f0: 61 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e  a,./* Connection
9200: 20 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20   state info */. 
9210: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f     int mask).../
9220: 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65  * Events of inte
9230: 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 20 63  rest; an OR-ed c
9240: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 09 09  ombination of...
9250: 09 09 20 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c  .. * TCL_READABL
9260: 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20  E, TCL_WRITABLE 
9270: 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f  and TCL_EXCEPTIO
9280: 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f  N. */.{.    Tcl_
9290: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a  Channel parent;.
92a0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
92b0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
92c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
92d0: 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63    Tcl_DriverWatc
92e0: 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63  hProc *watchProc
92f0: 3b 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e  ;.    int pendin
9300: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  g = 0;..    dpri
9310: 6e 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68  ntf("Called with
9320: 20 6d 61 73 6b 20 30 78 25 30 32 78 20 61 6e 64   mask 0x%02x and
9330: 20 77 61 6e 74 20 30 78 25 30 32 78 22 2c 20 6d   want 0x%02x", m
9340: 61 73 6b 2c 20 73 74 61 74 65 50 74 72 2d 3e 77  ask, statePtr->w
9350: 61 6e 74 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ant);.    dprint
9360: 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 3b  Flags(statePtr);
9370: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
9380: 66 20 74 68 65 20 75 73 65 72 20 76 65 72 69 66  f the user verif
9390: 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74  y callback is st
93a0: 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61  ill running to a
93b0: 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e 67 0a  void triggering.
93c0: 20 20 20 20 20 2a 20 61 6e 6f 74 68 65 72 20 63       * another c
93d0: 61 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 63  all before the c
93e0: 75 72 72 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f  urrent one is co
93f0: 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69  mplete. */.    i
9400: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  f (statePtr->fla
9410: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c  gs & TLS_TCL_CAL
9420: 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74  LBACK) {..dprint
9430: 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f  f("Callback is o
9440: 6e 2d 67 6f 69 6e 67 2c 20 64 6f 69 6e 67 20 6e  n-going, doing n
9450: 6f 74 68 69 6e 67 22 29 3b 0a 09 72 65 74 75 72  othing");..retur
9460: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  n;.    }..    /*
9470: 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 74 6f 20   Get channel to 
9480: 6d 6f 6e 69 74 6f 72 20 66 6f 72 20 65 76 65 6e  monitor for even
9490: 74 73 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74  ts */.    parent
94a0: 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74   = Tls_GetParent
94b0: 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54  (statePtr, TLS_T
94c0: 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20  CL_FASTPATH);.  
94d0: 20 20 64 70 72 69 6e 74 66 28 22 50 61 72 65 6e    dprintf("Paren
94e0: 74 3a 20 63 68 61 6e 20 62 75 66 66 65 72 3d 25  t: chan buffer=%
94f0: 64 2c 20 69 6e 70 75 74 20 62 75 66 66 65 72 3d  d, input buffer=
9500: 25 64 2c 20 6f 75 74 70 75 74 20 62 75 66 66 65  %d, output buffe
9510: 72 3d 25 64 22 2c 20 5c 0a 09 54 63 6c 5f 43 68  r=%d", \..Tcl_Ch
9520: 61 6e 6e 65 6c 42 75 66 66 65 72 65 64 28 70 61  annelBuffered(pa
9530: 72 65 6e 74 29 2c 20 54 63 6c 5f 49 6e 70 75 74  rent), Tcl_Input
9540: 42 75 66 66 65 72 65 64 28 70 61 72 65 6e 74 29  Buffered(parent)
9550: 2c 20 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66  , Tcl_OutputBuff
9560: 65 72 65 64 28 70 61 72 65 6e 74 29 29 3b 0a 0a  ered(parent));..
9570: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
9580: 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 20 2a  connect failed *
9590: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
95a0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
95b0: 54 43 4c 5f 46 41 54 41 4c 5f 45 52 52 4f 52 29  TCL_FATAL_ERROR)
95c0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b   {..dprintf("Ask
95d0: 65 64 20 74 6f 20 77 61 74 63 68 20 61 20 73 6f  ed to watch a so
95e0: 63 6b 65 74 20 77 69 74 68 20 61 20 66 61 69 6c  cket with a fail
95f0: 65 64 20 68 61 6e 64 73 68 61 6b 65 20 2d 2d 20  ed handshake -- 
9600: 6e 6f 74 68 69 6e 67 20 63 61 6e 20 68 61 70 70  nothing can happ
9610: 65 6e 20 68 65 72 65 22 29 3b 0a 09 64 70 72 69  en here");..dpri
9620: 6e 74 66 28 22 55 6e 72 65 67 69 73 74 65 72 69  ntf("Unregisteri
9630: 6e 67 20 69 6e 74 65 72 65 73 74 20 69 6e 20 74  ng interest in t
9640: 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c  he lower channel
9650: 22 29 3b 0a 0a 09 77 61 74 63 68 50 72 6f 63 20  ");...watchProc 
9660: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74  = Tcl_ChannelWat
9670: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  chProc(Tcl_GetCh
9680: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
9690: 29 29 3b 0a 09 77 61 74 63 68 50 72 6f 63 28 54  ));..watchProc(T
96a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
96b0: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74  tanceData(parent
96c0: 29 2c 20 30 29 3b 0a 09 73 74 61 74 65 50 74 72  ), 0);..statePtr
96d0: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 30 3b  ->watchMask = 0;
96e0: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
96f0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77  .    statePtr->w
9700: 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b  atchMask = mask;
9710: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
9720: 4e 6f 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c  No channel handl
9730: 65 72 73 20 61 6e 79 20 6d 6f 72 65 2e 20 57 65  ers any more. We
9740: 20 77 69 6c 6c 20 62 65 20 6e 6f 74 69 66 69 65   will be notifie
9750: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
9760: 61 62 6f 75 74 0a 20 20 20 20 20 2a 20 65 76 65  about.     * eve
9770: 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e  nts on the chann
9780: 65 6c 20 62 65 6c 6f 77 20 76 69 61 20 61 20 63  el below via a c
9790: 61 6c 6c 20 74 6f 20 6f 75 72 20 27 54 72 61 6e  all to our 'Tran
97a0: 73 66 6f 72 6d 4e 6f 74 69 66 79 50 72 6f 63 27  sformNotifyProc'
97b0: 2e 20 42 75 74 0a 20 20 20 20 20 2a 20 77 65 20  . But.     * we 
97c0: 68 61 76 65 20 74 6f 20 70 61 73 73 20 74 68 65  have to pass the
97d0: 20 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20 6e   interest down n
97e0: 6f 77 2e 20 57 65 20 61 72 65 20 61 6c 6c 6f 77  ow. We are allow
97f0: 65 64 20 74 6f 20 61 64 64 20 61 64 64 69 74 69  ed to add additi
9800: 6f 6e 61 6c 0a 20 20 20 20 20 2a 20 27 69 6e 74  onal.     * 'int
9810: 65 72 65 73 74 27 20 74 6f 20 74 68 65 20 6d 61  erest' to the ma
9820: 73 6b 20 69 66 20 77 65 20 77 61 6e 74 20 74 6f  sk if we want to
9830: 2c 20 62 75 74 20 74 68 69 73 20 74 72 61 6e 73  , but this trans
9840: 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20 6e 6f  formation has no
9850: 0a 20 20 20 20 20 2a 20 73 75 63 68 20 69 6e 74  .     * such int
9860: 65 72 65 73 74 2e 20 49 74 20 6a 75 73 74 20 70  erest. It just p
9870: 61 73 73 65 73 20 74 68 65 20 72 65 71 75 65 73  asses the reques
9880: 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61 6e 67 65  t down, unchange
9890: 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64  d..     */.    d
98a0: 70 72 69 6e 74 66 28 22 52 65 67 69 73 74 65 72  printf("Register
98b0: 69 6e 67 20 6f 75 72 20 69 6e 74 65 72 65 73 74  ing our interest
98c0: 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68   in the lower ch
98d0: 61 6e 6e 65 6c 20 28 63 68 61 6e 3d 25 70 29 22  annel (chan=%p)"
98e0: 2c 20 28 76 6f 69 64 20 2a 29 20 70 61 72 65 6e  , (void *) paren
98f0: 74 29 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f  t);.    watchPro
9900: 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57  c = Tcl_ChannelW
9910: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
9920: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65  ChannelType(pare
9930: 6e 74 29 29 3b 0a 20 20 20 20 77 61 74 63 68 50  nt));.    watchP
9940: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
9950: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70  elInstanceData(p
9960: 61 72 65 6e 74 29 2c 20 6d 61 73 6b 29 3b 0a 0a  arent), mask);..
9970: 20 20 20 20 2f 2a 20 44 6f 20 77 65 20 68 61 76      /* Do we hav
9980: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 64 61  e any pending da
9990: 74 61 20 2a 2f 0a 20 20 20 20 70 65 6e 64 69 6e  ta */.    pendin
99a0: 67 20 3d 20 28 73 74 61 74 65 50 74 72 2d 3e 77  g = (statePtr->w
99b0: 61 6e 74 20 7c 7c 20 5c 0a 09 28 28 6d 61 73 6b  ant || \..((mask
99c0: 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29   & TCL_READABLE)
99d0: 20 26 26 20 28 28 54 63 6c 5f 49 6e 70 75 74 42   && ((Tcl_InputB
99e0: 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72  uffered(statePtr
99f0: 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20 7c 7c 20  ->self) > 0) || 
9a00: 28 42 49 4f 5f 63 74 72 6c 5f 70 65 6e 64 69 6e  (BIO_ctrl_pendin
9a10: 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  g(statePtr->bio)
9a20: 20 3e 20 30 29 29 29 20 7c 7c 0a 09 28 28 6d 61   > 0))) ||..((ma
9a30: 73 6b 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c  sk & TCL_WRITABL
9a40: 45 29 20 26 26 20 28 28 54 63 6c 5f 4f 75 74 70  E) && ((Tcl_Outp
9a50: 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65  utBuffered(state
9a60: 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20  Ptr->self) > 0) 
9a70: 7c 7c 20 28 42 49 4f 5f 63 74 72 6c 5f 77 70 65  || (BIO_ctrl_wpe
9a80: 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e  nding(statePtr->
9a90: 62 69 6f 29 20 3e 20 30 29 29 29 29 3b 0a 0a 20  bio) > 0))));.. 
9aa0: 20 20 20 64 70 72 69 6e 74 66 28 22 49 4f 20 57     dprintf("IO W
9ab0: 61 6e 74 3d 25 64 2c 20 69 6e 70 75 74 20 62 75  ant=%d, input bu
9ac0: 66 66 65 72 3d 25 64 2c 20 6f 75 74 70 75 74 20  ffer=%d, output 
9ad0: 62 75 66 66 65 72 3d 25 64 2c 20 42 49 4f 20 70  buffer=%d, BIO p
9ae0: 65 6e 64 69 6e 67 3d 25 7a 64 2c 20 42 49 4f 20  ending=%zd, BIO 
9af0: 77 70 65 6e 64 69 6e 67 3d 25 7a 64 2c 20 70 65  wpending=%zd, pe
9b00: 6e 64 69 6e 67 3d 25 64 22 2c 20 5c 0a 09 73 74  nding=%d", \..st
9b10: 61 74 65 50 74 72 2d 3e 77 61 6e 74 2c 20 54 63  atePtr->want, Tc
9b20: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28  l_InputBuffered(
9b30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
9b40: 20 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65   Tcl_OutputBuffe
9b50: 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65  red(statePtr->se
9b60: 6c 66 29 2c 20 5c 0a 09 42 49 4f 5f 63 74 72 6c  lf), \..BIO_ctrl
9b70: 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74  _pending(statePt
9b80: 72 2d 3e 62 69 6f 29 2c 20 42 49 4f 5f 63 74 72  r->bio), BIO_ctr
9b90: 6c 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65  l_wpending(state
9ba0: 50 74 72 2d 3e 62 69 6f 29 2c 20 70 65 6e 64 69  Ptr->bio), pendi
9bb0: 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  ng);..    /* Rem
9bc0: 6f 76 65 20 74 69 6d 65 72 2c 20 69 66 20 61 6e  ove timer, if an
9bd0: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  y */.    if (sta
9be0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
9bf0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
9c00: 20 4e 55 4c 4c 29 20 7b 0a 09 64 70 72 69 6e 74   NULL) {..dprint
9c10: 66 28 22 41 20 74 69 6d 65 72 20 77 61 73 20 66  f("A timer was f
9c20: 6f 75 6e 64 2c 20 64 65 6c 65 74 69 6e 67 20 69  ound, deleting i
9c30: 74 22 29 3b 0a 09 54 63 6c 5f 44 65 6c 65 74 65  t");..Tcl_Delete
9c40: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61  TimerHandler(sta
9c50: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09  tePtr->timer);..
9c60: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
9c70: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
9c80: 6e 29 20 4e 55 4c 4c 3b 0a 09 54 63 6c 5f 52 65  n) NULL;..Tcl_Re
9c90: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
9ca0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  a) statePtr);.  
9cb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
9cc0: 74 69 6d 65 72 2c 20 69 66 20 6e 6f 6e 65 20 2a  timer, if none *
9cd0: 2f 0a 20 20 20 20 69 66 20 28 6d 61 73 6b 20 26  /.    if (mask &
9ce0: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 7b   TCL_READABLE) {
9cf0: 0a 09 64 70 72 69 6e 74 66 28 22 43 72 65 61 74  ..dprintf("Creat
9d00: 69 6e 67 20 61 20 6e 65 77 20 74 69 6d 65 72 20  ing a new timer 
9d10: 73 69 6e 63 65 20 64 61 74 61 20 61 70 70 65 61  since data appea
9d20: 72 73 20 74 6f 20 62 65 20 77 61 69 74 69 6e 67  rs to be waiting
9d30: 22 29 3b 0a 09 54 63 6c 5f 50 72 65 73 65 72 76  ");..Tcl_Preserv
9d40: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
9d50: 74 61 74 65 50 74 72 29 3b 0a 09 73 74 61 74 65  tatePtr);..state
9d60: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c  Ptr->timer = Tcl
9d70: 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64  _CreateTimerHand
9d80: 6c 65 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41  ler(TLS_TCL_DELA
9d90: 59 2c 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e  Y, TlsChannelHan
9da0: 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 65  dlerTimer, (Clie
9db0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
9dc0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20  );.    }.}../*. 
9dd0: 2a 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 2d  ----------------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9e20: 2a 0a 20 2a 20 54 6c 73 47 65 74 48 61 6e 64 6c  *. * TlsGetHandl
9e30: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54  eProc --. *. *.T
9e40: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
9e50: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
9e60: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c  generic IO level
9e70: 20 74 6f 20 72 65 74 72 69 65 76 65 20 61 6e 20   to retrieve an 
9e80: 4f 53 0a 20 2a 09 73 70 65 63 69 66 69 63 20 68  OS. *.specific h
9e90: 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
9ea0: 20 77 69 74 68 20 74 68 65 20 63 68 61 6e 6e 65   with the channe
9eb0: 6c 2e 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20  l. Not used for 
9ec0: 74 72 61 6e 73 66 6f 72 6d 73 2e 0a 20 2a 0a 20  transforms.. *. 
9ed0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
9ee0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 54 63  e appropriate Tc
9ef0: 6c 5f 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 72  l_File handle or
9f00: 20 4e 55 4c 4c 20 69 66 20 4e 6f 6e 65 0a 20 2a   NULL if None. *
9f10: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
9f20: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
9f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
9f80: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 47  .static int TlsG
9f90: 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 0a 20 20  etHandleProc(.  
9fa0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
9fb0: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f  tanceData,./* So
9fc0: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20  cket state. */. 
9fd0: 20 20 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e     int direction
9fe0: 2c 09 09 2f 2a 20 54 43 4c 5f 52 45 41 44 41 42  ,../* TCL_READAB
9ff0: 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42  LE or TCL_WRITAB
a000: 4c 45 20 2a 2f 0a 20 20 20 20 43 6c 69 65 6e 74  LE */.    Client
a010: 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29  Data *handlePtr)
a020: 09 2f 2a 20 48 61 6e 64 6c 65 20 61 73 73 6f 63  ./* Handle assoc
a030: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
a040: 68 61 6e 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20  hannel */.{.    
a050: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
a060: 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74  = (State *) inst
a070: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64  anceData;..    d
a080: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 77  printf("Called w
a090: 69 74 68 20 64 69 72 65 63 74 69 6f 6e 20 30 78  ith direction 0x
a0a0: 25 30 32 78 22 2c 20 64 69 72 65 63 74 69 6f 6e  %02x", direction
a0b0: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
a0c0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e  cl_GetChannelHan
a0d0: 64 6c 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e  dle(Tls_GetParen
a0e0: 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f  t(statePtr, TLS_
a0f0: 54 43 4c 5f 46 41 53 54 50 41 54 48 29 2c 0a 09  TCL_FASTPATH),..
a100: 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c  direction, handl
a110: 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  ePtr);.}../*. *-
a120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
a170: 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63   * TlsNotifyProc
a180: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
a190: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
a1a0: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  ked by the gener
a1b0: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 6e  ic IO level to n
a1c0: 6f 74 69 66 79 20 74 68 65 20 63 68 61 6e 6e 65  otify the channe
a1d0: 6c 0a 20 2a 09 74 68 61 74 20 61 6e 20 65 76 65  l. *.that an eve
a1e0: 6e 74 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  nt has occurred 
a1f0: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  on the underlyin
a200: 67 20 63 68 61 6e 6e 65 6c 2e 20 49 74 20 69 73  g channel. It is
a210: 20 75 73 65 64 20 62 79 0a 20 2a 09 73 74 61 63   used by. *.stac
a220: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 64 72 69 76  ked channel driv
a230: 65 72 73 20 74 68 61 74 20 77 69 73 68 20 74 6f  ers that wish to
a240: 20 62 65 20 6e 6f 74 69 66 69 65 64 20 6f 66 20   be notified of 
a250: 65 76 65 6e 74 73 20 74 68 61 74 20 6f 63 63 75  events that occu
a260: 72 0a 20 2a 09 6f 6e 20 74 68 65 20 75 6e 64 65  r. *.on the unde
a270: 72 6c 79 69 6e 67 20 28 73 74 61 63 6b 65 64 29  rlying (stacked)
a280: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20   channel.. *. * 
a290: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75  Results:. *.Retu
a2a0: 72 6e 73 20 6d 61 73 6b 20 76 61 6c 75 65 20 74  rns mask value t
a2b0: 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 6e 65 20  o indicate none 
a2c0: 6f 66 20 74 68 65 20 65 76 65 6e 74 73 20 77 65  of the events we
a2d0: 72 65 20 73 65 72 76 69 63 65 64 2e 0a 20 2a 0a  re serviced.. *.
a2e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
a2f0: 0a 20 2a 09 4d 61 79 20 63 61 6c 6c 20 54 6c 73  . *.May call Tls
a300: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
a310: 61 6e 64 2f 6f 72 20 64 65 6c 65 74 65 20 74 69  and/or delete ti
a320: 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  mer.. *. *------
a330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a370: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
a380: 69 63 20 69 6e 74 20 54 6c 73 4e 6f 74 69 66 79  ic int TlsNotify
a390: 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74  Proc(.    Client
a3a0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
a3b0: 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61  a,./* Socket sta
a3c0: 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  te. */.    int m
a3d0: 61 73 6b 29 09 09 09 2f 2a 20 74 79 70 65 20 6f  ask).../* type o
a3e0: 66 20 65 76 65 6e 74 20 74 68 61 74 20 6f 63 63  f event that occ
a3f0: 75 72 72 65 64 3a 20 4f 52 2d 65 64 0a 09 09 09  urred: OR-ed....
a400: 09 20 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  . * combination 
a410: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20  of TCL_READABLE 
a420: 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20  or TCL_WRITABLE 
a430: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
a440: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
a450: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
a460: 61 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 6f 72  a;.    int error
a470: 43 6f 64 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64  Code = 0;..    d
a480: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 77  printf("Called w
a490: 69 74 68 20 6d 61 73 6b 20 30 78 25 30 32 78 22  ith mask 0x%02x"
a4a0: 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a  , mask);..    /*
a4b0: 0a 20 20 20 20 20 2a 20 44 65 6c 65 74 65 20 61  .     * Delete a
a4c0: 6e 20 65 78 69 73 74 69 6e 67 20 74 69 6d 65 72  n existing timer
a4d0: 2e 20 49 74 20 77 61 73 20 6e 6f 74 20 66 69 72  . It was not fir
a4e0: 65 64 2c 20 79 65 74 20 77 65 20 61 72 65 20 68  ed, yet we are h
a4f0: 65 72 65 2c 20 73 6f 20 74 68 65 0a 20 20 20 20  ere, so the.    
a500: 20 2a 20 62 65 6c 6f 77 20 63 68 61 6e 6e 65 6c   * below channel
a510: 20 67 65 6e 65 72 61 74 65 64 20 73 75 63 68 20   generated such 
a520: 61 6e 20 65 76 65 6e 74 20 61 6e 64 20 77 65 20  an event and we 
a530: 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 2e 20 54  don't need to. T
a540: 68 65 20 72 65 6e 65 77 61 6c 0a 20 20 20 20 20  he renewal.     
a550: 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 72 65 73  * of the interes
a560: 74 20 61 66 74 65 72 20 74 68 65 20 65 78 65 63  t after the exec
a570: 75 74 69 6f 6e 20 6f 66 20 63 68 61 6e 6e 65 6c  ution of channel
a580: 20 68 61 6e 64 6c 65 72 73 20 77 69 6c 6c 20 65   handlers will e
a590: 76 65 6e 74 75 61 6c 6c 79 0a 20 20 20 20 20 2a  ventually.     *
a5a0: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 63   cause us to rec
a5b0: 72 65 61 74 65 20 74 68 65 20 74 69 6d 65 72 20  reate the timer 
a5c0: 28 69 6e 20 54 6c 73 57 61 74 63 68 50 72 6f 63  (in TlsWatchProc
a5d0: 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  )..     */.    i
a5e0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
a5f0: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
a600: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
a610: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
a620: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
a630: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
a640: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
a650: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
a660: 4c 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28  L;..Tcl_Release(
a670: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
a680: 74 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  tePtr);.    }.. 
a690: 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 74     /* Abort if t
a6a0: 68 65 20 75 73 65 72 20 76 65 72 69 66 79 20 63  he user verify c
a6b0: 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 69 6c 6c  allback is still
a6c0: 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61 76 6f 69   running to avoi
a6d0: 64 20 74 72 69 67 67 65 72 69 6e 67 0a 20 20 20  d triggering.   
a6e0: 20 20 2a 20 61 6e 6f 74 68 65 72 20 63 61 6c 6c    * another call
a6f0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
a700: 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f 6d 70 6c  ent one is compl
a710: 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  ete. */.    if (
a720: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
a730: 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41  & TLS_TCL_CALLBA
a740: 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  CK) {..dprintf("
a750: 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67  Callback is on-g
a760: 6f 69 6e 67 2c 20 72 65 74 75 72 6e 69 6e 67 20  oing, returning 
a770: 66 61 69 6c 65 64 22 29 3b 0a 09 72 65 74 75 72  failed");..retur
a780: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
a790: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
a7a0: 6c 69 7a 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63  lized, do connec
a7b0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  t */.    if (sta
a7c0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
a7d0: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09  LS_TCL_INIT) {..
a7e0: 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a  int tlsConnect;.
a7f0: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69  ..dprintf("Calli
a800: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
a810: 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f  nnect");...tlsCo
a820: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74  nnect = Tls_Wait
a830: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
a840: 50 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c  Ptr, &errorCode,
a850: 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f 6e   1);..if (tlsCon
a860: 6e 65 63 74 20 3c 20 31 29 20 7b 0a 09 20 20 20  nect < 1) {..   
a870: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e   dprintf("Got an
a880: 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74   error waiting t
a890: 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f  o connect (tlsCo
a8a0: 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72  nnect = %i, *err
a8b0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22  orCodePtr = %i)"
a8c0: 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 65 72  , tlsConnect, er
a8d0: 72 6f 72 43 6f 64 65 29 3b 0a 09 20 20 20 20 69  rorCode);..    i
a8e0: 66 20 28 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20  f (errorCode == 
a8f0: 45 41 47 41 49 4e 29 20 7b 0a 09 09 64 70 72 69  EAGAIN) {...dpri
a900: 6e 74 66 28 22 41 73 79 6e 63 20 66 6c 61 67 20  ntf("Async flag 
a910: 63 6f 75 6c 64 20 62 65 20 73 65 74 20 28 64 69  could be set (di
a920: 64 6e 27 74 20 63 68 65 63 6b 29 20 61 6e 64 20  dn't check) and 
a930: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47  errorCode == EAG
a940: 41 49 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67 20  AIN:  Returning 
a950: 66 61 69 6c 65 64 22 29 3b 0a 0a 09 09 72 65 74  failed");....ret
a960: 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 0a 09  urn 0;..    }...
a970: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73      dprintf("Tls
a980: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
a990: 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
a9a0: 72 22 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  r");..}.    }.. 
a9b0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20     /*.     * An 
a9c0: 65 76 65 6e 74 20 6f 63 63 75 72 72 65 64 20 69  event occurred i
a9d0: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  n the underlying
a9e0: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 20 74   channel. This t
a9f0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 64 6f  ransformation do
aa00: 65 73 6e 27 74 0a 20 20 20 20 20 2a 20 70 72 6f  esn't.     * pro
aa10: 63 65 73 73 20 73 75 63 68 20 65 76 65 6e 74 73  cess such events
aa20: 20 74 68 75 73 20 72 65 74 75 72 6e 73 20 74 68   thus returns th
aa30: 65 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 6b 20  e incoming mask 
aa40: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  unchanged..     
aa50: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  */.    dprintf("
aa60: 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 6d  Returning %i", m
aa70: 61 73 6b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ask);.    return
aa80: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d   mask;.}../*. *-
aa90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
aae0: 20 2a 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79   * Tls_ChannelTy
aaf0: 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 44 65 66 69  pe --. *. *.Defi
ab00: 6e 65 73 20 74 68 65 20 54 4c 53 20 63 68 61 6e  nes the TLS chan
ab10: 6e 65 6c 20 64 72 69 76 65 72 20 68 61 6e 64 6c  nel driver handl
ab20: 65 72 73 20 66 6f 72 20 74 68 69 73 20 63 68 61  ers for this cha
ab30: 6e 6e 65 6c 20 74 79 70 65 2e 0a 20 2a 0a 20 2a  nnel type.. *. *
ab40: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74   Results:. *.Ret
ab50: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
ab60: 6f 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70  o Tcl_ChannelTyp
ab70: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 2a 0a  e structure.. *.
ab80: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
ab90: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.None. *. *--
aba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
abf0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c  static const Tcl
ac00: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c 73  _ChannelType tls
ac10: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
ac20: 20 20 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a 20      "tls",.../* 
ac30: 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  Type name */.   
ac40: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
ac50: 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68  SION_5,./* v5 ch
ac60: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73  annel */.    Tls
ac70: 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43  CloseProc,../* C
ac80: 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20  lose proc */.   
ac90: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09 09   TlsInputProc,..
aca0: 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f  /* Input proc */
acb0: 0a 20 20 20 20 54 6c 73 4f 75 74 70 75 74 50 72  .    TlsOutputPr
acc0: 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70  oc,../* Output p
acd0: 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c  roc */.    NULL,
ace0: 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20  .../* Seek proc 
acf0: 2a 2f 0a 20 20 20 20 54 6c 73 53 65 74 4f 70 74  */.    TlsSetOpt
ad00: 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74  ionProc,../* Set
ad10: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a   option proc */.
ad20: 20 20 20 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e      TlsGetOption
ad30: 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 6f 70  Proc,../* Get op
ad40: 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20  tion proc */.   
ad50: 20 54 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 09   TlsWatchProc,..
ad60: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f  /* Initialize no
ad70: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 54 6c  tifier */.    Tl
ad80: 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09  sGetHandleProc,.
ad90: 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c  ./* Get OS handl
ada0: 65 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65  es out of channe
adb0: 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73  l */.    TlsClos
adc0: 65 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73  e2Proc,../* clos
add0: 65 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c  e2proc */.    Tl
ade0: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09  sBlockModeProc,.
adf0: 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67  ./* Set blocking
ae00: 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64  /nonblocking mod
ae10: 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09  e*/.    NULL,...
ae20: 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f  /* Flush proc */
ae30: 0a 20 20 20 20 54 6c 73 4e 6f 74 69 66 79 50 72  .    TlsNotifyPr
ae40: 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67  oc,../* Handling
ae50: 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c   of events bubbl
ae60: 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55  ing up */.    NU
ae70: 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65  LL,.../* Wide se
ae80: 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e  ek proc */.    N
ae90: 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64  ULL,.../* Thread
aea0: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e   action */.    N
aeb0: 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74  ULL.../* Truncat
aec0: 65 20 2a 2f 0a 7d 3b 0a 0a 63 6f 6e 73 74 20 54  e */.};..const T
aed0: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a  cl_ChannelType *
aee0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
aef0: 76 6f 69 64 29 20 7b 0a 20 20 20 20 72 65 74 75  void) {.    retu
af00: 72 6e 20 26 74 6c 73 43 68 61 6e 6e 65 6c 54 79  rn &tlsChannelTy
af10: 70 65 3b 0a 7d 0a                                pe;.}.