0000: 2f 2a 0a 20 2a 20 50 72 6f 76 69 64 65 73 20 49  /*. * Provides I
0010: 4f 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 69  O functions to i
0020: 6e 74 65 72 66 61 63 65 20 62 65 74 77 65 65 6e  nterface between
0030: 20 74 68 65 20 42 49 4f 20 62 75 66 66 65 72 73   the BIO buffers
0040: 20 61 6e 64 20 54 43 4c 0a 20 2a 20 61 70 70 6c   and TCL. * appl
0050: 69 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 75 73  ications when us
0060: 69 6e 67 20 73 74 61 63 6b 65 64 20 63 68 61 6e  ing stacked chan
0070: 6e 65 6c 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79  nels.. *. * Copy
0080: 72 69 67 68 74 20 28 43 29 20 31 39 39 37 2d 32  right (C) 1997-2
0090: 30 30 30 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20  000 Matt Newman 
00a0: 3c 6d 61 74 74 40 6e 6f 76 61 64 69 67 6d 2e 63  <matt@novadigm.c
00b0: 6f 6d 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74  om>. * Copyright
00c0: 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 20   (C) 2000 Ajuba 
00d0: 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 20 43 6f 70  Solutions. * Cop
00e0: 79 72 69 67 68 74 20 28 43 29 20 32 30 32 34 20  yright (C) 2024 
00f0: 42 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a  Brian O'Hagan. *
0100: 0a 20 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 63  . * Additional c
0110: 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f 72  redit is due for
0120: 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73   Andreas Kupries
0130: 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74   (a.kupries@west
0140: 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a  end.com), for. *
0150: 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54   providing the T
0160: 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65  cl_ReplaceChanne
0170: 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20  l mechanism and 
0180: 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20  working closely 
0190: 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e  with me. * to en
01a0: 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70  hance it to supp
01b0: 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65  ort full fileeve
01c0: 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a  nt semantics.. *
01d0: 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f  . * Also work do
01e0: 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ne by the follow
01f0: 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64   people provided
0200: 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20   the impetus to 
0210: 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 3a  do this "right":
0220: 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69  . *.tclSSL (Coli
0230: 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61  n McCormack, Sha
0240: 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a  red Technology).
0250: 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72   *.SSLtcl (Peter
0260: 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a   Antman). *. */.
0270: 0a 2f 2a 0a 09 09 74 6c 73 42 49 4f 2e 63 09 09  ./*...tlsBIO.c..
0280: 09 09 74 6c 73 49 4f 2e 63 0a 20 20 2b 2d 2d 2d  ..tlsIO.c.  +---
0290: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20  ---+            
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
02b0: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20  ---+            
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02d0: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
02e0: 2b 0a 20 20 7c 20 20 20 20 20 20 7c 54 63 6c 5f  +.  |      |Tcl_
02f0: 57 72 69 74 65 52 61 77 20 3c 2d 2d 20 42 69 6f  WriteRaw <-- Bio
0300: 57 72 69 74 65 7c 20 53 53 4c 20 7c 42 49 4f 5f  Write| SSL |BIO_
0310: 77 72 69 74 65 20 3c 2d 2d 20 54 6c 73 4f 75 74  write <-- TlsOut
0320: 70 75 74 50 72 6f 63 20 3c 2d 2d 20 57 72 69 74  putProc <-- Writ
0330: 65 7c 20 20 20 20 20 20 7c 0a 20 20 7c 73 6f 63  e|      |.  |soc
0340: 6b 65 74 7c 20 20 20 20 20 20 3c 65 6e 63 72 79  ket|      <encry
0350: 70 74 65 64 3e 20 20 20 20 20 20 20 20 7c 20 42  pted>        | B
0360: 49 4f 20 7c 20 20 20 20 20 20 20 20 20 20 20 20  IO |            
0370: 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e 20 20 20  <unencrypted>   
0380: 20 20 20 20 20 20 20 20 20 7c 20 41 70 70 20 20           | App  
0390: 7c 0a 20 20 7c 20 20 20 20 20 20 7c 54 63 6c 5f  |.  |      |Tcl_
03a0: 52 65 61 64 52 61 77 20 20 2d 2d 3e 20 20 42 69  ReadRaw  -->  Bi
03b0: 6f 52 65 61 64 7c 20 20 20 20 20 7c 42 49 4f 5f  oRead|     |BIO_
03c0: 52 65 61 64 20 20 2d 2d 3e 20 54 6c 73 49 6e 70  Read  --> TlsInp
03d0: 75 74 50 72 6f 63 20 20 2d 2d 3e 20 20 52 65 61  utProc  -->  Rea
03e0: 64 7c 20 20 20 20 20 20 7c 0a 20 20 2b 2d 2d 2d  d|      |.  +---
03f0: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20  ---+            
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
0410: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20  ---+            
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
0440: 2b 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  +.*/..#include "
0450: 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  tlsInt.h".#inclu
0460: 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a  de <errno.h>../*
0470: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04c0: 0a 20 2a 0a 20 2a 20 54 6c 73 42 6c 6f 63 6b 4d  . *. * TlsBlockM
04d0: 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  odeProc --. *. *
04e0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
04f0: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
0500: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76  e generic IO lev
0510: 65 6c 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65  el to set channe
0520: 6c 20 74 6f 0a 20 2a 09 62 6c 6f 63 6b 69 6e 67  l to. *.blocking
0530: 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20   or nonblocking 
0540: 6d 6f 64 65 2e 20 43 61 6c 6c 65 64 20 62 79 20  mode. Called by 
0550: 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20  the generic I/O 
0560: 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72 0a 20  layer whenever. 
0570: 2a 09 74 68 65 20 54 63 6c 5f 53 65 74 43 68 61  *.the Tcl_SetCha
0580: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 29 20 66 75 6e  nnelOption() fun
0590: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77 69  ction is used wi
05a0: 74 68 20 6f 70 74 69 6f 6e 20 2d 62 6c 6f 63 6b  th option -block
05b0: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ing.. *. * Resul
05c0: 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63  ts:. *.0 if succ
05d0: 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20  essful or POSIX 
05e0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61  error code if fa
05f0: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  iled.. *. * Side
0600: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
0610: 73 20 74 68 65 20 64 65 76 69 63 65 20 69 6e 74  s the device int
0620: 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f  o blocking or no
0630: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  nblocking mode..
0640: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
06a0: 74 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72  t TlsBlockModePr
06b0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  oc(ClientData in
06c0: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20  stanceData, int 
06d0: 6d 6f 64 65 29 20 7b 0a 20 20 20 20 53 74 61 74  mode) {.    Stat
06e0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
06f0: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65  tate *) instance
0700: 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d  Data;..    if (m
0710: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f  ode == TCL_MODE_
0720: 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09  NONBLOCKING) {..
0730: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
0740: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43  |= TLS_TCL_ASYNC
0750: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
0760: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
0770: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59  &= ~(TLS_TCL_ASY
0780: 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NC);.    }.    r
0790: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
07a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
07f0: 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 72 6f  *. * TlsClosePro
0800: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
0810: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
0820: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  oked by the gene
0830: 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20  ric IO level to 
0840: 70 65 72 66 6f 72 6d 20 63 68 61 6e 6e 65 6c 0a  perform channel.
0850: 20 2a 09 74 79 70 65 20 73 70 65 63 69 66 69 63   *.type specific
0860: 20 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 61 20   cleanup when a 
0870: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
0880: 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73   channel is clos
0890: 65 64 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79  ed.. *.Called by
08a0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f   the generic I/O
08b0: 20 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72 20   layer whenever 
08c0: 74 68 65 20 54 63 6c 5f 43 6c 6f 73 65 28 29 20  the Tcl_Close() 
08d0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 2a 09 75  function is. *.u
08e0: 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  sed.. *. * Resul
08f0: 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63  ts:. *.0 if succ
0900: 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20  essful or POSIX 
0910: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61  error code if fa
0920: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  iled.. *. * Side
0930: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6c 6f   effects:. *.Clo
0940: 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f  ses the socket o
0950: 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20  f the channel.. 
0960: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09b0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
09c0: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 43 6c   TlsCloseProc(Cl
09d0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
09e0: 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  eData, Tcl_Inter
09f0: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
0a00: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
0a10: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
0a20: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20  tanceData;..    
0a30: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73  dprintf("TlsClos
0a40: 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f 69  eProc(%p)", (voi
0a50: 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  d *) statePtr);.
0a60: 0a 20 20 20 20 2f 2a 20 46 6c 75 73 68 20 61 6e  .    /* Flush an
0a70: 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a  y pending data *
0a80: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 73  /..    /* Send s
0a90: 68 75 74 64 6f 77 6e 20 6e 6f 74 69 66 69 63 61  hutdown notifica
0aa0: 74 69 6f 6e 2e 20 57 69 6c 6c 20 72 65 74 75 72  tion. Will retur
0ab0: 6e 20 30 20 77 68 69 6c 65 20 69 6e 20 70 72 6f  n 0 while in pro
0ac0: 63 65 73 73 2c 20 74 68 65 6e 20 31 20 77 68 65  cess, then 1 whe
0ad0: 6e 20 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20  n complete. */. 
0ae0: 20 20 20 2f 2a 20 43 6c 6f 73 65 73 20 74 68 65     /* Closes the
0af0: 20 77 72 69 74 65 20 64 69 72 65 63 74 69 6f 6e   write direction
0b00: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
0b10: 6f 6e 3b 20 74 68 65 20 72 65 61 64 20 64 69 72  on; the read dir
0b20: 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64  ection is closed
0b30: 20 62 79 20 74 68 65 20 70 65 65 72 2e 20 2a 2f   by the peer. */
0b40: 0a 20 20 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74  .    /* Does not
0b50: 20 61 66 66 65 63 74 20 73 6f 63 6b 65 74 20 73   affect socket s
0b60: 74 61 74 65 2e 20 44 6f 6e 27 74 20 63 61 6c 6c  tate. Don't call
0b70: 20 61 66 74 65 72 20 66 61 74 61 6c 20 65 72 72   after fatal err
0b80: 6f 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  or. */.    if (s
0b90: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 21 3d 20  tatePtr->ssl != 
0ba0: 4e 55 4c 4c 20 26 26 20 21 28 73 74 61 74 65 50  NULL && !(stateP
0bb0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
0bc0: 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41  TCL_HANDSHAKE_FA
0bd0: 49 4c 45 44 29 29 20 7b 0a 09 53 53 4c 5f 73 68  ILED)) {..SSL_sh
0be0: 75 74 64 6f 77 6e 28 73 74 61 74 65 50 74 72 2d  utdown(statePtr-
0bf0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >ssl);.    }..  
0c00: 20 20 2f 2a 20 54 6c 73 5f 46 72 65 65 20 63 61    /* Tls_Free ca
0c10: 6c 6c 73 20 54 6c 73 5f 43 6c 65 61 6e 20 2a 2f  lls Tls_Clean */
0c20: 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61  .    Tcl_Eventua
0c30: 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44  llyFree((ClientD
0c40: 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c  ata)statePtr, Tl
0c50: 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 72 65 74  s_Free);.    ret
0c60: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  urn 0;.}../*. *-
0c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0cc0: 20 2a 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63   * TlsClose2Proc
0cd0: 20 2d 2d 0a 20 2a 0a 20 2a 09 53 69 6d 69 6c 61   --. *. *.Simila
0ce0: 72 20 74 6f 20 54 6c 73 43 6c 6f 73 65 50 72 6f  r to TlsClosePro
0cf0: 63 2c 20 62 75 74 20 61 6c 6c 6f 77 73 20 66 6f  c, but allows fo
0d00: 72 20 73 65 70 61 72 61 74 65 20 63 6c 6f 73 65  r separate close
0d10: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 0a   read and write.
0d20: 20 2a 09 73 69 64 65 20 6f 66 20 63 68 61 6e 6e   *.side of chann
0d30: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
0d90: 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32 50  c int TlsClose2P
0da0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
0db0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20  nstanceData,    
0dc0: 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74  /* The socket st
0dd0: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ate. */.    Tcl_
0de0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09  Interp *interp,.
0df0: 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d  ./* For errors -
0e00: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   can be NULL. */
0e10: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09  .    int flags).
0e20: 09 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 6c  ../* Flags to cl
0e30: 6f 73 65 20 72 65 61 64 20 61 6e 64 2f 6f 72 20  ose read and/or 
0e40: 77 72 69 74 65 20 73 69 64 65 20 6f 66 20 63 68  write side of ch
0e50: 61 6e 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53  annel */.{.    S
0e60: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
0e70: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61   (State *) insta
0e80: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  nceData;..    dp
0e90: 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 65 32  rintf("TlsClose2
0ea0: 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f 69 64  Proc(%p)", (void
0eb0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a   *) statePtr);..
0ec0: 20 20 20 20 69 66 20 28 28 66 6c 61 67 73 20 26      if ((flags &
0ed0: 20 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44   (TCL_CLOSE_READ
0ee0: 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45  |TCL_CLOSE_WRITE
0ef0: 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75  )) == 0) {..retu
0f00: 72 6e 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28  rn TlsCloseProc(
0f10: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
0f20: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  terp);.    }.   
0f30: 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a   return EINVAL;.
0f40: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
0fa0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d  WaitForConnect -
0fb0: 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20  -. *. *.Perform 
0fc0: 63 6f 6e 6e 65 63 74 20 28 63 6c 69 65 6e 74 29  connect (client)
0fd0: 20 6f 72 20 61 63 63 65 70 74 20 28 73 65 72 76   or accept (serv
0fe0: 65 72 29 20 66 75 6e 63 74 69 6f 6e 2e 20 41 6c  er) function. Al
0ff0: 73 6f 20 70 65 72 66 6f 72 6d 73 0a 20 2a 09 65  so performs. *.e
1000: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 68 61 6e  quivalent of han
1010: 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 2e  dshake function.
1020: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20  . *. * Result:. 
1030: 2a 20 20 20 20 31 20 69 66 20 73 75 63 63 65 73  *    1 if succes
1040: 73 66 75 6c 2c 20 30 20 69 66 20 77 61 69 74 20  sful, 0 if wait 
1050: 66 6f 72 20 63 6f 6e 6e 65 63 74 2c 20 61 6e 64  for connect, and
1060: 20 2d 31 20 69 66 20 66 61 69 6c 65 64 2e 0a 20   -1 if failed.. 
1070: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1080: 73 3a 0a 20 2a 09 49 73 73 75 65 73 20 53 53 4c  s:. *.Issues SSL
1090: 5f 61 63 63 65 70 74 20 6f 72 20 53 53 4c 5f 63  _accept or SSL_c
10a0: 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  onnect. *. *----
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
1100: 74 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  t Tls_WaitForCon
1110: 6e 65 63 74 28 53 74 61 74 65 20 2a 73 74 61 74  nect(State *stat
1120: 65 50 74 72 2c 20 69 6e 74 20 2a 65 72 72 6f 72  ePtr, int *error
1130: 43 6f 64 65 50 74 72 2c 20 69 6e 74 20 68 61 6e  CodePtr, int han
1140: 64 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50  dshakeFailureIsP
1150: 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 20 20 20 20  ermanent) {.    
1160: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61  unsigned long ba
1170: 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20  ckingError;.    
1180: 69 6e 74 20 65 72 72 2c 20 72 63 20 3d 20 30 3b  int err, rc = 0;
1190: 0a 20 20 20 20 69 6e 74 20 62 69 6f 53 68 6f 75  .    int bioShou
11a0: 6c 64 52 65 74 72 79 3b 0a 20 20 20 20 2a 65 72  ldRetry;.    *er
11b0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
11c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 61  .    dprintf("Wa
11d0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 25 70 29  itForConnect(%p)
11e0: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74  ", (void *) stat
11f0: 65 50 74 72 29 3b 0a 20 20 20 20 64 70 72 69 6e  ePtr);.    dprin
1200: 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29  tFlags(statePtr)
1210: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 20 61 6c  ;..    /* Can al
1220: 73 6f 20 63 68 65 63 6b 20 53 53 4c 5f 69 73 5f  so check SSL_is_
1230: 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73  init_finished(ss
1240: 6c 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 28  l) */.    if (!(
1250: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
1260: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 29  & TLS_TCL_INIT))
1270: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 54 6c 73   {..dprintf("Tls
1280: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
1290: 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 72 65 61 64  called on alread
12a0: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 68  y initialized ch
12b0: 61 6e 6e 65 6c 20 2d 2d 20 72 65 74 75 72 6e 69  annel -- returni
12c0: 6e 67 20 77 69 74 68 20 69 6d 6d 65 64 69 61 74  ng with immediat
12d0: 65 20 73 75 63 63 65 73 73 22 29 3b 0a 09 72 65  e success");..re
12e0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
12f0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
1300: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
1310: 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45  _HANDSHAKE_FAILE
1320: 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 69 66  D) {../*.. * Dif
1330: 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20  ferent types of 
1340: 6f 70 65 72 61 74 69 6f 6e 73 20 68 61 76 65 20  operations have 
1350: 64 69 66 66 65 72 65 6e 74 20 72 65 71 75 69 72  different requir
1360: 65 6d 65 6e 74 73 0a 09 20 2a 20 53 53 4c 20 62  ements.. * SSL b
1370: 65 69 6e 67 20 65 73 74 61 62 6c 69 73 68 65 64  eing established
1380: 0a 09 20 2a 2f 0a 09 69 66 20 28 68 61 6e 64 73  .. */..if (hands
1390: 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72  hakeFailureIsPer
13a0: 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20 20 20 64  manent) {..    d
13b0: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
13c0: 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20   wait for a TLS 
13d0: 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68  handshake that h
13e0: 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65  as already faile
13f0: 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61  d.  Returning fa
1400: 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a 09 20 20  tal error");..  
1410: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
1420: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a  = ECONNABORTED;.
1430: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64  .} else {..    d
1440: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
1450: 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20   wait for a TLS 
1460: 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68  handshake that h
1470: 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65  as already faile
1480: 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 73 6f  d.  Returning so
1490: 66 74 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20  ft error");..   
14a0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
14b0: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 7d 0a   ECONNRESET;..}.
14c0: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20  .return -1;.    
14d0: 7d 0a 0a 20 20 20 20 66 6f 72 20 28 3b 3b 29 20  }..    for (;;) 
14e0: 7b 0a 09 45 52 52 5f 63 6c 65 61 72 5f 65 72 72  {..ERR_clear_err
14f0: 6f 72 28 29 3b 0a 09 42 49 4f 5f 63 6c 65 61 72  or();..BIO_clear
1500: 5f 72 65 74 72 79 5f 66 6c 61 67 73 28 73 74 61  _retry_flags(sta
1510: 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 2f  tePtr->bio);.../
1520: 2a 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  * Not initialize
1530: 64 20 79 65 74 21 20 41 6c 73 6f 20 63 61 6c 6c  d yet! Also call
1540: 73 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61  s SSL_do_handsha
1550: 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 73 74  ke(). */..if (st
1560: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
1570: 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20  TLS_TCL_SERVER) 
1580: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
1590: 43 61 6c 6c 69 6e 67 20 53 53 4c 5f 61 63 63 65  Calling SSL_acce
15a0: 70 74 28 29 22 29 3b 0a 09 20 20 20 20 65 72 72  pt()");..    err
15b0: 20 3d 20 53 53 4c 5f 61 63 63 65 70 74 28 73 74   = SSL_accept(st
15c0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 0a 09  atePtr->ssl);...
15d0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70  } else {..    dp
15e0: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53  rintf("Calling S
15f0: 53 4c 5f 63 6f 6e 6e 65 63 74 28 29 22 29 3b 0a  SL_connect()");.
1600: 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 63  .    err = SSL_c
1610: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2d  onnect(statePtr-
1620: 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 31  >ssl);..}.../* 1
1630: 3d 73 75 63 63 65 73 73 66 75 6c 2c 20 30 3d 6e  =successful, 0=n
1640: 6f 74 20 73 75 63 63 65 73 73 66 75 6c 20 61 6e  ot successful an
1650: 64 20 73 68 75 74 20 64 6f 77 6e 2c 20 3c 30 3d  d shut down, <0=
1660: 66 61 74 61 6c 20 65 72 72 6f 72 20 2a 2f 0a 09  fatal error */..
1670: 69 66 20 28 65 72 72 20 3e 20 30 29 20 7b 0a 09  if (err > 0) {..
1680: 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 63 63      dprintf("Acc
1690: 65 70 74 20 6f 72 20 63 6f 6e 6e 65 63 74 20 77  ept or connect w
16a0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 22 29 3b  as successful");
16b0: 0a 0a 09 20 20 20 20 65 72 72 20 3d 20 42 49 4f  ...    err = BIO
16c0: 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d  _flush(statePtr-
16d0: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 69 66 20 28  >bio);..    if (
16e0: 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 09 64 70  err <= 0) {...dp
16f0: 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20  rintf("Flushing 
1700: 74 68 65 20 6c 6f 77 65 72 20 6c 61 79 65 72 73  the lower layers
1710: 20 66 61 69 6c 65 64 2c 20 74 68 69 73 20 77 69   failed, this wi
1720: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 74 65 72 6d  ll probably term
1730: 69 6e 61 74 65 20 74 68 69 73 20 73 65 73 73 69  inate this sessi
1740: 6f 6e 22 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 20  on");..    }..} 
1750: 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69  else {..    dpri
1760: 6e 74 66 28 22 41 63 63 65 70 74 20 6f 72 20 63  ntf("Accept or c
1770: 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 22 29 3b  onnect failed");
1780: 0a 09 7d 0a 0a 09 2f 2a 20 53 61 6d 65 20 61 73  ..}.../* Same as
1790: 20 53 53 4c 5f 77 61 6e 74 2c 20 62 75 74 20 61   SSL_want, but a
17a0: 6c 73 6f 20 63 68 65 63 6b 73 20 74 68 65 20 65  lso checks the e
17b0: 72 72 6f 72 20 71 75 65 75 65 20 2a 2f 0a 09 72  rror queue */..r
17c0: 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f  c = SSL_get_erro
17d0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  r(statePtr->ssl,
17e0: 20 65 72 72 29 3b 0a 09 62 61 63 6b 69 6e 67 45   err);..backingE
17f0: 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65  rror = ERR_get_e
1800: 72 72 6f 72 28 29 3b 0a 09 69 66 20 28 72 63 20  rror();..if (rc 
1810: 21 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e  != SSL_ERROR_NON
1820: 45 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  E) {..    dprint
1830: 66 28 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 69  f("Got error: %i
1840: 20 28 72 63 20 3d 20 25 69 29 22 2c 20 65 72 72   (rc = %i)", err
1850: 2c 20 72 63 29 3b 0a 09 20 20 20 20 64 70 72 69  , rc);..    dpri
1860: 6e 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a 20  ntf("Got error: 
1870: 25 73 22 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f  %s", ERR_reason_
1880: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63  error_string(bac
1890: 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 7d 0a  kingError));..}.
18a0: 0a 09 2f 2a 20 54 68 65 20 72 65 74 72 79 20 66  ../* The retry f
18b0: 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68  lag is set by th
18c0: 65 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f  e BIO_set_retry_
18d0: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 09  * functions */..
18e0: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d  bioShouldRetry =
18f0: 20 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72   BIO_should_retr
1900: 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  y(statePtr->bio)
1910: 3b 0a 09 64 70 72 69 6e 74 66 28 22 62 69 6f 53  ;..dprintf("bioS
1920: 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 25 64 22  houldRetry = %d"
1930: 2c 20 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79  , bioShouldRetry
1940: 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 3c 3d 20  );...if (err <= 
1950: 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 72 63  0) {..    if (rc
1960: 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41   == SSL_ERROR_WA
1970: 4e 54 5f 43 4f 4e 4e 45 43 54 20 7c 7c 20 72 63  NT_CONNECT || rc
1980: 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41   == SSL_ERROR_WA
1990: 4e 54 5f 41 43 43 45 50 54 29 20 7b 0a 09 09 62  NT_ACCEPT) {...b
19a0: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20  ioShouldRetry = 
19b0: 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  1;..    } else i
19c0: 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52  f (rc == SSL_ERR
19d0: 4f 52 5f 57 41 4e 54 5f 52 45 41 44 29 20 7b 0a  OR_WANT_READ) {.
19e0: 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79  ..bioShouldRetry
19f0: 20 3d 20 31 3b 0a 09 09 73 74 61 74 65 50 74 72   = 1;...statePtr
1a00: 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 52 45  ->want |= TCL_RE
1a10: 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 7d 20 65  ADABLE;..    } e
1a20: 6c 73 65 20 69 66 20 28 72 63 20 3d 3d 20 53 53  lse if (rc == SS
1a30: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49  L_ERROR_WANT_WRI
1a40: 54 45 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c  TE) {...bioShoul
1a50: 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 09 73 74  dRetry = 1;...st
1a60: 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20  atePtr->want |= 
1a70: 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20  TCL_WRITABLE;.. 
1a80: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 42 49     } else if (BI
1a90: 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73  O_should_retry(s
1aa0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b  tatePtr->bio)) {
1ab0: 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72  ...bioShouldRetr
1ac0: 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c  y = 1;..    } el
1ad0: 73 65 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c  se if (rc == SSL
1ae0: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 20 26  _ERROR_SYSCALL &
1af0: 26 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  & Tcl_GetErrno()
1b00: 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 09   == EAGAIN) {...
1b10: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d  bioShouldRetry =
1b20: 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09   1;..    }..}...
1b30: 69 66 20 28 62 69 6f 53 68 6f 75 6c 64 52 65 74  if (bioShouldRet
1b40: 72 79 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  ry) {..    dprin
1b50: 74 66 28 22 54 68 65 20 49 2f 4f 20 64 69 64 20  tf("The I/O did 
1b60: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 2d 2d 20  not complete -- 
1b70: 62 75 74 20 77 65 20 73 68 6f 75 6c 64 20 74 72  but we should tr
1b80: 79 20 69 74 20 61 67 61 69 6e 22 29 3b 0a 0a 09  y it again");...
1b90: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
1ba0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
1bb0: 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09 64 70 72  L_ASYNC) {...dpr
1bc0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
1bd0: 45 41 47 41 49 4e 20 73 6f 20 74 68 61 74 20 69  EAGAIN so that i
1be0: 74 20 63 61 6e 20 62 65 20 72 65 74 72 69 65 64  t can be retried
1bf0: 20 6c 61 74 65 72 22 29 3b 0a 09 09 2a 65 72 72   later");...*err
1c00: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
1c10: 49 4e 3b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a  IN;...return 0;.
1c20: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
1c30: 64 70 72 69 6e 74 66 28 22 44 6f 69 6e 67 20 73  dprintf("Doing s
1c40: 6f 20 6e 6f 77 22 29 3b 0a 09 09 63 6f 6e 74 69  o now");...conti
1c50: 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  nue;..    }..}..
1c60: 09 64 70 72 69 6e 74 66 28 22 57 65 20 68 61 76  .dprintf("We hav
1c70: 65 20 65 69 74 68 65 72 20 63 6f 6d 70 6c 65 74  e either complet
1c80: 65 6c 79 20 65 73 74 61 62 6c 69 73 68 65 64 20  ely established 
1c90: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 72 20 63  the session or c
1ca0: 6f 6d 70 6c 65 74 65 6c 79 20 66 61 69 6c 65 64  ompletely failed
1cb0: 20 69 74 20 2d 2d 20 74 68 65 72 65 20 69 73 20   it -- there is 
1cc0: 6e 6f 20 6d 6f 72 65 20 6e 65 65 64 20 74 6f 20  no more need to 
1cd0: 65 76 65 72 20 72 65 74 72 79 20 69 74 20 74 68  ever retry it th
1ce0: 6f 75 67 68 22 29 3b 0a 09 62 72 65 61 6b 3b 0a  ough");..break;.
1cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
1d00: 68 20 28 72 63 29 20 7b 0a 09 63 61 73 65 20 53  h (rc) {..case S
1d10: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09  SL_ERROR_NONE:..
1d20: 20 20 20 20 2f 2a 20 54 68 65 20 54 4c 53 2f 53      /* The TLS/S
1d30: 53 4c 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e  SL I/O operation
1d40: 20 63 6f 6d 70 6c 65 74 65 64 20 73 75 63 63 65   completed succe
1d50: 73 73 66 75 6c 6c 79 20 2a 2f 0a 09 20 20 20 20  ssfully */..    
1d60: 64 70 72 69 6e 74 66 28 22 54 68 65 20 63 6f 6e  dprintf("The con
1d70: 6e 65 63 74 69 6f 6e 20 69 73 20 67 6f 6f 64 22  nection is good"
1d80: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
1d90: 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20  dePtr = 0;..    
1da0: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
1db0: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20  L_ERROR_SSL:..  
1dc0: 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76    /* A non-recov
1dd0: 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72  erable, fatal er
1de0: 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  ror in the SSL l
1df0: 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c  ibrary occurred,
1e00: 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f   usually a proto
1e10: 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20  col error */..  
1e20: 20 20 2f 2a 20 54 68 69 73 20 69 6e 63 6c 75 64    /* This includ
1e30: 65 73 20 63 65 72 74 69 66 69 63 61 74 65 20 76  es certificate v
1e40: 61 6c 69 64 61 74 69 6f 6e 20 65 72 72 6f 72 73  alidation errors
1e50: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
1e60: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a  ("SSL_ERROR_SSL:
1e70: 20 47 6f 74 20 70 65 72 6d 61 6e 65 6e 74 20 66   Got permanent f
1e80: 61 74 61 6c 20 53 53 4c 20 65 72 72 6f 72 2c 20  atal SSL error, 
1e90: 61 62 6f 72 74 69 6e 67 20 69 6d 6d 65 64 69 61  aborting immedia
1ea0: 74 65 6c 79 22 29 3b 0a 09 20 20 20 20 69 66 20  tely");..    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 20 58 35 30 39  r(statePtr, X509
1f00: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
1f10: 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65  or_string(SSL_ge
1f20: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
1f30: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 29  statePtr->ssl)))
1f40: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66  ;..    }..    if
1f50: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21   (backingError !
1f60: 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72  = 0) {...Tls_Err
1f70: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 52  or(statePtr, ERR
1f80: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74  _reason_error_st
1f90: 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f  ring(backingErro
1fa0: 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  r));..    }..   
1fb0: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
1fc0: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44   |= TLS_TCL_HAND
1fd0: 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20  SHAKE_FAILED;.. 
1fe0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
1ff0: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b   = ECONNABORTED;
2000: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
2010: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
2020: 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20  R_SYSCALL:..    
2030: 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f  /* Some non-reco
2040: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49  verable, fatal I
2050: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
2060: 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  d */..    dprint
2070: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53  f("SSL_ERROR_SYS
2080: 43 41 4c 4c 22 29 3b 0a 0a 09 20 20 20 20 69 66  CALL");...    if
2090: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d   (backingError =
20a0: 3d 20 30 20 26 26 20 65 72 72 20 3d 3d 20 30 29  = 0 && err == 0)
20b0: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 45 4f   {...dprintf("EO
20c0: 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65  F reached")...*e
20d0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
20e0: 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 54 6c 73 5f  ONNRESET;...Tls_
20f0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
2100: 22 28 75 6e 65 78 70 65 63 74 65 64 29 20 45 4f  "(unexpected) EO
2110: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20  F reached");... 
2120: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61     } else if (ba
2130: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20  ckingError == 0 
2140: 26 26 20 65 72 72 20 3d 3d 20 2d 31 29 20 7b 0a  && err == -1) {.
2150: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65  ..dprintf("I/O e
2160: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65  rror occurred (e
2170: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75  rrno = %lu)", (u
2180: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63  nsigned long) Tc
2190: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09  l_GetErrno());..
21a0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
21b0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b   Tcl_GetErrno();
21c0: 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64  ...if (*errorCod
21d0: 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53  ePtr == ECONNRES
21e0: 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72  ET) {...    *err
21f0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e  orCodePtr = ECON
2200: 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 09  NABORTED;...}...
2210: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
2220: 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67  tr, Tcl_ErrnoMsg
2230: 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29  (*errorCodePtr))
2240: 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;...    } else {
2250: 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20  ...dprintf("I/O 
2260: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28  error occurred (
2270: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25  backingError = %
2280: 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72  lu)", backingErr
2290: 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64  or);...*errorCod
22a0: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72  ePtr = Tcl_GetEr
22b0: 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 72  rno();...if (*er
22c0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43  rorCodePtr == EC
22d0: 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 20  ONNRESET) {...  
22e0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
22f0: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a  = ECONNABORTED;.
2300: 09 09 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28  ..}...Tls_Error(
2310: 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65  statePtr, ERR_re
2320: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
2330: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29  g(backingError))
2340: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73  ;..    }...    s
2350: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
2360: 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48  = TLS_TCL_HANDSH
2370: 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20  AKE_FAILED;..   
2380: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61   return -1;...ca
2390: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52  se SSL_ERROR_ZER
23a0: 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f  O_RETURN:..    /
23b0: 2a 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65  * Peer has close
23c0: 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  d the connection
23d0: 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20   by sending the 
23e0: 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65  close_notify ale
23f0: 72 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20  rt. Can't read, 
2400: 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 2a  but can write. *
2410: 2f 0a 09 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  /..    /* Need t
2420: 6f 20 72 65 74 75 72 6e 20 61 6e 20 45 4f 46 2c  o return an EOF,
2430: 20 73 6f 20 63 68 61 6e 6e 65 6c 20 69 73 20 63   so channel is c
2440: 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c 6c  losed which will
2450: 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 75   send an SSL_shu
2460: 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 20  tdown(). */..   
2470: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52   dprintf("SSL_ER
2480: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a  ROR_ZERO_RETURN:
2490: 20 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65   Connect returne
24a0: 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  d an invalid val
24b0: 75 65 2e 2e 2e 22 29 3b 0a 09 20 20 20 20 2a 65  ue...");..    *e
24c0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
24d0: 4f 4e 4e 52 45 53 45 54 3b 0a 09 20 20 20 20 54  ONNRESET;..    T
24e0: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
24f0: 72 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f  r, "Peer has clo
2500: 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  sed the connecti
2510: 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62  on for writing b
2520: 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c  y sending the cl
2530: 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74  ose_notify alert
2540: 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ");..    return 
2550: 2d 31 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  -1;...case SSL_E
2560: 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a  RROR_WANT_READ:.
2570: 09 20 20 20 20 2f 2a 20 4d 6f 72 65 20 64 61 74  .    /* More dat
2580: 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 20 66  a must be read f
2590: 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
25a0: 6e 67 20 42 49 4f 20 6c 61 79 65 72 20 69 6e 20  ng BIO layer in 
25b0: 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
25c0: 65 20 74 68 65 20 61 63 74 75 61 6c 20 53 53 4c  e the actual SSL
25d0: 5f 2a 28 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  _*() operation. 
25e0: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
25f0: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  ("SSL_ERROR_WANT
2600: 5f 52 45 41 44 22 29 3b 0a 09 20 20 20 20 42 49  _READ");..    BI
2610: 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61 64  O_set_retry_read
2620: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
2630: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
2640: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
2650: 20 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28     dprintf("ERR(
2660: 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52  SSL_ERROR_ZERO_R
2670: 45 54 55 52 4e 2c 20 45 41 47 41 49 4e 29 20 22  ETURN, EAGAIN) "
2680: 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72  );..    statePtr
2690: 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 52 45  ->want |= TCL_RE
26a0: 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 72 65 74  ADABLE;..    ret
26b0: 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53 53  urn 0;...case SS
26c0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49  L_ERROR_WANT_WRI
26d0: 54 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 72  TE:..    /* Ther
26e0: 65 20 69 73 20 64 61 74 61 20 69 6e 20 74 68 65  e is data in the
26f0: 20 53 53 4c 20 62 75 66 66 65 72 20 74 68 61 74   SSL buffer that
2700: 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
2710: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
2720: 6e 67 20 42 49 4f 20 69 6e 20 6f 72 64 65 72 20  ng BIO in order 
2730: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
2740: 53 53 4c 5f 2a 28 29 20 6f 70 65 72 61 74 69 6f  SSL_*() operatio
2750: 6e 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  n. */..    dprin
2760: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41  tf("SSL_ERROR_WA
2770: 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09 20 20 20  NT_WRITE");..   
2780: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77   BIO_set_retry_w
2790: 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62  rite(statePtr->b
27a0: 69 6f 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  io);..    *error
27b0: 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e  CodePtr = EAGAIN
27c0: 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
27d0: 45 52 52 28 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ERR(SSL_ERROR_WA
27e0: 4e 54 5f 57 52 49 54 45 2c 20 45 41 47 41 49 4e  NT_WRITE, EAGAIN
27f0: 29 20 22 29 3b 0a 09 20 20 20 20 73 74 61 74 65  ) ");..    state
2800: 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c  Ptr->want |= TCL
2810: 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 20 20  _WRITABLE;..    
2820: 72 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65  return 0;...case
2830: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
2840: 43 4f 4e 4e 45 43 54 3a 0a 09 20 20 20 20 2f 2a  CONNECT:..    /*
2850: 20 43 6f 6e 6e 65 63 74 20 77 6f 75 6c 64 20 68   Connect would h
2860: 61 76 65 20 62 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  ave blocked. */.
2870: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
2880: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e  L_ERROR_WANT_CON
2890: 4e 45 43 54 22 29 3b 0a 09 20 20 20 20 42 49 4f  NECT");..    BIO
28a0: 5f 73 65 74 5f 72 65 74 72 79 5f 73 70 65 63 69  _set_retry_speci
28b0: 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  al(statePtr->bio
28c0: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f  );..    BIO_set_
28d0: 72 65 74 72 79 5f 72 65 61 73 6f 6e 28 73 74 61  retry_reason(sta
28e0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 42 49 4f 5f  tePtr->bio, BIO_
28f0: 52 52 5f 43 4f 4e 4e 45 43 54 29 3b 0a 09 20 20  RR_CONNECT);..  
2900: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
2910: 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64  = EAGAIN;..    d
2920: 70 72 69 6e 74 66 28 22 45 52 52 28 53 53 4c 5f  printf("ERR(SSL_
2930: 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45  ERROR_WANT_CONNE
2940: 43 54 2c 20 45 41 47 41 49 4e 29 20 22 29 3b 0a  CT, EAGAIN) ");.
2950: 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a  .    return 0;..
2960: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
2970: 57 41 4e 54 5f 41 43 43 45 50 54 3a 0a 09 20 20  WANT_ACCEPT:..  
2980: 20 20 2f 2a 20 41 63 63 65 70 74 20 77 6f 75 6c    /* Accept woul
2990: 64 20 68 61 76 65 20 62 6c 6f 63 6b 65 64 20 2a  d have blocked *
29a0: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
29b0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41  SSL_ERROR_WANT_A
29c0: 43 43 45 50 54 22 29 3b 0a 09 20 20 20 20 42 49  CCEPT");..    BI
29d0: 4f 5f 73 65 74 5f 72 65 74 72 79 5f 73 70 65 63  O_set_retry_spec
29e0: 69 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ial(statePtr->bi
29f0: 6f 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74  o);..    BIO_set
2a00: 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e 28 73 74  _retry_reason(st
2a10: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 42 49 4f  atePtr->bio, BIO
2a20: 5f 52 52 5f 41 43 43 45 50 54 29 3b 0a 09 20 20  _RR_ACCEPT);..  
2a30: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
2a40: 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64  = EAGAIN;..    d
2a50: 70 72 69 6e 74 66 28 22 45 52 52 28 53 53 4c 5f  printf("ERR(SSL_
2a60: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50  ERROR_WANT_ACCEP
2a70: 54 2c 20 45 41 47 41 49 4e 29 20 22 29 3b 0a 09  T, EAGAIN) ");..
2a80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09      return 0;...
2a90: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57  case SSL_ERROR_W
2aa0: 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a  ANT_X509_LOOKUP:
2ab0: 0a 09 20 20 20 20 2f 2a 20 41 70 70 20 63 61 6c  ..    /* App cal
2ac0: 6c 62 61 63 6b 20 73 65 74 20 62 79 20 53 53 4c  lback set by SSL
2ad0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
2ae0: 63 65 72 74 5f 63 62 20 68 61 73 20 61 73 6b 65  cert_cb has aske
2af0: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61  d to be called a
2b00: 67 61 69 6e 20 2a 2f 0a 09 20 20 20 20 2f 2a 20  gain */..    /* 
2b10: 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69  The operation di
2b20: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
2b30: 65 63 61 75 73 65 20 61 6e 20 61 70 70 6c 69 63  ecause an applic
2b40: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 73  ation callback s
2b50: 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 65  et by SSL_CTX_se
2b60: 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62  t_client_cert_cb
2b70: 28 29 20 68 61 73 20 61 73 6b 65 64 20 74 6f 20  () has asked to 
2b80: 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e  be called again.
2b90: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
2ba0: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  ("SSL_ERROR_WANT
2bb0: 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 22 29 3b 0a  _X509_LOOKUP");.
2bc0: 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74  .    BIO_set_ret
2bd0: 72 79 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65  ry_special(state
2be0: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20  Ptr->bio);..    
2bf0: 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65  BIO_set_retry_re
2c00: 61 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 62  ason(statePtr->b
2c10: 69 6f 2c 20 42 49 4f 5f 52 52 5f 53 53 4c 5f 58  io, BIO_RR_SSL_X
2c20: 35 30 39 5f 4c 4f 4f 4b 55 50 29 3b 0a 09 20 20  509_LOOKUP);..  
2c30: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
2c40: 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64  = EAGAIN;..    d
2c50: 70 72 69 6e 74 66 28 22 45 52 52 28 53 53 4c 5f  printf("ERR(SSL_
2c60: 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f  ERROR_WANT_X509_
2c70: 4c 4f 4f 4b 55 50 2c 20 45 41 47 41 49 4e 29 20  LOOKUP, EAGAIN) 
2c80: 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ");..    return 
2c90: 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  0;...case SSL_ER
2ca0: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a  ROR_WANT_ASYNC:.
2cb0: 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69 74  .    /* Used wit
2cc0: 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f  h flag SSL_MODE_
2cd0: 41 53 59 4e 43 2c 20 6f 70 20 64 69 64 6e 27 74  ASYNC, op didn't
2ce0: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
2cf0: 65 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69 6e  e an async engin
2d00: 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63 65  e is still proce
2d10: 73 73 69 6e 67 20 64 61 74 61 20 2a 2f 0a 09 63  ssing data */..c
2d20: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
2d30: 4e 54 5f 41 53 59 4e 43 5f 4a 4f 42 3a 0a 09 20  NT_ASYNC_JOB:.. 
2d40: 20 20 20 2f 2a 20 54 68 65 20 61 73 79 6e 63 68     /* The asynch
2d50: 72 6f 6e 6f 75 73 20 6a 6f 62 20 63 6f 75 6c 64  ronous job could
2d60: 20 6e 6f 74 20 62 65 20 73 74 61 72 74 65 64 20   not be started 
2d70: 62 65 63 61 75 73 65 20 74 68 65 72 65 20 77 65  because there we
2d80: 72 65 20 6e 6f 20 61 73 79 6e 63 20 6a 6f 62 73  re no async jobs
2d90: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
2da0: 65 20 70 6f 6f 6c 2e 20 2a 2f 0a 09 63 61 73 65  e pool. */..case
2db0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
2dc0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 43 42 3a  CLIENT_HELLO_CB:
2dd0: 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65  ..    /* The ope
2de0: 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63  ration did not c
2df0: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
2e00: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  an application c
2e10: 61 6c 6c 62 61 63 6b 20 73 65 74 20 62 79 20 53  allback set by S
2e20: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
2e30: 74 5f 68 65 6c 6c 6f 5f 63 62 28 29 20 68 61 73  t_hello_cb() has
2e40: 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c   asked to be cal
2e50: 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 23 69  led again. */.#i
2e60: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
2e70: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30  N_NUMBER >= 0x30
2e80: 30 30 30 30 30 30 4c 0a 09 63 61 73 65 20 53 53  000000L..case SS
2e90: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 54  L_ERROR_WANT_RET
2ea0: 52 59 5f 56 45 52 49 46 59 3a 0a 09 20 20 20 20  RY_VERIFY:..    
2eb0: 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  /* The operation
2ec0: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
2ed0: 65 20 62 65 63 61 75 73 65 20 61 20 63 65 72 74  e because a cert
2ee0: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61  ificate verifica
2ef0: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 68 61  tion callback ha
2f00: 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61  s asked to be ca
2f10: 6c 6c 65 64 20 61 67 61 69 6e 20 76 69 61 20 53  lled again via S
2f20: 53 4c 5f 73 65 74 5f 72 65 74 72 79 5f 76 65 72  SL_set_retry_ver
2f30: 69 66 79 28 33 29 2e 20 2a 2f 0a 23 65 6e 64 69  ify(3). */.#endi
2f40: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20  f..default:..   
2f50: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   /* The operatio
2f60: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  n did not comple
2f70: 74 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  te and should be
2f80: 20 72 65 74 72 69 65 64 20 6c 61 74 65 72 2e 20   retried later. 
2f90: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
2fa0: 22 4f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e  "Operation did n
2fb0: 6f 74 20 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c  ot complete, cal
2fc0: 6c 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  l function again
2fd0: 20 6c 61 74 65 72 22 29 3b 0a 09 20 20 20 20 2a   later");..    *
2fe0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
2ff0: 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 69  AGAIN;..    dpri
3000: 6e 74 66 28 22 45 52 52 28 4f 74 68 65 72 2c 20  ntf("ERR(Other, 
3010: 45 41 47 41 49 4e 29 20 22 29 3b 0a 09 20 20 20  EAGAIN) ");..   
3020: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
3030: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
3040: 65 6d 6f 76 69 6e 67 20 74 68 65 20 5c 22 54 4c  emoving the \"TL
3050: 53 5f 54 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61  S_TCL_INIT\" fla
3060: 67 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  g since we have 
3070: 63 6f 6d 70 6c 65 74 65 64 20 74 68 65 20 68 61  completed the ha
3080: 6e 64 73 68 61 6b 65 22 29 3b 0a 20 20 20 20 73  ndshake");.    s
3090: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
30a0: 3d 20 7e 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b  = ~TLS_TCL_INIT;
30b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
30c0: 65 74 75 72 6e 69 6e 67 20 73 75 63 63 65 73 73  eturning success
30d0: 22 29 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f  ");.    *errorCo
30e0: 64 65 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 72  dePtr = 0;.    r
30f0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 1;.}../*. 
3100: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3150: 2a 0a 20 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f  *. * TlsInputPro
3160: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
3170: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
3180: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  oked by the gene
3190: 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 74 6f  ric I/O layer to
31a0: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 0a   read data from.
31b0: 20 2a 09 74 68 65 20 42 49 4f 20 77 68 65 6e 65   *.the BIO whene
31c0: 76 65 72 20 74 68 65 20 54 63 6c 5f 52 65 61 64  ver the Tcl_Read
31d0: 28 29 2c 20 54 63 6c 5f 52 65 61 64 43 68 61 72  (), Tcl_ReadChar
31e0: 73 2c 20 54 63 6c 5f 47 65 74 73 2c 20 61 6e 64  s, Tcl_Gets, and
31f0: 0a 20 2a 09 54 63 6c 5f 47 65 74 73 4f 62 6a 20  . *.Tcl_GetsObj 
3200: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73  functions are us
3210: 65 64 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 74  ed. Equivalent t
3220: 6f 20 53 53 4c 5f 72 65 61 64 5f 65 78 20 61 6e  o SSL_read_ex an
3230: 64 20 53 53 4c 5f 72 65 61 64 2e 0a 20 2a 0a 20  d SSL_read.. *. 
3240: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65  * Results:. *.Re
3250: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
3260: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 6f   of bytes read o
3270: 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 53  r -1 on error. S
3280: 65 74 73 20 65 72 72 6f 72 43 6f 64 65 50 74 72  ets errorCodePtr
3290: 20 74 6f 0a 20 2a 09 61 20 50 4f 53 49 58 20 65   to. *.a POSIX e
32a0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
32b0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
32c0: 6f 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a  or 0 if none.. *
32d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
32e0: 3a 0a 20 2a 09 52 65 61 64 73 20 69 6e 70 75 74  :. *.Reads input
32f0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
3300: 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68  device of the ch
3310: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 44 61 74  annel.. *. * Dat
3320: 61 20 69 73 20 72 65 63 65 69 76 65 64 20 69 6e  a is received in
3330: 20 77 68 6f 6c 65 20 62 6c 6f 63 6b 73 20 6b 6e   whole blocks kn
3340: 6f 77 6e 20 61 73 20 72 65 63 6f 72 64 73 20 66  own as records f
3350: 72 6f 6d 20 74 68 65 20 70 65 65 72 2e 20 41 20  rom the peer. A 
3360: 77 68 6f 6c 65 0a 20 2a 20 72 65 63 6f 72 64 20  whole. * record 
3370: 69 73 20 70 72 6f 63 65 73 73 65 64 20 28 65 2e  is processed (e.
3380: 67 2e 20 64 65 63 72 79 70 74 65 64 29 20 69 6e  g. decrypted) in
3390: 20 6f 6e 65 20 67 6f 20 61 6e 64 20 69 73 20 62   one go and is b
33a0: 75 66 66 65 72 65 64 20 62 79 20 4f 70 65 6e 53  uffered by OpenS
33b0: 53 4c 0a 20 2a 20 75 6e 74 69 6c 20 69 74 20 69  SL. * until it i
33c0: 73 20 72 65 61 64 20 62 79 20 74 68 65 20 61 70  s read by the ap
33d0: 70 6c 69 63 61 74 69 6f 6e 20 76 69 61 20 61 20  plication via a 
33e0: 63 61 6c 6c 20 74 6f 20 53 53 4c 5f 72 65 61 64  call to SSL_read
33f0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3450: 69 6e 74 20 54 6c 73 49 6e 70 75 74 50 72 6f 63  int TlsInputProc
3460: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
3470: 61 6e 63 65 44 61 74 61 2c 20 63 68 61 72 20 2a  anceData, char *
3480: 62 75 66 2c 20 69 6e 74 20 62 75 66 53 69 7a 65  buf, int bufSize
3490: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
34a0: 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 67  Ptr) {.    unsig
34b0: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67  ned long backing
34c0: 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65  Error;.    State
34d0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
34e0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
34f0: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 74  ata;.    int byt
3500: 65 73 52 65 61 64 2c 20 65 72 72 3b 0a 20 20 20  esRead, err;.   
3510: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
3520: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
3530: 28 22 52 65 61 64 28 25 64 29 22 2c 20 62 75 66  ("Read(%d)", buf
3540: 53 69 7a 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  Size);..    /* S
3550: 6b 69 70 20 69 66 20 75 73 65 72 20 76 65 72 69  kip if user veri
3560: 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73  fy callback is s
3570: 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 2a 2f 0a  till running */.
3580: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
3590: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
35a0: 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64  L_CALLBACK) {..d
35b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b  printf("Callback
35c0: 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 72 65 61   is running, rea
35d0: 64 69 6e 67 20 30 20 62 79 74 65 73 22 29 3b 0a  ding 0 bytes");.
35e0: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d  .return 0;.    }
35f0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ..    /* If not 
3600: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 64 6f 20  initialized, do 
3610: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 2f  connect */.    /
3620: 2a 20 43 61 6e 20 61 6c 73 6f 20 63 68 65 63 6b  * Can also check
3630: 20 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e   SSL_is_init_fin
3640: 69 73 68 65 64 28 73 73 6c 29 20 2a 2f 0a 20 20  ished(ssl) */.  
3650: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3660: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
3670: 49 4e 49 54 29 20 7b 0a 09 69 6e 74 20 74 6c 73  INIT) {..int tls
3680: 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70 72 69 6e  Connect;...dprin
3690: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f  tf("Calling Tls_
36a0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29  WaitForConnect")
36b0: 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63 74 20 3d  ;...tlsConnect =
36c0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
36d0: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72  ect(statePtr, er
36e0: 72 6f 72 43 6f 64 65 50 74 72 2c 20 30 29 3b 0a  rorCodePtr, 0);.
36f0: 09 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20  .if (tlsConnect 
3700: 3c 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69  < 0) {..    dpri
3710: 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f  ntf("Got an erro
3720: 72 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e  r waiting to con
3730: 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74  nect (tlsConnect
3740: 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64   = %i, *errorCod
3750: 65 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73  ePtr = %i)", tls
3760: 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43  Connect, *errorC
3770: 6f 64 65 50 74 72 29 3b 0a 0a 09 20 20 20 20 62  odePtr);...    b
3780: 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09  ytesRead = -1;..
3790: 20 20 20 20 69 66 20 28 2a 65 72 72 6f 72 43 6f      if (*errorCo
37a0: 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45  dePtr == ECONNRE
37b0: 53 45 54 29 20 7b 0a 09 09 64 70 72 69 6e 74 66  SET) {...dprintf
37c0: 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  ("Got connection
37d0: 20 72 65 73 65 74 22 29 3b 0a 09 09 2f 2a 20 53   reset");.../* S
37e0: 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 09 2a 65 72  oft EOF */...*er
37f0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
3800: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b  ..bytesRead = 0;
3810: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74  ..    }..    ret
3820: 75 72 6e 20 62 79 74 65 73 52 65 61 64 3b 0a 09  urn bytesRead;..
3830: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  }.    }..    /*.
3840: 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74       * We need t
3850: 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20  o clear the SSL 
3860: 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20  error stack now 
3870: 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74  because we somet
3880: 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 20  imes reach.     
3890: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
38a0: 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72  with leftover er
38b0: 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63  rors in the stac
38c0: 6b 2e 20 20 49 66 20 42 49 4f 5f 72 65 61 64 0a  k.  If BIO_read.
38d0: 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d       * returns -
38e0: 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41  1 and intends EA
38f0: 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61  GAIN, there is a
3900: 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c   leftover error,
3910: 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20   it will be.    
3920: 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20   * misconstrued 
3930: 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74  as an error, not
3940: 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a   EAGAIN..     *.
3950: 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69       * Alternati
3960: 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e  vely, we may wan
3970: 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  t to handle the 
3980: 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  <0 return codes 
3990: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f  from.     * BIO_
39a0: 72 65 61 64 20 73 70 65 63 69 61 6c 6c 79 20 28  read specially (
39b0: 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 68  as advised in th
39c0: 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c  e RSA docs).  TL
39d0: 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 20  S's lower level 
39e0: 42 49 4f 0a 20 20 20 20 20 2a 20 66 75 6e 63 74  BIO.     * funct
39f0: 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 74  ions play with t
3a00: 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 74  he retry flags t
3a10: 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 20  hough, and this 
3a20: 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 0a 20 20  seems to work.  
3a30: 20 20 20 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20     * correctly. 
3a40: 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e 20   Similar fix in 
3a50: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e 20 2d  TlsOutputProc. -
3a60: 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20   hobbs.     */. 
3a70: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
3a80: 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f 5f 63 6c  or();.    BIO_cl
3a90: 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 73 28  ear_retry_flags(
3aa0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
3ab0: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20      bytesRead = 
3ac0: 42 49 4f 5f 72 65 61 64 28 73 74 61 74 65 50 74  BIO_read(statePt
3ad0: 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 62 75 66  r->bio, buf, buf
3ae0: 53 69 7a 65 29 3b 0a 20 20 20 20 64 70 72 69 6e  Size);.    dprin
3af0: 74 66 28 22 42 49 4f 5f 72 65 61 64 20 2d 3e 20  tf("BIO_read -> 
3b00: 25 64 22 2c 20 62 79 74 65 73 52 65 61 64 29 3b  %d", bytesRead);
3b10: 0a 0a 20 20 20 20 2f 2a 20 53 61 6d 65 20 61 73  ..    /* Same as
3b20: 20 53 53 4c 5f 77 61 6e 74 2c 20 62 75 74 20 61   SSL_want, but a
3b30: 6c 73 6f 20 63 68 65 63 6b 73 20 74 68 65 20 65  lso checks the e
3b40: 72 72 6f 72 20 71 75 65 75 65 20 2a 2f 0a 20 20  rror queue */.  
3b50: 20 20 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f    err = SSL_get_
3b60: 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e  error(statePtr->
3b70: 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 29 3b  ssl, bytesRead);
3b80: 0a 20 20 20 20 62 61 63 6b 69 6e 67 45 72 72 6f  .    backingErro
3b90: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f  r = ERR_get_erro
3ba0: 72 28 29 3b 0a 0a 20 20 20 20 69 66 20 28 62 79  r();..    if (by
3bb0: 74 65 73 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a  tesRead <= 0) {.
3bc0: 09 2f 2a 20 54 68 65 20 72 65 74 72 79 20 66 6c  ./* The retry fl
3bd0: 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68 65  ag is set by the
3be0: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 2a   BIO_set_retry_*
3bf0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 09 69   functions */..i
3c00: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65  f (BIO_should_re
3c10: 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69  try(statePtr->bi
3c20: 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  o)) {..    dprin
3c30: 74 66 28 22 52 65 61 64 20 66 61 69 6c 65 64 20  tf("Read failed 
3c40: 77 69 74 68 20 63 6f 64 65 3d 25 64 2c 20 62 79  with code=%d, by
3c50: 74 65 73 20 72 65 61 64 3d 25 64 3a 20 73 68 6f  tes read=%d: sho
3c60: 75 6c 64 20 72 65 74 72 79 22 2c 20 65 72 72 2c  uld retry", err,
3c70: 20 62 79 74 65 73 52 65 61 64 29 3b 0a 09 20 20   bytesRead);..  
3c80: 20 20 2f 2a 20 53 6f 6d 65 20 64 6f 63 73 20 69    /* Some docs i
3c90: 6d 70 6c 79 20 77 65 20 73 68 6f 75 6c 64 20 72  mply we should r
3ca0: 65 64 6f 20 74 68 65 20 42 49 4f 5f 72 65 61 64  edo the BIO_read
3cb0: 20 6e 6f 77 20 2a 2f 0a 09 7d 20 65 6c 73 65 20   now */..} else 
3cc0: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
3cd0: 52 65 61 64 20 66 61 69 6c 65 64 20 77 69 74 68  Read failed with
3ce0: 20 63 6f 64 65 3d 25 64 2c 20 62 79 74 65 73 20   code=%d, bytes 
3cf0: 72 65 61 64 3d 25 64 3a 20 65 72 72 6f 72 20 63  read=%d: error c
3d00: 6f 6e 64 69 74 69 6f 6e 22 2c 20 65 72 72 2c 20  ondition", err, 
3d10: 62 79 74 65 73 52 65 61 64 29 3b 0a 09 7d 0a 0a  bytesRead);..}..
3d20: 09 64 70 72 69 6e 74 66 28 22 42 49 4f 20 69 73  .dprintf("BIO is
3d30: 20 45 4f 46 20 25 64 22 2c 20 42 49 4f 5f 65 6f   EOF %d", BIO_eo
3d40: 66 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  f(statePtr->bio)
3d50: 29 3b 0a 0a 09 2f 2a 20 54 68 65 73 65 20 61 72  );.../* These ar
3d60: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 42 49  e the same as BI
3d70: 4f 5f 72 65 74 72 79 5f 74 79 70 65 20 2a 2f 0a  O_retry_type */.
3d80: 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f  .if (BIO_should_
3d90: 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62  read(statePtr->b
3da0: 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69  io)) {..    dpri
3db0: 6e 74 66 28 22 42 49 4f 20 68 61 73 20 69 6e 73  ntf("BIO has ins
3dc0: 75 66 66 69 63 69 65 6e 74 20 64 61 74 61 20 74  ufficient data t
3dd0: 6f 20 72 65 61 64 20 61 6e 64 20 72 65 74 75 72  o read and retur
3de0: 6e 22 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50  n");..    stateP
3df0: 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f  tr->want |= TCL_
3e00: 52 45 41 44 41 42 4c 45 3b 0a 09 7d 0a 09 69 66  READABLE;..}..if
3e10: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 77 72 69   (BIO_should_wri
3e20: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  te(statePtr->bio
3e30: 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  )) {..    dprint
3e40: 66 28 22 42 49 4f 20 68 61 73 20 70 65 6e 64 69  f("BIO has pendi
3e50: 6e 67 20 64 61 74 61 20 74 6f 20 77 72 69 74 65  ng data to write
3e60: 22 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ");..    statePt
3e70: 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 57  r->want |= TCL_W
3e80: 52 49 54 41 42 4c 45 3b 0a 09 7d 0a 09 69 66 20  RITABLE;..}..if 
3e90: 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 69 6f 5f 73  (BIO_should_io_s
3ea0: 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d  pecial(statePtr-
3eb0: 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 69 6e  >bio)) {..    in
3ec0: 74 20 72 65 61 73 6f 6e 20 3d 20 42 49 4f 5f 67  t reason = BIO_g
3ed0: 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e 28  et_retry_reason(
3ee0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
3ef0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49  .    dprintf("BI
3f00: 4f 20 68 61 73 20 73 6f 6d 65 20 73 70 65 63 69  O has some speci
3f10: 61 6c 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 74 68  al condition oth
3f20: 65 72 20 74 68 61 6e 20 72 65 61 64 20 6f 72 20  er than read or 
3f30: 77 72 69 74 65 3a 20 63 6f 64 65 3d 25 64 22 2c  write: code=%d",
3f40: 20 72 65 61 73 6f 6e 29 3b 0a 09 7d 0a 09 64 70   reason);..}..dp
3f50: 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20 70  rintf("BIO has p
3f60: 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f 20 77  ending data to w
3f70: 72 69 74 65 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  rite");.    }.. 
3f80: 20 20 20 73 77 69 74 63 68 20 28 65 72 72 29 20     switch (err) 
3f90: 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  {..case SSL_ERRO
3fa0: 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20  R_NONE:..    /* 
3fb0: 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f  I/O operation co
3fc0: 6d 70 6c 65 74 65 64 20 2a 2f 0a 09 20 20 20 20  mpleted */..    
3fd0: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52  dprintf("SSL_ERR
3fe0: 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20  OR_NONE");..    
3ff0: 64 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66  dprintBuffer(buf
4000: 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a 09 20  , bytesRead);.. 
4010: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
4020: 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a   SSL_ERROR_SSL:.
4030: 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65  .    /* A non-re
4040: 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c  coverable, fatal
4050: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53   error in the SS
4060: 4c 20 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72  L library occurr
4070: 65 64 2c 20 75 73 75 61 6c 6c 79 20 61 20 70 72  ed, usually a pr
4080: 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a  otocol error */.
4090: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
40a0: 4c 20 65 72 72 6f 72 2c 20 69 6e 64 69 63 61 74  L error, indicat
40b0: 69 6e 67 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ing that the con
40c0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  nection has been
40d0: 20 61 62 6f 72 74 65 64 22 29 3b 0a 09 20 20 20   aborted");..   
40e0: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f   if (backingErro
40f0: 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f  r != 0) {...Tls_
4100: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
4110: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
4120: 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45  _string(backingE
4130: 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 20 65  rror));..    } e
4140: 6c 73 65 20 69 66 20 28 53 53 4c 5f 67 65 74 5f  lse if (SSL_get_
4150: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74  verify_result(st
4160: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20  atePtr->ssl) != 
4170: 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54  X509_V_OK) {...T
4180: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4190: 72 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r, X509_verify_c
41a0: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
41b0: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
41c0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
41d0: 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20  >ssl)));..    } 
41e0: 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72  else {...Tls_Err
41f0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e  or(statePtr, "Un
4200: 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22  known SSL error"
4210: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a  );..    }..    *
4220: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
4230: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20  CONNABORTED;..  
4240: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31    bytesRead = -1
4250: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
4260: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
4270: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
4280: 20 20 2f 2a 20 55 6e 65 78 70 65 63 74 65 64 20    /* Unexpected 
4290: 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 65 65  EOF from the pee
42a0: 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 33 2e  r for OpenSSL 3.
42b0: 30 2b 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 45  0+ */..    if (E
42c0: 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e 28 62 61  RR_GET_REASON(ba
42d0: 63 6b 69 6e 67 45 72 72 6f 72 29 20 3d 3d 20 53  ckingError) == S
42e0: 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54 45 44 5f  SL_R_UNEXPECTED_
42f0: 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41 44 49 4e  EOF_WHILE_READIN
4300: 47 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  G) {...dprintf("
4310: 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46  (Unexpected) EOF
4320: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72   reached")...*er
4330: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
4340: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b  ..bytesRead = 0;
4350: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
4360: 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 61 63  tePtr, "EOF reac
4370: 68 65 64 22 29 3b 0a 09 20 20 20 20 7d 0a 23 65  hed");..    }.#e
4380: 6e 64 69 66 0a 09 20 20 20 20 62 72 65 61 6b 3b  ndif..    break;
4390: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
43a0: 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20  R_WANT_READ:..  
43b0: 20 20 2f 2a 20 4f 70 20 64 69 64 20 6e 6f 74 20    /* Op did not 
43c0: 63 6f 6d 70 6c 65 74 65 20 64 75 65 20 74 6f 20  complete due to 
43d0: 6e 6f 74 20 65 6e 6f 75 67 68 20 64 61 74 61 20  not enough data 
43e0: 77 61 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  was available. R
43f0: 65 74 72 79 20 6c 61 74 65 72 2e 20 2a 2f 0a 09  etry later. */..
4400: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
4410: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
4420: 52 45 41 44 2c 20 6d 61 70 70 69 6e 67 20 74 68  READ, mapping th
4430: 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a  is to EAGAIN");.
4440: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
4450: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
4460: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31    bytesRead = -1
4470: 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
4480: 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 52 45 41  >want |= TCL_REA
4490: 44 41 42 4c 45 3b 0a 09 20 20 20 20 42 49 4f 5f  DABLE;..    BIO_
44a0: 73 65 74 5f 72 65 74 72 79 5f 72 65 61 64 28 73  set_retry_read(s
44b0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
44c0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
44d0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  e SSL_ERROR_WANT
44e0: 5f 57 52 49 54 45 3a 0a 09 20 20 20 20 2f 2a 20  _WRITE:..    /* 
44f0: 4f 70 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c  Op did not compl
4500: 65 74 65 20 64 75 65 20 74 6f 20 75 6e 61 62 6c  ete due to unabl
4510: 65 20 74 6f 20 73 65 6e 64 20 61 6c 6c 20 64 61  e to send all da
4520: 74 61 20 74 6f 20 74 68 65 20 42 49 4f 2e 20 52  ta to the BIO. R
4530: 65 74 72 79 20 6c 61 74 65 72 2e 20 2a 2f 0a 09  etry later. */..
4540: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
4550: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
4560: 57 52 49 54 45 2c 20 6d 61 70 70 69 6e 67 20 74  WRITE, mapping t
4570: 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b  his to EAGAIN");
4580: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
4590: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
45a0: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d     bytesRead = -
45b0: 31 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72  1;..    statePtr
45c0: 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 57 52  ->want |= TCL_WR
45d0: 49 54 41 42 4c 45 3b 0a 09 20 20 20 20 42 49 4f  ITABLE;..    BIO
45e0: 5f 73 65 74 5f 72 65 74 72 79 5f 77 72 69 74 65  _set_retry_write
45f0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
4600: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
4610: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
4620: 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a  NT_X509_LOOKUP:.
4630: 09 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 6e 27  .    /* Op didn'
4640: 74 20 63 6f 6d 70 6c 65 74 65 20 73 69 6e 63 65  t complete since
4650: 20 63 61 6c 6c 62 61 63 6b 20 73 65 74 20 62 79   callback set by
4660: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69   SSL_CTX_set_cli
4670: 65 6e 74 5f 63 65 72 74 5f 63 62 28 29 20 61 73  ent_cert_cb() as
4680: 6b 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ked to be called
4690: 20 61 67 61 69 6e 20 2a 2f 0a 09 20 20 20 20 64   again */..    d
46a0: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f  printf("Got SSL_
46b0: 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f  ERROR_WANT_X509_
46c0: 4c 4f 4f 4b 55 50 2c 20 6d 61 70 70 69 6e 67 20  LOOKUP, mapping 
46d0: 69 74 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a  it to EAGAIN");.
46e0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
46f0: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
4700: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31    bytesRead = -1
4710: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
4720: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53  case SSL_ERROR_S
4730: 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20  YSCALL:..    /* 
4740: 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72  Some non-recover
4750: 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20  able, fatal I/O 
4760: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
4770: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
4780: 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c  SSL_ERROR_SYSCAL
4790: 4c 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 62  L");...    if (b
47a0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30  ackingError == 0
47b0: 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d   && bytesRead ==
47c0: 20 30 29 20 7b 0a 09 09 2f 2a 20 55 6e 65 78 70   0) {.../* Unexp
47d0: 65 63 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 74  ected EOF from t
47e0: 68 65 20 70 65 65 72 20 66 6f 72 20 4f 70 65 6e  he peer for Open
47f0: 53 53 4c 20 31 2e 31 20 2a 2f 0a 09 09 64 70 72  SSL 1.1 */...dpr
4800: 69 6e 74 66 28 22 28 55 6e 65 78 70 65 63 74 65  intf("(Unexpecte
4810: 64 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 29  d) EOF reached")
4820: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
4830: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61   = 0;...bytesRea
4840: 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72  d = 0;...Tls_Err
4850: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f  or(statePtr, "EO
4860: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20  F reached");... 
4870: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61     } else if (ba
4880: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20  ckingError == 0 
4890: 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20  && bytesRead == 
48a0: 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28  -1) {...dprintf(
48b0: 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  "I/O error occur
48c0: 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75  red (errno = %lu
48d0: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
48e0: 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  ng) Tcl_GetErrno
48f0: 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64  ());...*errorCod
4900: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72  ePtr = Tcl_GetEr
4910: 72 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73 52 65  rno();...bytesRe
4920: 61 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45  ad = -1;...Tls_E
4930: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 54  rror(statePtr, T
4940: 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a 65 72 72  cl_ErrnoMsg(*err
4950: 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20  orCodePtr));... 
4960: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70     } else {...dp
4970: 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72  rintf("I/O error
4980: 20 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b 69   occurred (backi
4990: 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c  ngError = %lu)",
49a0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a   backingError);.
49b0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
49c0: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  = Tcl_GetErrno()
49d0: 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20  ;...bytesRead = 
49e0: 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28  -1;...Tls_Error(
49f0: 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65  statePtr, ERR_re
4a00: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
4a10: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29  g(backingError))
4a20: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72  ;..    }..    br
4a30: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
4a40: 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52  ERROR_ZERO_RETUR
4a50: 4e 3a 0a 09 20 20 20 20 2f 2a 20 50 65 65 72 20  N:..    /* Peer 
4a60: 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63  has closed the c
4a70: 6f 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e  onnection by sen
4a80: 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e  ding the close_n
4a90: 6f 74 69 66 79 20 61 6c 65 72 74 2e 20 43 61 6e  otify alert. Can
4aa0: 27 74 20 72 65 61 64 2c 20 62 75 74 20 63 61 6e  't read, but can
4ab0: 20 77 72 69 74 65 2e 20 2a 2f 0a 09 20 20 20 20   write. */..    
4ac0: 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 74 75 72  /* Need to retur
4ad0: 6e 20 61 6e 20 45 4f 46 2c 20 73 6f 20 63 68 61  n an EOF, so cha
4ae0: 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 20 77  nnel is closed w
4af0: 68 69 63 68 20 77 69 6c 6c 20 73 65 6e 64 20 61  hich will send a
4b00: 6e 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 29  n SSL_shutdown()
4b10: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  . */..    dprint
4b20: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52  f("Got SSL_ERROR
4b30: 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74 68  _ZERO_RETURN, th
4b40: 69 73 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46 20  is means an EOF 
4b50: 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64  has been reached
4b60: 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65  ");..    bytesRe
4b70: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72  ad = 0;..    *er
4b80: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
4b90: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73  .    Tls_Error(s
4ba0: 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68  tatePtr, "Peer h
4bb0: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f  as closed the co
4bc0: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69  nnection for wri
4bd0: 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20  ting by sending 
4be0: 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79  the close_notify
4bf0: 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62   alert");..    b
4c00: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c  reak;...case SSL
4c10: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e  _ERROR_WANT_ASYN
4c20: 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20  C:..    /* Used 
4c30: 77 69 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f  with flag SSL_MO
4c40: 44 45 5f 41 53 59 4e 43 2c 20 6f 70 20 64 69 64  DE_ASYNC, op did
4c50: 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  n't complete bec
4c60: 61 75 73 65 20 61 6e 20 61 73 79 6e 63 20 65 6e  ause an async en
4c70: 67 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72  gine is still pr
4c80: 6f 63 65 73 73 69 6e 67 20 64 61 74 61 20 2a 2f  ocessing data */
4c90: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47  ..    dprintf("G
4ca0: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  ot SSL_ERROR_WAN
4cb0: 54 5f 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67  T_ASYNC, mapping
4cc0: 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22   this to EAGAIN"
4cd0: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
4ce0: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
4cf0: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
4d00: 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b   -1;..    break;
4d10: 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20  ...default:..   
4d20: 20 64 70 72 69 6e 74 66 28 22 55 6e 6b 6e 6f 77   dprintf("Unknow
4d30: 6e 20 65 72 72 6f 72 20 28 65 72 72 20 3d 20 25  n error (err = %
4d40: 69 29 2c 20 6d 61 70 70 69 6e 67 20 74 6f 20 45  i), mapping to E
4d50: 4f 46 22 2c 20 65 72 72 29 3b 0a 09 20 20 20 20  OF", err);..    
4d60: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
4d70: 30 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61  0;..    bytesRea
4d80: 64 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73 5f  d = 0;..    Tls_
4d90: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
4da0: 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 29  "Unknown error")
4db0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
4dc0: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
4dd0: 28 22 49 6e 70 75 74 28 25 64 29 20 2d 3e 20 25  ("Input(%d) -> %
4de0: 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 69 7a 65  d [%d]", bufSize
4df0: 2c 20 62 79 74 65 73 52 65 61 64 2c 20 2a 65 72  , bytesRead, *er
4e00: 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20 20 20  rorCodePtr);.   
4e10: 20 72 65 74 75 72 6e 20 62 79 74 65 73 52 65 61   return bytesRea
4e20: 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  d;.}../*. *-----
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
4e80: 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a  lsOutputProc --.
4e90: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
4ea0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
4eb0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
4ec0: 2f 4f 20 6c 61 79 65 72 20 74 6f 20 77 72 69 74  /O layer to writ
4ed0: 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 20 2a  e data to the. *
4ee0: 09 42 49 4f 20 77 68 65 6e 65 76 65 72 20 74 68  .BIO whenever th
4ef0: 65 20 74 68 65 20 54 63 6c 5f 57 72 69 74 65 28  e the Tcl_Write(
4f00: 29 2c 20 54 63 6c 5f 57 72 69 74 65 43 68 61 72  ), Tcl_WriteChar
4f10: 73 2c 20 61 6e 64 20 54 63 6c 5f 57 72 69 74 65  s, and Tcl_Write
4f20: 4f 62 6a 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 73  Obj. *.functions
4f30: 20 61 72 65 20 75 73 65 64 2e 20 45 71 75 69 76   are used. Equiv
4f40: 61 6c 65 6e 74 20 74 6f 20 53 53 4c 5f 77 72 69  alent to SSL_wri
4f50: 74 65 5f 65 78 20 61 6e 64 20 53 53 4c 5f 77 72  te_ex and SSL_wr
4f60: 69 74 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ite.. *. * Resul
4f70: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74  ts:. *.Returns t
4f80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4f90: 65 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31  es written or -1
4fa0: 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20   on error. Sets 
4fb0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 20 2a 09  errorCodePtr. *.
4fc0: 74 6f 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72  to a POSIX error
4fd0: 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
4fe0: 72 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30  r occurred, or 0
4ff0: 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20   if none.. *. * 
5000: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
5010: 09 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 6f  .Writes output o
5020: 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 65 76  n the output dev
5030: 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e  ice of the chann
5040: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
50a0: 63 20 69 6e 74 20 54 6c 73 4f 75 74 70 75 74 50  c int TlsOutputP
50b0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
50c0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 63 6f 6e  nstanceData, con
50d0: 73 74 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e  st char *buf, in
50e0: 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a  t toWrite, int *
50f0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a  errorCodePtr) {.
5100: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
5110: 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a  g backingError;.
5120: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
5130: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
5140: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
5150: 20 20 69 6e 74 20 77 72 69 74 74 65 6e 2c 20 65    int written, e
5160: 72 72 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f  rr;.    *errorCo
5170: 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  dePtr = 0;..    
5180: 64 70 72 69 6e 74 66 28 22 57 72 69 74 65 28 25  dprintf("Write(%
5190: 70 2c 20 25 64 29 22 2c 20 28 76 6f 69 64 20 2a  p, %d)", (void *
51a0: 29 20 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72  ) statePtr, toWr
51b0: 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ite);.    dprint
51c0: 42 75 66 66 65 72 28 62 75 66 2c 20 74 6f 57 72  Buffer(buf, toWr
51d0: 69 74 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b  ite);..    /* Sk
51e0: 69 70 20 69 66 20 75 73 65 72 20 76 65 72 69 66  ip if user verif
51f0: 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74  y callback is st
5200: 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 2a 2f 0a 20  ill running */. 
5210: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
5220: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
5230: 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70  _CALLBACK) {..dp
5240: 72 69 6e 74 66 28 22 44 6f 6e 27 74 20 70 72 6f  rintf("Don't pro
5250: 63 65 73 73 20 6f 75 74 70 75 74 20 77 68 69 6c  cess output whil
5260: 65 20 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20  e callbacks are 
5270: 72 75 6e 6e 69 6e 67 22 29 3b 0a 09 77 72 69 74  running");..writ
5280: 74 65 6e 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f  ten = -1;..*erro
5290: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
52a0: 4e 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20  N;..return -1;. 
52b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
52c0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  not initialized,
52d0: 20 64 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20   do connect */. 
52e0: 20 20 20 2f 2a 20 43 61 6e 20 61 6c 73 6f 20 63     /* Can also c
52f0: 68 65 63 6b 20 53 53 4c 5f 69 73 5f 69 6e 69 74  heck SSL_is_init
5300: 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 20 2a  _finished(ssl) *
5310: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
5320: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
5330: 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 69 6e 74  TCL_INIT) {..int
5340: 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64   tlsConnect;...d
5350: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
5360: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
5370: 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65  ct");...tlsConne
5380: 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  ct = Tls_WaitFor
5390: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
53a0: 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20  , errorCodePtr, 
53b0: 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f 6e 6e  1);..if (tlsConn
53c0: 65 63 74 20 3c 20 30 29 20 7b 0a 09 20 20 20 20  ect < 0) {..    
53d0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20  dprintf("Got an 
53e0: 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f  error waiting to
53f0: 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e   connect (tlsCon
5400: 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f  nect = %i, *erro
5410: 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c  rCodePtr = %i)",
5420: 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a 65 72   tlsConnect, *er
5430: 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a 09 20  rorCodePtr);... 
5440: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b     written = -1;
5450: 0a 09 20 20 20 20 69 66 20 28 2a 65 72 72 6f 72  ..    if (*error
5460: 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e  CodePtr == ECONN
5470: 52 45 53 45 54 29 20 7b 0a 09 09 64 70 72 69 6e  RESET) {...dprin
5480: 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69  tf("Got connecti
5490: 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 2f 2a  on reset");.../*
54a0: 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 09 2a   Soft EOF */...*
54b0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
54c0: 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 30 3b  ;...written = 0;
54d0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74  ..    }..    ret
54e0: 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a 09 7d 0a  urn written;..}.
54f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74      }..    if (t
5500: 6f 57 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09  oWrite == 0) {..
5510: 64 70 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72  dprintf("zero-wr
5520: 69 74 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 49  ite");..err = BI
5530: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72  O_flush(statePtr
5540: 2d 3e 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72  ->bio);...if (er
5550: 72 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 64  r <= 0) {..    d
5560: 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67  printf("Flushing
5570: 20 66 61 69 6c 65 64 22 29 3b 0a 09 20 20 20 20   failed");..    
5580: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
5590: 74 72 2c 20 22 46 6c 75 73 68 20 66 61 69 6c 65  tr, "Flush faile
55a0: 64 22 29 3b 0a 0a 09 20 20 20 20 2a 65 72 72 6f  d");...    *erro
55b0: 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a  rCodePtr = EIO;.
55c0: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30  .    written = 0
55d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ;..    return -1
55e0: 3b 0a 09 7d 0a 0a 09 77 72 69 74 74 65 6e 20 3d  ;..}...written =
55f0: 20 30 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50   0;..*errorCodeP
5600: 74 72 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20  tr = 0;..return 
5610: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
5620: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20  .     * We need 
5630: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c  to clear the SSL
5640: 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77   error stack now
5650: 20 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65   because we some
5660: 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20  times reach.    
5670: 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e   * this function
5680: 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65   with leftover e
5690: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61  rrors in the sta
56a0: 63 6b 2e 20 20 49 66 20 42 49 4f 5f 77 72 69 74  ck.  If BIO_writ
56b0: 65 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73  e.     * returns
56c0: 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20   -1 and intends 
56d0: 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73  EAGAIN, there is
56e0: 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f   a leftover erro
56f0: 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20  r, it will be.  
5700: 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65     * misconstrue
5710: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e  d as an error, n
5720: 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20  ot EAGAIN..     
5730: 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61  *.     * Alterna
5740: 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77  tively, we may w
5750: 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ant to handle th
5760: 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65  e <0 return code
5770: 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49  s from.     * BI
5780: 4f 5f 77 72 69 74 65 20 73 70 65 63 69 61 6c 6c  O_write speciall
5790: 79 20 28 61 73 20 61 64 76 69 73 65 64 20 69 6e  y (as advised in
57a0: 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20   the RSA docs). 
57b0: 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76   TLS's lower lev
57c0: 65 6c 0a 20 20 20 20 20 2a 20 42 49 4f 20 66 75  el.     * BIO fu
57d0: 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74  nctions play wit
57e0: 68 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 67  h the retry flag
57f0: 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68  s though, and th
5800: 69 73 20 73 65 65 6d 73 20 74 6f 0a 20 20 20 20  is seems to.    
5810: 20 2a 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c   * work correctl
5820: 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20  y.  Similar fix 
5830: 69 6e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2e  in TlsInputProc.
5840: 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f   - hobbs.     */
5850: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
5860: 72 72 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f 5f  rror();.    BIO_
5870: 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67  clear_retry_flag
5880: 73 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  s(statePtr->bio)
5890: 3b 0a 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ;.    written = 
58a0: 42 49 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50  BIO_write(stateP
58b0: 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f  tr->bio, buf, to
58c0: 57 72 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69  Write);.    dpri
58d0: 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25  ntf("BIO_write(%
58e0: 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c  p, %d) -> [%d]",
58f0: 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50   (void *) stateP
5900: 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69  tr, toWrite, wri
5910: 74 74 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  tten);..    /* S
5920: 61 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c  ame as SSL_want,
5930: 20 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73   but also checks
5940: 20 74 68 65 20 65 72 72 6f 72 20 71 75 65 75 65   the error queue
5950: 20 2a 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 53   */.    err = SS
5960: 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74  L_get_error(stat
5970: 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74  ePtr->ssl, writt
5980: 65 6e 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67  en);.    backing
5990: 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f  Error = ERR_get_
59a0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 66  error();..    if
59b0: 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 20   (written <= 0) 
59c0: 7b 0a 09 2f 2a 20 54 68 65 20 72 65 74 72 79 20  {../* The retry 
59d0: 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74  flag is set by t
59e0: 68 65 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79  he BIO_set_retry
59f0: 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  _* functions */.
5a00: 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f  .if (BIO_should_
5a10: 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e  retry(statePtr->
5a20: 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72  bio)) {..    dpr
5a30: 69 6e 74 66 28 22 57 72 69 74 65 20 66 61 69 6c  intf("Write fail
5a40: 65 64 20 77 69 74 68 20 63 6f 64 65 20 25 64 2c  ed with code %d,
5a50: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 3d 25   bytes written=%
5a60: 64 3a 20 73 68 6f 75 6c 64 20 72 65 74 72 79 22  d: should retry"
5a70: 2c 20 65 72 72 2c 20 77 72 69 74 74 65 6e 29 3b  , err, written);
5a80: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
5a90: 64 70 72 69 6e 74 66 28 22 57 72 69 74 65 20 66  dprintf("Write f
5aa0: 61 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 20  ailed with code 
5ab0: 25 64 2c 20 62 79 74 65 73 20 77 72 69 74 74 65  %d, bytes writte
5ac0: 6e 3d 25 64 3a 20 65 72 72 6f 72 20 63 6f 6e 64  n=%d: error cond
5ad0: 69 74 69 6f 6e 22 2c 20 65 72 72 2c 20 77 72 69  ition", err, wri
5ae0: 74 74 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54  tten);..}.../* T
5af0: 68 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d  hese are the sam
5b00: 65 20 61 73 20 42 49 4f 5f 72 65 74 72 79 5f 74  e as BIO_retry_t
5b10: 79 70 65 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f  ype */..if (BIO_
5b20: 73 68 6f 75 6c 64 5f 72 65 61 64 28 73 74 61 74  should_read(stat
5b30: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20  ePtr->bio)) {.. 
5b40: 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20     dprintf("BIO 
5b50: 68 61 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74  has insufficient
5b60: 20 64 61 74 61 20 74 6f 20 72 65 61 64 20 61 6e   data to read an
5b70: 64 20 72 65 74 75 72 6e 22 29 3b 0a 09 7d 0a 09  d return");..}..
5b80: 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 77  if (BIO_should_w
5b90: 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62  rite(statePtr->b
5ba0: 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69  io)) {..    dpri
5bb0: 6e 74 66 28 22 42 49 4f 20 68 61 73 20 70 65 6e  ntf("BIO has pen
5bc0: 64 69 6e 67 20 64 61 74 61 20 74 6f 20 77 72 69  ding data to wri
5bd0: 74 65 22 29 3b 0a 09 7d 0a 09 69 66 20 28 42 49  te");..}..if (BI
5be0: 4f 5f 73 68 6f 75 6c 64 5f 69 6f 5f 73 70 65 63  O_should_io_spec
5bf0: 69 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ial(statePtr->bi
5c00: 6f 29 29 20 7b 0a 09 20 20 20 20 69 6e 74 20 72  o)) {..    int r
5c10: 65 61 73 6f 6e 20 3d 20 42 49 4f 5f 67 65 74 5f  eason = BIO_get_
5c20: 72 65 74 72 79 5f 72 65 61 73 6f 6e 28 73 74 61  retry_reason(sta
5c30: 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20  tePtr->bio);..  
5c40: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68    dprintf("BIO h
5c50: 61 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  as some special 
5c60: 63 6f 6e 64 69 74 69 6f 6e 20 6f 74 68 65 72 20  condition other 
5c70: 74 68 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69  than read or wri
5c80: 74 65 3a 20 63 6f 64 65 3d 25 64 22 2c 20 72 65  te: code=%d", re
5c90: 61 73 6f 6e 29 3b 0a 09 7d 0a 09 64 70 72 69 6e  ason);..}..dprin
5ca0: 74 66 28 22 42 49 4f 20 68 61 73 20 70 65 6e 64  tf("BIO has pend
5cb0: 69 6e 67 20 64 61 74 61 20 74 6f 20 77 72 69 74  ing data to writ
5cc0: 65 22 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  e");..    } else
5cd0: 20 7b 0a 09 42 49 4f 5f 66 6c 75 73 68 28 73 74   {..BIO_flush(st
5ce0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 20 20  atePtr->bio);.  
5cf0: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20    }..    switch 
5d00: 28 65 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53  (err) {..case SS
5d10: 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20  L_ERROR_NONE:.. 
5d20: 20 20 20 2f 2a 20 49 2f 4f 20 6f 70 65 72 61 74     /* I/O operat
5d30: 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f  ion completed */
5d40: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
5d50: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b  SL_ERROR_NONE");
5d60: 0a 09 20 20 20 20 69 66 20 28 77 72 69 74 74 65  ..    if (writte
5d70: 6e 20 3c 20 30 29 20 7b 0a 09 09 77 72 69 74 74  n < 0) {...writt
5d80: 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09  en = 0;..    }..
5d90: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
5da0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a  e SSL_ERROR_SSL:
5db0: 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72  ..    /* A non-r
5dc0: 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61  ecoverable, fata
5dd0: 6c 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 53  l error in the S
5de0: 53 4c 20 6c 69 62 72 61 72 79 20 6f 63 63 75 72  SL library occur
5df0: 72 65 64 2c 20 75 73 75 61 6c 6c 79 20 61 20 70  red, usually a p
5e00: 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f  rotocol error */
5e10: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
5e20: 53 4c 20 65 72 72 6f 72 2c 20 69 6e 64 69 63 61  SL error, indica
5e30: 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 63 6f  ting that the co
5e40: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nnection has bee
5e50: 6e 20 61 62 6f 72 74 65 64 22 29 3b 0a 09 20 20  n aborted");..  
5e60: 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72    if (backingErr
5e70: 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73  or != 0) {...Tls
5e80: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
5e90: 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f   ERR_reason_erro
5ea0: 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67  r_string(backing
5eb0: 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 20  Error));..    } 
5ec0: 65 6c 73 65 20 69 66 20 28 53 53 4c 5f 67 65 74  else if (SSL_get
5ed0: 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73  _verify_result(s
5ee0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d  tatePtr->ssl) !=
5ef0: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09   X509_V_OK) {...
5f00: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
5f10: 74 72 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f  tr, X509_verify_
5f20: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
5f30: 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  g(SSL_get_verify
5f40: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  _result(statePtr
5f50: 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d  ->ssl)));..    }
5f60: 20 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72   else {...Tls_Er
5f70: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 55  ror(statePtr, "U
5f80: 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72  nknown SSL error
5f90: 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ");..    }..    
5fa0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
5fb0: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20  ECONNABORTED;.. 
5fc0: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b     written = -1;
5fd0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
5fe0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
5ff0: 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f 2a  NT_READ:..    /*
6000: 20 4f 70 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70   Op did not comp
6010: 6c 65 74 65 20 64 75 65 20 74 6f 20 6e 6f 74 20  lete due to not 
6020: 65 6e 6f 75 67 68 20 64 61 74 61 20 77 61 73 20  enough data was 
6030: 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 74 72 79  available. Retry
6040: 20 6c 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20   later. */..    
6050: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c  dprintf("Got SSL
6060: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44  _ERROR_WANT_READ
6070: 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20  , mapping it to 
6080: 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a  EAGAIN");..    *
6090: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
60a0: 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74  AGAIN;..    writ
60b0: 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73  ten = -1;..    s
60c0: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d  tatePtr->want |=
60d0: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09   TCL_READABLE;..
60e0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72      BIO_set_retr
60f0: 79 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d  y_read(statePtr-
6100: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61  >bio);..    brea
6110: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
6120: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a  ROR_WANT_WRITE:.
6130: 09 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 20 6e  .    /* Op did n
6140: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20  ot complete due 
6150: 74 6f 20 75 6e 61 62 6c 65 20 74 6f 20 73 65 6e  to unable to sen
6160: 64 20 61 6c 6c 20 64 61 74 61 20 74 6f 20 74 68  d all data to th
6170: 65 20 42 49 4f 2e 20 52 65 74 72 79 20 6c 61 74  e BIO. Retry lat
6180: 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  er. */..    dpri
6190: 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52  ntf("Got SSL_ERR
61a0: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d  OR_WANT_WRITE, m
61b0: 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47  apping it to EAG
61c0: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  AIN");..    *err
61d0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
61e0: 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e  IN;..    written
61f0: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74   = -1;..    stat
6200: 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43  ePtr->want |= TC
6210: 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 20  L_WRITABLE;..   
6220: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77   BIO_set_retry_w
6230: 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62  rite(statePtr->b
6240: 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  io);..    break;
6250: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
6260: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b  R_WANT_X509_LOOK
6270: 55 50 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 20 64  UP:..    /* Op d
6280: 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 73  idn't complete s
6290: 69 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 73 65  ince callback se
62a0: 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 65 74  t by SSL_CTX_set
62b0: 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62 28  _client_cert_cb(
62c0: 29 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61  ) asked to be ca
62d0: 6c 6c 65 64 20 61 67 61 69 6e 20 2a 2f 0a 09 20  lled again */.. 
62e0: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
62f0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58  SSL_ERROR_WANT_X
6300: 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d 61 70 70  509_LOOKUP, mapp
6310: 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e  ing it to EAGAIN
6320: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
6330: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
6340: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ..    written = 
6350: 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -1;..    break;.
6360: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
6370: 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f  _SYSCALL:..    /
6380: 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76  * Some non-recov
6390: 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f  erable, fatal I/
63a0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  O error occurred
63b0: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
63c0: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43  ("SSL_ERROR_SYSC
63d0: 41 4c 4c 22 29 3b 0a 0a 09 20 20 20 20 69 66 20  ALL");...    if 
63e0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d  (backingError ==
63f0: 20 30 20 26 26 20 77 72 69 74 74 65 6e 20 3d 3d   0 && written ==
6400: 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28   0) {...dprintf(
6410: 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09  "EOF reached")..
6420: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
6430: 20 30 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20   0;...written = 
6440: 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73  0;...Tls_Error(s
6450: 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65  tatePtr, "EOF re
6460: 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d  ached");...    }
6470: 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e   else if (backin
6480: 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 77  gError == 0 && w
6490: 72 69 74 74 65 6e 20 3d 3d 20 2d 31 29 20 7b 0a  ritten == -1) {.
64a0: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65  ..dprintf("I/O e
64b0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65  rror occurred (e
64c0: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75  rrno = %lu)", (u
64d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63  nsigned long) Tc
64e0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09  l_GetErrno());..
64f0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
6500: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b   Tcl_GetErrno();
6510: 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b  ...written = -1;
6520: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
6530: 74 65 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f  tePtr, Tcl_Errno
6540: 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 74  Msg(*errorCodePt
6550: 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73  r));...    } els
6560: 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49  e {...dprintf("I
6570: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  /O error occurre
6580: 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  d (backingError 
6590: 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67  = %lu)", backing
65a0: 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72  Error);...*error
65b0: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65  CodePtr = Tcl_Ge
65c0: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69 74  tErrno();...writ
65d0: 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f  ten = -1;...Tls_
65e0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
65f0: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
6600: 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45  _string(backingE
6610: 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09  rror));..    }..
6620: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
6630: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f  e SSL_ERROR_ZERO
6640: 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f 2a  _RETURN:..    /*
6650: 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64   Peer has closed
6660: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6670: 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63  by sending the c
6680: 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72  lose_notify aler
6690: 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20 62  t. Can't read, b
66a0: 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 2a 2f  ut can write. */
66b0: 0a 09 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  ..    /* Need to
66c0: 20 72 65 74 75 72 6e 20 61 6e 20 45 4f 46 2c 20   return an EOF, 
66d0: 73 6f 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c  so channel is cl
66e0: 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c 6c 20  osed which will 
66f0: 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 75 74  send an SSL_shut
6700: 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 20 20  down(). */..    
6710: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c  dprintf("Got SSL
6720: 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55  _ERROR_ZERO_RETU
6730: 52 4e 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 61  RN, this means a
6740: 6e 20 45 4f 46 20 68 61 73 20 62 65 65 6e 20 72  n EOF has been r
6750: 65 61 63 68 65 64 22 29 3b 0a 09 20 20 20 20 2a  eached");..    *
6760: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
6770: 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d  ;..    written =
6780: 20 30 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72   0;..    Tls_Err
6790: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 50 65  or(statePtr, "Pe
67a0: 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68  er has closed th
67b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
67c0: 20 77 72 69 74 69 6e 67 20 62 79 20 73 65 6e 64   writing by send
67d0: 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f  ing the close_no
67e0: 74 69 66 79 20 61 6c 65 72 74 22 29 3b 0a 09 20  tify alert");.. 
67f0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
6800: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
6810: 41 53 59 4e 43 3a 0a 09 20 20 20 20 2f 2a 20 55  ASYNC:..    /* U
6820: 73 65 64 20 77 69 74 68 20 66 6c 61 67 20 53 53  sed with flag SS
6830: 4c 5f 4d 4f 44 45 5f 41 53 59 4e 43 2c 20 6f 70  L_MODE_ASYNC, op
6840: 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65   didn't complete
6850: 20 62 65 63 61 75 73 65 20 61 6e 20 61 73 79 6e   because an asyn
6860: 63 20 65 6e 67 69 6e 65 20 69 73 20 73 74 69 6c  c engine is stil
6870: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 64 61 74  l processing dat
6880: 61 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  a */..    dprint
6890: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52  f("Got SSL_ERROR
68a0: 5f 57 41 4e 54 5f 41 53 59 4e 43 2c 20 6d 61 70  _WANT_ASYNC, map
68b0: 70 69 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47  ping this to EAG
68c0: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  AIN");..    *err
68d0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
68e0: 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e  IN;..    written
68f0: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61   = -1;..    brea
6900: 6b 3b 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20  k;...default:.. 
6910: 20 20 20 64 70 72 69 6e 74 66 28 22 75 6e 6b 6e     dprintf("unkn
6920: 6f 77 6e 20 65 72 72 6f 72 3a 20 25 64 22 2c 20  own error: %d", 
6930: 65 72 72 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45  err);..    Tls_E
6940: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22  rror(statePtr, "
6950: 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 29 3b  Unknown error");
6960: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ..    break;.   
6970: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
6980: 22 4f 75 74 70 75 74 28 25 64 29 20 2d 3e 20 25  "Output(%d) -> %
6990: 64 22 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69  d", toWrite, wri
69a0: 74 74 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  tten);.    retur
69b0: 6e 20 77 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a  n written;.}../*
69c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
69d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a10: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 47 65 74 50 61  . *. * Tls_GetPa
6a20: 72 65 6e 74 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65  rent --. *. *.Ge
6a30: 74 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c  t parent channel
6a40: 20 66 6f 72 20 61 20 73 74 61 63 6b 65 64 20 63   for a stacked c
6a50: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
6a60: 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 5f 43 68  sults:. *.Tcl_Ch
6a70: 61 6e 6e 65 6c 20 6f 72 20 4e 55 4c 4c 20 69 66  annel or NULL if
6a80: 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   none.. *. *----
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63  ---------. */.Tc
6ae0: 6c 5f 43 68 61 6e 6e 65 6c 20 54 6c 73 5f 47 65  l_Channel Tls_Ge
6af0: 74 50 61 72 65 6e 74 28 53 74 61 74 65 20 2a 73  tParent(State *s
6b00: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 6d 61 73  tatePtr, int mas
6b10: 6b 46 6c 61 67 73 29 20 7b 0a 20 20 20 20 64 70  kFlags) {.    dp
6b20: 72 69 6e 74 66 28 22 52 65 71 75 65 73 74 65 64  rintf("Requested
6b30: 20 74 6f 20 67 65 74 20 70 61 72 65 6e 74 20 6f   to get parent o
6b40: 66 20 63 68 61 6e 6e 65 6c 20 25 70 22 2c 20 73  f channel %p", s
6b50: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a  tatePtr->self);.
6b60: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50  .    if ((stateP
6b70: 74 72 2d 3e 66 6c 61 67 73 20 26 20 7e 6d 61 73  tr->flags & ~mas
6b80: 6b 46 6c 61 67 73 29 20 26 20 54 4c 53 5f 54 43  kFlags) & TLS_TC
6b90: 4c 5f 46 41 53 54 50 41 54 48 29 20 7b 0a 09 64  L_FASTPATH) {..d
6ba0: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
6bb0: 20 67 65 74 20 74 68 65 20 70 61 72 65 6e 74 20   get the parent 
6bc0: 63 68 61 6e 6e 65 6c 20 77 68 69 6c 65 20 77 65  channel while we
6bd0: 20 61 72 65 20 75 73 69 6e 67 20 46 61 73 74 50   are using FastP
6be0: 61 74 68 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67  ath -- returning
6bf0: 20 4e 55 4c 4c 22 29 3b 0a 09 72 65 74 75 72 6e   NULL");..return
6c00: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
6c10: 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 53   return Tcl_GetS
6c20: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74  tackedChannel(st
6c30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 7d  atePtr->self);.}
6c40: 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c90: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65  ----. *. * TlsSe
6ca0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20  tOptionProc --. 
6cb0: 2a 0a 20 2a 09 53 65 74 73 20 61 6e 20 6f 70 74  *. *.Sets an opt
6cc0: 69 6f 6e 20 74 6f 20 76 61 6c 75 65 20 66 6f 72  ion to value for
6cd0: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
6ce0: 73 65 64 20 63 68 61 6e 6e 65 6c 2e 20 43 61 6c  sed channel. Cal
6cf0: 6c 65 64 20 62 79 20 74 68 65 0a 20 2a 09 67 65  led by the. *.ge
6d00: 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20  neric I/O layer 
6d10: 77 68 65 6e 65 76 65 72 20 74 68 65 20 54 63 6c  whenever the Tcl
6d20: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
6d30: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  n() function is 
6d40: 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  used.. *. * Resu
6d50: 6c 74 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69  lts:. *.TCL_OK i
6d60: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
6d70: 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 69  TCL_ERROR if fai
6d80: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  led.. *. * Side 
6d90: 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61  effects:. *.Upda
6da0: 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69  tes channel opti
6db0: 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e  on to new value.
6dc0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e10: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
6e20: 6e 74 0a 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50  nt.TlsSetOptionP
6e30: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
6e40: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20  nstanceData,    
6e50: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e  /* Socket state.
6e60: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65   */.    Tcl_Inte
6e70: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
6e80: 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e  For errors - can
6e90: 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20   be NULL. */.   
6ea0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74   const char *opt
6eb0: 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65  ionName,./* Name
6ec0: 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74   of the option t
6ed0: 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
6ee0: 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e  for, or..... * N
6ef0: 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f  ULL to get all o
6f00: 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72  ptions and their
6f10: 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20   values. */.    
6f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69  const char *opti
6f30: 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61 6c 75  onValue)./* Valu
6f40: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20 2a 2f  e for option. */
6f50: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
6f60: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
6f70: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
6f80: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
6f90: 20 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f 47 65   parent = Tls_Ge
6fa0: 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72  tParent(statePtr
6fb0: 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41  , TLS_TCL_FASTPA
6fc0: 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69  TH);.    Tcl_Dri
6fd0: 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63  verSetOptionProc
6fe0: 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b   *setOptionProc;
6ff0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
7000: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
7010: 20 50 61 73 73 20 74 6f 20 70 61 72 65 6e 74 20   Pass to parent 
7020: 2a 2f 0a 20 20 20 20 73 65 74 4f 70 74 69 6f 6e  */.    setOption
7030: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e  Proc = Tcl_Chann
7040: 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  elSetOptionProc(
7050: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
7060: 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  pe(parent));.   
7070: 20 69 66 20 28 73 65 74 4f 70 74 69 6f 6e 50 72   if (setOptionPr
7080: 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  oc != NULL) {..r
7090: 65 74 75 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f  eturn (*setOptio
70a0: 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68  nProc)(Tcl_GetCh
70b0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
70c0: 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72  a(parent), inter
70d0: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f  p, optionName, o
70e0: 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20  ptionValue);.   
70f0: 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a   }.    /*.     *
7100: 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73   Request for a s
7110: 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68  pecific option h
7120: 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64  as to fail, we d
7130: 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20  on't have any.. 
7140: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
7150: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
7160: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
7170: 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a  ptionName, "");.
7180: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
71d0: 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72  * TlsGetOptionPr
71e0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20  oc --. *. *.Get 
71f0: 61 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65  a option's value
7200: 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b 65   for a SSL socke
7210: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c  t based channel,
7220: 20 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 61 6c   or a list of al
7230: 6c 0a 20 2a 09 6f 70 74 69 6f 6e 73 20 61 6e 64  l. *.options and
7240: 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20 43   their values. C
7250: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e  alled by the gen
7260: 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77  eric I/O layer w
7270: 68 65 6e 65 76 65 72 20 74 68 65 0a 20 2a 09 54  henever the. *.T
7280: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
7290: 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ion() function i
72a0: 73 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 0a 20 2a  s used.. *. *. *
72b0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
72c0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
72d0: 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66  lt. The value of
72e0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
72f0: 70 74 69 6f 6e 20 6f 72 20 61 20 6c 69 73 74 20  ption or a list 
7300: 6f 66 0a 20 2a 09 61 6c 6c 20 6f 70 74 69 6f 6e  of. *.all option
7310: 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75  s and their valu
7320: 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  es is returned i
7330: 6e 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 44  n the supplied D
7340: 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69  String.. *. * Si
7350: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
7360: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
7370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
73b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73  /.static int.Tls
73c0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c  GetOptionProc(Cl
73d0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
73e0: 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63  eData,    /* Soc
73f0: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ket state. */.  
7400: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7410: 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72  terp,../* For er
7420: 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 4e 55  rors - can be NU
7430: 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  LL. */.    const
7440: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d   char *optionNam
7450: 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  e,./* Name of th
7460: 65 20 6f 70 74 69 6f 6e 20 74 6f 20 72 65 74 72  e option to retr
7470: 69 65 76 65 20 74 68 65 20 76 61 6c 75 65 20 66  ieve the value f
7480: 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e 55  or, or..... * NU
7490: 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70  LL to get all op
74a0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20  tions and their 
74b0: 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 54  values. */.    T
74c0: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69  cl_DString *opti
74d0: 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 57 68 65 72  onValue)./* Wher
74e0: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
74f0: 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 20 69 6e  omputed value in
7500: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 63 61 6c  itialized by cal
7510: 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74  ler. */.{.    St
7520: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
7530: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
7540: 63 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ceData;.    Tcl_
7550: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d  Channel parent =
7560: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73   Tls_GetParent(s
7570: 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c  tatePtr, TLS_TCL
7580: 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20  _FASTPATH);.    
7590: 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74  Tcl_DriverGetOpt
75a0: 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69  ionProc *getOpti
75b0: 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70 72  onProc;..    dpr
75c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
75d0: 0a 20 20 20 20 2f 2a 20 50 61 73 73 20 74 6f 20  .    /* Pass to 
75e0: 70 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 67 65  parent */.    ge
75f0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63  tOptionProc = Tc
7600: 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69  l_ChannelGetOpti
7610: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  onProc(Tcl_GetCh
7620: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
7630: 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f  ));.    if (getO
7640: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c  ptionProc != NUL
7650: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67  L) {..return (*g
7660: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63  etOptionProc)(Tc
7670: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
7680: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
7690: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  , interp, option
76a0: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75  Name, optionValu
76b0: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  e);.    } else i
76c0: 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d  f (optionName ==
76d0: 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b   (char*) NULL) {
76e0: 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73 74  ../*.. * Request
76f0: 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c   is query for al
7700: 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20  l options, this 
7710: 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65 74  is ok... */..ret
7720: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
7730: 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  }.    /*.     * 
7740: 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 70  Request for a sp
7750: 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61  ecific option ha
7760: 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f  s to fail, we do
7770: 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20  n't have any..  
7780: 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
7790: 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f   Tcl_BadChannelO
77a0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70  ption(interp, op
77b0: 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d  tionName, "");.}
77c0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
77d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7810: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 43 68  ----. *. * TlsCh
7820: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65  annelHandlerTime
7830: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  r --. *. *.Calle
7840: 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65  d by the notifie
7850: 72 20 76 69 61 20 61 20 74 69 6d 65 72 2c 20 74  r via a timer, t
7860: 6f 20 66 6c 75 73 68 20 6f 75 74 20 64 61 74 61  o flush out data
7870: 20 77 61 69 74 69 6e 67 20 69 6e 0a 20 2a 09 63   waiting in. *.c
7880: 68 61 6e 6e 65 6c 20 62 75 66 66 65 72 73 2e 20  hannel buffers. 
7890: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65  called by the ge
78a0: 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20  neric I/O layer 
78b0: 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 2a 09  whenever the. *.
78c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61  Tcl_GetChannelHa
78d0: 6e 64 6c 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  ndle() function 
78e0: 69 73 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52  is used.. *. * R
78f0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
7900: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
7910: 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20  cts:. *.Creates 
7920: 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 65 76 65  notification eve
7930: 6e 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  nt.. *. *-------
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
7990: 63 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e 65  c void TlsChanne
79a0: 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 28 43 6c  lHandlerTimer(Cl
79b0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
79c0: 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ata) {.    State
79d0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
79e0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
79f0: 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 20  a;.    int mask 
7a00: 3d 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74  = statePtr->want
7a10: 3b 20 2f 2a 20 49 6e 69 74 20 74 6f 20 53 53 4c  ; /* Init to SSL
7a20: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44  _ERROR_WANT_READ
7a30: 20 61 6e 64 20 53 53 4c 5f 45 52 52 4f 52 5f 57   and SSL_ERROR_W
7a40: 41 4e 54 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20  ANT_WRITE */..  
7a50: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
7a60: 64 22 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50  d");..    stateP
7a70: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
7a80: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
7a90: 4c 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  L;..    /* Check
7aa0: 20 66 6f 72 20 61 6d 6f 75 6e 74 20 6f 66 20 64   for amount of d
7ab0: 61 74 61 20 70 65 6e 64 69 6e 67 20 69 6e 20 42  ata pending in B
7ac0: 49 4f 20 77 72 69 74 65 20 62 75 66 66 65 72 20  IO write buffer 
7ad0: 2a 2f 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 77  */.    if (BIO_w
7ae0: 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72  pending(statePtr
7af0: 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70 72 69 6e  ->bio)) {..dprin
7b00: 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49  tf("[chan=%p] BI
7b10: 4f 20 77 72 69 74 61 62 6c 65 22 2c 20 73 74 61  O writable", sta
7b20: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09  tePtr->self);...
7b30: 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54  mask |= TCL_WRIT
7b40: 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ABLE;.    }..   
7b50: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 6d   /* Check for am
7b60: 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 70 65 6e  ount of data pen
7b70: 64 69 6e 67 20 69 6e 20 42 49 4f 20 72 65 61 64  ding in BIO read
7b80: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 69   buffer */.    i
7b90: 66 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73  f (BIO_pending(s
7ba0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b  tatePtr->bio)) {
7bb0: 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e  ..dprintf("[chan
7bc0: 3d 25 70 5d 20 42 49 4f 20 72 65 61 64 61 62 6c  =%p] BIO readabl
7bd0: 65 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  e", statePtr->se
7be0: 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54  lf);...mask |= T
7bf0: 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20 20  CL_READABLE;.   
7c00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 66   }..    /* Notif
7c10: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
7c20: 20 6c 61 79 65 72 20 74 68 61 74 20 74 68 65 20   layer that the 
7c30: 6d 61 73 6b 20 65 76 65 6e 74 73 20 68 61 76 65  mask events have
7c40: 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 74 68 65   occurred on the
7c50: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
7c60: 64 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79 69  dprintf("Notifyi
7c70: 6e 67 20 6f 75 72 73 65 6c 76 65 73 22 29 3b 0a  ng ourselves");.
7c80: 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68      Tcl_NotifyCh
7c90: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
7ca0: 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 20 20 20  self, mask);.   
7cb0: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20   statePtr->want 
7cc0: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
7cd0: 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a  f("Returning");.
7ce0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .    return;.}..
7cf0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d40: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 61 74 63  --. *. * TlsWatc
7d50: 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 53  hProc --. *. *.S
7d60: 65 74 20 75 70 20 74 68 65 20 65 76 65 6e 74 20  et up the event 
7d70: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63  notifier to watc
7d80: 68 20 66 6f 72 20 65 76 65 6e 74 73 20 6f 66 20  h for events of 
7d90: 69 6e 74 65 72 65 73 74 20 66 72 6f 6d 20 74 68  interest from th
7da0: 69 73 0a 20 2a 09 63 68 61 6e 6e 65 6c 2e 20 43  is. *.channel. C
7db0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e  alled by the gen
7dc0: 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77  eric I/O layer w
7dd0: 68 65 6e 65 76 65 72 20 74 68 65 20 75 73 65 72  henever the user
7de0: 20 28 6f 72 20 74 68 65 0a 20 2a 09 73 79 73 74   (or the. *.syst
7df0: 65 6d 29 20 61 6e 6e 6f 75 6e 63 65 73 20 69 74  em) announces it
7e00: 73 20 28 64 69 73 29 69 6e 74 65 72 65 73 74 20  s (dis)interest 
7e10: 69 6e 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65  in events on the
7e20: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 20 69   channel. This i
7e30: 73 0a 20 2a 09 63 61 6c 6c 65 64 20 72 65 70 65  s. *.called repe
7e40: 61 74 65 64 6c 79 2e 0a 20 2a 0a 20 2a 20 52 65  atedly.. *. * Re
7e50: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
7e60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
7e70: 74 73 3a 0a 20 2a 09 53 65 74 73 20 75 70 20 74  ts:. *.Sets up t
7e80: 68 65 20 74 69 6d 65 2d 62 61 73 65 64 20 6e 6f  he time-based no
7e90: 74 69 66 69 65 72 20 73 6f 20 74 68 61 74 20 66  tifier so that f
7ea0: 75 74 75 72 65 20 65 76 65 6e 74 73 20 6f 6e 20  uture events on 
7eb0: 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 77  the channel. *.w
7ec0: 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54  ill be seen by T
7ed0: 43 4c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  CL.. *. *-------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f20: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
7f30: 63 20 76 6f 69 64 0a 54 6c 73 57 61 74 63 68 50  c void.TlsWatchP
7f40: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
7f50: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20  nstanceData,    
7f60: 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74  /* The socket st
7f70: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ate. */.    int 
7f80: 6d 61 73 6b 29 09 09 09 2f 2a 20 45 76 65 6e 74  mask).../* Event
7f90: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 3b 20 61  s of interest; a
7fa0: 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  n OR-ed combinat
7fb0: 69 6f 6e 20 6f 66 0a 09 09 09 09 20 2a 20 54 43  ion of..... * TC
7fc0: 4c 5f 52 45 41 44 41 42 4c 45 2c 20 54 43 4c 5f  L_READABLE, TCL_
7fd0: 57 52 49 54 41 42 4c 45 20 61 6e 64 20 54 43 4c  WRITABLE and TCL
7fe0: 5f 45 58 43 45 50 54 49 4f 4e 2e 20 2a 2f 0a 7b  _EXCEPTION. */.{
7ff0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
8000: 20 20 20 20 20 70 61 72 65 6e 74 3b 0a 20 20 20       parent;.   
8010: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
8020: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
8030: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 54  tanceData;.    T
8040: 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68 50 72  cl_DriverWatchPr
8050: 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b 0a 20  oc *watchProc;. 
8060: 20 20 20 69 6e 74 20 70 65 6e 64 69 6e 67 20 3d     int pending =
8070: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
8080: 28 22 54 6c 73 57 61 74 63 68 50 72 6f 63 28 30  ("TlsWatchProc(0
8090: 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b 0a 20 20  x%x)", mask);.  
80a0: 20 20 64 70 72 69 6e 74 46 6c 61 67 73 28 73 74    dprintFlags(st
80b0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
80c0: 20 50 72 65 74 65 6e 64 20 74 6f 20 62 65 20 64   Pretend to be d
80d0: 65 61 64 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ead as long as t
80e0: 68 65 20 76 65 72 69 66 79 20 63 61 6c 6c 62 61  he verify callba
80f0: 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 20  ck is running.. 
8100: 20 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 20      * Otherwise 
8110: 74 68 61 74 20 63 61 6c 6c 62 61 63 6b 20 63 6f  that callback co
8120: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 72  uld be invoked r
8130: 65 63 75 72 73 69 76 65 6c 79 2e 20 2a 2f 0a 20  ecursively. */. 
8140: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
8150: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
8160: 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70  _CALLBACK) {..dp
8170: 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b 20  rintf("Callback 
8180: 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20 64 6f 69  is on-going, doi
8190: 6e 67 20 6e 6f 74 68 69 6e 67 22 29 3b 0a 09 72  ng nothing");..r
81a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
81b0: 20 20 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f 47    parent = Tls_G
81c0: 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74  etParent(statePt
81d0: 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50  r, TLS_TCL_FASTP
81e0: 41 54 48 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ATH);..    if (s
81f0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
8200: 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41   TLS_TCL_HANDSHA
8210: 4b 45 5f 46 41 49 4c 45 44 29 20 7b 0a 09 64 70  KE_FAILED) {..dp
8220: 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
8230: 77 61 74 63 68 20 61 20 73 6f 63 6b 65 74 20 77  watch a socket w
8240: 69 74 68 20 61 20 66 61 69 6c 65 64 20 68 61 6e  ith a failed han
8250: 64 73 68 61 6b 65 20 2d 2d 20 6e 6f 74 68 69 6e  dshake -- nothin
8260: 67 20 63 61 6e 20 68 61 70 70 65 6e 20 68 65 72  g can happen her
8270: 65 22 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 55  e");..dprintf("U
8280: 6e 72 65 67 69 73 74 65 72 69 6e 67 20 69 6e 74  nregistering int
8290: 65 72 65 73 74 20 69 6e 20 74 68 65 20 6c 6f 77  erest in the low
82a0: 65 72 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 0a 09  er channel");...
82b0: 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f  watchProc = Tcl_
82c0: 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63  ChannelWatchProc
82d0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
82e0: 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 09 77  ype(parent));..w
82f0: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
8300: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
8310: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 30 29 3b  ata(parent), 0);
8320: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63  ..statePtr->watc
8330: 68 4d 61 73 6b 20 3d 20 30 3b 0a 09 72 65 74 75  hMask = 0;..retu
8340: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  rn;.    }..    s
8350: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61  tatePtr->watchMa
8360: 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20  sk = mask;..    
8370: 2f 2a 20 4e 6f 20 63 68 61 6e 6e 65 6c 20 68 61  /* No channel ha
8380: 6e 64 6c 65 72 73 20 61 6e 79 20 6d 6f 72 65 2e  ndlers any more.
8390: 20 57 65 20 77 69 6c 6c 20 62 65 20 6e 6f 74 69   We will be noti
83a0: 66 69 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  fied automatical
83b0: 6c 79 0a 20 20 20 20 20 2a 20 61 62 6f 75 74 20  ly.     * about 
83c0: 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68  events on the ch
83d0: 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69 61 20  annel below via 
83e0: 61 20 63 61 6c 6c 20 74 6f 20 6f 75 72 0a 20 20  a call to our.  
83f0: 20 20 20 2a 20 27 54 72 61 6e 73 66 6f 72 6d 4e     * 'TransformN
8400: 6f 74 69 66 79 50 72 6f 63 27 2e 20 42 75 74 20  otifyProc'. But 
8410: 77 65 20 68 61 76 65 20 74 6f 20 70 61 73 73 20  we have to pass 
8420: 74 68 65 20 69 6e 74 65 72 65 73 74 20 64 6f 77  the interest dow
8430: 6e 20 6e 6f 77 2e 0a 20 20 20 20 20 2a 20 57 65  n now..     * We
8440: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
8450: 61 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 27  add additional '
8460: 69 6e 74 65 72 65 73 74 27 20 74 6f 20 74 68 65  interest' to the
8470: 20 6d 61 73 6b 20 69 66 20 77 65 20 77 61 6e 74   mask if we want
8480: 0a 20 20 20 20 20 2a 20 74 6f 2e 20 42 75 74 20  .     * to. But 
8490: 74 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  this transformat
84a0: 69 6f 6e 20 68 61 73 20 6e 6f 20 73 75 63 68 20  ion has no such 
84b0: 69 6e 74 65 72 65 73 74 2e 20 49 74 20 6a 75 73  interest. It jus
84c0: 74 20 70 61 73 73 65 73 0a 20 20 20 20 20 2a 20  t passes.     * 
84d0: 74 68 65 20 72 65 71 75 65 73 74 20 64 6f 77 6e  the request down
84e0: 2c 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20  , unchanged..   
84f0: 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66    */.    dprintf
8500: 28 22 52 65 67 69 73 74 65 72 69 6e 67 20 6f 75  ("Registering ou
8510: 72 20 69 6e 74 65 72 65 73 74 20 69 6e 20 74 68  r interest in th
8520: 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 20  e lower channel 
8530: 28 63 68 61 6e 3d 25 70 29 22 2c 20 28 76 6f 69  (chan=%p)", (voi
8540: 64 20 2a 29 20 70 61 72 65 6e 74 29 3b 0a 20 20  d *) parent);.  
8550: 20 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63    watchProc = Tc
8560: 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72  l_ChannelWatchPr
8570: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  oc(Tcl_GetChanne
8580: 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a  lType(parent));.
8590: 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 54 63      watchProc(Tc
85a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
85b0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
85c0: 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a  , mask);..    /*
85d0: 20 44 6f 20 77 65 20 68 61 76 65 20 61 6e 79 20   Do we have any 
85e0: 70 65 6e 64 69 6e 67 20 65 76 65 6e 74 73 20 2a  pending events *
85f0: 2f 0a 20 20 20 20 70 65 6e 64 69 6e 67 20 3d 20  /.    pending = 
8600: 28 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20  (statePtr->want 
8610: 7c 7c 20 5c 0a 09 28 28 6d 61 73 6b 20 26 20 54  || \..((mask & T
8620: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20  CL_READABLE) && 
8630: 28 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65  ((Tcl_InputBuffe
8640: 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65  red(statePtr->se
8650: 6c 66 29 20 3e 20 30 29 20 7c 7c 20 28 42 49 4f  lf) > 0) || (BIO
8660: 5f 63 74 72 6c 5f 70 65 6e 64 69 6e 67 28 73 74  _ctrl_pending(st
8670: 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 3e 20 30  atePtr->bio) > 0
8680: 29 29 29 20 7c 7c 0a 09 28 28 6d 61 73 6b 20 26  ))) ||..((mask &
8690: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 20 26   TCL_WRITABLE) &
86a0: 26 20 28 28 54 63 6c 5f 4f 75 74 70 75 74 42 75  & ((Tcl_OutputBu
86b0: 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d  ffered(statePtr-
86c0: 3e 73 65 6c 66 29 20 3e 20 30 29 20 7c 7c 20 28  >self) > 0) || (
86d0: 42 49 4f 5f 63 74 72 6c 5f 77 70 65 6e 64 69 6e  BIO_ctrl_wpendin
86e0: 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  g(statePtr->bio)
86f0: 20 3e 20 30 29 29 29 29 3b 0a 0a 20 20 20 20 64   > 0))));..    d
8700: 70 72 69 6e 74 66 28 22 49 4f 20 57 61 6e 74 3d  printf("IO Want=
8710: 25 64 2c 20 69 6e 70 75 74 20 62 75 66 66 65 72  %d, input buffer
8720: 3d 25 64 2c 20 6f 75 74 70 75 74 20 62 75 66 66  =%d, output buff
8730: 65 72 3d 25 64 2c 20 42 49 4f 20 70 65 6e 64 69  er=%d, BIO pendi
8740: 6e 67 3d 25 7a 64 2c 20 42 49 4f 20 77 70 65 6e  ng=%zd, BIO wpen
8750: 64 69 6e 67 3d 25 7a 64 22 2c 20 5c 0a 09 73 74  ding=%zd", \..st
8760: 61 74 65 50 74 72 2d 3e 77 61 6e 74 2c 20 54 63  atePtr->want, Tc
8770: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28  l_InputBuffered(
8780: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
8790: 20 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65   Tcl_OutputBuffe
87a0: 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65  red(statePtr->se
87b0: 6c 66 29 2c 20 5c 0a 09 42 49 4f 5f 63 74 72 6c  lf), \..BIO_ctrl
87c0: 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74  _pending(statePt
87d0: 72 2d 3e 62 69 6f 29 2c 20 42 49 4f 5f 63 74 72  r->bio), BIO_ctr
87e0: 6c 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65  l_wpending(state
87f0: 50 74 72 2d 3e 62 69 6f 29 29 3b 0a 0a 20 20 20  Ptr->bio));..   
8800: 20 69 66 20 28 21 28 6d 61 73 6b 20 26 20 54 43   if (!(mask & TC
8810: 4c 5f 52 45 41 44 41 42 4c 45 29 20 7c 7c 20 70  L_READABLE) || p
8820: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 09  ending == 0) {..
8830: 2f 2a 20 52 65 6d 6f 76 65 20 74 69 6d 65 72 2c  /* Remove timer,
8840: 20 69 66 20 61 6e 79 20 2a 2f 0a 09 69 66 20 28   if any */..if (
8850: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
8860: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
8870: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  en) NULL) {..   
8880: 20 64 70 72 69 6e 74 66 28 22 41 20 74 69 6d 65   dprintf("A time
8890: 72 20 77 61 73 20 66 6f 75 6e 64 2c 20 64 65 6c  r was found, del
88a0: 65 74 69 6e 67 20 69 74 22 29 3b 0a 09 20 20 20  eting it");..   
88b0: 20 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72   Tcl_DeleteTimer
88c0: 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
88d0: 2d 3e 74 69 6d 65 72 29 3b 0a 09 20 20 20 20 73  ->timer);..    s
88e0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
88f0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
8900: 29 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20 20 20 20  ) NULL;..}..    
8910: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 41 64 64  } else {../* Add
8920: 20 74 69 6d 65 72 2c 20 69 66 20 6e 6f 6e 65 20   timer, if none 
8930: 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72  */..if (statePtr
8940: 2d 3e 74 69 6d 65 72 20 3d 3d 20 28 54 63 6c 5f  ->timer == (Tcl_
8950: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
8960: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
8970: 28 22 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77  ("Creating a new
8980: 20 74 69 6d 65 72 20 73 69 6e 63 65 20 64 61 74   timer since dat
8990: 61 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  a appears to be 
89a0: 77 61 69 74 69 6e 67 22 29 3b 0a 09 20 20 20 20  waiting");..    
89b0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
89c0: 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65  = Tcl_CreateTime
89d0: 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c  rHandler(TLS_TCL
89e0: 5f 44 45 4c 41 59 2c 20 54 6c 73 43 68 61 6e 6e  _DELAY, TlsChann
89f0: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20  elHandlerTimer, 
8a00: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
8a10: 74 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d  tePtr);..}.    }
8a20: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a70: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
8a80: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d  GetHandleProc --
8a90: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
8aa0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
8ab0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
8ac0: 49 4f 20 6c 65 76 65 6c 20 74 6f 20 72 65 74 72  IO level to retr
8ad0: 69 65 76 65 20 61 6e 20 4f 53 0a 20 2a 09 73 70  ieve an OS. *.sp
8ae0: 65 63 69 66 69 63 20 68 61 6e 64 6c 65 20 61 73  ecific handle as
8af0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
8b00: 65 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75  e channel. Not u
8b10: 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66 6f 72  sed for transfor
8b20: 6d 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ms.. *. * Result
8b30: 73 3a 0a 20 2a 09 54 68 65 20 61 70 70 72 6f 70  s:. *.The approp
8b40: 72 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 20 68  riate Tcl_File h
8b50: 61 6e 64 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66  andle or NULL if
8b60: 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64   none.. *. * Sid
8b70: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
8b80: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bd0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
8be0: 63 20 69 6e 74 20 54 6c 73 47 65 74 48 61 6e 64  c int TlsGetHand
8bf0: 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  leProc(ClientDat
8c00: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
8c10: 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61     /* Socket sta
8c20: 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  te. */.    int d
8c30: 69 72 65 63 74 69 6f 6e 2c 09 09 2f 2a 20 54 43  irection,../* TC
8c40: 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43  L_READABLE or TC
8c50: 4c 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20  L_WRITABLE */.  
8c60: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61    ClientData *ha
8c70: 6e 64 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e 64  ndlePtr)./* Hand
8c80: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
8c90: 74 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a  th the channel *
8ca0: 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  /.{.    State *s
8cb0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
8cc0: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
8cd0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63  ;..    return Tc
8ce0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64  l_GetChannelHand
8cf0: 6c 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74  le(Tls_GetParent
8d00: 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54  (statePtr, TLS_T
8d10: 43 4c 5f 46 41 53 54 50 41 54 48 29 2c 20 64 69  CL_FASTPATH), di
8d20: 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50  rection, handleP
8d30: 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  tr);.}../*. *---
8d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8d90: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 2d   TlsNotifyProc -
8da0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
8db0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
8dc0: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
8dd0: 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 6e 6f 74   IO level to not
8de0: 69 66 79 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a  ify the channel.
8df0: 20 2a 09 74 68 61 74 20 61 6e 20 65 76 65 6e 74   *.that an event
8e00: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
8e10: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
8e20: 63 68 61 6e 6e 65 6c 2e 20 49 74 20 69 73 20 75  channel. It is u
8e30: 73 65 64 20 62 79 20 73 74 61 63 6b 65 64 20 63  sed by stacked c
8e40: 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 73 20 74  hannel drivers t
8e50: 68 61 74 0a 20 2a 09 77 69 73 68 20 74 6f 20 62  hat. *.wish to b
8e60: 65 20 6e 6f 74 69 66 69 65 64 20 6f 66 20 65 76  e notified of ev
8e70: 65 6e 74 73 20 74 68 61 74 20 6f 63 63 75 72 20  ents that occur 
8e80: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  on the underlyin
8e90: 67 20 28 73 74 61 63 6b 65 64 29 0a 20 2a 09 63  g (stacked). *.c
8ea0: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
8eb0: 73 75 6c 74 73 3a 0a 20 2a 09 54 79 70 65 20 6f  sults:. *.Type o
8ec0: 66 20 65 76 65 6e 74 20 6f 72 20 30 20 69 66 20  f event or 0 if 
8ed0: 66 61 69 6c 65 64 0a 20 2a 0a 20 2a 20 53 69 64  failed. *. * Sid
8ee0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
8ef0: 79 20 70 72 6f 63 65 73 73 20 74 68 65 20 69 6e  y process the in
8f00: 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 62 79 20  coming event by 
8f10: 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d 2d  itself.. *. *---
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
8f70: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4e 6f 74  tatic int TlsNot
8f80: 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  ifyProc(ClientDa
8f90: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
8fa0: 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74      /* Socket st
8fb0: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ate. */.    int 
8fc0: 6d 61 73 6b 29 09 09 09 2f 2a 20 74 79 70 65 20  mask).../* type 
8fd0: 6f 66 20 65 76 65 6e 74 20 74 68 61 74 20 6f 63  of event that oc
8fe0: 63 75 72 72 65 64 3a 0a 09 09 09 09 20 2a 20 4f  curred:..... * O
8ff0: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
9000: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   of TCL_READABLE
9010: 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45   or TCL_WRITABLE
9020: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20   */.{.    State 
9030: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
9040: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61  te *) instanceDa
9050: 74 61 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 6f  ta;.    int erro
9060: 72 43 6f 64 65 20 3d 20 30 3b 0a 0a 20 20 20 20  rCode = 0;..    
9070: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
9080: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
9090: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 78 69 73  * Delete an exis
90a0: 74 69 6e 67 20 74 69 6d 65 72 2e 20 49 74 20 77  ting timer. It w
90b0: 61 73 20 6e 6f 74 20 66 69 72 65 64 2c 20 79 65  as not fired, ye
90c0: 74 20 77 65 20 61 72 65 0a 20 20 20 20 20 2a 20  t we are.     * 
90d0: 68 65 72 65 2c 20 73 6f 20 74 68 65 20 63 68 61  here, so the cha
90e0: 6e 6e 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65 72  nnel below gener
90f0: 61 74 65 64 20 73 75 63 68 20 61 6e 20 65 76 65  ated such an eve
9100: 6e 74 20 61 6e 64 20 77 65 0a 20 20 20 20 20 2a  nt and we.     *
9110: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 2e 20   don't have to. 
9120: 54 68 65 20 72 65 6e 65 77 61 6c 20 6f 66 20 74  The renewal of t
9130: 68 65 20 69 6e 74 65 72 65 73 74 20 61 66 74 65  he interest afte
9140: 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 78 65  r the.     * exe
9150: 63 75 74 69 6f 6e 20 6f 66 20 63 68 61 6e 6e 65  cution of channe
9160: 6c 20 68 61 6e 64 6c 65 72 73 20 77 69 6c 6c 20  l handlers will 
9170: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 75 73 65  eventually cause
9180: 20 75 73 20 74 6f 0a 20 20 20 20 20 2a 20 72 65   us to.     * re
9190: 63 72 65 61 74 65 20 74 68 65 20 74 69 6d 65 72  create the timer
91a0: 20 28 69 6e 20 57 61 74 63 68 50 72 6f 63 29 2e   (in WatchProc).
91b0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20  .     */.    if 
91c0: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
91d0: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
91e0: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
91f0: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
9200: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
9210: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
9220: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
9230: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
9240: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
9250: 6b 69 70 20 69 66 20 75 73 65 72 20 76 65 72 69  kip if user veri
9260: 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73  fy callback is s
9270: 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 2a 2f 0a  till running */.
9280: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
9290: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
92a0: 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64  L_CALLBACK) {..d
92b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b  printf("Callback
92c0: 20 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20 72 65   is on-going, re
92d0: 74 75 72 6e 69 6e 67 20 66 61 69 6c 65 64 22 29  turning failed")
92e0: 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  ;..return 0;.   
92f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   }..    /* If no
9300: 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 64  t initialized, d
9310: 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20  o connect */.   
9320: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
9330: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49  lags & TLS_TCL_I
9340: 4e 49 54 29 20 7b 0a 09 69 6e 74 20 74 6c 73 43  NIT) {..int tlsC
9350: 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70 72 69 6e 74  onnect;...dprint
9360: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57  f("Calling Tls_W
9370: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b  aitForConnect");
9380: 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20  ...tlsConnect = 
9390: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
93a0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72  ct(statePtr, &er
93b0: 72 6f 72 43 6f 64 65 2c 20 31 29 3b 0a 09 69 66  rorCode, 1);..if
93c0: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 31   (tlsConnect < 1
93d0: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
93e0: 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77  ("Got an error w
93f0: 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e 65 63  aiting to connec
9400: 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20  t (tlsConnect = 
9410: 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  %i, *errorCodePt
9420: 72 20 3d 20 25 69 29 22 2c 20 74 6c 73 43 6f 6e  r = %i)", tlsCon
9430: 6e 65 63 74 2c 20 65 72 72 6f 72 43 6f 64 65 29  nect, errorCode)
9440: 3b 0a 09 20 20 20 20 69 66 20 28 65 72 72 6f 72  ;..    if (error
9450: 43 6f 64 65 20 3d 3d 20 45 41 47 41 49 4e 29 20  Code == EAGAIN) 
9460: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 41 73 79  {...dprintf("Asy
9470: 6e 63 20 66 6c 61 67 20 63 6f 75 6c 64 20 62 65  nc flag could be
9480: 20 73 65 74 20 28 64 69 64 6e 27 74 20 63 68 65   set (didn't che
9490: 63 6b 29 20 61 6e 64 20 65 72 72 6f 72 43 6f 64  ck) and errorCod
94a0: 65 20 3d 3d 20 45 41 47 41 49 4e 3a 20 20 52 65  e == EAGAIN:  Re
94b0: 74 75 72 6e 69 6e 67 20 66 61 69 6c 65 64 22 29  turning failed")
94c0: 3b 0a 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09  ;....return 0;..
94d0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 70 72 69      }...    dpri
94e0: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72  ntf("Tls_WaitFor
94f0: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64  Connect returned
9500: 20 61 6e 20 65 72 72 6f 72 22 29 3b 0a 09 7d 0a   an error");..}.
9510: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
9520: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  tf("Returning %i
9530: 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f  ", mask);..    /
9540: 2a 0a 20 20 20 20 20 2a 20 41 6e 20 65 76 65 6e  *.     * An even
9550: 74 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68  t occurred in th
9560: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61  e underlying cha
9570: 6e 6e 65 6c 2e 20 20 54 68 69 73 0a 20 20 20 20  nnel.  This.    
9580: 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f   * transformatio
9590: 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f 63 65 73  n doesn't proces
95a0: 73 20 73 75 63 68 20 65 76 65 6e 74 73 20 74 68  s such events th
95b0: 75 73 20 72 65 74 75 72 6e 73 20 74 68 65 0a 20  us returns the. 
95c0: 20 20 20 20 2a 20 69 6e 63 6f 6d 69 6e 67 20 6d      * incoming m
95d0: 61 73 6b 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ask unchanged.. 
95e0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
95f0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  n mask;.}../*. *
9600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
9650: 0a 20 2a 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  . * Tls_ChannelT
9660: 79 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 44 65 66  ype --. *. *.Def
9670: 69 6e 65 73 20 74 68 65 20 63 6f 72 72 65 63 74  ines the correct
9680: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 20 64 72 69   TLS channel dri
9690: 76 65 72 20 68 61 6e 64 6c 65 72 73 20 66 6f 72  ver handlers for
96a0: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 74 79   this channel ty
96b0: 70 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  pe.. *. * Result
96c0: 73 3a 0a 20 2a 09 54 63 6c 5f 43 68 61 6e 6e 65  s:. *.Tcl_Channe
96d0: 6c 54 79 70 65 20 73 74 72 75 63 74 75 72 65 2e  lType structure.
96e0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
96f0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
9700: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9750: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  . */.static cons
9760: 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70  t Tcl_ChannelTyp
9770: 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  e tlsChannelType
9780: 20 3d 20 7b 0a 20 20 20 20 22 74 6c 73 22 2c 09   = {.    "tls",.
9790: 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a  ../* Type name *
97a0: 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45  /.    TCL_CHANNE
97b0: 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20  L_VERSION_5,./* 
97c0: 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  v5 channel */.  
97d0: 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c 09    TlsCloseProc,.
97e0: 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a  ./* Close proc *
97f0: 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 50 72  /.    TlsInputPr
9800: 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72  oc,../* Input pr
9810: 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4f 75 74  oc */.    TlsOut
9820: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74  putProc,../* Out
9830: 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  put proc */.    
9840: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 6b 20  NULL,.../* Seek 
9850: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 53  proc */.    TlsS
9860: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f  etOptionProc,../
9870: 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f  * Set option pro
9880: 63 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 4f  c */.    TlsGetO
9890: 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 47  ptionProc,../* G
98a0: 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a  et option proc *
98b0: 2f 0a 20 20 20 20 54 6c 73 57 61 74 63 68 50 72  /.    TlsWatchPr
98c0: 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69  oc,../* Initiali
98d0: 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20  ze notifier */. 
98e0: 20 20 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50     TlsGetHandleP
98f0: 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 4f 53 20  roc,../* Get OS 
9900: 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63  handles out of c
9910: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c  hannel */.    Tl
9920: 73 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f 2a  sClose2Proc,../*
9930: 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a 20   close2proc */. 
9940: 20 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50     TlsBlockModeP
9950: 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20 62 6c 6f  roc,../* Set blo
9960: 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e  cking/nonblockin
9970: 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e 55 4c  g mode*/.    NUL
9980: 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 72  L,.../* Flush pr
9990: 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4e 6f 74  oc */.    TlsNot
99a0: 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48 61 6e  ifyProc,../* Han
99b0: 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74 73 20  dling of events 
99c0: 62 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f 0a 20  bubbling up */. 
99d0: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 57 69     NULL,.../* Wi
99e0: 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a  de seek proc */.
99f0: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54      NULL,.../* T
9a00: 68 72 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f 0a  hread action */.
9a10: 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54 72      NULL.../* Tr
9a20: 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 63 6f  uncate */.};..co
9a30: 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54  nst Tcl_ChannelT
9a40: 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c  ype *Tls_Channel
9a50: 54 79 70 65 28 76 6f 69 64 29 20 7b 0a 20 20 20  Type(void) {.   
9a60: 20 72 65 74 75 72 6e 20 26 74 6c 73 43 68 61 6e   return &tlsChan
9a70: 6e 65 6c 54 79 70 65 3b 0a 7d 0a                 nelType;.}.