Hex Artifact Content

Artifact d9ccae3ec81dfaefa6d19cfb5ccc3bb5454254a96aae2c72290ef811429a1b75:


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 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0c30: 74 65 72 70 29 09 09 2f 2a 20 54 63 6c 20 69 6e  terp)../* Tcl in
0c40: 74 65 72 70 72 65 74 65 72 20 74 6f 20 72 65 70  terpreter to rep
0c50: 6f 72 74 20 65 72 72 6f 72 73 20 74 6f 20 2a 2f  ort errors to */
0c60: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
0c70: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
0c80: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
0c90: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
0ca0: 6c 6f 73 65 28 25 70 29 22 2c 20 28 76 6f 69 64  lose(%p)", (void
0cb0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a   *) statePtr);..
0cc0: 20 20 20 20 2f 2a 20 53 65 6e 64 20 22 63 6c 6f      /* Send "clo
0cd0: 73 65 20 6e 6f 74 69 66 79 22 20 73 68 75 74 64  se notify" shutd
0ce0: 6f 77 6e 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e  own notification
0cf0: 2e 20 57 69 6c 6c 20 72 65 74 75 72 6e 20 30 20  . Will return 0 
0d00: 69 66 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 0a  if in progress,.
0d10: 09 61 6e 64 20 31 20 77 68 65 6e 20 63 6f 6d 70  .and 1 when comp
0d20: 6c 65 74 65 2e 20 4f 6e 6c 79 20 63 6c 6f 73 65  lete. Only close
0d30: 73 20 74 68 65 20 77 72 69 74 65 20 64 69 72 65  s the write dire
0d40: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  ction of the con
0d50: 6e 65 63 74 69 6f 6e 3b 0a 09 74 68 65 20 72 65  nection;..the re
0d60: 61 64 20 64 69 72 65 63 74 69 6f 6e 20 69 73 20  ad direction is 
0d70: 63 6c 6f 73 65 64 20 62 79 20 74 68 65 20 70 65  closed by the pe
0d80: 65 72 2e 20 44 6f 65 73 20 6e 6f 74 20 61 66 66  er. Does not aff
0d90: 65 63 74 20 74 68 65 20 73 6f 63 6b 65 74 20 0a  ect the socket .
0da0: 09 73 74 61 74 65 2e 20 44 6f 6e 27 74 20 63 61  .state. Don't ca
0db0: 6c 6c 20 61 66 74 65 72 20 66 61 74 61 6c 20 65  ll after fatal e
0dc0: 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20  rror. */.    if 
0dd0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 21  (statePtr->ssl !
0de0: 3d 20 4e 55 4c 4c 20 26 26 20 21 28 73 74 61 74  = NULL && !(stat
0df0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c  ePtr->flags & TL
0e00: 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52 52 4f  S_TCL_FATAL_ERRO
0e10: 52 29 29 20 7b 0a 09 42 49 4f 5f 66 6c 75 73 68  R)) {..BIO_flush
0e20: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
0e30: 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 73  ..SSL_shutdown(s
0e40: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
0e50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 6c 73     }..    /* Tls
0e60: 5f 46 72 65 65 20 63 61 6c 6c 73 20 54 6c 73 5f  _Free calls Tls_
0e70: 43 6c 65 61 6e 20 2a 2f 0a 20 20 20 20 54 63 6c  Clean */.    Tcl
0e80: 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 28  _EventuallyFree(
0e90: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74  (ClientData)stat
0ea0: 65 50 74 72 2c 20 54 6c 73 5f 46 72 65 65 29 3b  ePtr, Tls_Free);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
0ec0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f10: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c  ----. *. * TlsCl
0f20: 6f 73 65 32 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  ose2Proc --. *. 
0f30: 2a 09 53 69 6d 69 6c 61 72 20 74 6f 20 54 6c 73  *.Similar to Tls
0f40: 43 6c 6f 73 65 50 72 6f 63 2c 20 62 75 74 20 61  CloseProc, but a
0f50: 6c 6c 6f 77 73 20 66 6f 72 20 73 65 70 61 72 61  llows for separa
0f60: 74 65 20 63 6c 6f 73 65 20 6f 66 20 74 68 65 20  te close of the 
0f70: 72 65 61 64 20 6f 72 0a 20 2a 09 77 72 69 74 65  read or. *.write
0f80: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 68 61   side of the cha
0f90: 6e 6e 65 6c 2e 20 57 65 20 64 6f 6e 27 74 20 73  nnel. We don't s
0fa0: 75 70 70 6f 72 74 20 74 68 65 73 65 20 73 69 6e  upport these sin
0fb0: 63 65 20 54 4c 53 20 69 73 20 61 0a 20 2a 09 62  ce TLS is a. *.b
0fc0: 69 2d 64 69 72 65 63 74 69 6f 6e 61 6c 20 70 72  i-directional pr
0fd0: 6f 74 6f 63 6f 6c 2e 0a 20 2a 0a 20 2a 20 52 65  otocol.. *. * Re
0fe0: 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73  sults:. *.0 if s
0ff0: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53  uccessful or POS
1000: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IX error code if
1010: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53   failed.. *. * S
1020: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1030: 43 6c 6f 73 65 73 20 74 68 65 20 73 6f 63 6b 65  Closes the socke
1040: 74 20 66 6f 72 20 74 68 65 20 63 68 61 6e 6e 65  t for the channe
1050: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
10b0: 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32 50 72   int TlsClose2Pr
10c0: 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  oc(.    ClientDa
10d0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
10e0: 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73  ./* Connection s
10f0: 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  tate info */.   
1100: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1110: 65 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69 6e 74  erp,../* Tcl int
1120: 65 72 70 72 65 74 65 72 20 74 6f 20 72 65 70 6f  erpreter to repo
1130: 72 74 20 65 72 72 6f 72 73 20 74 6f 20 2a 2f 0a  rt errors to */.
1140: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09      int flags)..
1150: 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 6c 6f  ./* Flags to clo
1160: 73 65 20 72 65 61 64 2f 77 72 69 74 65 20 73 69  se read/write si
1170: 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f  de of channel */
1180: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
1190: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
11a0: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
11b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
11c0: 61 6c 6c 65 64 20 77 69 74 68 20 66 6c 61 67 73  alled with flags
11d0: 20 25 64 22 2c 20 66 6c 61 67 73 29 3b 0a 0a 20   %d", flags);.. 
11e0: 20 20 20 69 66 20 28 28 66 6c 61 67 73 20 26 20     if ((flags & 
11f0: 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 7c  (TCL_CLOSE_READ|
1200: 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29  TCL_CLOSE_WRITE)
1210: 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72  ) == 0) {..retur
1220: 6e 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 69  n TlsCloseProc(i
1230: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
1240: 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  erp);.    }.    
1250: 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d  return EINVAL;.}
1260: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 57  ----. *. * Tls_W
12c0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d 2d  aitForConnect --
12d0: 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 63  . *. *.Perform c
12e0: 6f 6e 6e 65 63 74 20 28 63 6c 69 65 6e 74 29 20  onnect (client) 
12f0: 6f 72 20 61 63 63 65 70 74 20 28 73 65 72 76 65  or accept (serve
1300: 72 29 20 66 75 6e 63 74 69 6f 6e 2e 20 41 6c 73  r) function. Als
1310: 6f 20 70 65 72 66 6f 72 6d 73 0a 20 2a 09 65 71  o performs. *.eq
1320: 75 69 76 61 6c 65 6e 74 20 6f 66 20 68 61 6e 64  uivalent of hand
1330: 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  shake function..
1340: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a   *. * Result:. *
1350: 09 31 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  .1 if successful
1360: 2c 20 30 20 69 66 20 77 61 69 74 69 6e 67 20 66  , 0 if waiting f
1370: 6f 72 20 63 6f 6e 6e 65 63 74 2c 20 61 6e 64 20  or connect, and 
1380: 2d 31 20 69 66 20 66 61 69 6c 65 64 2e 20 53 65  -1 if failed. Se
1390: 74 73 0a 20 2a 09 65 72 72 6f 72 43 6f 64 65 50  ts. *.errorCodeP
13a0: 74 72 20 74 6f 20 61 20 50 4f 53 49 58 20 65 72  tr to a POSIX er
13b0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
13c0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 6f  rror occurred, o
13d0: 72 20 30 20 69 66 20 6e 6f 74 2e 0a 20 2a 0a 20  r 0 if not.. *. 
13e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
13f0: 20 2a 09 50 65 72 66 6f 72 6d 73 20 53 53 4c 5f   *.Performs SSL_
1400: 61 63 63 65 70 74 20 6f 72 20 53 53 4c 5f 63 6f  accept or SSL_co
1410: 6e 6e 65 63 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  nnect.. *. *----
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1440: 2d 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 0a 20 2a 2f 0a 69 6e  ---------. */.in
1470: 74 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  t Tls_WaitForCon
1480: 6e 65 63 74 28 0a 20 20 20 20 53 74 61 74 65 20  nect(.    State 
1490: 2a 73 74 61 74 65 50 74 72 2c 09 09 09 2f 2a 20  *statePtr,.../* 
14a0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65  Connection state
14b0: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 6e 74   info */.    int
14c0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 09   *errorCodePtr,.
14d0: 09 09 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f 72  ../* Storage for
14e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 72   error code to r
14f0: 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  eturn */.    int
1500: 20 68 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72   handshakeFailur
1510: 65 49 73 50 65 72 6d 61 6e 65 6e 74 29 09 2f 2a  eIsPermanent)./*
1520: 20 49 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 20   Is the connect 
1530: 66 61 69 6c 75 72 65 20 70 65 72 6d 61 6e 65 6e  failure permanen
1540: 74 20 2a 2f 0a 7b 0a 20 20 20 20 75 6e 73 69 67  t */.{.    unsig
1550: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67  ned long backing
1560: 45 72 72 6f 72 3b 0a 20 20 20 20 69 6e 74 20 65  Error;.    int e
1570: 72 72 2c 20 72 63 3b 0a 20 20 20 20 2a 65 72 72  rr, rc;.    *err
1580: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a  orCodePtr = 0;..
1590: 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 61 69      dprintf("Wai
15a0: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 25 70 29 22  tForConnect(%p)"
15b0: 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65  , (void *) state
15c0: 50 74 72 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  Ptr);.    dprint
15d0: 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68 20 68  f("Called with h
15e0: 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65 49  andshakeFailureI
15f0: 73 50 65 72 6d 61 6e 65 6e 74 20 25 64 22 2c 20  sPermanent %d", 
1600: 68 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65  handshakeFailure
1610: 49 73 50 65 72 6d 61 6e 65 6e 74 29 3b 0a 20 20  IsPermanent);.  
1620: 20 20 64 70 72 69 6e 74 46 6c 61 67 73 28 73 74    dprintFlags(st
1630: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
1640: 20 43 61 6e 20 61 6c 73 6f 20 63 68 65 63 6b 20   Can also check 
1650: 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69  SSL_is_init_fini
1660: 73 68 65 64 28 73 73 6c 29 20 2a 2f 0a 20 20 20  shed(ssl) */.   
1670: 20 69 66 20 28 21 28 73 74 61 74 65 50 74 72 2d   if (!(statePtr-
1680: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
1690: 5f 49 4e 49 54 29 29 20 7b 0a 09 64 70 72 69 6e  _INIT)) {..dprin
16a0: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43  tf("Tls_WaitForC
16b0: 6f 6e 6e 65 63 74 20 63 61 6c 6c 65 64 20 6f 6e  onnect called on
16c0: 20 61 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c   already initial
16d0: 69 7a 65 64 20 63 68 61 6e 6e 65 6c 20 2d 2d 20  ized channel -- 
16e0: 72 65 74 75 72 6e 69 6e 67 20 77 69 74 68 20 69  returning with i
16f0: 6d 6d 65 64 69 61 74 65 20 73 75 63 63 65 73 73  mmediate success
1700: 22 29 3b 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20  ");..return 1;. 
1710: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 66     }..    /* Dif
1720: 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20  ferent types of 
1730: 6f 70 65 72 61 74 69 6f 6e 73 20 68 61 76 65 20  operations have 
1740: 64 69 66 66 65 72 65 6e 74 20 72 65 71 75 69 72  different requir
1750: 65 6d 65 6e 74 73 20 66 6f 72 20 53 53 4c 20 62  ements for SSL b
1760: 65 69 6e 67 20 65 73 74 61 62 6c 69 73 68 65 64  eing established
1770: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  . */.    if (sta
1780: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
1790: 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52 52  LS_TCL_FATAL_ERR
17a0: 4f 52 29 20 7b 0a 09 69 66 20 28 68 61 6e 64 73  OR) {..if (hands
17b0: 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72  hakeFailureIsPer
17c0: 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20 20 20 64  manent) {..    d
17d0: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
17e0: 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20   wait for a TLS 
17f0: 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68  handshake that h
1800: 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65  as already faile
1810: 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61  d.  Returning fa
1820: 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a 09 20 20  tal error");..  
1830: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
1840: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a  = ECONNABORTED;.
1850: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64  .} else {..    d
1860: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
1870: 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20   wait for a TLS 
1880: 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68  handshake that h
1890: 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65  as already faile
18a0: 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 73 6f  d.  Returning so
18b0: 66 74 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20  ft error");..   
18c0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
18d0: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 7d 0a   ECONNRESET;..}.
18e0: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20  .return -1;.    
18f0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
1900: 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61   We need to clea
1910: 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20  r the SSL error 
1920: 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73  stack now becaus
1930: 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72  e we sometimes r
1940: 65 61 63 68 0a 20 20 20 20 20 2a 20 74 68 69 73  each.     * this
1950: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c   function with l
1960: 65 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69  eftover errors i
1970: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66  n the stack.  If
1980: 20 61 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e 65   accept or conne
1990: 63 74 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e  ct.     * return
19a0: 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20   -1 and intends 
19b0: 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73  EAGAIN, there is
19c0: 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f   a leftover erro
19d0: 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20  r, it will be.  
19e0: 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65     * misconstrue
19f0: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e  d as an error, n
1a00: 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20  ot EAGAIN..     
1a10: 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  */.    ERR_clear
1a20: 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 42 49  _error();.    BI
1a30: 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c  O_clear_retry_fl
1a40: 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ags(statePtr->bi
1a50: 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 20  o);..    /* Not 
1a60: 69 6e 69 74 69 61 6c 69 7a 65 64 20 79 65 74 21  initialized yet!
1a70: 20 41 6c 73 6f 20 63 61 6c 6c 73 20 53 53 4c 5f   Also calls SSL_
1a80: 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20  do_handshake(). 
1a90: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
1aa0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
1ab0: 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09  _TCL_SERVER) {..
1ac0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67  dprintf("Calling
1ad0: 20 53 53 4c 5f 61 63 63 65 70 74 28 29 22 29 3b   SSL_accept()");
1ae0: 0a 09 72 63 20 3d 20 53 53 4c 5f 61 63 63 65 70  ..rc = SSL_accep
1af0: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  t(statePtr->ssl)
1b00: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
1b10: 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e  .dprintf("Callin
1b20: 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 29 22  g SSL_connect()"
1b30: 29 3b 0a 09 72 63 20 3d 20 53 53 4c 5f 63 6f 6e  );..rc = SSL_con
1b40: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73  nect(statePtr->s
1b50: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  sl);.    }.    e
1b60: 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72  rr = SSL_get_err
1b70: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  or(statePtr->ssl
1b80: 2c 20 72 63 29 3b 0a 20 20 20 20 62 61 63 6b 69  , rc);.    backi
1b90: 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65  ngError = ERR_ge
1ba0: 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  t_error();..    
1bb0: 69 66 20 28 72 63 20 3c 3d 20 30 29 20 7b 0a 09  if (rc <= 0) {..
1bc0: 64 70 72 69 6e 74 66 28 22 41 63 63 65 70 74 2f  dprintf("Accept/
1bd0: 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 3a 20  connect failed: 
1be0: 69 73 20 45 4f 46 3d 25 64 2c 20 73 68 6f 75 6c  is EOF=%d, shoul
1bf0: 64 20 72 65 74 72 79 3d 25 64 2c 20 72 65 74 72  d retry=%d, retr
1c00: 79 20 72 65 61 64 3d 25 64 2c 20 72 65 74 72 79  y read=%d, retry
1c10: 20 77 72 69 74 65 3d 25 64 2c 20 6f 74 68 65 72   write=%d, other
1c20: 3d 25 64 22 2c 0a 09 20 20 20 20 42 49 4f 5f 65  =%d",..    BIO_e
1c30: 6f 66 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  of(statePtr->bio
1c40: 29 2c 0a 09 20 20 20 20 42 49 4f 5f 73 68 6f 75  ),..    BIO_shou
1c50: 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74  ld_retry(statePt
1c60: 72 2d 3e 62 69 6f 29 2c 20 42 49 4f 5f 73 68 6f  r->bio), BIO_sho
1c70: 75 6c 64 5f 72 65 61 64 28 73 74 61 74 65 50 74  uld_read(statePt
1c80: 72 2d 3e 62 69 6f 29 2c 0a 09 20 20 20 20 42 49  r->bio),..    BI
1c90: 4f 5f 73 68 6f 75 6c 64 5f 77 72 69 74 65 28 73  O_should_write(s
1ca0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c 20 42  tatePtr->bio), B
1cb0: 49 4f 5f 73 68 6f 75 6c 64 5f 69 6f 5f 73 70 65  IO_should_io_spe
1cc0: 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  cial(statePtr->b
1cd0: 69 6f 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  io));.    }..   
1ce0: 20 2f 2a 20 42 61 73 65 64 20 6f 6e 20 65 72 72   /* Based on err
1cf0: 6f 72 2c 20 64 6f 20 72 65 74 72 79 20 6f 72 20  or, do retry or 
1d00: 61 62 6f 72 74 20 2a 2f 0a 20 20 20 20 73 77 69  abort */.    swi
1d10: 74 63 68 20 28 65 72 72 29 20 7b 0a 09 63 61 73  tch (err) {..cas
1d20: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45  e SSL_ERROR_NONE
1d30: 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 54 4c  :..    /* The TL
1d40: 53 2f 53 53 4c 20 49 2f 4f 20 6f 70 65 72 61 74  S/SSL I/O operat
1d50: 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 73 75  ion completed su
1d60: 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 09 20  ccessfully */.. 
1d70: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
1d80: 45 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09 20  ERROR_NONE");.. 
1d90: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
1da0: 20 3d 20 30 3b 0a 09 20 20 20 20 62 72 65 61 6b   = 0;..    break
1db0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
1dc0: 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20  OR_SSL:..    /* 
1dd0: 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c  A non-recoverabl
1de0: 65 2c 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69  e, fatal error i
1df0: 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72  n the SSL librar
1e00: 79 20 6f 63 63 75 72 72 65 64 2c 0a 09 20 20 20  y occurred,..   
1e10: 20 20 20 20 75 73 75 61 6c 6c 79 20 61 20 70 72      usually a pr
1e20: 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 2e 20 54 68  otocol error. Th
1e30: 69 73 20 69 6e 63 6c 75 64 65 73 20 63 65 72 74  is includes cert
1e40: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69  ificate validati
1e50: 6f 6e 0a 09 20 20 20 20 20 20 20 65 72 72 6f 72  on..       error
1e60: 73 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  s. */..    dprin
1e70: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 53  tf("SSL_ERROR_SS
1e80: 4c 3a 20 46 61 74 61 6c 20 53 53 4c 20 70 72 6f  L: Fatal SSL pro
1e90: 74 6f 63 6f 6c 20 65 72 72 6f 72 20 6f 63 63 75  tocol error occu
1ea0: 72 72 65 64 22 29 3b 0a 09 20 20 20 20 69 66 20  rred");..    if 
1eb0: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
1ec0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
1ed0: 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f  >ssl) != X509_V_
1ee0: 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f  OK) {...Tls_Erro
1ef0: 72 28 73 74 61 74 65 50 74 72 2c 0a 09 09 20 20  r(statePtr,...  
1f00: 20 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65    X509_verify_ce
1f10: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
1f20: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
1f30: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
1f40: 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 0a 09  ssl)));..    }..
1f50: 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45      if (backingE
1f60: 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09 54  rror != 0) {...T
1f70: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
1f80: 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72  r, ERR_reason_er
1f90: 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69  ror_string(backi
1fa0: 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20  ngError));..    
1fb0: 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  }..    *errorCod
1fc0: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
1fd0: 54 45 44 3b 0a 09 20 20 20 20 73 74 61 74 65 50  TED;..    stateP
1fe0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
1ff0: 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52 52 4f 52  _TCL_FATAL_ERROR
2000: 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
2010: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
2020: 4c 5f 45 4f 46 3b 0a 09 20 20 20 20 72 65 74 75  L_EOF;..    retu
2030: 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65 20 53 53  rn -1;...case SS
2040: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41  L_ERROR_WANT_REA
2050: 44 3a 0a 09 20 20 20 20 2f 2a 20 4d 6f 72 65 20  D:..    /* More 
2060: 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
2070: 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
2080: 6c 79 69 6e 67 20 42 49 4f 20 6c 61 79 65 72 20  lying BIO layer 
2090: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 09 20 20 20  in order to..   
20a0: 20 20 20 20 63 6f 6d 70 6c 65 74 65 20 74 68 65      complete the
20b0: 20 61 63 74 75 61 6c 20 53 53 4c 5f 2a 28 29 20   actual SSL_*() 
20c0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 2a 2f 0a 09  operation.  */..
20d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c      dprintf("SSL
20e0: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44  _ERROR_WANT_READ
20f0: 3a 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20  : EAGAIN");..   
2100: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72   BIO_set_retry_r
2110: 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ead(statePtr->bi
2120: 6f 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  o);..    *errorC
2130: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
2140: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
2150: 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 52 45 41 44  want |= TCL_READ
2160: 41 42 4c 45 3b 0a 09 20 20 20 20 72 65 74 75 72  ABLE;..    retur
2170: 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  n 0;...case SSL_
2180: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45  ERROR_WANT_WRITE
2190: 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 72 65 20  :..    /* There 
21a0: 69 73 20 64 61 74 61 20 69 6e 20 74 68 65 20 53  is data in the S
21b0: 53 4c 20 62 75 66 66 65 72 20 74 68 61 74 20 6d  SL buffer that m
21c0: 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
21d0: 6f 20 74 68 65 0a 09 20 20 20 20 20 20 20 75 6e  o the..       un
21e0: 64 65 72 6c 79 69 6e 67 20 42 49 4f 20 69 6e 20  derlying BIO in 
21f0: 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
2200: 65 20 74 68 65 20 53 53 4c 5f 2a 28 29 20 6f 70  e the SSL_*() op
2210: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 09 20 20 20  eration. */..   
2220: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52   dprintf("SSL_ER
2230: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 20  ROR_WANT_WRITE: 
2240: 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 42  EAGAIN");..    B
2250: 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77 72 69  IO_set_retry_wri
2260: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  te(statePtr->bio
2270: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
2280: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
2290: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77  .    statePtr->w
22a0: 61 6e 74 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41  ant |= TCL_WRITA
22b0: 42 4c 45 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  BLE;..    return
22c0: 20 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45   0;...case SSL_E
22d0: 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c  RROR_WANT_X509_L
22e0: 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 2a 20 54  OOKUP:..    /* T
22f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64  he operation did
2300: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
2310: 63 61 75 73 65 20 61 6e 20 61 70 70 6c 69 63 61  cause an applica
2320: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 09 20  tion callback.. 
2330: 20 20 20 20 20 20 73 65 74 20 62 79 20 53 53 4c        set by SSL
2340: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
2350: 63 65 72 74 5f 63 62 28 29 20 68 61 73 20 61 73  cert_cb() has as
2360: 6b 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ked to be called
2370: 20 61 67 61 69 6e 2e 20 2a 2f 0a 09 20 20 20 20   again. */..    
2380: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52  dprintf("SSL_ERR
2390: 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f  OR_WANT_X509_LOO
23a0: 4b 55 50 3a 20 45 41 47 41 49 4e 22 29 3b 0a 09  KUP: EAGAIN");..
23b0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72      BIO_set_retr
23c0: 79 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65 50  y_special(stateP
23d0: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42  tr->bio);..    B
23e0: 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61  IO_set_retry_rea
23f0: 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69  son(statePtr->bi
2400: 6f 2c 20 42 49 4f 5f 52 52 5f 53 53 4c 5f 58 35  o, BIO_RR_SSL_X5
2410: 30 39 5f 4c 4f 4f 4b 55 50 29 3b 0a 09 20 20 20  09_LOOKUP);..   
2420: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
2430: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 72 65   EAGAIN;..    re
2440: 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53  turn 0;...case S
2450: 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c  SL_ERROR_SYSCALL
2460: 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e  :..    /* Some n
2470: 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20  on-recoverable, 
2480: 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20  fatal I/O error 
2490: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20  occurred */..   
24a0: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52   dprintf("SSL_ER
24b0: 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74  ROR_SYSCALL: Fat
24c0: 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  al I/O error occ
24d0: 75 72 72 65 64 22 29 3b 0a 0a 09 20 20 20 20 69  urred");...    i
24e0: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  f (backingError 
24f0: 3d 3d 20 30 20 26 26 20 72 63 20 3d 3d 20 30 29  == 0 && rc == 0)
2500: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 45 4f   {...dprintf("EO
2510: 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65  F reached")...*e
2520: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
2530: 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 54 6c 73 5f  ONNRESET;...Tls_
2540: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
2550: 22 28 75 6e 65 78 70 65 63 74 65 64 29 20 45 4f  "(unexpected) EO
2560: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20  F reached");... 
2570: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61     } else if (ba
2580: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20  ckingError == 0 
2590: 26 26 20 72 63 20 3d 3d 20 2d 31 29 20 7b 0a 09  && rc == -1) {..
25a0: 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72  .dprintf("I/O er
25b0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 72  ror occurred (er
25c0: 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e  rno = %lu)", (un
25d0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c  signed long) Tcl
25e0: 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09  _GetErrno());...
25f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2600: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a  Tcl_GetErrno();.
2610: 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65  ..if (*errorCode
2620: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45  Ptr == ECONNRESE
2630: 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 6f  T) {...    *erro
2640: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e  rCodePtr = ECONN
2650: 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 09 54  ABORTED;...}...T
2660: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
2670: 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28  r, Tcl_ErrnoMsg(
2680: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b  *errorCodePtr));
2690: 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ...    } else {.
26a0: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65  ..dprintf("I/O e
26b0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62  rror occurred (b
26c0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c  ackingError = %l
26d0: 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f  u)", backingErro
26e0: 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65  r);...*errorCode
26f0: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72  Ptr = Tcl_GetErr
2700: 6e 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 72 72  no();...if (*err
2710: 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f  orCodePtr == ECO
2720: 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 20 20  NNRESET) {...   
2730: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
2740: 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09   ECONNABORTED;..
2750: 09 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73  .}...Tls_Error(s
2760: 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 61  tatePtr, ERR_rea
2770: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  son_error_string
2780: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b  (backingError));
2790: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73 74  ..    }...    st
27a0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
27b0: 20 54 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45   TLS_TCL_FATAL_E
27c0: 52 52 4f 52 3b 0a 09 20 20 20 20 73 74 61 74 65  RROR;..    state
27d0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
27e0: 53 5f 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20  S_TCL_EOF;..    
27f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73  return -1;...cas
2800: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f  e SSL_ERROR_ZERO
2810: 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f 2a  _RETURN:..    /*
2820: 20 50 65 65 72 20 68 61 73 20 63 6c 65 61 6e 6c   Peer has cleanl
2830: 79 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e  y closed the con
2840: 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64 69  nection by sendi
2850: 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74  ng the close_not
2860: 69 66 79 0a 09 20 20 20 20 20 20 20 61 6c 65 72  ify..       aler
2870: 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20 62  t. Can't read, b
2880: 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 4e 65  ut can write. Ne
2890: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ed to return an 
28a0: 45 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20 20 20  EOF, so the..   
28b0: 20 20 20 20 63 68 61 6e 6e 65 6c 20 69 73 20 63      channel is c
28c0: 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c 6c  losed which will
28d0: 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 75   send an SSL_shu
28e0: 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 20  tdown(). */..   
28f0: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52   dprintf("SSL_ER
2900: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a  ROR_ZERO_RETURN:
2910: 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64   Peer has closed
2920: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 22   the connection"
2930: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
2940: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53  dePtr = ECONNRES
2950: 45 54 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ET;..    statePt
2960: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
2970: 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20 54 6c  TCL_EOF;..    Tl
2980: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
2990: 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f 73  , "Peer has clos
29a0: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ed the connectio
29b0: 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79  n for writing by
29c0: 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f   sending the clo
29d0: 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 22  se_notify alert"
29e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d  );..    return -
29f0: 31 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  1;...case SSL_ER
2a00: 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54  ROR_WANT_CONNECT
2a10: 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  :..    /* The op
2a20: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
2a30: 63 6f 6d 70 6c 65 74 65 20 61 6e 64 20 63 6f 6e  complete and con
2a40: 6e 65 63 74 20 77 6f 75 6c 64 20 68 61 76 65 20  nect would have 
2a50: 62 6c 6f 63 6b 65 64 2e 0a 09 20 20 20 20 20 20  blocked...      
2a60: 20 52 65 74 72 79 20 61 67 61 69 6e 20 61 66 74   Retry again aft
2a70: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
2a80: 20 65 73 74 61 62 6c 69 73 68 65 64 2e 20 2a 2f   established. */
2a90: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
2aa0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f  SL_ERROR_WANT_CO
2ab0: 4e 4e 45 43 54 3a 20 45 41 47 41 49 4e 22 29 3b  NNECT: EAGAIN");
2ac0: 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65  ..    BIO_set_re
2ad0: 74 72 79 5f 73 70 65 63 69 61 6c 28 73 74 61 74  try_special(stat
2ae0: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20  ePtr->bio);..   
2af0: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72   BIO_set_retry_r
2b00: 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  eason(statePtr->
2b10: 62 69 6f 2c 20 42 49 4f 5f 52 52 5f 43 4f 4e 4e  bio, BIO_RR_CONN
2b20: 45 43 54 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  ECT);..    *erro
2b30: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
2b40: 4e 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30  N;..    return 0
2b50: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
2b60: 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 3a 0a  OR_WANT_ACCEPT:.
2b70: 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72  .    /* The oper
2b80: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f  ation did not co
2b90: 6d 70 6c 65 74 65 20 61 6e 64 20 61 63 63 65 70  mplete and accep
2ba0: 74 20 77 6f 75 6c 64 20 68 61 76 65 20 62 6c 6f  t would have blo
2bb0: 63 6b 65 64 2e 0a 09 20 20 20 20 20 20 20 52 65  cked...       Re
2bc0: 74 72 79 20 61 67 61 69 6e 20 61 66 74 65 72 20  try again after 
2bd0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 65 73  connection is es
2be0: 74 61 62 6c 69 73 68 65 64 2e 20 2a 2f 0a 09 20  tablished. */.. 
2bf0: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
2c00: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50  ERROR_WANT_ACCEP
2c10: 54 3a 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20  T: EAGAIN");..  
2c20: 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f    BIO_set_retry_
2c30: 73 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 72  special(statePtr
2c40: 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42 49 4f  ->bio);..    BIO
2c50: 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f  _set_retry_reaso
2c60: 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c  n(statePtr->bio,
2c70: 20 42 49 4f 5f 52 52 5f 41 43 43 45 50 54 29 3b   BIO_RR_ACCEPT);
2c80: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
2c90: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
2ca0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 63     return 0;...c
2cb0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
2cc0: 4e 54 5f 41 53 59 4e 43 3a 0a 09 20 20 20 20 2f  NT_ASYNC:..    /
2cd0: 2a 20 55 73 65 64 20 77 69 74 68 20 66 6c 61 67  * Used with flag
2ce0: 20 53 53 4c 5f 4d 4f 44 45 5f 41 53 59 4e 43 2c   SSL_MODE_ASYNC,
2cf0: 20 6f 70 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c   op didn't compl
2d00: 65 74 65 20 62 65 63 61 75 73 65 20 61 6e 0a 09  ete because an..
2d10: 20 20 20 20 20 20 20 61 73 79 6e 63 20 65 6e 67         async eng
2d20: 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f  ine is still pro
2d30: 63 65 73 73 69 6e 67 20 64 61 74 61 20 2a 2f 0a  cessing data */.
2d40: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
2d50: 57 41 4e 54 5f 41 53 59 4e 43 5f 4a 4f 42 3a 0a  WANT_ASYNC_JOB:.
2d60: 09 20 20 20 20 2f 2a 20 54 68 65 20 61 73 79 6e  .    /* The asyn
2d70: 63 68 72 6f 6e 6f 75 73 20 6a 6f 62 20 63 6f 75  chronous job cou
2d80: 6c 64 20 6e 6f 74 20 62 65 20 73 74 61 72 74 65  ld not be starte
2d90: 64 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20  d because there 
2da0: 77 65 72 65 20 6e 6f 0a 09 20 20 20 20 20 20 20  were no..       
2db0: 61 73 79 6e 63 20 6a 6f 62 73 20 61 76 61 69 6c  async jobs avail
2dc0: 61 62 6c 65 20 69 6e 20 74 68 65 20 70 6f 6f 6c  able in the pool
2dd0: 2e 20 2a 2f 0a 09 63 61 73 65 20 53 53 4c 5f 45  . */..case SSL_E
2de0: 52 52 4f 52 5f 57 41 4e 54 5f 43 4c 49 45 4e 54  RROR_WANT_CLIENT
2df0: 5f 48 45 4c 4c 4f 5f 43 42 3a 0a 09 20 20 20 20  _HELLO_CB:..    
2e00: 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  /* The operation
2e10: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
2e20: 65 20 62 65 63 61 75 73 65 20 61 6e 20 61 70 70  e because an app
2e30: 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  lication callbac
2e40: 6b 0a 09 20 20 20 20 20 20 20 73 65 74 20 62 79  k..       set by
2e50: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69   SSL_CTX_set_cli
2e60: 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 29 20 68  ent_hello_cb() h
2e70: 61 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63  as asked to be c
2e80: 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a  alled again. */.
2e90: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
2ea0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
2eb0: 33 30 30 30 30 30 30 30 4c 0a 09 63 61 73 65 20  30000000L..case 
2ec0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52  SSL_ERROR_WANT_R
2ed0: 45 54 52 59 5f 56 45 52 49 46 59 3a 0a 09 20 20  ETRY_VERIFY:..  
2ee0: 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69    /* The operati
2ef0: 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c  on did not compl
2f00: 65 74 65 20 62 65 63 61 75 73 65 20 61 20 63 65  ete because a ce
2f10: 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66 69  rtificate verifi
2f20: 63 61 74 69 6f 6e 0a 09 20 20 20 20 20 20 20 63  cation..       c
2f30: 61 6c 6c 62 61 63 6b 20 68 61 73 20 61 73 6b 65  allback has aske
2f40: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61  d to be called a
2f50: 67 61 69 6e 20 76 69 61 20 53 53 4c 5f 73 65 74  gain via SSL_set
2f60: 5f 72 65 74 72 79 5f 76 65 72 69 66 79 28 33 29  _retry_verify(3)
2f70: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 09 64 65 66  . */.#endif..def
2f80: 61 75 6c 74 3a 0a 09 20 20 20 20 2f 2a 20 54 68  ault:..    /* Th
2f90: 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  e operation did 
2fa0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  not complete and
2fb0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
2fc0: 65 64 20 6c 61 74 65 72 2e 20 2a 2f 0a 09 20 20  ed later. */..  
2fd0: 20 20 64 70 72 69 6e 74 66 28 22 4f 70 65 72 61    dprintf("Opera
2fe0: 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d  tion did not com
2ff0: 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66 75 6e 63  plete, call func
3000: 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74 65 72  tion again later
3010: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
3020: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
3030: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45  ..    dprintf("E
3040: 52 52 28 4f 74 68 65 72 2c 20 45 41 47 41 49 4e  RR(Other, EAGAIN
3050: 29 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  )");..    return
3060: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64   0;.    }..    d
3070: 70 72 69 6e 74 66 28 22 52 65 6d 6f 76 69 6e 67  printf("Removing
3080: 20 74 68 65 20 5c 22 54 4c 53 5f 54 43 4c 5f 49   the \"TLS_TCL_I
3090: 4e 49 54 5c 22 20 66 6c 61 67 20 73 69 6e 63 65  NIT\" flag since
30a0: 20 77 65 20 68 61 76 65 20 63 6f 6d 70 6c 65 74   we have complet
30b0: 65 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  ed the handshake
30c0: 22 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  ");.    statePtr
30d0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 4c 53 5f  ->flags &= ~TLS_
30e0: 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20 20 20 20 64  TCL_INIT;..    d
30f0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
3100: 67 20 73 75 63 63 65 73 73 22 29 3b 0a 20 20 20  g success");.   
3110: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
3120: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   0;.    return 1
3130: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
3190: 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a  sInputProc --. *
31a0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
31b0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  re is invoked by
31c0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f   the generic I/O
31d0: 20 6c 61 79 65 72 20 74 6f 20 72 65 61 64 20 64   layer to read d
31e0: 61 74 61 20 66 72 6f 6d 0a 20 2a 09 74 68 65 20  ata from. *.the 
31f0: 42 49 4f 20 77 68 65 6e 65 76 65 72 20 74 68 65  BIO whenever the
3200: 20 54 63 6c 5f 52 65 61 64 2c 20 54 63 6c 5f 52   Tcl_Read, Tcl_R
3210: 65 61 64 43 68 61 72 73 2c 20 54 63 6c 5f 47 65  eadChars, Tcl_Ge
3220: 74 73 2c 20 61 6e 64 20 54 63 6c 5f 47 65 74 73  ts, and Tcl_Gets
3230: 4f 62 6a 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 73  Obj. *.functions
3240: 20 61 72 65 20 75 73 65 64 2e 20 45 71 75 69 76   are used. Equiv
3250: 61 6c 65 6e 74 20 74 6f 20 53 53 4c 5f 72 65 61  alent to SSL_rea
3260: 64 5f 65 78 20 61 6e 64 20 53 53 4c 5f 72 65 61  d_ex and SSL_rea
3270: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  d.. *. * Results
3280: 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65  :. *.Returns the
3290: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
32a0: 20 72 65 61 64 20 6f 72 20 2d 31 20 6f 6e 20 65   read or -1 on e
32b0: 72 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72  rror. Sets error
32c0: 43 6f 64 65 50 74 72 20 74 6f 0a 20 2a 09 61 20  CodePtr to. *.a 
32d0: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65  POSIX error code
32e0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
32f0: 75 72 72 65 64 2c 20 6f 72 20 30 20 69 66 20 73  urred, or 0 if s
3300: 75 63 63 65 73 73 66 75 6c 2e 0a 20 2a 0a 20 2a  uccessful.. *. *
3310: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
3320: 2a 09 52 65 61 64 73 20 64 61 74 61 20 66 72 6f  *.Reads data fro
3330: 6d 20 53 53 4c 2f 42 49 4f 2e 0a 20 2a 0a 20 2a  m SSL/BIO.. *. *
3340: 20 4e 6f 74 65 73 3a 0a 20 2a 09 44 61 74 61 20   Notes:. *.Data 
3350: 69 73 20 72 65 63 65 69 76 65 64 20 69 6e 20 77  is received in w
3360: 68 6f 6c 65 20 62 6c 6f 63 6b 73 20 6b 6e 6f 77  hole blocks know
3370: 6e 20 61 73 20 72 65 63 6f 72 64 73 20 66 72 6f  n as records fro
3380: 6d 20 74 68 65 20 70 65 65 72 2e 20 41 20 0a 20  m the peer. A . 
3390: 2a 09 77 68 6f 6c 65 20 72 65 63 6f 72 64 20 69  *.whole record i
33a0: 73 20 70 72 6f 63 65 73 73 65 64 20 28 65 2e 67  s processed (e.g
33b0: 2e 20 64 65 63 72 79 70 74 65 64 29 20 69 6e 20  . decrypted) in 
33c0: 6f 6e 65 20 67 6f 20 61 6e 64 20 69 73 20 62 75  one go and is bu
33d0: 66 66 65 72 65 64 20 62 79 0a 20 2a 09 4f 70 65  ffered by. *.Ope
33e0: 6e 53 53 4c 20 75 6e 74 69 6c 20 69 74 20 69 73  nSSL until it is
33f0: 20 72 65 61 64 20 62 79 20 74 68 65 20 61 70 70   read by the app
3400: 6c 69 63 61 74 69 6f 6e 20 76 69 61 20 61 20 63  lication via a c
3410: 61 6c 6c 20 74 6f 20 53 53 4c 5f 72 65 61 64 28  all to SSL_read(
3420: 29 20 6f 72 0a 20 2a 09 42 49 4f 5f 72 65 61 64  ) or. *.BIO_read
3430: 28 29 20 69 6e 20 6f 75 72 20 63 61 73 65 2e 20  () in our case. 
3440: 53 53 4c 5f 70 65 6e 64 69 6e 67 28 29 20 72 65  SSL_pending() re
3450: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
3460: 20 6f 66 20 62 79 74 65 73 20 77 68 69 63 68 0a   of bytes which.
3470: 20 2a 09 68 61 76 65 20 62 65 65 6e 20 70 72 6f   *.have been pro
3480: 63 65 73 73 65 64 2c 20 62 75 66 66 65 72 65 64  cessed, buffered
3490: 2c 20 61 6e 64 20 61 72 65 20 61 76 61 69 6c 61  , and are availa
34a0: 62 6c 65 20 69 6e 73 69 64 65 20 73 73 6c 20 66  ble inside ssl f
34b0: 6f 72 0a 20 2a 09 69 6d 6d 65 64 69 61 74 65 20  or. *.immediate 
34c0: 72 65 61 64 2e 20 53 53 4c 5f 68 61 73 5f 70 65  read. SSL_has_pe
34d0: 6e 64 69 6e 67 28 29 20 72 65 74 75 72 6e 73 20  nding() returns 
34e0: 31 20 69 66 20 64 61 74 61 20 69 73 20 62 75 66  1 if data is buf
34f0: 66 65 72 65 64 0a 20 2a 09 28 77 68 65 74 68 65  fered. *.(whethe
3500: 72 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 75  r processed or u
3510: 6e 70 72 6f 63 65 73 73 65 64 29 20 61 6e 64 20  nprocessed) and 
3520: 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 20 2a 0a  0 otherwise.. *.
3530: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3580: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
3590: 6c 73 49 6e 70 75 74 50 72 6f 63 28 0a 20 20 20  lsInputProc(.   
35a0: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
35b0: 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43 6f 6e  anceData,./* Con
35c0: 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69 6e  nection state in
35d0: 66 6f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  fo */.    char *
35e0: 62 75 66 2c 09 09 09 2f 2a 20 42 75 66 66 65 72  buf,.../* Buffer
35f0: 20 74 6f 20 73 74 6f 72 65 20 64 61 74 61 20 72   to store data r
3600: 65 61 64 20 66 72 6f 6d 20 42 49 4f 20 2a 2f 0a  ead from BIO */.
3610: 20 20 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c      int bufSize,
3620: 09 09 2f 2a 20 42 75 66 66 65 72 20 73 69 7a 65  ../* Buffer size
3630: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
3640: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
3650: 74 72 29 09 09 2f 2a 20 53 74 6f 72 61 67 65 20  tr)../* Storage 
3660: 66 6f 72 20 65 72 72 6f 72 20 63 6f 64 65 20 74  for error code t
3670: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 7b 0a 20 20  o return */.{.  
3680: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
3690: 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 20  backingError;.  
36a0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
36b0: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e  r = (State *) in
36c0: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20  stanceData;.    
36d0: 69 6e 74 20 62 79 74 65 73 52 65 61 64 2c 20 65  int bytesRead, e
36e0: 72 72 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f  rr;.    *errorCo
36f0: 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  dePtr = 0;..    
3700: 64 70 72 69 6e 74 66 28 22 52 65 61 64 20 25 64  dprintf("Read %d
3710: 20 62 79 74 65 73 22 2c 20 62 75 66 53 69 7a 65   bytes", bufSize
3720: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74  );..    /* Abort
3730: 20 69 66 20 74 68 65 20 75 73 65 72 20 76 65 72   if the user ver
3740: 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ify callback is 
3750: 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f  still running to
3760: 20 61 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e   avoid triggerin
3770: 67 0a 20 20 20 20 20 2a 20 61 6e 6f 74 68 65 72  g.     * another
3780: 20 63 61 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   call before the
3790: 20 63 75 72 72 65 6e 74 20 6f 6e 65 20 69 73 20   current one is 
37a0: 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20  complete. */.   
37b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
37c0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43  lags & TLS_TCL_C
37d0: 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69  ALLBACK) {..dpri
37e0: 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73  ntf("Callback is
37f0: 20 72 75 6e 6e 69 6e 67 2c 20 72 65 61 64 69 6e   running, readin
3800: 67 20 30 20 62 79 74 65 73 22 29 3b 0a 09 72 65  g 0 bytes");..re
3810: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
3820: 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 45     /* Abort if E
3830: 4f 46 20 61 6c 72 65 61 64 79 20 64 65 74 65 63  OF already detec
3840: 74 65 64 2e 20 43 61 6e 27 74 20 72 65 61 64 2c  ted. Can't read,
3850: 20 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20   but can write. 
3860: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
3870: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
3880: 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52 52 4f 52  _TCL_FATAL_ERROR
3890: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 66 6c   || statePtr->fl
38a0: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 45 4f  ags & TLS_TCL_EO
38b0: 46 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 45  F) {..dprintf("E
38c0: 4f 46 20 61 6c 72 65 61 64 79 20 64 65 74 65 63  OF already detec
38d0: 74 65 64 2c 20 61 62 6f 72 74 20 72 65 61 64 22  ted, abort read"
38e0: 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  );..return 0;.  
38f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
3900: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ot initialized, 
3910: 64 6f 20 63 6f 6e 6e 65 63 74 2e 20 43 61 6e 20  do connect. Can 
3920: 61 6c 73 6f 20 63 68 65 63 6b 20 53 53 4c 5f 69  also check SSL_i
3930: 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28  s_init_finished(
3940: 29 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  ). */.    if (st
3950: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
3960: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a  TLS_TCL_INIT) {.
3970: 09 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b  .int tlsConnect;
3980: 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c  ...dprintf("Call
3990: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  ing Tls_WaitForC
39a0: 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73 43  onnect");...tlsC
39b0: 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69  onnect = Tls_Wai
39c0: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74  tForConnect(stat
39d0: 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50  ePtr, errorCodeP
39e0: 74 72 2c 20 30 29 3b 0a 09 69 66 20 28 74 6c 73  tr, 0);..if (tls
39f0: 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09  Connect < 0) {..
3a00: 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 2c 20      /* Failure, 
3a10: 73 6f 20 61 62 6f 72 74 20 2a 2f 0a 09 20 20 20  so abort */..   
3a20: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e   dprintf("Got an
3a30: 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74   error waiting t
3a40: 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f  o connect (tlsCo
3a50: 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72  nnect = %i, *err
3a60: 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22  orCodePtr = %i)"
3a70: 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a 65  , tlsConnect, *e
3a80: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a 09  rrorCodePtr);...
3a90: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20      bytesRead = 
3aa0: 2d 31 3b 0a 09 20 20 20 20 69 66 20 28 2a 65 72  -1;..    if (*er
3ab0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43  rorCodePtr == EC
3ac0: 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 64 70  ONNRESET) {...dp
3ad0: 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65  rintf("Got conne
3ae0: 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09  ction reset");..
3af0: 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a  ./* Soft EOF */.
3b00: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
3b10: 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64  = 0;...bytesRead
3b20: 20 3d 20 30 3b 0a 09 09 73 74 61 74 65 50 74 72   = 0;...statePtr
3b30: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
3b40: 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20 7d 0a 09  CL_EOF;..    }..
3b50: 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73      return bytes
3b60: 52 65 61 64 3b 0a 09 7d 20 65 6c 73 65 20 69 66  Read;..} else if
3b70: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 3d 20   (tlsConnect == 
3b80: 30 29 20 7b 0a 09 20 20 20 20 2f 2a 20 54 72 79  0) {..    /* Try
3b90: 20 61 67 61 69 6e 20 2a 2f 0a 09 20 20 20 20 62   again */..    b
3ba0: 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09  ytesRead = -1;..
3bb0: 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73      return bytes
3bc0: 52 65 61 64 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  Read;..}.    }..
3bd0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
3be0: 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74   need to clear t
3bf0: 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61  he SSL error sta
3c00: 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77  ck now because w
3c10: 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63  e sometimes reac
3c20: 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75  h.     * this fu
3c30: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74  nction with left
3c40: 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74  over errors in t
3c50: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49  he stack.  If BI
3c60: 4f 5f 72 65 61 64 0a 20 20 20 20 20 2a 20 72 65  O_read.     * re
3c70: 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74  turns -1 and int
3c80: 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65  ends EAGAIN, the
3c90: 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72  re is a leftover
3ca0: 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20   error, it will 
3cb0: 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e  be.     * miscon
3cc0: 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 72  strued as an err
3cd0: 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a  or, not EAGAIN..
3ce0: 20 20 20 20 20 2a 2f 0a 2f 2a 20 20 20 20 64 70       */./*    dp
3cf0: 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 61 64 3a  rintf("BIO_read:
3d00: 20 43 68 61 6e 20 70 65 6e 64 69 6e 67 3d 25 64   Chan pending=%d
3d10: 64 22 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28  d", BIO_pending(
3d20: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 3b  statePtr->bio));
3d30: 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  */.    ERR_clear
3d40: 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 42 49  _error();.    BI
3d50: 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c  O_clear_retry_fl
3d60: 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ags(statePtr->bi
3d70: 6f 29 3b 0a 20 20 20 20 62 79 74 65 73 52 65 61  o);.    bytesRea
3d80: 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73 74 61  d = BIO_read(sta
3d90: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c  tePtr->bio, buf,
3da0: 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20 20 64   bufSize);.    d
3db0: 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 61 64  printf("BIO_read
3dc0: 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52 65   -> %d", bytesRe
3dd0: 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 61 6d  ad);..    /* Sam
3de0: 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62  e as SSL_want, b
3df0: 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74  ut also checks t
3e00: 68 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a  he error queue *
3e10: 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f  /.    err = SSL_
3e20: 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50  get_error(stateP
3e30: 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65  tr->ssl, bytesRe
3e40: 61 64 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67  ad);.    backing
3e50: 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f  Error = ERR_get_
3e60: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 66  error();..    if
3e70: 20 28 62 79 74 65 73 52 65 61 64 20 3c 3d 20 30   (bytesRead <= 0
3e80: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 52 65  ) {..dprintf("Re
3e90: 61 64 20 66 61 69 6c 65 64 3a 20 69 73 20 45 4f  ad failed: is EO
3ea0: 46 3d 25 64 2c 20 73 68 6f 75 6c 64 20 72 65 74  F=%d, should ret
3eb0: 72 79 3d 25 64 2c 20 72 65 74 72 79 20 72 65 61  ry=%d, retry rea
3ec0: 64 3d 25 64 2c 20 72 65 74 72 79 20 77 72 69 74  d=%d, retry writ
3ed0: 65 3d 25 64 2c 20 6f 74 68 65 72 3d 25 64 22 2c  e=%d, other=%d",
3ee0: 0a 09 20 20 20 20 42 49 4f 5f 65 6f 66 28 73 74  ..    BIO_eof(st
3ef0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c 0a 09 20  atePtr->bio),.. 
3f00: 20 20 20 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65     BIO_should_re
3f10: 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69  try(statePtr->bi
3f20: 6f 29 2c 20 42 49 4f 5f 73 68 6f 75 6c 64 5f 72  o), BIO_should_r
3f30: 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ead(statePtr->bi
3f40: 6f 29 2c 0a 09 20 20 20 20 42 49 4f 5f 73 68 6f  o),..    BIO_sho
3f50: 75 6c 64 5f 77 72 69 74 65 28 73 74 61 74 65 50  uld_write(stateP
3f60: 74 72 2d 3e 62 69 6f 29 2c 20 42 49 4f 5f 73 68  tr->bio), BIO_sh
3f70: 6f 75 6c 64 5f 69 6f 5f 73 70 65 63 69 61 6c 28  ould_io_special(
3f80: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 3b  statePtr->bio));
3f90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42  .    }..    /* B
3fa0: 61 73 65 64 20 6f 6e 20 65 72 72 6f 72 2c 20 64  ased on error, d
3fb0: 6f 20 72 65 74 72 79 20 6f 72 20 61 62 6f 72 74  o retry or abort
3fc0: 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 20 28   */.    switch (
3fd0: 65 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53 4c  err) {..case SSL
3fe0: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20  _ERROR_NONE:..  
3ff0: 20 20 2f 2a 20 49 2f 4f 20 6f 70 65 72 61 74 69    /* I/O operati
4000: 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a  on completed */.
4010: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
4020: 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b 0a  L_ERROR_NONE");.
4030: 09 20 20 20 20 64 70 72 69 6e 74 42 75 66 66 65  .    dprintBuffe
4040: 72 28 62 75 66 2c 20 62 79 74 65 73 52 65 61 64  r(buf, bytesRead
4050: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  );..    break;..
4060: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
4070: 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e  SSL:..    /* A n
4080: 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20  on-recoverable, 
4090: 66 61 74 61 6c 20 65 72 72 6f 72 20 69 6e 20 74  fatal error in t
40a0: 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f  he SSL library o
40b0: 63 63 75 72 72 65 64 2c 0a 09 20 20 20 20 20 20  ccurred,..      
40c0: 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f   usually a proto
40d0: 63 6f 6c 20 65 72 72 6f 72 2e 20 2a 2f 0a 09 20  col error. */.. 
40e0: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
40f0: 45 52 52 4f 52 5f 53 53 4c 3a 20 46 61 74 61 6c  ERROR_SSL: Fatal
4100: 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 65 72   SSL protocol er
4110: 72 6f 72 20 6f 63 63 75 72 72 65 64 22 29 3b 0a  ror occurred");.
4120: 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67  .    if (backing
4130: 45 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09  Error != 0) {...
4140: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
4150: 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65  tr, ERR_reason_e
4160: 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b  rror_string(back
4170: 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20  ingError));..   
4180: 20 7d 20 65 6c 73 65 20 69 66 20 28 53 53 4c 5f   } else if (SSL_
4190: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c  get_verify_resul
41a0: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  t(statePtr->ssl)
41b0: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b   != X509_V_OK) {
41c0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
41d0: 74 65 50 74 72 2c 0a 09 09 20 20 20 20 58 35 30  tePtr,...    X50
41e0: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
41f0: 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67  ror_string(SSL_g
4200: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
4210: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
4220: 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  );..    } else {
4230: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
4240: 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20  tePtr, "Unknown 
4250: 53 53 4c 20 65 72 72 6f 72 22 29 3b 0a 09 20 20  SSL error");..  
4260: 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 43    }..    *errorC
4270: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42  odePtr = ECONNAB
4280: 4f 52 54 45 44 3b 0a 09 20 20 20 20 62 79 74 65  ORTED;..    byte
4290: 73 52 65 61 64 20 3d 20 2d 31 3b 0a 0a 23 69 66  sRead = -1;..#if
42a0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
42b0: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 30  _NUMBER >= 0x300
42c0: 30 30 30 30 30 4c 0a 09 20 20 20 20 2f 2a 20 55  00000L..    /* U
42d0: 6e 65 78 70 65 63 74 65 64 20 45 4f 46 20 66 72  nexpected EOF fr
42e0: 6f 6d 20 74 68 65 20 70 65 65 72 20 66 6f 72 20  om the peer for 
42f0: 4f 70 65 6e 53 53 4c 20 33 2e 30 2b 20 2a 2f 0a  OpenSSL 3.0+ */.
4300: 09 20 20 20 20 69 66 20 28 45 52 52 5f 47 45 54  .    if (ERR_GET
4310: 5f 52 45 41 53 4f 4e 28 62 61 63 6b 69 6e 67 45  _REASON(backingE
4320: 72 72 6f 72 29 20 3d 3d 20 53 53 4c 5f 52 5f 55  rror) == SSL_R_U
4330: 4e 45 58 50 45 43 54 45 44 5f 45 4f 46 5f 57 48  NEXPECTED_EOF_WH
4340: 49 4c 45 5f 52 45 41 44 49 4e 47 29 20 7b 0a 09  ILE_READING) {..
4350: 09 64 70 72 69 6e 74 66 28 22 28 55 6e 65 78 70  .dprintf("(Unexp
4360: 65 63 74 65 64 29 20 45 4f 46 20 72 65 61 63 68  ected) EOF reach
4370: 65 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64  ed")...*errorCod
4380: 65 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65  ePtr = 0;...byte
4390: 73 52 65 61 64 20 3d 20 30 3b 0a 09 09 54 6c 73  sRead = 0;...Tls
43a0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
43b0: 20 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 3b   "EOF reached");
43c0: 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09  ..    }.#endif..
43d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
43e0: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 46  ags |= TLS_TCL_F
43f0: 41 54 41 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20  ATAL_ERROR;..   
4400: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
4410: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 45 4f 46 3b   |= TLS_TCL_EOF;
4420: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
4430: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
4440: 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f 2a  NT_READ:..    /*
4450: 20 4f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   Operation did n
4460: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20  ot complete due 
4470: 74 6f 20 6e 6f 74 20 65 6e 6f 75 67 68 20 64 61  to not enough da
4480: 74 61 20 77 61 73 20 61 76 61 69 6c 61 62 6c 65  ta was available
4490: 2e 0a 09 20 20 20 20 20 20 20 52 65 74 72 79 20  ...       Retry 
44a0: 61 67 61 69 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a  again later. */.
44b0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
44c0: 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  t SSL_ERROR_WANT
44d0: 5f 52 45 41 44 2c 20 6d 61 70 70 69 6e 67 20 74  _READ, mapping t
44e0: 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b  his to EAGAIN");
44f0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
4500: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
4510: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d     bytesRead = -
4520: 31 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72  1;..    statePtr
4530: 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 52 45  ->want |= TCL_RE
4540: 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 42 49 4f  ADABLE;..    BIO
4550: 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61 64 28  _set_retry_read(
4560: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
4570: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
4580: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  se SSL_ERROR_WAN
4590: 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 20 2f 2a  T_WRITE:..    /*
45a0: 20 4f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   Operation did n
45b0: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20  ot complete due 
45c0: 74 6f 20 75 6e 61 62 6c 65 20 74 6f 20 73 65 6e  to unable to sen
45d0: 64 20 61 6c 6c 20 64 61 74 61 20 74 6f 20 74 68  d all data to th
45e0: 65 0a 09 20 20 20 20 20 20 20 42 49 4f 2e 20 52  e..       BIO. R
45f0: 65 74 72 79 20 61 67 61 69 6e 20 6c 61 74 65 72  etry again later
4600: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  . */..    dprint
4610: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52  f("Got SSL_ERROR
4620: 5f 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d 61 70  _WANT_WRITE, map
4630: 70 69 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47  ping this to EAG
4640: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  AIN");..    *err
4650: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
4660: 49 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65  IN;..    bytesRe
4670: 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74  ad = -1;..    st
4680: 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20  atePtr->want |= 
4690: 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20  TCL_WRITABLE;.. 
46a0: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
46b0: 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d  _write(statePtr-
46c0: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61  >bio);..    brea
46d0: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
46e0: 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f  ROR_WANT_X509_LO
46f0: 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 2a 20 54 68  OKUP:..    /* Th
4700: 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  e operation did 
4710: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
4720: 61 75 73 65 20 61 6e 20 61 70 70 6c 69 63 61 74  ause an applicat
4730: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 09 20 20  ion callback..  
4740: 20 20 20 20 20 73 65 74 20 62 79 20 53 53 4c 5f       set by SSL_
4750: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63  CTX_set_client_c
4760: 65 72 74 5f 63 62 28 29 20 68 61 73 20 61 73 6b  ert_cb() has ask
4770: 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
4780: 61 67 61 69 6e 2e 20 2a 2f 0a 09 20 20 20 20 64  again. */..    d
4790: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f  printf("Got SSL_
47a0: 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f  ERROR_WANT_X509_
47b0: 4c 4f 4f 4b 55 50 2c 20 6d 61 70 70 69 6e 67 20  LOOKUP, mapping 
47c0: 69 74 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a  it to EAGAIN");.
47d0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
47e0: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
47f0: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31    bytesRead = -1
4800: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
4810: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53  case SSL_ERROR_S
4820: 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20  YSCALL:..    /* 
4830: 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72  Some non-recover
4840: 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20  able, fatal I/O 
4850: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
4860: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
4870: 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c  SSL_ERROR_SYSCAL
4880: 4c 3a 20 46 61 74 61 6c 20 49 2f 4f 20 65 72 72  L: Fatal I/O err
4890: 6f 72 20 6f 63 63 75 72 72 65 64 22 29 3b 0a 0a  or occurred");..
48a0: 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67  .    if (backing
48b0: 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 62 79  Error == 0 && by
48c0: 74 65 73 52 65 61 64 20 3d 3d 20 30 29 20 7b 0a  tesRead == 0) {.
48d0: 09 09 2f 2a 20 55 6e 65 78 70 65 63 74 65 64 20  ../* Unexpected 
48e0: 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 65 65  EOF from the pee
48f0: 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 31 2e  r for OpenSSL 1.
4900: 31 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22  1 */...dprintf("
4910: 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46  (Unexpected) EOF
4920: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72   reached")...*er
4930: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
4940: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b  ..bytesRead = 0;
4950: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
4960: 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 61 63  tePtr, "EOF reac
4970: 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d 20 65  hed");...    } e
4980: 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45  lse if (backingE
4990: 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 62 79 74  rror == 0 && byt
49a0: 65 73 52 65 61 64 20 3d 3d 20 2d 31 29 20 7b 0a  esRead == -1) {.
49b0: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65  ..dprintf("I/O e
49c0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65  rror occurred (e
49d0: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75  rrno = %lu)", (u
49e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63  nsigned long) Tc
49f0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09  l_GetErrno());..
4a00: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
4a10: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b   Tcl_GetErrno();
4a20: 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 2d  ...bytesRead = -
4a30: 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73  1;...Tls_Error(s
4a40: 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 45 72 72  tatePtr, Tcl_Err
4a50: 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65  noMsg(*errorCode
4a60: 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65  Ptr));...    } e
4a70: 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28  lse {...dprintf(
4a80: 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  "I/O error occur
4a90: 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f  red (backingErro
4aa0: 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69  r = %lu)", backi
4ab0: 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72  ngError);...*err
4ac0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f  orCodePtr = Tcl_
4ad0: 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79  GetErrno();...by
4ae0: 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09  tesRead = -1;...
4af0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
4b00: 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65  tr, ERR_reason_e
4b10: 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b  rror_string(back
4b20: 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20  ingError));..   
4b30: 20 7d 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   }..    statePtr
4b40: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
4b50: 43 4c 5f 46 41 54 41 4c 5f 45 52 52 4f 52 3b 0a  CL_FATAL_ERROR;.
4b60: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66  .    statePtr->f
4b70: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
4b80: 45 4f 46 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  EOF;..    break;
4b90: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
4ba0: 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09  R_ZERO_RETURN:..
4bb0: 20 20 20 20 2f 2a 20 50 65 65 72 20 68 61 73 20      /* Peer has 
4bc0: 63 6c 65 61 6e 6c 79 20 63 6c 6f 73 65 64 20 74  cleanly closed t
4bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 79  he connection by
4be0: 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f   sending the clo
4bf0: 73 65 5f 6e 6f 74 69 66 79 0a 09 20 20 20 20 20  se_notify..     
4c00: 20 20 61 6c 65 72 74 2e 20 43 61 6e 27 74 20 72    alert. Can't r
4c10: 65 61 64 2c 20 62 75 74 20 63 61 6e 20 77 72 69  ead, but can wri
4c20: 74 65 2e 20 4e 65 65 64 20 74 6f 20 72 65 74 75  te. Need to retu
4c30: 72 6e 20 61 6e 20 45 4f 46 2c 20 73 6f 20 74 68  rn an EOF, so th
4c40: 65 0a 09 20 20 20 20 20 20 20 63 68 61 6e 6e 65  e..       channe
4c50: 6c 20 69 73 20 63 6c 6f 73 65 64 20 77 68 69 63  l is closed whic
4c60: 68 20 77 69 6c 6c 20 73 65 6e 64 20 61 6e 20 53  h will send an S
4c70: 53 4c 5f 73 68 75 74 64 6f 77 6e 28 29 2e 20 2a  SL_shutdown(). *
4c80: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
4c90: 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52  SSL_ERROR_ZERO_R
4ca0: 45 54 55 52 4e 3a 20 50 65 65 72 20 68 61 73 20  ETURN: Peer has 
4cb0: 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65  closed the conne
4cc0: 63 74 69 6f 6e 22 29 3b 0a 09 20 20 20 20 2a 65  ction");..    *e
4cd0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
4ce0: 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20  ..    bytesRead 
4cf0: 3d 20 30 3b 0a 09 20 20 20 20 73 74 61 74 65 50  = 0;..    stateP
4d00: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
4d10: 5f 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20 54  _TCL_EOF;..    T
4d20: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4d30: 72 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f  r, "Peer has clo
4d40: 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  sed the connecti
4d50: 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62  on for writing b
4d60: 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c  y sending the cl
4d70: 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74  ose_notify alert
4d80: 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  ");..    break;.
4d90: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
4da0: 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a 09 20 20  _WANT_ASYNC:..  
4db0: 20 20 2f 2a 20 55 73 65 64 20 77 69 74 68 20 66    /* Used with f
4dc0: 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f 41 53 59  lag SSL_MODE_ASY
4dd0: 4e 43 2c 20 6f 70 65 72 61 74 69 6f 6e 20 64 69  NC, operation di
4de0: 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  dn't complete be
4df0: 63 61 75 73 65 0a 09 20 20 20 20 20 20 20 61 6e  cause..       an
4e00: 20 61 73 79 6e 63 20 65 6e 67 69 6e 65 20 69 73   async engine is
4e10: 20 73 74 69 6c 6c 20 70 72 6f 63 65 73 73 69 6e   still processin
4e20: 67 20 64 61 74 61 2e 20 2a 2f 0a 09 20 20 20 20  g data. */..    
4e30: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c  dprintf("Got SSL
4e40: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e  _ERROR_WANT_ASYN
4e50: 43 2c 20 6d 61 70 70 69 6e 67 20 74 68 69 73 20  C, mapping this 
4e60: 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20  to EAGAIN");..  
4e70: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
4e80: 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 62  = EAGAIN;..    b
4e90: 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20  ytesRead = 0;.. 
4ea0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64 65 66 61     break;...defa
4eb0: 75 6c 74 3a 0a 09 20 20 20 20 2f 2a 20 4f 74 68  ult:..    /* Oth
4ec0: 65 72 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20  er error */..   
4ed0: 20 64 70 72 69 6e 74 66 28 22 4f 74 68 65 72 20   dprintf("Other 
4ee0: 65 72 72 6f 72 2c 20 61 62 6f 72 74 22 29 3b 0a  error, abort");.
4ef0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
4f00: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 74  tr = 0;..    byt
4f10: 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20  esRead = 0;..   
4f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4f30: 20 20 20 64 70 72 69 6e 74 66 28 22 49 6e 70 75     dprintf("Inpu
4f40: 74 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 64 5d  t(%d) -> %d [%d]
4f50: 22 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 74 65  ", bufSize, byte
4f60: 73 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 6f 64  sRead, *errorCod
4f70: 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ePtr);.    retur
4f80: 6e 20 62 79 74 65 73 52 65 61 64 3b 0a 7d 0a 0a  n bytesRead;.}..
4f90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fe0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70  --. *. * TlsOutp
4ff0: 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  utProc --. *. *.
5000: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
5010: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  s invoked by the
5020: 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79   generic I/O lay
5030: 65 72 20 74 6f 20 77 72 69 74 65 20 64 61 74 61  er to write data
5040: 20 74 6f 20 74 68 65 0a 20 2a 09 42 49 4f 20 77   to the. *.BIO w
5050: 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65 20  henever the the 
5060: 54 63 6c 5f 57 72 69 74 65 28 29 2c 20 54 63 6c  Tcl_Write(), Tcl
5070: 5f 57 72 69 74 65 43 68 61 72 73 2c 20 61 6e 64  _WriteChars, and
5080: 20 54 63 6c 5f 57 72 69 74 65 4f 62 6a 0a 20 2a   Tcl_WriteObj. *
5090: 09 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75  .functions are u
50a0: 73 65 64 2e 20 45 71 75 69 76 61 6c 65 6e 74 20  sed. Equivalent 
50b0: 74 6f 20 53 53 4c 5f 77 72 69 74 65 5f 65 78 20  to SSL_write_ex 
50c0: 61 6e 64 20 53 53 4c 5f 77 72 69 74 65 2e 0a 20  and SSL_write.. 
50d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
50e0: 09 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d  .Returns the num
50f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
5100: 74 74 65 6e 20 6f 72 20 2d 31 20 6f 6e 20 65 72  tten or -1 on er
5110: 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72 43  ror. Sets errorC
5120: 6f 64 65 50 74 72 0a 20 2a 09 74 6f 20 61 20 50  odePtr. *.to a P
5130: 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20  OSIX error code 
5140: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
5150: 72 72 65 64 2c 20 6f 72 20 30 20 69 66 20 73 75  rred, or 0 if su
5160: 63 63 65 73 73 66 75 6c 2e 0a 20 2a 0a 20 2a 20  ccessful.. *. * 
5170: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
5180: 09 57 72 69 74 65 73 20 64 61 74 61 20 74 6f 20  .Writes data to 
5190: 53 53 4c 2f 42 49 4f 2e 0a 20 2a 0a 20 2a 2d 2d  SSL/BIO.. *. *--
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
51f0: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4f 75  static int TlsOu
5200: 74 70 75 74 50 72 6f 63 28 0a 20 20 20 20 43 6c  tputProc(.    Cl
5210: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
5220: 65 44 61 74 61 2c 09 2f 2a 20 43 6f 6e 6e 65 63  eData,./* Connec
5230: 74 69 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20  tion state info 
5240: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
5250: 72 20 2a 62 75 66 2c 09 09 2f 2a 20 42 75 66 66  r *buf,../* Buff
5260: 65 72 20 77 69 74 68 20 64 61 74 61 20 74 6f 20  er with data to 
5270: 77 72 69 74 65 20 74 6f 20 42 49 4f 20 2a 2f 0a  write to BIO */.
5280: 20 20 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c      int toWrite,
5290: 09 09 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74  ../* Size of dat
52a0: 61 20 74 6f 20 77 72 69 74 65 20 69 6e 20 62 79  a to write in by
52b0: 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a  tes */.    int *
52c0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 09 2f  errorCodePtr)../
52d0: 2a 20 53 74 6f 72 61 67 65 20 66 6f 72 20 65 72  * Storage for er
52e0: 72 6f 72 20 63 6f 64 65 20 74 6f 20 72 65 74 75  ror code to retu
52f0: 72 6e 20 2a 2f 0a 7b 0a 20 20 20 20 75 6e 73 69  rn */.{.    unsi
5300: 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e  gned long backin
5310: 67 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74  gError;.    Stat
5320: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
5330: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65  tate *) instance
5340: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 72  Data;.    int wr
5350: 69 74 74 65 6e 2c 20 65 72 72 3b 0a 20 20 20 20  itten, err;.    
5360: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
5370: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
5380: 22 57 72 69 74 65 20 25 64 20 62 79 74 65 73 22  "Write %d bytes"
5390: 2c 20 74 6f 57 72 69 74 65 29 3b 0a 20 20 20 20  , toWrite);.    
53a0: 64 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66  dprintBuffer(buf
53b0: 2c 20 74 6f 57 72 69 74 65 29 3b 0a 0a 20 20 20  , toWrite);..   
53c0: 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 74 68 65   /* Abort if the
53d0: 20 75 73 65 72 20 76 65 72 69 66 79 20 63 61 6c   user verify cal
53e0: 6c 62 61 63 6b 20 69 73 20 73 74 69 6c 6c 20 72  lback is still r
53f0: 75 6e 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 20  unning to avoid 
5400: 74 72 69 67 67 65 72 69 6e 67 0a 20 20 20 20 20  triggering.     
5410: 2a 20 61 6e 6f 74 68 65 72 20 63 61 6c 6c 20 62  * another call b
5420: 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
5430: 74 20 6f 6e 65 20 69 73 20 63 6f 6d 70 6c 65 74  t one is complet
5440: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  e. */.    if (st
5450: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
5460: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
5470: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 44 6f  ) {..dprintf("Do
5480: 6e 27 74 20 70 72 6f 63 65 73 73 20 6f 75 74 70  n't process outp
5490: 75 74 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63  ut while callbac
54a0: 6b 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 22 29  ks are running")
54b0: 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b  ;..written = -1;
54c0: 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
54d0: 3d 20 45 41 47 41 49 4e 3b 0a 09 72 65 74 75 72  = EAGAIN;..retur
54e0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
54f0: 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 63 6f 6e   /* Abort if con
5500: 6e 65 63 74 69 6f 6e 20 68 61 73 20 66 61 69 6c  nection has fail
5510: 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ed. */.    if (s
5520: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
5530: 20 54 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45   TLS_TCL_FATAL_E
5540: 52 52 4f 52 29 20 7b 0a 09 64 70 72 69 6e 74 66  RROR) {..dprintf
5550: 28 22 45 4f 46 20 61 6c 72 65 61 64 79 20 64 65  ("EOF already de
5560: 74 65 63 74 65 64 2c 20 61 62 6f 72 74 20 77 72  tected, abort wr
5570: 69 74 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 30  ite");..return 0
5580: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5590: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
55a0: 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63 74 2e 20  ed, do connect. 
55b0: 43 61 6e 20 61 6c 73 6f 20 63 68 65 63 6b 20 53  Can also check S
55c0: 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73  SL_is_init_finis
55d0: 68 65 64 28 29 2e 20 2a 2f 0a 20 20 20 20 69 66  hed(). */.    if
55e0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
55f0: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54  s & TLS_TCL_INIT
5600: 29 20 7b 0a 09 69 6e 74 20 74 6c 73 43 6f 6e 6e  ) {..int tlsConn
5610: 65 63 74 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22  ect;...dprintf("
5620: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74  Calling Tls_Wait
5630: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09  ForConnect");...
5640: 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73  tlsConnect = Tls
5650: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28  _WaitForConnect(
5660: 73 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43  statePtr, errorC
5670: 6f 64 65 50 74 72 2c 20 31 29 3b 0a 09 69 66 20  odePtr, 1);..if 
5680: 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29  (tlsConnect < 0)
5690: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
56a0: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 61  "Got an error wa
56b0: 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74  iting to connect
56c0: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25   (tlsConnect = %
56d0: 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  i, *errorCodePtr
56e0: 20 3d 20 25 69 29 22 2c 0a 09 09 74 6c 73 43 6f   = %i)",...tlsCo
56f0: 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43 6f 64  nnect, *errorCod
5700: 65 50 74 72 29 3b 0a 0a 09 20 20 20 20 77 72 69  ePtr);...    wri
5710: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20  tten = -1;..    
5720: 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74  if (*errorCodePt
5730: 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29  r == ECONNRESET)
5740: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 47 6f   {...dprintf("Go
5750: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 73  t connection res
5760: 65 74 22 29 3b 0a 09 09 2f 2a 20 53 6f 66 74 20  et");.../* Soft 
5770: 45 4f 46 20 2a 2f 0a 09 09 2a 65 72 72 6f 72 43  EOF */...*errorC
5780: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 77 72  odePtr = 0;...wr
5790: 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09 73 74 61  itten = 0;...sta
57a0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
57b0: 54 4c 53 5f 54 43 4c 5f 45 4f 46 3b 0a 09 20 20  TLS_TCL_EOF;..  
57c0: 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
57d0: 77 72 69 74 74 65 6e 3b 0a 09 7d 20 65 6c 73 65  written;..} else
57e0: 20 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20   if (tlsConnect 
57f0: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 20  == 0) {..    /* 
5800: 54 72 79 20 61 67 61 69 6e 20 2a 2f 0a 09 20 20  Try again */..  
5810: 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a    written = -1;.
5820: 09 20 20 20 20 72 65 74 75 72 6e 20 77 72 69 74  .    return writ
5830: 74 65 6e 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ten;..}.    }.. 
5840: 20 20 20 69 66 20 28 74 6f 57 72 69 74 65 20 3d     if (toWrite =
5850: 3d 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  = 0) {..dprintf(
5860: 22 7a 65 72 6f 2d 77 72 69 74 65 22 29 3b 0a 09  "zero-write");..
5870: 65 72 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28  err = BIO_flush(
5880: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
5890: 0a 09 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20  ..if (err <= 0) 
58a0: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
58b0: 46 6c 75 73 68 69 6e 67 20 66 61 69 6c 65 64 22  Flushing failed"
58c0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  );..    Tls_Erro
58d0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 46 6c 75  r(statePtr, "Flu
58e0: 73 68 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 20  sh failed");... 
58f0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
5900: 20 3d 20 45 49 4f 3b 0a 09 20 20 20 20 77 72 69   = EIO;..    wri
5910: 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 72  tten = 0;..    r
5920: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2a  eturn -1;..}...*
5930: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
5940: 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a  ;..written = 0;.
5950: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d  .return 0;.    }
5960: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
5970: 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72  We need to clear
5980: 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73   the SSL error s
5990: 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65  tack now because
59a0: 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65   we sometimes re
59b0: 61 63 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20  ach.     * this 
59c0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65  function with le
59d0: 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e  ftover errors in
59e0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20   the stack.  If 
59f0: 42 49 4f 5f 77 72 69 74 65 0a 20 20 20 20 20 2a  BIO_write.     *
5a00: 20 72 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20   returns -1 and 
5a10: 69 6e 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20  intends EAGAIN, 
5a20: 74 68 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f  there is a lefto
5a30: 76 65 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69  ver error, it wi
5a40: 6c 6c 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73  ll be.     * mis
5a50: 63 6f 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20  construed as an 
5a60: 65 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49  error, not EAGAI
5a70: 4e 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64  N..     */.    d
5a80: 70 72 69 6e 74 66 28 22 42 49 4f 5f 77 72 69 74  printf("BIO_writ
5a90: 65 3a 20 42 49 4f 20 70 65 6e 64 69 6e 67 3d 25  e: BIO pending=%
5aa0: 64 2c 20 43 68 61 6e 20 70 65 6e 64 69 6e 67 3d  d, Chan pending=
5ab0: 25 64 22 2c 20 42 49 4f 5f 77 70 65 6e 64 69 6e  %d", BIO_wpendin
5ac0: 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  g(statePtr->bio)
5ad0: 2c 20 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66  , Tcl_OutputBuff
5ae0: 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73  ered(statePtr->s
5af0: 65 6c 66 29 29 3b 0a 20 20 20 20 45 52 52 5f 63  elf));.    ERR_c
5b00: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20  lear_error();.  
5b10: 20 20 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72    BIO_clear_retr
5b20: 79 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 72  y_flags(statePtr
5b30: 2d 3e 62 69 6f 29 3b 0a 20 20 20 20 77 72 69 74  ->bio);.    writ
5b40: 74 65 6e 20 3d 20 42 49 4f 5f 77 72 69 74 65 28  ten = BIO_write(
5b50: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62  statePtr->bio, b
5b60: 75 66 2c 20 74 6f 57 72 69 74 65 29 3b 0a 20 20  uf, toWrite);.  
5b70: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 77    dprintf("BIO_w
5b80: 72 69 74 65 28 25 70 2c 20 25 64 29 20 2d 3e 20  rite(%p, %d) -> 
5b90: 5b 25 64 5d 22 2c 20 28 76 6f 69 64 20 2a 29 20  [%d]", (void *) 
5ba0: 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72 69 74  statePtr, toWrit
5bb0: 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a 0a 20 20  e, written);..  
5bc0: 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 53 53 4c    /* Same as SSL
5bd0: 5f 77 61 6e 74 2c 20 62 75 74 20 61 6c 73 6f 20  _want, but also 
5be0: 63 68 65 63 6b 73 20 74 68 65 20 65 72 72 6f 72  checks the error
5bf0: 20 71 75 65 75 65 20 2a 2f 0a 20 20 20 20 65 72   queue */.    er
5c00: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f  r = SSL_get_erro
5c10: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  r(statePtr->ssl,
5c20: 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 62   written);.    b
5c30: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52  ackingError = ER
5c40: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a  R_get_error();..
5c50: 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e 20      if (written 
5c60: 3c 3d 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 66  <= 0) {..dprintf
5c70: 28 22 57 72 69 74 65 20 66 61 69 6c 65 64 3a 20  ("Write failed: 
5c80: 69 73 20 45 4f 46 3d 25 64 2c 20 73 68 6f 75 6c  is EOF=%d, shoul
5c90: 64 20 72 65 74 72 79 3d 25 64 2c 20 72 65 74 72  d retry=%d, retr
5ca0: 79 20 72 65 61 64 3d 25 64 2c 20 72 65 74 72 79  y read=%d, retry
5cb0: 20 77 72 69 74 65 3d 25 64 2c 20 6f 74 68 65 72   write=%d, other
5cc0: 3d 25 64 22 2c 0a 09 20 20 20 20 42 49 4f 5f 65  =%d",..    BIO_e
5cd0: 6f 66 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  of(statePtr->bio
5ce0: 29 2c 0a 09 20 20 20 20 42 49 4f 5f 73 68 6f 75  ),..    BIO_shou
5cf0: 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74  ld_retry(statePt
5d00: 72 2d 3e 62 69 6f 29 2c 20 42 49 4f 5f 73 68 6f  r->bio), BIO_sho
5d10: 75 6c 64 5f 72 65 61 64 28 73 74 61 74 65 50 74  uld_read(statePt
5d20: 72 2d 3e 62 69 6f 29 2c 0a 09 20 20 20 20 42 49  r->bio),..    BI
5d30: 4f 5f 73 68 6f 75 6c 64 5f 77 72 69 74 65 28 73  O_should_write(s
5d40: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c 20 42  tatePtr->bio), B
5d50: 49 4f 5f 73 68 6f 75 6c 64 5f 69 6f 5f 73 70 65  IO_should_io_spe
5d60: 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  cial(statePtr->b
5d70: 69 6f 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  io));.    } else
5d80: 20 7b 0a 09 42 49 4f 5f 66 6c 75 73 68 28 73 74   {..BIO_flush(st
5d90: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 20 20  atePtr->bio);.  
5da0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 61 73 65    }..    /* Base
5db0: 64 20 6f 6e 20 65 72 72 6f 72 2c 20 64 6f 20 72  d on error, do r
5dc0: 65 74 72 79 20 6f 72 20 61 62 6f 72 74 20 2a 2f  etry or abort */
5dd0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 65 72 72  .    switch (err
5de0: 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  ) {..case SSL_ER
5df0: 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f  ROR_NONE:..    /
5e00: 2a 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20  * I/O operation 
5e10: 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 09 20 20  completed */..  
5e20: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45    dprintf("SSL_E
5e30: 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09 20 20  RROR_NONE");..  
5e40: 20 20 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20    if (written < 
5e50: 30 29 20 7b 0a 09 09 77 72 69 74 74 65 6e 20 3d  0) {...written =
5e60: 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20   0;..    }..    
5e70: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
5e80: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20  L_ERROR_SSL:..  
5e90: 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76    /* A non-recov
5ea0: 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72  erable, fatal er
5eb0: 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  ror in the SSL l
5ec0: 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c  ibrary occurred,
5ed0: 0a 09 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79  ..       usually
5ee0: 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f   a protocol erro
5ef0: 72 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  r */..    dprint
5f00: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c  f("SSL_ERROR_SSL
5f10: 3a 20 46 61 74 61 6c 20 53 53 4c 20 70 72 6f 74  : Fatal SSL prot
5f20: 6f 63 6f 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  ocol error occur
5f30: 72 65 64 22 29 3b 0a 09 20 20 20 20 69 66 20 28  red");..    if (
5f40: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20  backingError != 
5f50: 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72  0) {...Tls_Error
5f60: 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72  (statePtr, ERR_r
5f70: 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69  eason_error_stri
5f80: 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29  ng(backingError)
5f90: 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  );..    } else i
5fa0: 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  f (SSL_get_verif
5fb0: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
5fc0: 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f  r->ssl) != X509_
5fd0: 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72  V_OK) {...Tls_Er
5fe0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 0a 09 09  ror(statePtr,...
5ff0: 20 20 20 20 58 35 30 39 5f 76 65 72 69 66 79 5f      X509_verify_
6000: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
6010: 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  g(SSL_get_verify
6020: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  _result(statePtr
6030: 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d  ->ssl)));..    }
6040: 20 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72   else {...Tls_Er
6050: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 55  ror(statePtr, "U
6060: 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72  nknown SSL error
6070: 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ");..    }..    
6080: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
6090: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20  ECONNABORTED;.. 
60a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
60b0: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 46 41  gs |= TLS_TCL_FA
60c0: 54 41 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TAL_ERROR;..    
60d0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
60e0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 45 4f 46 3b 0a  |= TLS_TCL_EOF;.
60f0: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d  .    written = -
6100: 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  1;..    break;..
6110: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
6120: 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20  WANT_READ:..    
6130: 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 20 64 69 64  /* Operation did
6140: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75   not complete du
6150: 65 20 74 6f 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e to not enough 
6160: 64 61 74 61 20 77 61 73 20 61 76 61 69 6c 61 62  data was availab
6170: 6c 65 2e 0a 09 20 20 20 20 20 20 20 52 65 74 72  le...       Retr
6180: 79 20 61 67 61 69 6e 20 6c 61 74 65 72 20 77 69  y again later wi
6190: 74 68 20 73 61 6d 65 20 64 61 74 61 2e 20 2a 2f  th same data. */
61a0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47  ..    dprintf("G
61b0: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  ot SSL_ERROR_WAN
61c0: 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 6e 67 20  T_READ, mapping 
61d0: 69 74 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a  it to EAGAIN");.
61e0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
61f0: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
6200: 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a    written = -1;.
6210: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77  .    statePtr->w
6220: 61 6e 74 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41  ant |= TCL_READA
6230: 42 4c 45 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65  BLE;..    BIO_se
6240: 74 5f 72 65 74 72 79 5f 72 65 61 64 28 73 74 61  t_retry_read(sta
6250: 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20  tePtr->bio);..  
6260: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
6270: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57  SSL_ERROR_WANT_W
6280: 52 49 54 45 3a 0a 09 20 20 20 20 2f 2a 20 4f 70  RITE:..    /* Op
6290: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
62a0: 63 6f 6d 70 6c 65 74 65 20 64 75 65 20 74 6f 20  complete due to 
62b0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 6e 64 20 61  unable to send a
62c0: 6c 6c 20 64 61 74 61 20 74 6f 20 74 68 65 0a 09  ll data to the..
62d0: 20 20 20 20 20 20 20 42 49 4f 2e 20 52 65 74 72         BIO. Retr
62e0: 79 20 6c 61 74 65 72 20 77 69 74 68 20 73 61 6d  y later with sam
62f0: 65 20 64 61 74 61 2e 20 2a 2f 0a 09 20 20 20 20  e data. */..    
6300: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c  dprintf("Got SSL
6310: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54  _ERROR_WANT_WRIT
6320: 45 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f  E, mapping it to
6330: 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20   EAGAIN");..    
6340: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
6350: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69  EAGAIN;..    wri
6360: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20  tten = -1;..    
6370: 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c  statePtr->want |
6380: 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a  = TCL_WRITABLE;.
6390: 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74  .    BIO_set_ret
63a0: 72 79 5f 77 72 69 74 65 28 73 74 61 74 65 50 74  ry_write(statePt
63b0: 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72  r->bio);..    br
63c0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
63d0: 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f  ERROR_WANT_X509_
63e0: 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 2a 20  LOOKUP:..    /* 
63f0: 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69  The operation di
6400: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
6410: 65 63 61 75 73 65 20 61 6e 20 61 70 70 6c 69 63  ecause an applic
6420: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 09  ation callback..
6430: 20 20 20 20 20 20 20 73 65 74 20 62 79 20 53 53         set by SS
6440: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
6450: 5f 63 65 72 74 5f 63 62 28 29 20 68 61 73 20 61  _cert_cb() has a
6460: 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  sked to be calle
6470: 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 09 20 20 20  d again. */..   
6480: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53   dprintf("Got SS
6490: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30  L_ERROR_WANT_X50
64a0: 39 5f 4c 4f 4f 4b 55 50 2c 20 6d 61 70 70 69 6e  9_LOOKUP, mappin
64b0: 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e 22 29  g it to EAGAIN")
64c0: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
64d0: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09  ePtr = EAGAIN;..
64e0: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31      written = -1
64f0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
6500: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53  case SSL_ERROR_S
6510: 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20  YSCALL:..    /* 
6520: 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72  Some non-recover
6530: 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20  able, fatal I/O 
6540: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
6550: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
6560: 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c  SSL_ERROR_SYSCAL
6570: 4c 3a 20 46 61 74 61 6c 20 49 2f 4f 20 65 72 72  L: Fatal I/O err
6580: 6f 72 20 6f 63 63 75 72 72 65 64 22 29 3b 0a 0a  or occurred");..
6590: 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67  .    if (backing
65a0: 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 77 72  Error == 0 && wr
65b0: 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  itten == 0) {...
65c0: 64 70 72 69 6e 74 66 28 22 45 4f 46 20 72 65 61  dprintf("EOF rea
65d0: 63 68 65 64 22 29 0a 09 09 2a 65 72 72 6f 72 43  ched")...*errorC
65e0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 77 72  odePtr = 0;...wr
65f0: 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09 54 6c 73  itten = 0;...Tls
6600: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
6610: 20 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 3b   "EOF reached");
6620: 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
6630: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d   (backingError =
6640: 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e 20 3d  = 0 && written =
6650: 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74  = -1) {...dprint
6660: 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  f("I/O error occ
6670: 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25  urred (errno = %
6680: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
6690: 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 72  long) Tcl_GetErr
66a0: 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43  no());...*errorC
66b0: 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74  odePtr = Tcl_Get
66c0: 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69 74 74  Errno();...writt
66d0: 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45  en = -1;...Tls_E
66e0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 54  rror(statePtr, T
66f0: 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a 65 72 72  cl_ErrnoMsg(*err
6700: 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20  orCodePtr));... 
6710: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70     } else {...dp
6720: 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72  rintf("I/O error
6730: 20 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b 69   occurred (backi
6740: 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c  ngError = %lu)",
6750: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a   backingError);.
6760: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
6770: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  = Tcl_GetErrno()
6780: 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31  ;...written = -1
6790: 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74  ;...Tls_Error(st
67a0: 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 61 73  atePtr, ERR_reas
67b0: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  on_error_string(
67c0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a  backingError));.
67d0: 09 20 20 20 20 7d 0a 09 20 20 20 20 73 74 61 74  .    }..    stat
67e0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
67f0: 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45 52 52  LS_TCL_FATAL_ERR
6800: 4f 52 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74  OR;..    statePt
6810: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
6820: 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20 20 62 72  TCL_EOF;..    br
6830: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
6840: 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52  ERROR_ZERO_RETUR
6850: 4e 3a 0a 09 20 20 20 20 2f 2a 20 50 65 65 72 20  N:..    /* Peer 
6860: 68 61 73 20 63 6c 65 61 6e 6c 79 20 63 6c 6f 73  has cleanly clos
6870: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ed the connectio
6880: 6e 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65  n by sending the
6890: 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 0a 09 20   close_notify.. 
68a0: 20 20 20 20 20 20 61 6c 65 72 74 2e 20 43 61 6e        alert. Can
68b0: 27 74 20 72 65 61 64 2c 20 62 75 74 20 63 61 6e  't read, but can
68c0: 20 77 72 69 74 65 2e 20 4e 65 65 64 20 74 6f 20   write. Need to 
68d0: 72 65 74 75 72 6e 20 61 6e 20 45 4f 46 2c 20 73  return an EOF, s
68e0: 6f 20 74 68 65 0a 09 20 20 20 20 20 20 20 63 68  o the..       ch
68f0: 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 20  annel is closed 
6900: 77 68 69 63 68 20 77 69 6c 6c 20 73 65 6e 64 20  which will send 
6910: 61 6e 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28  an SSL_shutdown(
6920: 29 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  ). */..    dprin
6930: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 5a 45  tf("SSL_ERROR_ZE
6940: 52 4f 5f 52 45 54 55 52 4e 3a 20 50 65 65 72 20  RO_RETURN: Peer 
6950: 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63  has closed the c
6960: 6f 6e 6e 65 63 74 69 6f 6e 22 29 3b 0a 09 20 20  onnection");..  
6970: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
6980: 3d 20 30 3b 0a 09 20 20 20 20 77 72 69 74 74 65  = 0;..    writte
6990: 6e 20 3d 20 30 3b 0a 09 20 20 20 20 73 74 61 74  n = 0;..    stat
69a0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
69b0: 4c 53 5f 54 43 4c 5f 45 4f 46 3b 0a 09 20 20 20  LS_TCL_EOF;..   
69c0: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65   Tls_Error(state
69d0: 50 74 72 2c 20 22 50 65 65 72 20 68 61 73 20 63  Ptr, "Peer has c
69e0: 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63  losed the connec
69f0: 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  tion for writing
6a00: 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20   by sending the 
6a10: 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65  close_notify ale
6a20: 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  rt");..    break
6a30: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
6a40: 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a 09  OR_WANT_ASYNC:..
6a50: 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69 74 68      /* Used with
6a60: 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f 41   flag SSL_MODE_A
6a70: 53 59 4e 43 2c 20 6f 70 65 72 61 74 69 6f 6e 20  SYNC, operation 
6a80: 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20  didn't complete 
6a90: 62 65 63 61 75 73 65 0a 09 20 20 20 20 20 20 20  because..       
6aa0: 61 6e 20 61 73 79 6e 63 20 65 6e 67 69 6e 65 20  an async engine 
6ab0: 69 73 20 73 74 69 6c 6c 20 70 72 6f 63 65 73 73  is still process
6ac0: 69 6e 67 20 64 61 74 61 2e 20 2a 2f 0a 09 20 20  ing data. */..  
6ad0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53    dprintf("Got S
6ae0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53  SL_ERROR_WANT_AS
6af0: 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20 74 68 69  YNC, mapping thi
6b00: 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09  s to EAGAIN");..
6b10: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
6b20: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20  r = EAGAIN;..   
6b30: 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20   written = 0;.. 
6b40: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64 65 66 61     break;...defa
6b50: 75 6c 74 3a 0a 09 20 20 20 20 2f 2a 20 4f 74 68  ult:..    /* Oth
6b60: 65 72 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20  er error */..   
6b70: 20 64 70 72 69 6e 74 66 28 22 4f 74 68 65 72 20   dprintf("Other 
6b80: 65 72 72 6f 72 2c 20 61 62 6f 72 74 22 29 3b 0a  error, abort");.
6b90: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
6ba0: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 77 72 69  tr = 0;..    wri
6bb0: 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 62  tten = 0;..    b
6bc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
6bd0: 20 64 70 72 69 6e 74 66 28 22 4f 75 74 70 75 74   dprintf("Output
6be0: 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f 57  (%d) -> %d", toW
6bf0: 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a  rite, written);.
6c00: 20 20 20 20 72 65 74 75 72 6e 20 77 72 69 74 74      return writt
6c10: 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  en;.}../*. *----
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6c70: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 20 2d 2d  Tls_GetParent --
6c80: 0a 20 2a 0a 20 2a 09 47 65 74 20 70 61 72 65 6e  . *. *.Get paren
6c90: 74 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20 61 20  t channel for a 
6ca0: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2e  stacked channel.
6cb0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
6cc0: 20 2a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 6f   *.Tcl_Channel o
6cd0: 72 20 4e 55 4c 4c 20 69 66 20 4e 6f 6e 65 0a 20  r NULL if None. 
6ce0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 0a 20 2a 2f 0a 54 63 6c 5f 43 68 61 6e 6e 65  -. */.Tcl_Channe
6d40: 6c 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28  l Tls_GetParent(
6d50: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
6d60: 65 50 74 72 2c 09 09 2f 2a 20 43 6f 6e 6e 65 63  ePtr,../* Connec
6d70: 74 69 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20  tion state info 
6d80: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 46  */.    int maskF
6d90: 6c 61 67 73 29 09 09 2f 2a 20 57 68 69 63 68 20  lags)../* Which 
6da0: 66 6c 61 67 73 20 74 6f 20 70 72 6f 63 65 73 73  flags to process
6db0: 20 2a 2f 0a 7b 0a 20 20 20 20 64 70 72 69 6e 74   */.{.    dprint
6dc0: 66 28 22 52 65 71 75 65 73 74 65 64 20 74 6f 20  f("Requested to 
6dd0: 67 65 74 20 70 61 72 65 6e 74 20 6f 66 20 63 68  get parent of ch
6de0: 61 6e 6e 65 6c 20 25 70 22 2c 20 73 74 61 74 65  annel %p", state
6df0: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 20 20 20  Ptr->self);..   
6e00: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e   if ((statePtr->
6e10: 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 46 6c 61  flags & ~maskFla
6e20: 67 73 29 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41  gs) & TLS_TCL_FA
6e30: 53 54 50 41 54 48 29 20 7b 0a 09 64 70 72 69 6e  STPATH) {..dprin
6e40: 74 66 28 22 41 73 6b 65 64 20 74 6f 20 67 65 74  tf("Asked to get
6e50: 20 74 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e   the parent chan
6e60: 6e 65 6c 20 77 68 69 6c 65 20 77 65 20 61 72 65  nel while we are
6e70: 20 75 73 69 6e 67 20 46 61 73 74 50 61 74 68 20   using FastPath 
6e80: 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 4e 55 4c  -- returning NUL
6e90: 4c 22 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  L");..return NUL
6ea0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
6eb0: 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 6b  urn Tcl_GetStack
6ec0: 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50  edChannel(stateP
6ed0: 74 72 2d 3e 73 65 6c 66 29 3b 0a 7d 0a 0a 2f 2a  tr->self);.}../*
6ee0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 74 4f 70 74  . *. * TlsSetOpt
6f40: 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  ionProc --. *. *
6f50: 09 53 65 74 73 20 61 6e 20 6f 70 74 69 6f 6e 20  .Sets an option 
6f60: 74 6f 20 76 61 6c 75 65 20 66 6f 72 20 61 20 53  to value for a S
6f70: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
6f80: 63 68 61 6e 6e 65 6c 2e 20 43 61 6c 6c 65 64 20  channel. Called 
6f90: 62 79 20 74 68 65 0a 20 2a 09 67 65 6e 65 72 69  by the. *.generi
6fa0: 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e  c I/O layer when
6fb0: 65 76 65 72 20 74 68 65 20 54 63 6c 5f 53 65 74  ever the Tcl_Set
6fc0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 29 20  ChannelOption() 
6fd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
6fe0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
6ff0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75  . *.TCL_OK if su
7000: 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f  ccessful or TCL_
7010: 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 2e  ERROR if failed.
7020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
7030: 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20  cts:. *.Updates 
7040: 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74  channel option t
7050: 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a  o new value.. *.
7060: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
70b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54   */.static int.T
70c0: 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  lsSetOptionProc(
70d0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
70e0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a  instanceData,./*
70f0: 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a   Socket state. *
7100: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  /.    Tcl_Interp
7110: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f   *interp,../* Fo
7120: 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62  r errors - can b
7130: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63  e NULL. */.    c
7140: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f  onst char *optio
7150: 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f  nName,./* Name o
7160: 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20  f the option to 
7170: 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 66 6f  set the value fo
7180: 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e 55 4c  r, or..... * NUL
7190: 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 74  L to get all opt
71a0: 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76  ions and their v
71b0: 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 63 6f  alues. */.    co
71c0: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e  nst char *option
71d0: 56 61 6c 75 65 29 09 2f 2a 20 56 61 6c 75 65 20  Value)./* Value 
71e0: 66 6f 72 20 6f 70 74 69 6f 6e 2e 20 2a 2f 0a 7b  for option. */.{
71f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
7200: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
7210: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20   instanceData;. 
7220: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70     Tcl_Channel p
7230: 61 72 65 6e 74 20 3d 20 54 6c 73 5f 47 65 74 50  arent = Tls_GetP
7240: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20  arent(statePtr, 
7250: 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48  TLS_TCL_FASTPATH
7260: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65  );.    Tcl_Drive
7270: 72 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a  rSetOptionProc *
7280: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a  setOptionProc;..
7290: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
72a0: 6c 65 64 20 74 6f 20 73 65 74 20 6f 70 74 69 6f  led to set optio
72b0: 6e 20 25 73 20 74 6f 20 76 61 6c 75 65 20 25 73  n %s to value %s
72c0: 22 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f  ", optionName, o
72d0: 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 0a 20 20  ptionValue);..  
72e0: 20 20 2f 2a 20 50 61 73 73 20 74 6f 20 70 61 72    /* Pass to par
72f0: 65 6e 74 20 2a 2f 0a 20 20 20 20 73 65 74 4f 70  ent */.    setOp
7300: 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43  tionProc = Tcl_C
7310: 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50  hannelSetOptionP
7320: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
7330: 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b  elType(parent));
7340: 0a 20 20 20 20 69 66 20 28 73 65 74 4f 70 74 69  .    if (setOpti
7350: 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20  onProc != NULL) 
7360: 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f  {..return (*setO
7370: 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47  ptionProc)(Tcl_G
7380: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
7390: 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69  eData(parent), i
73a0: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d  nterp, optionNam
73b0: 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b  e, optionValue);
73c0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20  .    }.    /*.  
73d0: 20 20 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72     * Request for
73e0: 20 61 20 73 70 65 63 69 66 69 63 20 6f 70 74 69   a specific opti
73f0: 6f 6e 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20  on has to fail, 
7400: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e  we don't have an
7410: 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72  y..     */.    r
7420: 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61  eturn Tcl_BadCha
7430: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
7440: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22  p, optionName, "
7450: 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ");.}../*. *----
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
74b0: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  TlsGetOptionProc
74c0: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20   --. *. *.Get a 
74d0: 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 20 66  option's value f
74e0: 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20  or a SSL socket 
74f0: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f  based channel, o
7500: 72 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 0a  r a list of all.
7510: 20 2a 09 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74   *.options and t
7520: 68 65 69 72 20 76 61 6c 75 65 73 2e 20 43 61 6c  heir values. Cal
7530: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
7540: 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65  ic I/O layer whe
7550: 6e 65 76 65 72 20 74 68 65 0a 20 2a 09 54 63 6c  never the. *.Tcl
7560: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
7570: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  n() function is 
7580: 75 73 65 64 2e 0a 20 2a 0a 20 2a 0a 20 2a 20 52  used.. *. *. * R
7590: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 43 4c 5f 4f  esults:. *.TCL_O
75a0: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  K if successful 
75b0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20  or TCL_ERROR if 
75c0: 66 61 69 6c 65 64 2e 20 53 65 74 73 20 6f 70 74  failed. Sets opt
75d0: 69 6f 6e 56 61 6c 75 65 20 74 6f 0a 20 2a 09 74  ionValue to. *.t
75e0: 68 65 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75  he option's valu
75f0: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
7600: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  fects:. *.None. 
7610: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7660: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
7670: 0a 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f  .TlsGetOptionPro
7680: 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74  c(.    ClientDat
7690: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09  a instanceData,.
76a0: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e  /* Socket state.
76b0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65   */.    Tcl_Inte
76c0: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
76d0: 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e  For errors - can
76e0: 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20   be NULL. */.   
76f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74   const char *opt
7700: 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65  ionName,./* Name
7710: 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74   of the option t
7720: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 76  o retrieve the v
7730: 61 6c 75 65 20 66 6f 72 2c 0a 09 09 09 09 20 2a  alue for,..... *
7740: 20 6f 72 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20   or NULL to get 
7750: 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20  all options and 
7760: 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f  their values. */
7770: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
7780: 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 09 2f   *optionValue)./
7790: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65  * Where to store
77a0: 20 74 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61   the computed va
77b0: 6c 75 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  lue initialized 
77c0: 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a  by caller. */.{.
77d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
77e0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
77f0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
7800: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61    Tcl_Channel pa
7810: 72 65 6e 74 20 3d 20 54 6c 73 5f 47 65 74 50 61  rent = Tls_GetPa
7820: 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54  rent(statePtr, T
7830: 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29  LS_TCL_FASTPATH)
7840: 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72  ;.    Tcl_Driver
7850: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67  GetOptionProc *g
7860: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20  etOptionProc;.. 
7870: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
7880: 65 64 20 74 6f 20 67 65 74 20 6f 70 74 69 6f 6e  ed to get option
7890: 20 25 73 22 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65   %s", optionName
78a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 61 73 73 20  );..    /* Pass 
78b0: 74 6f 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 20  to parent */.   
78c0: 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d   getOptionProc =
78d0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f   Tcl_ChannelGetO
78e0: 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65  ptionProc(Tcl_Ge
78f0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72  tChannelType(par
7900: 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67  ent));.    if (g
7910: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20  etOptionProc != 
7920: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
7930: 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29  (*getOptionProc)
7940: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  (Tcl_GetChannelI
7950: 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65  nstanceData(pare
7960: 6e 74 29 2c 20 69 6e 74 65 72 70 2c 0a 09 20 20  nt), interp,..  
7970: 20 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70    optionName, op
7980: 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20  tionValue);.    
7990: 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f  } else if (optio
79a0: 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29  nName == (char*)
79b0: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a   NULL) {../*.. *
79c0: 20 52 65 71 75 65 73 74 20 69 73 20 71 75 65 72   Request is quer
79d0: 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e  y for all option
79e0: 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09  s, this is ok...
79f0: 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f   */..return TCL_
7a00: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  OK;.    }.    /*
7a10: 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 20  .     * Request 
7a20: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 6f  for a specific o
7a30: 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 69  ption has to fai
7a40: 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65  l, we don't have
7a50: 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20   any..     */.  
7a60: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64    return Tcl_Bad
7a70: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
7a80: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65  terp, optionName
7a90: 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d  ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
7af0: 20 2a 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e   * TlsChannelHan
7b00: 64 6c 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a  dlerTimer --. *.
7b10: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65   *.Called by the
7b20: 20 6e 6f 74 69 66 69 65 72 20 76 69 61 20 61 20   notifier via a 
7b30: 74 69 6d 65 72 2c 20 74 6f 20 67 65 6e 65 72 61  timer, to genera
7b40: 74 65 20 72 65 61 64 2f 77 72 69 74 65 20 65 76  te read/write ev
7b50: 65 6e 74 73 20 74 6f 0a 20 2a 09 66 6c 75 73 68  ents to. *.flush
7b60: 20 6f 75 74 20 64 61 74 61 20 77 61 69 74 69 6e   out data waitin
7b70: 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 62 75 66  g in channel buf
7b80: 66 65 72 73 2e 20 43 61 6c 6c 65 64 20 62 79 20  fers. Called by 
7b90: 54 6c 73 57 61 74 63 68 50 72 6f 63 20 74 6f 0a  TlsWatchProc to.
7ba0: 20 2a 09 70 65 72 69 6f 64 69 63 61 6c 6c 79 20   *.periodically 
7bb0: 63 68 65 63 6b 20 66 6f 72 20 6e 65 77 20 65 76  check for new ev
7bc0: 65 6e 74 73 2e 20 55 73 65 64 20 74 6f 20 67 65  ents. Used to ge
7bd0: 6e 65 72 61 74 65 20 65 76 65 6e 74 73 20 77 68  nerate events wh
7be0: 65 6e 20 64 61 74 61 20 69 73 0a 20 2a 09 62 75  en data is. *.bu
7bf0: 66 66 65 72 65 64 20 69 6e 20 42 49 4f 20 61 6e  ffered in BIO an
7c00: 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 75  d there are no u
7c10: 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65  nderlying channe
7c20: 6c 20 65 76 65 6e 74 73 2e 0a 20 2a 0a 20 2a 20  l events.. *. * 
7c30: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
7c40: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
7c50: 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20  cts:. *.Creates 
7c60: 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 65 76 65  notification eve
7c70: 6e 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  nt.. *. *-------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
7cd0: 63 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e 65  c void TlsChanne
7ce0: 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 28 0a 20  lHandlerTimer(. 
7cf0: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c     ClientData cl
7d00: 69 65 6e 74 44 61 74 61 29 09 2f 2a 20 53 6f 63  ientData)./* Soc
7d10: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 7b 0a  ket state. */.{.
7d20: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
7d30: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
7d40: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
7d50: 69 6e 74 20 6d 61 73 6b 20 3d 20 73 74 61 74 65  int mask = state
7d60: 50 74 72 2d 3e 77 61 6e 74 3b 20 2f 2a 20 49 6e  Ptr->want; /* In
7d70: 69 74 20 74 6f 20 53 53 4c 5f 45 52 52 4f 52 5f  it to SSL_ERROR_
7d80: 57 41 4e 54 5f 52 45 41 44 20 61 6e 64 20 53 53  WANT_READ and SS
7d90: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49  L_ERROR_WANT_WRI
7da0: 54 45 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e  TE */..    dprin
7db0: 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68 20  tf("Called with 
7dc0: 6d 61 73 6b 20 30 78 25 30 32 78 22 2c 20 6d 61  mask 0x%02x", ma
7dd0: 73 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  sk);..    if (st
7de0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
7df0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
7e00: 29 20 4e 55 4c 4c 29 20 7b 0a 09 73 74 61 74 65  ) NULL) {..state
7e10: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63  Ptr->timer = (Tc
7e20: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
7e30: 4c 4c 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65  LL;..Tcl_Release
7e40: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
7e50: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a  atePtr);.    }..
7e60: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
7e70: 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20   amount of data 
7e80: 70 65 6e 64 69 6e 67 20 69 6e 20 49 4f 20 6f 72  pending in IO or
7e90: 20 42 49 4f 20 77 72 69 74 65 20 62 75 66 66 65   BIO write buffe
7ea0: 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c  r */.    if (Tcl
7eb0: 5f 4f 75 74 70 75 74 42 75 66 66 65 72 65 64 28  _OutputBuffered(
7ec0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20  statePtr->self) 
7ed0: 7c 7c 20 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28  || BIO_wpending(
7ee0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20  statePtr->bio)) 
7ef0: 7b 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61  {..dprintf("[cha
7f00: 6e 3d 25 70 5d 20 42 49 4f 20 77 72 69 74 61 62  n=%p] BIO writab
7f10: 6c 65 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  le", statePtr->s
7f20: 65 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20  elf);...mask |= 
7f30: 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20  TCL_WRITABLE;.  
7f40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
7f50: 6b 20 66 6f 72 20 61 6d 6f 75 6e 74 20 6f 66 20  k for amount of 
7f60: 64 61 74 61 20 70 65 6e 64 69 6e 67 20 69 6e 20  data pending in 
7f70: 49 4f 20 6f 72 20 42 49 4f 20 72 65 61 64 20 62  IO or BIO read b
7f80: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 69 66 20  uffer */.    if 
7f90: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72  (Tcl_InputBuffer
7fa0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
7fb0: 66 29 20 7c 7c 20 42 49 4f 5f 70 65 6e 64 69 6e  f) || BIO_pendin
7fc0: 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  g(statePtr->bio)
7fd0: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 5b 63  ) {..dprintf("[c
7fe0: 68 61 6e 3d 25 70 5d 20 42 49 4f 20 72 65 61 64  han=%p] BIO read
7ff0: 61 62 6c 65 22 2c 20 73 74 61 74 65 50 74 72 2d  able", statePtr-
8000: 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c  >self);...mask |
8010: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a  = TCL_READABLE;.
8020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f      }..    /* No
8030: 74 69 66 79 20 74 68 65 20 67 65 6e 65 72 69 63  tify the generic
8040: 20 49 4f 20 6c 61 79 65 72 20 74 68 61 74 20 6d   IO layer that m
8050: 61 73 6b 20 65 76 65 6e 74 73 20 68 61 76 65 20  ask events have 
8060: 6f 63 63 75 72 72 65 64 20 6f 6e 20 74 68 65 20  occurred on the 
8070: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69  channel */.    i
8080: 66 20 28 6d 61 73 6b 20 3e 20 30 29 20 7b 0a 09  f (mask > 0) {..
8090: 64 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79 69  dprintf("Notifyi
80a0: 6e 67 20 6f 75 72 73 65 6c 76 65 73 20 77 69 74  ng ourselves wit
80b0: 68 20 6d 61 73 6b 3d 25 64 22 2c 20 6d 61 73 6b  h mask=%d", mask
80c0: 29 3b 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68  );..Tcl_NotifyCh
80d0: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
80e0: 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 20 20 20  self, mask);.   
80f0: 20 7d 20 65 6c 73 65 20 7b 0a 09 64 70 72 69 6e   } else {..dprin
8100: 74 66 28 22 4e 6f 20 6e 6f 74 69 66 69 63 61 74  tf("No notificat
8110: 69 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ion");.    }.   
8120: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20   statePtr->want 
8130: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
8140: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
81a0: 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a  WatchProc --. *.
81b0: 20 2a 09 53 65 74 20 75 70 20 74 68 65 20 65 76   *.Set up the ev
81c0: 65 6e 74 20 6e 6f 74 69 66 69 65 72 20 74 6f 20  ent notifier to 
81d0: 77 61 74 63 68 20 66 6f 72 20 65 76 65 6e 74 73  watch for events
81e0: 20 6f 66 20 69 6e 74 65 72 65 73 74 20 66 72 6f   of interest fro
81f0: 6d 20 74 68 69 73 0a 20 2a 09 63 68 61 6e 6e 65  m this. *.channe
8200: 6c 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65  l. Called by the
8210: 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79   generic I/O lay
8220: 65 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  er whenever the 
8230: 75 73 65 72 20 28 6f 72 20 74 68 65 0a 20 2a 09  user (or the. *.
8240: 73 79 73 74 65 6d 29 20 61 6e 6e 6f 75 6e 63 65  system) announce
8250: 73 20 69 74 73 20 28 64 69 73 29 69 6e 74 65 72  s its (dis)inter
8260: 65 73 74 20 69 6e 20 65 76 65 6e 74 73 20 6f 6e  est in events on
8270: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 54 68   the channel. Th
8280: 69 73 20 69 73 0a 20 2a 09 63 61 6c 6c 65 64 20  is is. *.called 
8290: 72 65 70 65 61 74 65 64 6c 79 2e 0a 20 2a 0a 20  repeatedly.. *. 
82a0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
82b0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
82c0: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 75  fects:. *.Sets u
82d0: 70 20 6f 72 20 63 6c 65 61 72 73 20 61 20 74 69  p or clears a ti
82e0: 6d 65 2d 62 61 73 65 64 20 6e 6f 74 69 66 69 65  me-based notifie
82f0: 72 20 73 6f 20 74 68 61 74 20 66 75 74 75 72 65  r so that future
8300: 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 0a 20   events on the. 
8310: 2a 09 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 62  *.channel will b
8320: 65 20 73 65 65 6e 20 62 79 20 54 43 4c 2e 0a 20  e seen by TCL.. 
8330: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8380: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -. */.static voi
8390: 64 0a 54 6c 73 57 61 74 63 68 50 72 6f 63 28 0a  d.TlsWatchProc(.
83a0: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69      ClientData i
83b0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20  nstanceData,./* 
83c0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65  Connection state
83d0: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 6e 74   info */.    int
83e0: 20 6d 61 73 6b 29 09 09 09 2f 2a 20 45 76 65 6e   mask).../* Even
83f0: 74 73 20 6f 66 20 69 6e 74 65 72 65 73 74 3b 20  ts of interest; 
8400: 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  an OR-ed combina
8410: 74 69 6f 6e 20 6f 66 0a 09 09 09 09 20 2a 20 54  tion of..... * T
8420: 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 54 43 4c  CL_READABLE, TCL
8430: 5f 57 52 49 54 41 42 4c 45 20 61 6e 64 20 54 43  _WRITABLE and TC
8440: 4c 5f 45 58 43 45 50 54 49 4f 4e 2e 20 2a 2f 0a  L_EXCEPTION. */.
8450: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
8460: 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 53 74  l parent;.    St
8470: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
8480: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
8490: 63 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ceData;.    Tcl_
84a0: 44 72 69 76 65 72 57 61 74 63 68 50 72 6f 63 20  DriverWatchProc 
84b0: 2a 77 61 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20  *watchProc;..   
84c0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
84d0: 20 77 69 74 68 20 6d 61 73 6b 20 30 78 25 30 32   with mask 0x%02
84e0: 78 20 61 6e 64 20 77 61 6e 74 20 30 78 25 30 32  x and want 0x%02
84f0: 78 22 2c 20 6d 61 73 6b 2c 20 73 74 61 74 65 50  x", mask, stateP
8500: 74 72 2d 3e 77 61 6e 74 29 3b 0a 20 20 20 20 64  tr->want);.    d
8510: 70 72 69 6e 74 46 6c 61 67 73 28 73 74 61 74 65  printFlags(state
8520: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62  Ptr);..    /* Ab
8530: 6f 72 74 20 69 66 20 74 68 65 20 75 73 65 72 20  ort if the user 
8540: 76 65 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20  verify callback 
8550: 69 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67  is still running
8560: 20 74 6f 20 61 76 6f 69 64 20 74 72 69 67 67 65   to avoid trigge
8570: 72 69 6e 67 0a 20 20 20 20 20 2a 20 61 6e 6f 74  ring.     * anot
8580: 68 65 72 20 63 61 6c 6c 20 62 65 66 6f 72 65 20  her call before 
8590: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 20  the current one 
85a0: 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a  is complete. */.
85b0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
85c0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
85d0: 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64  L_CALLBACK) {..d
85e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b  printf("Callback
85f0: 20 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20 64 6f   is on-going, do
8600: 69 6e 67 20 6e 6f 74 68 69 6e 67 22 29 3b 0a 09  ing nothing");..
8610: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
8620: 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65     /* Get channe
8630: 6c 20 74 6f 20 6d 6f 6e 69 74 6f 72 20 66 6f 72  l to monitor for
8640: 20 65 76 65 6e 74 73 20 2a 2f 0a 20 20 20 20 70   events */.    p
8650: 61 72 65 6e 74 20 3d 20 54 6c 73 5f 47 65 74 50  arent = Tls_GetP
8660: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20  arent(statePtr, 
8670: 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48  TLS_TCL_FASTPATH
8680: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
8690: 50 61 72 65 6e 74 3a 20 63 68 61 6e 20 62 75 66  Parent: chan buf
86a0: 66 65 72 3d 25 64 2c 20 69 6e 70 75 74 20 62 75  fer=%d, input bu
86b0: 66 66 65 72 3d 25 64 2c 20 6f 75 74 70 75 74 20  ffer=%d, output 
86c0: 62 75 66 66 65 72 3d 25 64 22 2c 20 5c 0a 09 54  buffer=%d", \..T
86d0: 63 6c 5f 43 68 61 6e 6e 65 6c 42 75 66 66 65 72  cl_ChannelBuffer
86e0: 65 64 28 70 61 72 65 6e 74 29 2c 20 54 63 6c 5f  ed(parent), Tcl_
86f0: 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 70 61  InputBuffered(pa
8700: 72 65 6e 74 29 2c 20 54 63 6c 5f 4f 75 74 70 75  rent), Tcl_Outpu
8710: 74 42 75 66 66 65 72 65 64 28 70 61 72 65 6e 74  tBuffered(parent
8720: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72  ));..    /* Abor
8730: 74 20 69 66 20 63 6f 6e 6e 65 63 74 20 66 61 69  t if connect fai
8740: 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  led */.    if (s
8750: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
8760: 20 54 4c 53 5f 54 43 4c 5f 46 41 54 41 4c 5f 45   TLS_TCL_FATAL_E
8770: 52 52 4f 52 29 20 7b 0a 09 64 70 72 69 6e 74 66  RROR) {..dprintf
8780: 28 22 41 73 6b 65 64 20 74 6f 20 77 61 74 63 68  ("Asked to watch
8790: 20 61 20 73 6f 63 6b 65 74 20 77 69 74 68 20 61   a socket with a
87a0: 20 66 61 69 6c 65 64 20 68 61 6e 64 73 68 61 6b   failed handshak
87b0: 65 20 2d 2d 20 6e 6f 74 68 69 6e 67 20 63 61 6e  e -- nothing can
87c0: 20 68 61 70 70 65 6e 20 68 65 72 65 22 29 3b 0a   happen here");.
87d0: 09 64 70 72 69 6e 74 66 28 22 55 6e 72 65 67 69  .dprintf("Unregi
87e0: 73 74 65 72 69 6e 67 20 69 6e 74 65 72 65 73 74  stering interest
87f0: 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68   in the lower ch
8800: 61 6e 6e 65 6c 22 29 3b 0a 0a 09 77 61 74 63 68  annel");...watch
8810: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e  Proc = Tcl_Chann
8820: 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f  elWatchProc(Tcl_
8830: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70  GetChannelType(p
8840: 61 72 65 6e 74 29 29 3b 0a 09 77 61 74 63 68 50  arent));..watchP
8850: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
8860: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70  elInstanceData(p
8870: 61 72 65 6e 74 29 2c 20 30 29 3b 0a 09 73 74 61  arent), 0);..sta
8880: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
8890: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 3b 0a 20   = 0;..return;. 
88a0: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50     }..    stateP
88b0: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20  tr->watchMask = 
88c0: 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  mask;..    /*.  
88d0: 20 20 20 2a 20 4e 6f 20 63 68 61 6e 6e 65 6c 20     * No channel 
88e0: 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d 6f 72  handlers any mor
88f0: 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20 6e 6f  e. We will be no
8900: 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74 69 63  tified automatic
8910: 61 6c 6c 79 20 61 62 6f 75 74 0a 20 20 20 20 20  ally about.     
8920: 2a 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 20  * events on the 
8930: 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69  channel below vi
8940: 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f 75 72 20  a a call to our 
8950: 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 79  'TransformNotify
8960: 50 72 6f 63 27 2e 20 42 75 74 0a 20 20 20 20 20  Proc'. But.     
8970: 2a 20 77 65 20 68 61 76 65 20 74 6f 20 70 61 73  * we have to pas
8980: 73 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 64  s the interest d
8990: 6f 77 6e 20 6e 6f 77 2e 20 57 65 20 61 72 65 20  own now. We are 
89a0: 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64 20 61  allowed to add a
89b0: 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 20 2a  dditional.     *
89c0: 20 27 69 6e 74 65 72 65 73 74 27 20 74 6f 20 74   'interest' to t
89d0: 68 65 20 6d 61 73 6b 20 69 66 20 77 65 20 77 61  he mask if we wa
89e0: 6e 74 20 74 6f 2c 20 62 75 74 20 74 68 69 73 20  nt to, but this 
89f0: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68  transformation h
8a00: 61 73 20 6e 6f 0a 20 20 20 20 20 2a 20 73 75 63  as no.     * suc
8a10: 68 20 69 6e 74 65 72 65 73 74 2e 20 49 74 20 6a  h interest. It j
8a20: 75 73 74 20 70 61 73 73 65 73 20 74 68 65 20 72  ust passes the r
8a30: 65 71 75 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63  equest down, unc
8a40: 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a  hanged..     */.
8a50: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 67      dprintf("Reg
8a60: 69 73 74 65 72 69 6e 67 20 6f 75 72 20 69 6e 74  istering our int
8a70: 65 72 65 73 74 20 69 6e 20 74 68 65 20 6c 6f 77  erest in the low
8a80: 65 72 20 63 68 61 6e 6e 65 6c 20 28 63 68 61 6e  er channel (chan
8a90: 3d 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20  =%p)", (void *) 
8aa0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 77 61 74  parent);.    wat
8ab0: 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  chProc = Tcl_Cha
8ac0: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63  nnelWatchProc(Tc
8ad0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8ae0: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77  (parent));.    w
8af0: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
8b00: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
8b10: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73  ata(parent), mas
8b20: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 63 68 65  k);..    /* Sche
8b30: 64 75 6c 65 20 6e 65 78 74 20 65 76 65 6e 74 20  dule next event 
8b40: 69 66 20 64 61 74 61 20 69 73 20 70 65 6e 64 69  if data is pendi
8b50: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 63 65  ng, otherwise ce
8b60: 61 73 65 20 65 76 65 6e 74 73 20 66 6f 72 20 6e  ase events for n
8b70: 6f 77 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 28  ow */.    if (!(
8b80: 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41  mask & TCL_READA
8b90: 42 4c 45 29 29 20 7b 0a 09 2f 2a 20 52 65 6d 6f  BLE)) {../* Remo
8ba0: 76 65 20 74 69 6d 65 72 2c 20 69 66 20 61 6e 79  ve timer, if any
8bb0: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74   */..if (statePt
8bc0: 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c  r->timer != (Tcl
8bd0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
8be0: 4c 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  L) {..    dprint
8bf0: 66 28 22 41 20 74 69 6d 65 72 20 77 61 73 20 66  f("A timer was f
8c00: 6f 75 6e 64 2c 20 64 65 6c 65 74 69 6e 67 20 69  ound, deleting i
8c10: 74 22 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65  t");..    Tcl_De
8c20: 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  leteTimerHandler
8c30: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
8c40: 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72  );..    statePtr
8c50: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
8c60: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
8c70: 0a 09 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
8c80: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
8c90: 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 0a 20 20  tatePtr);..}..  
8ca0: 20 20 2f 2a 20 44 6f 6e 27 74 20 63 68 65 63 6b    /* Don't check
8cb0: 20 66 6f 72 20 70 65 6e 64 69 6e 67 20 64 61 74   for pending dat
8cc0: 61 20 68 65 72 65 2c 20 77 69 6c 6c 20 63 68 65  a here, will che
8cd0: 63 6b 20 66 6f 72 20 77 61 6e 74 20 69 6e 20 74  ck for want in t
8ce0: 69 6d 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  imer callback */
8cf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
8d00: 2a 20 41 64 64 20 74 69 6d 65 72 2c 20 69 66 20  * Add timer, if 
8d10: 6e 6f 6e 65 20 2a 2f 0a 09 69 66 20 28 73 74 61  none */..if (sta
8d20: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 3d 20  tePtr->timer == 
8d30: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
8d40: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 64 70   NULL) {..    dp
8d50: 72 69 6e 74 66 28 22 43 72 65 61 74 69 6e 67 20  rintf("Creating 
8d60: 61 20 6e 65 77 20 74 69 6d 65 72 20 73 69 6e 63  a new timer sinc
8d70: 65 20 64 61 74 61 20 61 70 70 65 61 72 73 20 74  e data appears t
8d80: 6f 20 62 65 20 77 61 69 74 69 6e 67 22 29 3b 0a  o be waiting");.
8d90: 09 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
8da0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
8db0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 73  tatePtr);..    s
8dc0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
8dd0: 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72   Tcl_CreateTimer
8de0: 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f  Handler(TLS_TCL_
8df0: 44 45 4c 41 59 2c 20 54 6c 73 43 68 61 6e 6e 65  DELAY, TlsChanne
8e00: 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28  lHandlerTimer, (
8e10: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
8e20: 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ePtr);..}.    }.
8e30: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47  -----. *. * TlsG
8e90: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a  etHandleProc --.
8ea0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
8eb0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
8ec0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
8ed0: 4f 20 6c 65 76 65 6c 20 74 6f 20 72 65 74 72 69  O level to retri
8ee0: 65 76 65 20 61 6e 20 4f 53 0a 20 2a 09 73 70 65  eve an OS. *.spe
8ef0: 63 69 66 69 63 20 68 61 6e 64 6c 65 20 61 73 73  cific handle ass
8f00: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
8f10: 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73   channel. Not us
8f20: 65 64 20 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d  ed for transform
8f30: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
8f40: 3a 0a 20 2a 09 54 68 65 20 61 70 70 72 6f 70 72  :. *.The appropr
8f50: 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 20 68 61  iate Tcl_File ha
8f60: 6e 64 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ndle or NULL if 
8f70: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
8f80: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
8f90: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d  ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fe0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
8ff0: 6e 74 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50  nt TlsGetHandleP
9000: 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44  roc(.    ClientD
9010: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
9020: 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74  ,./* Socket stat
9030: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 69  e. */.    int di
9040: 72 65 63 74 69 6f 6e 2c 09 09 2f 2a 20 54 43 4c  rection,../* TCL
9050: 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c  _READABLE or TCL
9060: 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20  _WRITABLE */.   
9070: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e   ClientData *han
9080: 64 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e 64 6c  dlePtr)./* Handl
9090: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
90a0: 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f  h the channel */
90b0: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
90c0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
90d0: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
90e0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
90f0: 61 6c 6c 65 64 20 77 69 74 68 20 64 69 72 65 63  alled with direc
9100: 74 69 6f 6e 20 30 78 25 30 32 78 22 2c 20 64 69  tion 0x%02x", di
9110: 72 65 63 74 69 6f 6e 29 3b 0a 0a 20 20 20 20 72  rection);..    r
9120: 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61  eturn Tcl_GetCha
9130: 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 6c 73 5f 47  nnelHandle(Tls_G
9140: 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74  etParent(statePt
9150: 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50  r, TLS_TCL_FASTP
9160: 41 54 48 29 2c 0a 09 64 69 72 65 63 74 69 6f 6e  ATH),..direction
9170: 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a  , handlePtr);.}.
9180: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74  ---. *. * TlsNot
91e0: 69 66 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  ifyProc --. *. *
91f0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
9200: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
9210: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76  e generic IO lev
9220: 65 6c 20 74 6f 20 6e 6f 74 69 66 79 20 74 68 65  el to notify the
9230: 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 74 68 61 74   channel. *.that
9240: 20 61 6e 20 65 76 65 6e 74 20 68 61 73 20 6f 63   an event has oc
9250: 63 75 72 72 65 64 20 6f 6e 20 74 68 65 20 75 6e  curred on the un
9260: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
9270: 2e 20 49 74 20 69 73 20 75 73 65 64 20 62 79 0a  . It is used by.
9280: 20 2a 09 73 74 61 63 6b 65 64 20 63 68 61 6e 6e   *.stacked chann
9290: 65 6c 20 64 72 69 76 65 72 73 20 74 68 61 74 20  el drivers that 
92a0: 77 69 73 68 20 74 6f 20 62 65 20 6e 6f 74 69 66  wish to be notif
92b0: 69 65 64 20 6f 66 20 65 76 65 6e 74 73 20 74 68  ied of events th
92c0: 61 74 20 6f 63 63 75 72 0a 20 2a 09 6f 6e 20 74  at occur. *.on t
92d0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 28 73  he underlying (s
92e0: 74 61 63 6b 65 64 29 20 63 68 61 6e 6e 65 6c 2e  tacked) channel.
92f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
9300: 20 2a 09 52 65 74 75 72 6e 73 20 6d 61 73 6b 20   *.Returns mask 
9310: 76 61 6c 75 65 20 74 6f 20 69 6e 64 69 63 61 74  value to indicat
9320: 65 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 65 76  e none of the ev
9330: 65 6e 74 73 20 77 65 72 65 20 73 65 72 76 69 63  ents were servic
9340: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ed.. *. * Side e
9350: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63  ffects:. *.May c
9360: 61 6c 6c 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  all Tls_WaitForC
9370: 6f 6e 6e 65 63 74 20 61 6e 64 2f 6f 72 20 64 65  onnect and/or de
9380: 6c 65 74 65 20 74 69 6d 65 72 2e 0a 20 2a 0a 20  lete timer.. *. 
9390: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
93a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
93e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c  */.static int Tl
93f0: 73 4e 6f 74 69 66 79 50 72 6f 63 28 0a 20 20 20  sNotifyProc(.   
9400: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
9410: 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63  anceData,./* Soc
9420: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ket state. */.  
9430: 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a    int mask).../*
9440: 20 74 79 70 65 20 6f 66 20 65 76 65 6e 74 20 74   type of event t
9450: 68 61 74 20 6f 63 63 75 72 72 65 64 3a 20 4f 52  hat occurred: OR
9460: 2d 65 64 0a 09 09 09 09 20 2a 20 63 6f 6d 62 69  -ed..... * combi
9470: 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45  nation of TCL_RE
9480: 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52  ADABLE or TCL_WR
9490: 49 54 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 20  ITABLE */.{.    
94a0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
94b0: 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74  = (State *) inst
94c0: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e  anceData;.    in
94d0: 74 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b  t errorCode = 0;
94e0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
94f0: 61 6c 6c 65 64 20 77 69 74 68 20 6d 61 73 6b 20  alled with mask 
9500: 30 78 25 30 32 78 22 2c 20 6d 61 73 6b 29 3b 0a  0x%02x", mask);.
9510: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66  .    /* Abort if
9520: 20 74 68 65 20 75 73 65 72 20 76 65 72 69 66 79   the user verify
9530: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 69   callback is sti
9540: 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61 76  ll running to av
9550: 6f 69 64 20 74 72 69 67 67 65 72 69 6e 67 0a 20  oid triggering. 
9560: 20 20 20 20 2a 20 61 6e 6f 74 68 65 72 20 63 61      * another ca
9570: 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ll before the cu
9580: 72 72 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f 6d  rrent one is com
9590: 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69 66  plete. */.    if
95a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
95b0: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  s & TLS_TCL_CALL
95c0: 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66  BACK) {..dprintf
95d0: 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e  ("Callback is on
95e0: 2d 67 6f 69 6e 67 2c 20 72 65 74 75 72 6e 69 6e  -going, returnin
95f0: 67 20 66 61 69 6c 65 64 22 29 3b 0a 09 72 65 74  g failed");..ret
9600: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
9610: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
9620: 69 61 6c 69 7a 65 64 2c 20 64 6f 20 63 6f 6e 6e  ialized, do conn
9630: 65 63 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ect */.    if (s
9640: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
9650: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b   TLS_TCL_INIT) {
9660: 0a 09 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74  ..int tlsConnect
9670: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c  ;...dprintf("Cal
9680: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
9690: 43 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73  Connect");...tls
96a0: 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61  Connect = Tls_Wa
96b0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61  itForConnect(sta
96c0: 74 65 50 74 72 2c 20 26 65 72 72 6f 72 43 6f 64  tePtr, &errorCod
96d0: 65 2c 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43  e, 1);..if (tlsC
96e0: 6f 6e 6e 65 63 74 20 3c 20 31 29 20 7b 0a 09 20  onnect < 1) {.. 
96f0: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
9700: 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67  an error waiting
9710: 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73   to connect (tls
9720: 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65  Connect = %i, *e
9730: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69  rrorCodePtr = %i
9740: 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20  )", tlsConnect, 
9750: 65 72 72 6f 72 43 6f 64 65 29 3b 0a 09 20 20 20  errorCode);..   
9760: 20 69 66 20 28 65 72 72 6f 72 43 6f 64 65 20 3d   if (errorCode =
9770: 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 09 64 70  = EAGAIN) {...dp
9780: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 66 6c 61  rintf("Async fla
9790: 67 20 63 6f 75 6c 64 20 62 65 20 73 65 74 20 28  g could be set (
97a0: 64 69 64 6e 27 74 20 63 68 65 63 6b 29 20 61 6e  didn't check) an
97b0: 64 20 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45  d errorCode == E
97c0: 41 47 41 49 4e 3a 20 20 52 65 74 75 72 6e 69 6e  AGAIN:  Returnin
97d0: 67 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 09 72  g failed");....r
97e0: 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a  eturn 0;..    }.
97f0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 54  ..    dprintf("T
9800: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
9810: 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  t returned an er
9820: 72 6f 72 22 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ror");..}.    }.
9830: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44  .    /*.     * D
9840: 65 6c 65 74 65 20 61 6e 20 65 78 69 73 74 69 6e  elete an existin
9850: 67 20 74 69 6d 65 72 2e 20 49 74 20 77 61 73 20  g timer. It was 
9860: 6e 6f 74 20 66 69 72 65 64 2c 20 79 65 74 20 77  not fired, yet w
9870: 65 20 61 72 65 20 68 65 72 65 2c 20 73 6f 20 74  e are here, so t
9880: 68 65 0a 20 20 20 20 20 2a 20 62 65 6c 6f 77 20  he.     * below 
9890: 63 68 61 6e 6e 65 6c 20 67 65 6e 65 72 61 74 65  channel generate
98a0: 64 20 73 75 63 68 20 61 6e 20 65 76 65 6e 74 20  d such an event 
98b0: 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 6e 65 65  and we don't nee
98c0: 64 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 61  d to. The renewa
98d0: 6c 0a 20 20 20 20 20 2a 20 6f 66 20 74 68 65 20  l.     * of the 
98e0: 69 6e 74 65 72 65 73 74 20 61 66 74 65 72 20 74  interest after t
98f0: 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
9900: 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73  channel handlers
9910: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
9920: 0a 20 20 20 20 20 2a 20 63 61 75 73 65 20 75 73  .     * cause us
9930: 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65   to recreate the
9940: 20 74 69 6d 65 72 20 28 69 6e 20 54 6c 73 57 61   timer (in TlsWa
9950: 74 63 68 50 72 6f 63 29 2e 0a 20 20 20 20 20 2a  tchProc)..     *
9960: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
9970: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
9980: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
9990: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
99a0: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
99b0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
99c0: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
99d0: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b   = (Tcl_TimerTok
99e0: 65 6e 29 20 4e 55 4c 4c 3b 0a 09 54 63 6c 5f 52  en) NULL;..Tcl_R
99f0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
9a00: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20  ta) statePtr);. 
9a10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
9a20: 20 20 2a 20 41 6e 20 65 76 65 6e 74 20 6f 63 63    * An event occ
9a30: 75 72 72 65 64 20 69 6e 20 74 68 65 20 75 6e 64  urred in the und
9a40: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e  erlying channel.
9a50: 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
9a60: 74 69 6f 6e 20 64 6f 65 73 6e 27 74 0a 20 20 20  tion doesn't.   
9a70: 20 20 2a 20 70 72 6f 63 65 73 73 20 73 75 63 68    * process such
9a80: 20 65 76 65 6e 74 73 20 74 68 75 73 20 72 65 74   events thus ret
9a90: 75 72 6e 73 20 74 68 65 20 69 6e 63 6f 6d 69 6e  urns the incomin
9aa0: 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e 67 65 64  g mask unchanged
9ab0: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70  ..     */.    dp
9ac0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
9ad0: 20 25 69 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 20   %i", mask);.   
9ae0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
9af0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
9b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b40: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 68  ---. *. * Tls_Ch
9b50: 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a  annelType --. *.
9b60: 20 2a 09 44 65 66 69 6e 65 73 20 74 68 65 20 54   *.Defines the T
9b70: 4c 53 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65  LS channel drive
9b80: 72 20 68 61 6e 64 6c 65 72 73 20 66 6f 72 20 74  r handlers for t
9b90: 68 69 73 20 63 68 61 6e 6e 65 6c 20 74 79 70 65  his channel type
9ba0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
9bb0: 0a 20 2a 09 52 65 74 75 72 6e 73 20 61 20 70 6f  . *.Returns a po
9bc0: 69 6e 74 65 72 20 74 6f 20 54 63 6c 5f 43 68 61  inter to Tcl_Cha
9bd0: 6e 6e 65 6c 54 79 70 65 20 73 74 72 75 63 74 75  nnelType structu
9be0: 72 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  re.. *. * Side e
9bf0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  ffects:. *.None.
9c00: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
9c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c50: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  --. */.static co
9c60: 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54  nst Tcl_ChannelT
9c70: 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79  ype tlsChannelTy
9c80: 70 65 20 3d 20 7b 0a 20 20 20 20 22 74 6c 73 22  pe = {.    "tls"
9c90: 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65  ,.../* Type name
9ca0: 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e   */.    TCL_CHAN
9cb0: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f  NEL_VERSION_5,./
9cc0: 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  * v5 channel */.
9cd0: 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63      TlsCloseProc
9ce0: 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63  ,../* Close proc
9cf0: 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74   */.    TlsInput
9d00: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20  Proc,../* Input 
9d10: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4f  proc */.    TlsO
9d20: 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f  utputProc,../* O
9d30: 75 74 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20  utput proc */.  
9d40: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65    NULL,.../* See
9d50: 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c  k proc */.    Tl
9d60: 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09  sSetOptionProc,.
9d70: 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20 70  ./* Set option p
9d80: 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65  roc */.    TlsGe
9d90: 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a  tOptionProc,../*
9da0: 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63   Get option proc
9db0: 20 2a 2f 0a 20 20 20 20 54 6c 73 57 61 74 63 68   */.    TlsWatch
9dc0: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61  Proc,../* Initia
9dd0: 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f  lize notifier */
9de0: 0a 20 20 20 20 54 6c 73 47 65 74 48 61 6e 64 6c  .    TlsGetHandl
9df0: 65 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 4f  eProc,../* Get O
9e00: 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66  S handles out of
9e10: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
9e20: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09  TlsClose2Proc,..
9e30: 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f  /* close2proc */
9e40: 0a 20 20 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64  .    TlsBlockMod
9e50: 65 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20 62  eProc,../* Set b
9e60: 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b  locking/nonblock
9e70: 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e  ing mode*/.    N
9e80: 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20  ULL,.../* Flush 
9e90: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4e  proc */.    TlsN
9ea0: 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48  otifyProc,../* H
9eb0: 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74  andling of event
9ec0: 73 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f  s bubbling up */
9ed0: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20  .    NULL,.../* 
9ee0: 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a  Wide seek proc *
9ef0: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  /.    NULL,.../*
9f00: 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e 20 2a   Thread action *
9f10: 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20  /.    NULL.../* 
9f20: 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a  Truncate */.};..
9f30: 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65  const Tcl_Channe
9f40: 6c 54 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e  lType *Tls_Chann
9f50: 65 6c 54 79 70 65 28 76 6f 69 64 29 20 7b 0a 20  elType(void) {. 
9f60: 20 20 20 72 65 74 75 72 6e 20 26 74 6c 73 43 68     return &tlsCh
9f70: 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d 0a           annelType;.}.