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 20 20 20 20 74 63 6c 53 53 4c 20 28 43  . *    tclSSL (C
0230: 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20  olin McCormack, 
0240: 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67  Shared Technolog
0250: 79 29 0a 20 2a 20 20 20 20 53 53 4c 74 63 6c 20  y). *    SSLtcl 
0260: 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a 20  (Peter Antman). 
0270: 2a 0a 20 2a 2f 0a 0a 2f 2a 0a 09 09 74 6c 73 42  *. */../*...tlsB
0280: 49 4f 2e 63 09 09 09 09 74 6c 73 49 4f 2e 63 0a  IO.c....tlsIO.c.
0290: 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20    +------+      
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02b0: 20 20 20 2b 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20     +-----+      
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
02e0: 2d 2d 2d 2d 2d 2d 2b 0a 20 20 7c 20 20 20 20 20  ------+.  |     
02f0: 20 7c 54 63 6c 5f 57 72 69 74 65 52 61 77 20 3c   |Tcl_WriteRaw <
0300: 2d 2d 20 42 69 6f 57 72 69 74 65 7c 20 53 53 4c  -- BioWrite| SSL
0310: 20 7c 42 49 4f 5f 77 72 69 74 65 20 3c 2d 2d 20   |BIO_write <-- 
0320: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 3c 2d  TlsOutputProc <-
0330: 2d 20 57 72 69 74 65 7c 20 20 20 20 20 20 7c 0a  - Write|      |.
0340: 20 20 7c 73 6f 63 6b 65 74 7c 20 20 20 20 20 20    |socket|      
0350: 3c 65 6e 63 72 79 70 74 65 64 3e 20 20 20 20 20  <encrypted>     
0360: 20 20 20 7c 20 42 49 4f 20 7c 20 20 20 20 20 20     | BIO |      
0370: 20 20 20 20 20 20 3c 75 6e 65 6e 63 72 79 70 74        <unencrypt
0380: 65 64 3e 20 20 20 20 20 20 20 20 20 20 20 20 7c  ed>            |
0390: 20 41 70 70 20 20 7c 0a 20 20 7c 20 20 20 20 20   App  |.  |     
03a0: 20 7c 54 63 6c 5f 52 65 61 64 52 61 77 20 20 2d   |Tcl_ReadRaw  -
03b0: 2d 3e 20 20 42 69 6f 52 65 61 64 7c 20 20 20 20  ->  BioRead|    
03c0: 20 7c 42 49 4f 5f 52 65 61 64 20 20 2d 2d 3e 20   |BIO_Read  --> 
03d0: 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 20 2d 2d  TlsInputProc  --
03e0: 3e 20 20 52 65 61 64 7c 20 20 20 20 20 20 7c 0a  >  Read|      |.
03f0: 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20    +------+      
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 2b 2d 2d 2d 2d 2d 2b 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 20 20 20 20 20 20 2b                 +
0440: 2d 2d 2d 2d 2d 2d 2b 0a 2a 2f 0a 0a 23 69 6e 63  ------+.*/..#inc
0450: 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a  lude "tlsInt.h".
0460: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0470: 68 3e 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  h>../*. *-------
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: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
04d0: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d  BlockModeProc --
04e0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
04f0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
0500: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
0510: 49 4f 20 6c 65 76 65 6c 20 74 6f 20 73 65 74 20  IO level to set 
0520: 63 68 61 6e 6e 65 6c 20 74 6f 0a 20 2a 09 62 6c  channel to. *.bl
0530: 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f  ocking or nonblo
0540: 63 6b 69 6e 67 20 6d 6f 64 65 2e 20 43 61 6c 6c  cking mode. Call
0550: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
0560: 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e  c I/O layer when
0570: 65 76 65 72 0a 20 2a 09 74 68 65 20 54 63 6c 5f  ever. *.the Tcl_
0580: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
0590: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  () function is u
05a0: 73 65 64 20 77 69 74 68 20 6f 70 74 69 6f 6e 20  sed with option 
05b0: 2d 62 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 0a 20 2a  -blocking.. *. *
05c0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20   Results:. *    
05d0: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  0 if successful 
05e0: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63  or POSIX error c
05f0: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20  ode if failed.. 
0600: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0610: 73 3a 0a 20 2a 20 20 20 20 53 65 74 73 20 74 68  s:. *    Sets th
0620: 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c  e device into bl
0630: 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f  ocking or nonblo
0640: 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20  cking mode.. *. 
0650: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
06a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c  */.static int Tl
06b0: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43  sBlockModeProc(C
06c0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
06d0: 63 65 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65  ceData, int mode
06e0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
06f0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
0700: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
0710: 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20  ;..    if (mode 
0720: 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42  == TCL_MODE_NONB
0730: 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74  LOCKING) {..stat
0740: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
0750: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20  LS_TCL_ASYNC;.  
0760: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
0770: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  ePtr->flags &= ~
0780: 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b  (TLS_TCL_ASYNC);
0790: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
07a0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  n 0;.}../*. *---
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0800: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 2d 2d   TlsCloseProc --
0810: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
0820: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
0830: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
0840: 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66  IO level to perf
0850: 6f 72 6d 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 74  orm channel. *.t
0860: 79 70 65 20 73 70 65 63 69 66 69 63 20 63 6c 65  ype specific cle
0870: 61 6e 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  anup when a SSL 
0880: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
0890: 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 2e 0a  nnel is closed..
08a0: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65   *.Called by the
08b0: 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79   generic I/O lay
08c0: 65 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  er whenever the 
08d0: 54 63 6c 5f 43 6c 6f 73 65 28 29 20 66 75 6e 63  Tcl_Close() func
08e0: 74 69 6f 6e 20 69 73 0a 20 2a 09 75 73 65 64 2e  tion is. *.used.
08f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0900: 20 2a 20 20 20 20 30 20 69 66 20 73 75 63 63 65   *    0 if succe
0910: 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65  ssful or POSIX e
0920: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69  rror code if fai
0930: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  led.. *. * Side 
0940: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 43  effects:. *    C
0950: 6c 6f 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74  loses the socket
0960: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e   of the channel.
0970: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
09d0: 6e 74 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28  nt TlsCloseProc(
09e0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
09f0: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  nceData, Tcl_Int
0a00: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
0a10: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
0a20: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69  tr = (State *) i
0a30: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
0a40: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c    dprintf("TlsCl
0a50: 6f 73 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76  oseProc(%p)", (v
0a60: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29  oid *) statePtr)
0a70: 3b 0a 0a 20 20 20 20 2f 2a 20 46 6c 75 73 68 20  ;..    /* Flush 
0a80: 61 6e 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61  any pending data
0a90: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64   */..    /* Send
0aa0: 20 73 68 75 74 64 6f 77 6e 20 6e 6f 74 69 66 69   shutdown notifi
0ab0: 63 61 74 69 6f 6e 2e 20 57 69 6c 6c 20 72 65 74  cation. Will ret
0ac0: 75 72 6e 20 30 20 77 68 69 6c 65 20 69 6e 20 70  urn 0 while in p
0ad0: 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 31 20 77  rocess, then 1 w
0ae0: 68 65 6e 20 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f  hen complete. */
0af0: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 73 20 74  .    /* Closes t
0b00: 68 65 20 77 72 69 74 65 20 64 69 72 65 63 74 69  he write directi
0b10: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  on of the connec
0b20: 74 69 6f 6e 3b 20 74 68 65 20 72 65 61 64 20 64  tion; the read d
0b30: 69 72 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  irection is clos
0b40: 65 64 20 62 79 20 74 68 65 20 70 65 65 72 2e 20  ed by the peer. 
0b50: 2a 2f 0a 20 20 20 20 2f 2a 20 44 6f 65 73 20 6e  */.    /* Does n
0b60: 6f 74 20 61 66 66 65 63 74 20 73 6f 63 6b 65 74  ot affect socket
0b70: 20 73 74 61 74 65 2e 20 44 6f 6e 27 74 20 63 61   state. Don't ca
0b80: 6c 6c 20 61 66 74 65 72 20 66 61 74 61 6c 20 65  ll after fatal e
0b90: 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20  rror. */.    if 
0ba0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 21  (statePtr->ssl !
0bb0: 3d 20 4e 55 4c 4c 20 26 26 20 21 28 73 74 61 74  = NULL && !(stat
0bc0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c  ePtr->flags & TL
0bd0: 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f  S_TCL_HANDSHAKE_
0be0: 46 41 49 4c 45 44 29 29 20 7b 0a 09 53 53 4c 5f  FAILED)) {..SSL_
0bf0: 73 68 75 74 64 6f 77 6e 28 73 74 61 74 65 50 74  shutdown(statePt
0c00: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a  r->ssl);.    }..
0c10: 20 20 20 20 2f 2a 20 54 6c 73 5f 46 72 65 65 20      /* Tls_Free 
0c20: 63 61 6c 6c 73 20 54 6c 73 5f 43 6c 65 61 6e 20  calls Tls_Clean 
0c30: 2a 2f 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74  */.    Tcl_Event
0c40: 75 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e  uallyFree((Clien
0c50: 74 44 61 74 61 29 73 74 61 74 65 50 74 72 2c 20  tData)statePtr, 
0c60: 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 72  Tls_Free);.    r
0c70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
0c80: 2a 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 2d 2d 2d 2d  ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0cd0: 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 32 50 72  *. * TlsClose2Pr
0ce0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 53 69 6d 69  oc --. *. *.Simi
0cf0: 6c 61 72 20 74 6f 20 54 6c 73 43 6c 6f 73 65 50  lar to TlsCloseP
0d00: 72 6f 63 2c 20 62 75 74 20 61 6c 6c 6f 77 73 20  roc, but allows 
0d10: 66 6f 72 20 73 65 70 61 72 61 74 65 20 63 6c 6f  for separate clo
0d20: 73 65 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  se read and writ
0d30: 65 0a 20 2a 09 73 69 64 65 20 6f 66 20 63 68 61  e. *.side of cha
0d40: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nnel.. *. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
0da0: 74 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65  tic int TlsClose
0db0: 32 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61  2Proc(ClientData
0dc0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20   instanceData,  
0dd0: 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20    /* The socket 
0de0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63  state. */.    Tc
0df0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0e00: 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73  ,../* For errors
0e10: 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20   - can be NULL. 
0e20: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
0e30: 29 09 09 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20  ).../* Flags to 
0e40: 63 6c 6f 73 65 20 72 65 61 64 20 61 6e 64 2f 6f  close read and/o
0e50: 72 20 77 72 69 74 65 20 73 69 64 65 20 6f 66 20  r write side of 
0e60: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20  channel */.{.   
0e70: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
0e80: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
0e90: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20  tanceData;..    
0ea0: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73  dprintf("TlsClos
0eb0: 65 32 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f  e2Proc(%p)", (vo
0ec0: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  id *) statePtr);
0ed0: 0a 0a 20 20 20 20 69 66 20 28 28 66 6c 61 67 73  ..    if ((flags
0ee0: 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45   & (TCL_CLOSE_RE
0ef0: 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49  AD|TCL_CLOSE_WRI
0f00: 54 45 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65  TE)) == 0) {..re
0f10: 74 75 72 6e 20 54 6c 73 43 6c 6f 73 65 50 72 6f  turn TlsClosePro
0f20: 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  c(instanceData, 
0f30: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20  interp);.    }. 
0f40: 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c     return EINVAL
0f50: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
0fb0: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
0fc0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
0fd0: 6d 20 63 6f 6e 6e 65 63 74 20 28 63 6c 69 65 6e  m connect (clien
0fe0: 74 29 20 6f 72 20 61 63 63 65 70 74 20 28 73 65  t) or accept (se
0ff0: 72 76 65 72 29 20 66 75 6e 63 74 69 6f 6e 2e 20  rver) function. 
1000: 41 6c 73 6f 20 70 65 72 66 6f 72 6d 73 0a 20 2a  Also performs. *
1010: 09 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 68  .equivalent of h
1020: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f  andshake functio
1030: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 3a  n.. *. * Result:
1040: 0a 20 2a 20 20 20 20 30 20 69 66 20 73 75 63 63  . *    0 if succ
1050: 65 73 73 66 75 6c 2c 20 2d 31 20 69 66 20 66 61  essful, -1 if fa
1060: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  iled.. *. * Side
1070: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20   effects:. *    
1080: 49 73 73 75 65 73 20 53 53 4c 5f 61 63 63 65 70  Issues SSL_accep
1090: 74 20 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74  t or SSL_connect
10a0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
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 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f  ---. */.int Tls_
1100: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 53  WaitForConnect(S
1110: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
1120: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1130: 72 2c 20 69 6e 74 20 68 61 6e 64 73 68 61 6b 65  r, int handshake
1140: 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61 6e 65  FailureIsPermane
1150: 6e 74 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e  nt) {.    unsign
1160: 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 45  ed long backingE
1170: 72 72 6f 72 3b 0a 20 20 20 20 69 6e 74 20 65 72  rror;.    int er
1180: 72 2c 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 69  r, rc = 0;.    i
1190: 6e 74 20 62 69 6f 53 68 6f 75 6c 64 52 65 74 72  nt bioShouldRetr
11a0: 79 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  y;.    *errorCod
11b0: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64  ePtr = 0;..    d
11c0: 70 72 69 6e 74 66 28 22 57 61 69 74 46 6f 72 43  printf("WaitForC
11d0: 6f 6e 6e 65 63 74 28 25 70 29 22 2c 20 28 76 6f  onnect(%p)", (vo
11e0: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  id *) statePtr);
11f0: 0a 20 20 20 20 64 70 72 69 6e 74 46 6c 61 67 73  .    dprintFlags
1200: 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  (statePtr);..   
1210: 20 2f 2a 20 43 61 6e 20 61 6c 73 6f 20 63 68 65   /* Can also che
1220: 63 6b 20 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66  ck SSL_is_init_f
1230: 69 6e 69 73 68 65 64 28 73 73 6c 29 20 2a 2f 0a  inished(ssl) */.
1240: 20 20 20 20 69 66 20 28 21 28 73 74 61 74 65 50      if (!(stateP
1250: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
1260: 54 43 4c 5f 49 4e 49 54 29 29 20 7b 0a 09 64 70  TCL_INIT)) {..dp
1270: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46  rintf("Tls_WaitF
1280: 6f 72 43 6f 6e 6e 65 63 74 20 63 61 6c 6c 65 64  orConnect called
1290: 20 6f 6e 20 61 6c 72 65 61 64 79 20 69 6e 69 74   on already init
12a0: 69 61 6c 69 7a 65 64 20 63 68 61 6e 6e 65 6c 20  ialized channel 
12b0: 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 77 69 74  -- returning wit
12c0: 68 20 69 6d 6d 65 64 69 61 74 65 20 73 75 63 63  h immediate succ
12d0: 65 73 73 22 29 3b 0a 09 72 65 74 75 72 6e 20 30  ess");..return 0
12e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
12f0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
1300: 20 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53   & TLS_TCL_HANDS
1310: 48 41 4b 45 5f 46 41 49 4c 45 44 29 20 7b 0a 09  HAKE_FAILED) {..
1320: 2f 2a 0a 09 20 2a 20 44 69 66 66 65 72 65 6e 74  /*.. * Different
1330: 20 74 79 70 65 73 20 6f 66 20 6f 70 65 72 61 74   types of operat
1340: 69 6f 6e 73 20 68 61 76 65 20 64 69 66 66 65 72  ions have differ
1350: 65 6e 74 20 72 65 71 75 69 72 65 6d 65 6e 74 73  ent requirements
1360: 0a 09 20 2a 20 53 53 4c 20 62 65 69 6e 67 20 65  .. * SSL being e
1370: 73 74 61 62 6c 69 73 68 65 64 0a 09 20 2a 2f 0a  stablished.. */.
1380: 09 69 66 20 28 68 61 6e 64 73 68 61 6b 65 46 61  .if (handshakeFa
1390: 69 6c 75 72 65 49 73 50 65 72 6d 61 6e 65 6e 74  ilureIsPermanent
13a0: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
13b0: 28 22 41 73 6b 65 64 20 74 6f 20 77 61 69 74 20  ("Asked to wait 
13c0: 66 6f 72 20 61 20 54 4c 53 20 68 61 6e 64 73 68  for a TLS handsh
13d0: 61 6b 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  ake that has alr
13e0: 65 61 64 79 20 66 61 69 6c 65 64 2e 20 20 52 65  eady failed.  Re
13f0: 74 75 72 6e 69 6e 67 20 66 61 74 61 6c 20 65 72  turning fatal er
1400: 72 6f 72 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  ror");..    *err
1410: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e  orCodePtr = ECON
1420: 4e 41 42 4f 52 54 45 44 3b 0a 09 7d 20 65 6c 73  NABORTED;..} els
1430: 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  e {..    dprintf
1440: 28 22 41 73 6b 65 64 20 74 6f 20 77 61 69 74 20  ("Asked to wait 
1450: 66 6f 72 20 61 20 54 4c 53 20 68 61 6e 64 73 68  for a TLS handsh
1460: 61 6b 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  ake that has alr
1470: 65 61 64 79 20 66 61 69 6c 65 64 2e 20 20 52 65  eady failed.  Re
1480: 74 75 72 6e 69 6e 67 20 73 6f 66 74 20 65 72 72  turning soft err
1490: 6f 72 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  or");..    *erro
14a0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e  rCodePtr = ECONN
14b0: 52 45 53 45 54 3b 0a 09 7d 0a 09 54 6c 73 5f 45  RESET;..}..Tls_E
14c0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22  rror(statePtr, "
14d0: 57 61 69 74 20 66 6f 72 20 66 61 69 6c 65 64 20  Wait for failed 
14e0: 68 61 6e 64 73 68 61 6b 65 22 29 3b 0a 09 72 65  handshake");..re
14f0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
1500: 20 20 20 20 66 6f 72 20 28 3b 3b 29 20 7b 0a 09      for (;;) {..
1510: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
1520: 29 3b 0a 09 42 49 4f 5f 63 6c 65 61 72 5f 72 65  );..BIO_clear_re
1530: 74 72 79 5f 66 6c 61 67 73 28 73 74 61 74 65 50  try_flags(stateP
1540: 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 2f 2a 20 4e  tr->bio);.../* N
1550: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 79  ot initialized y
1560: 65 74 21 20 41 6c 73 6f 20 63 61 6c 6c 73 20 53  et! Also calls S
1570: 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28  SL_do_handshake(
1580: 29 2e 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65  ). */..if (state
1590: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
15a0: 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09  _TCL_SERVER) {..
15b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
15c0: 6c 69 6e 67 20 53 53 4c 5f 61 63 63 65 70 74 28  ling SSL_accept(
15d0: 29 22 29 3b 0a 09 20 20 20 20 65 72 72 20 3d 20  )");..    err = 
15e0: 53 53 4c 5f 61 63 63 65 70 74 28 73 74 61 74 65  SSL_accept(state
15f0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 0a 09 7d 20 65  Ptr->ssl);...} e
1600: 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  lse {..    dprin
1610: 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c 5f  tf("Calling SSL_
1620: 63 6f 6e 6e 65 63 74 28 29 22 29 3b 0a 09 20 20  connect()");..  
1630: 20 20 65 72 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e    err = SSL_conn
1640: 65 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ect(statePtr->ss
1650: 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 31 3d 73 75  l);..}.../* 1=su
1660: 63 63 65 73 73 66 75 6c 2c 20 30 3d 6e 6f 74 20  ccessful, 0=not 
1670: 73 75 63 63 65 73 73 66 75 6c 20 61 6e 64 20 73  successful and s
1680: 68 75 74 20 64 6f 77 6e 2c 20 3c 30 3d 66 61 74  hut down, <0=fat
1690: 61 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 69 66 20  al error */..if 
16a0: 28 65 72 72 20 3e 20 30 29 20 7b 0a 09 20 20 20  (err > 0) {..   
16b0: 20 64 70 72 69 6e 74 66 28 22 41 63 63 65 70 74   dprintf("Accept
16c0: 20 6f 72 20 63 6f 6e 6e 65 63 74 20 77 61 73 20   or connect was 
16d0: 73 75 63 63 65 73 73 66 75 6c 22 29 3b 0a 0a 09  successful");...
16e0: 20 20 20 20 65 72 72 20 3d 20 42 49 4f 5f 66 6c      err = BIO_fl
16f0: 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ush(statePtr->bi
1700: 6f 29 3b 0a 09 20 20 20 20 69 66 20 28 65 72 72  o);..    if (err
1710: 20 3c 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e   <= 0) {...dprin
1720: 74 66 28 22 46 6c 75 73 68 69 6e 67 20 74 68 65  tf("Flushing the
1730: 20 6c 6f 77 65 72 20 6c 61 79 65 72 73 20 66 61   lower layers fa
1740: 69 6c 65 64 2c 20 74 68 69 73 20 77 69 6c 6c 20  iled, this will 
1750: 70 72 6f 62 61 62 6c 79 20 74 65 72 6d 69 6e 61  probably termina
1760: 74 65 20 74 68 69 73 20 73 65 73 73 69 6f 6e 22  te this session"
1770: 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73  );..    }..} els
1780: 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  e {..    dprintf
1790: 28 22 41 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e  ("Accept or conn
17a0: 65 63 74 20 66 61 69 6c 65 64 22 29 3b 0a 09 7d  ect failed");..}
17b0: 0a 0a 09 2f 2a 20 53 61 6d 65 20 61 73 20 53 53  .../* Same as SS
17c0: 4c 5f 77 61 6e 74 2c 20 62 75 74 20 61 6c 73 6f  L_want, but also
17d0: 20 63 68 65 63 6b 73 20 74 68 65 20 65 72 72 6f   checks the erro
17e0: 72 20 71 75 65 75 65 20 2a 2f 0a 09 72 63 20 3d  r queue */..rc =
17f0: 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73   SSL_get_error(s
1800: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65 72  tatePtr->ssl, er
1810: 72 29 3b 0a 09 62 61 63 6b 69 6e 67 45 72 72 6f  r);..backingErro
1820: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f  r = ERR_get_erro
1830: 72 28 29 3b 0a 09 69 66 20 28 72 63 20 21 3d 20  r();..if (rc != 
1840: 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 29 20  SSL_ERROR_NONE) 
1850: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
1860: 47 6f 74 20 65 72 72 6f 72 3a 20 25 69 20 28 72  Got error: %i (r
1870: 63 20 3d 20 25 69 29 22 2c 20 65 72 72 2c 20 72  c = %i)", err, r
1880: 63 29 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  c);..    dprintf
1890: 28 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 73 22  ("Got error: %s"
18a0: 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72  , ERR_reason_err
18b0: 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e  or_string(backin
18c0: 67 45 72 72 6f 72 29 29 3b 0a 09 7d 0a 0a 09 2f  gError));..}.../
18d0: 2a 20 54 68 65 20 72 65 74 72 79 20 66 6c 61 67  * The retry flag
18e0: 20 69 73 20 73 65 74 20 62 79 20 74 68 65 20 42   is set by the B
18f0: 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 2a 20 66  IO_set_retry_* f
1900: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 09 62 69 6f  unctions */..bio
1910: 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 42 49  ShouldRetry = BI
1920: 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73  O_should_retry(s
1930: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a  tatePtr->bio);..
1940: 09 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b  .if (err <= 0) {
1950: 0a 09 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20  ..    if (rc == 
1960: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43  SSL_ERROR_WANT_C
1970: 4f 4e 4e 45 43 54 20 7c 7c 20 72 63 20 3d 3d 20  ONNECT || rc == 
1980: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41  SSL_ERROR_WANT_A
1990: 43 43 45 50 54 29 20 7b 0a 09 09 62 69 6f 53 68  CCEPT) {...bioSh
19a0: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09  ouldRetry = 1;..
19b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72      } else if (r
19c0: 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57  c == SSL_ERROR_W
19d0: 41 4e 54 5f 52 45 41 44 29 20 7b 0a 09 09 62 69  ANT_READ) {...bi
19e0: 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31  oShouldRetry = 1
19f0: 3b 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 77 61  ;...statePtr->wa
1a00: 6e 74 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42  nt |= TCL_READAB
1a10: 4c 45 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  LE;..    } else 
1a20: 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52  if (rc == SSL_ER
1a30: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 29 20  ROR_WANT_WRITE) 
1a40: 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74  {...bioShouldRet
1a50: 72 79 20 3d 20 31 3b 0a 09 09 73 74 61 74 65 50  ry = 1;...stateP
1a60: 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f  tr->want |= TCL_
1a70: 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 20 20 7d  WRITABLE;..    }
1a80: 20 65 6c 73 65 20 69 66 20 28 42 49 4f 5f 73 68   else if (BIO_sh
1a90: 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65  ould_retry(state
1aa0: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 62  Ptr->bio)) {...b
1ab0: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20  ioShouldRetry = 
1ac0: 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  1;..    } else i
1ad0: 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52  f (rc == SSL_ERR
1ae0: 4f 52 5f 53 59 53 43 41 4c 4c 20 26 26 20 54 63  OR_SYSCALL && Tc
1af0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 20 3d 3d 20  l_GetErrno() == 
1b00: 45 41 47 41 49 4e 29 20 7b 0a 09 09 62 69 6f 53  EAGAIN) {...bioS
1b10: 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a  houldRetry = 1;.
1b20: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 28  .    }..}...if (
1b30: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 29 20  bioShouldRetry) 
1b40: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
1b50: 54 68 65 20 49 2f 4f 20 64 69 64 20 6e 6f 74 20  The I/O did not 
1b60: 63 6f 6d 70 6c 65 74 65 20 2d 2d 20 62 75 74 20  complete -- but 
1b70: 77 65 20 73 68 6f 75 6c 64 20 74 72 79 20 69 74  we should try it
1b80: 20 61 67 61 69 6e 22 29 3b 0a 0a 09 20 20 20 20   again");...    
1b90: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  if (statePtr->fl
1ba0: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53  ags & TLS_TCL_AS
1bb0: 59 4e 43 29 20 7b 0a 09 09 64 70 72 69 6e 74 66  YNC) {...dprintf
1bc0: 28 22 52 65 74 75 72 6e 69 6e 67 20 45 41 47 41  ("Returning EAGA
1bd0: 49 4e 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  IN so that it ca
1be0: 6e 20 62 65 20 72 65 74 72 69 65 64 20 6c 61 74  n be retried lat
1bf0: 65 72 22 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f  er");...*errorCo
1c00: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
1c10: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
1c20: 65 50 74 72 2c 20 22 48 61 6e 64 73 68 61 6b 65  ePtr, "Handshake
1c30: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 2c 20 77   not complete, w
1c40: 69 6c 6c 20 72 65 74 72 79 20 6c 61 74 65 72 22  ill retry later"
1c50: 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a  );...return -1;.
1c60: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
1c70: 64 70 72 69 6e 74 66 28 22 44 6f 69 6e 67 20 73  dprintf("Doing s
1c80: 6f 20 6e 6f 77 22 29 3b 0a 09 09 63 6f 6e 74 69  o now");...conti
1c90: 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  nue;..    }..}..
1ca0: 09 64 70 72 69 6e 74 66 28 22 57 65 20 68 61 76  .dprintf("We hav
1cb0: 65 20 65 69 74 68 65 72 20 63 6f 6d 70 6c 65 74  e either complet
1cc0: 65 6c 79 20 65 73 74 61 62 6c 69 73 68 65 64 20  ely established 
1cd0: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 72 20 63  the session or c
1ce0: 6f 6d 70 6c 65 74 65 6c 79 20 66 61 69 6c 65 64  ompletely failed
1cf0: 20 69 74 20 2d 2d 20 74 68 65 72 65 20 69 73 20   it -- there is 
1d00: 6e 6f 20 6d 6f 72 65 20 6e 65 65 64 20 74 6f 20  no more need to 
1d10: 65 76 65 72 20 72 65 74 72 79 20 69 74 20 74 68  ever retry it th
1d20: 6f 75 67 68 22 29 3b 0a 09 62 72 65 61 6b 3b 0a  ough");..break;.
1d30: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
1d40: 68 20 28 72 63 29 20 7b 0a 09 63 61 73 65 20 53  h (rc) {..case S
1d50: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09  SL_ERROR_NONE:..
1d60: 20 20 20 20 2f 2a 20 54 68 65 20 54 4c 53 2f 53      /* The TLS/S
1d70: 53 4c 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e  SL I/O operation
1d80: 20 63 6f 6d 70 6c 65 74 65 64 20 73 75 63 63 65   completed succe
1d90: 73 73 66 75 6c 6c 79 20 2a 2f 0a 09 20 20 20 20  ssfully */..    
1da0: 64 70 72 69 6e 74 66 28 22 54 68 65 20 63 6f 6e  dprintf("The con
1db0: 6e 65 63 74 69 6f 6e 20 69 73 20 67 6f 6f 64 22  nection is good"
1dc0: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
1dd0: 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20  dePtr = 0;..    
1de0: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
1df0: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20  L_ERROR_SSL:..  
1e00: 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76    /* A non-recov
1e10: 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72  erable, fatal er
1e20: 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  ror in the SSL l
1e30: 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c  ibrary occurred,
1e40: 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f   usually a proto
1e50: 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20  col error */..  
1e60: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45    dprintf("SSL_E
1e70: 52 52 4f 52 5f 53 53 4c 3a 20 47 6f 74 20 70 65  RROR_SSL: Got pe
1e80: 72 6d 61 6e 65 6e 74 20 66 61 74 61 6c 20 53 53  rmanent fatal SS
1e90: 4c 20 65 72 72 6f 72 2c 20 61 62 6f 72 74 69 6e  L error, abortin
1ea0: 67 20 69 6d 6d 65 64 69 61 74 65 6c 79 22 29 3b  g immediately");
1eb0: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 67 65  ..    if (SSL_ge
1ec0: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
1ed0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21  statePtr->ssl) !
1ee0: 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09  = X509_V_OK) {..
1ef0: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65  .Tls_Error(state
1f00: 50 74 72 2c 20 58 35 30 39 5f 76 65 72 69 66 79  Ptr, X509_verify
1f10: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
1f20: 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
1f30: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
1f40: 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20  r->ssl)));..    
1f50: 7d 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69  }..    if (backi
1f60: 6e 67 45 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a  ngError != 0) {.
1f70: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
1f80: 65 50 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e  ePtr, ERR_reason
1f90: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61  _error_string(ba
1fa0: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20  ckingError));.. 
1fb0: 20 20 20 7d 0a 09 20 20 20 20 73 74 61 74 65 50     }..    stateP
1fc0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
1fd0: 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46  _TCL_HANDSHAKE_F
1fe0: 41 49 4c 45 44 3b 0a 09 20 20 20 20 2a 65 72 72  AILED;..    *err
1ff0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e  orCodePtr = ECON
2000: 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 72  NABORTED;..    r
2010: 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65  eturn -1;...case
2020: 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41   SSL_ERROR_SYSCA
2030: 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65  LL:..    /* Some
2040: 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65   non-recoverable
2050: 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f  , fatal I/O erro
2060: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20  r occurred */.. 
2070: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
2080: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 22 29 3b  ERROR_SYSCALL");
2090: 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69  ...    if (backi
20a0: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20  ngError == 0 && 
20b0: 65 72 72 20 3d 3d 20 30 29 20 7b 0a 09 09 64 70  err == 0) {...dp
20c0: 72 69 6e 74 66 28 22 45 4f 46 20 72 65 61 63 68  rintf("EOF reach
20d0: 65 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64  ed")...*errorCod
20e0: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45  ePtr = ECONNRESE
20f0: 54 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73  T;...Tls_Error(s
2100: 74 61 74 65 50 74 72 2c 20 22 28 75 6e 65 78 70  tatePtr, "(unexp
2110: 65 63 74 65 64 29 20 45 4f 46 20 72 65 61 63 68  ected) EOF reach
2120: 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c  ed");...    } el
2130: 73 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72  se if (backingEr
2140: 72 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20  ror == 0 && err 
2150: 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e  == -1) {...dprin
2160: 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63  tf("I/O error oc
2170: 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20  curred (errno = 
2180: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
2190: 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72   long) Tcl_GetEr
21a0: 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72  rno());...*error
21b0: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65  CodePtr = Tcl_Ge
21c0: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28  tErrno();...if (
21d0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d  *errorCodePtr ==
21e0: 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09   ECONNRESET) {..
21f0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
2200: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45  tr = ECONNABORTE
2210: 44 3b 0a 09 09 7d 0a 09 09 54 6c 73 5f 45 72 72  D;...}...Tls_Err
2220: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 54 63 6c  or(statePtr, Tcl
2230: 5f 45 72 72 6e 6f 4d 73 67 28 2a 65 72 72 6f 72  _ErrnoMsg(*error
2240: 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20 20 20  CodePtr));...   
2250: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69   } else {...dpri
2260: 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f  ntf("I/O error o
2270: 63 63 75 72 72 65 64 20 28 62 61 63 6b 69 6e 67  ccurred (backing
2280: 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62  Error = %lu)", b
2290: 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09  ackingError);...
22a0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
22b0: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a  Tcl_GetErrno();.
22c0: 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65  ..if (*errorCode
22d0: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45  Ptr == ECONNRESE
22e0: 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 6f  T) {...    *erro
22f0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e  rCodePtr = ECONN
2300: 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 09 54  ABORTED;...}...T
2310: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
2320: 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72  r, ERR_reason_er
2330: 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69  ror_string(backi
2340: 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20  ngError));..    
2350: 7d 0a 0a 09 20 20 20 20 73 74 61 74 65 50 74 72  }...    statePtr
2360: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
2370: 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49  CL_HANDSHAKE_FAI
2380: 4c 45 44 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LED;..    return
2390: 20 2d 31 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f   -1;...case SSL_
23a0: 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52  ERROR_ZERO_RETUR
23b0: 4e 3a 0a 09 20 20 20 20 2f 2a 20 50 65 65 72 20  N:..    /* Peer 
23c0: 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63  has closed the c
23d0: 6f 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e  onnection by sen
23e0: 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e  ding the close_n
23f0: 6f 74 69 66 79 20 61 6c 65 72 74 2e 20 43 61 6e  otify alert. Can
2400: 27 74 20 72 65 61 64 2c 20 62 75 74 20 63 61 6e  't read, but can
2410: 20 77 72 69 74 65 2e 20 2a 2f 0a 09 20 20 20 20   write. */..    
2420: 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 74 75 72  /* Need to retur
2430: 6e 20 61 6e 20 45 4f 46 2c 20 73 6f 20 63 68 61  n an EOF, so cha
2440: 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 20 77  nnel is closed w
2450: 68 69 63 68 20 77 69 6c 6c 20 73 65 6e 64 20 61  hich will send a
2460: 6e 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 29  n SSL_shutdown()
2470: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  . */..    dprint
2480: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52  f("SSL_ERROR_ZER
2490: 4f 5f 52 45 54 55 52 4e 3a 20 43 6f 6e 6e 65 63  O_RETURN: Connec
24a0: 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  t returned an in
24b0: 76 61 6c 69 64 20 76 61 6c 75 65 2e 2e 2e 22 29  valid value...")
24c0: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
24d0: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45  ePtr = ECONNRESE
24e0: 54 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  T;..    Tls_Erro
24f0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 50 65 65  r(statePtr, "Pee
2500: 72 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65  r has closed the
2510: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
2520: 77 72 69 74 69 6e 67 20 62 79 20 73 65 6e 64 69  writing by sendi
2530: 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74  ng the close_not
2540: 69 66 79 20 61 6c 65 72 74 22 29 3b 0a 09 20 20  ify alert");..  
2550: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63    return -1;...c
2560: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
2570: 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f 2a  NT_READ:..    /*
2580: 20 4d 6f 72 65 20 64 61 74 61 20 6d 75 73 74 20   More data must 
2590: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
25a0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 42 49 4f 20   underlying BIO 
25b0: 6c 61 79 65 72 20 69 6e 20 6f 72 64 65 72 20 74  layer in order t
25c0: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 61  o complete the a
25d0: 63 74 75 61 6c 20 53 53 4c 5f 2a 28 29 20 6f 70  ctual SSL_*() op
25e0: 65 72 61 74 69 6f 6e 2e 20 20 2a 2f 0a 09 20 20  eration.  */..  
25f0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45    dprintf("SSL_E
2600: 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 22 29  RROR_WANT_READ")
2610: 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72  ;..    BIO_set_r
2620: 65 74 72 79 5f 72 65 61 64 28 73 74 61 74 65 50  etry_read(stateP
2630: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 2a  tr->bio);..    *
2640: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
2650: 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 69  AGAIN;..    dpri
2660: 6e 74 66 28 22 45 52 52 28 25 64 2c 20 25 64 29  ntf("ERR(%d, %d)
2670: 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 43 6f   ", rc, *errorCo
2680: 64 65 50 74 72 29 3b 0a 09 20 20 20 20 73 74 61  dePtr);..    sta
2690: 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54  tePtr->want |= T
26a0: 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20  CL_READABLE;..  
26b0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63    return -1;...c
26c0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  ase SSL_ERROR_WA
26d0: 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 20 2f  NT_WRITE:..    /
26e0: 2a 20 54 68 65 72 65 20 69 73 20 64 61 74 61 20  * There is data 
26f0: 69 6e 20 74 68 65 20 53 53 4c 20 62 75 66 66 65  in the SSL buffe
2700: 72 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 77  r that must be w
2710: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 75 6e  ritten to the un
2720: 64 65 72 6c 79 69 6e 67 20 42 49 4f 20 69 6e 20  derlying BIO in 
2730: 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
2740: 65 20 74 68 65 20 53 53 4c 5f 2a 28 29 20 6f 70  e the SSL_*() op
2750: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 09 20 20 20  eration. */..   
2760: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52   dprintf("SSL_ER
2770: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 22 29  ROR_WANT_WRITE")
2780: 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72  ;..    BIO_set_r
2790: 65 74 72 79 5f 77 72 69 74 65 28 73 74 61 74 65  etry_write(state
27a0: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20  Ptr->bio);..    
27b0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
27c0: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 72  EAGAIN;..    dpr
27d0: 69 6e 74 66 28 22 45 52 52 28 25 64 2c 20 25 64  intf("ERR(%d, %d
27e0: 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 43  ) ", rc, *errorC
27f0: 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 20 73 74  odePtr);..    st
2800: 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20  atePtr->want |= 
2810: 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20  TCL_WRITABLE;.. 
2820: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09     return -1;...
2830: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57  case SSL_ERROR_W
2840: 41 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09 20 20  ANT_CONNECT:..  
2850: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 20 77 6f 75    /* Connect wou
2860: 6c 64 20 68 61 76 65 20 62 6c 6f 63 6b 65 64 2e  ld have blocked.
2870: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
2880: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  ("SSL_ERROR_WANT
2890: 5f 43 4f 4e 4e 45 43 54 22 29 3b 0a 09 20 20 20  _CONNECT");..   
28a0: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 73   BIO_set_retry_s
28b0: 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d  pecial(statePtr-
28c0: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42 49 4f 5f  >bio);..    BIO_
28d0: 73 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e  set_retry_reason
28e0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20  (statePtr->bio, 
28f0: 42 49 4f 5f 52 52 5f 43 4f 4e 4e 45 43 54 29 3b  BIO_RR_CONNECT);
2900: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
2910: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
2920: 20 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28     dprintf("ERR(
2930: 25 64 2c 20 25 64 29 20 22 2c 20 72 63 2c 20 2a  %d, %d) ", rc, *
2940: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09  errorCodePtr);..
2950: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a      return -1;..
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 25 64 2c 20  printf("ERR(%d, 
2a60: 25 64 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f  %d) ", rc, *erro
2a70: 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 20  rCodePtr);..    
2a80: 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73  return -1;...cas
2a90: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  e SSL_ERROR_WANT
2aa0: 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20  _X509_LOOKUP:.. 
2ab0: 20 20 20 2f 2a 20 41 70 70 20 63 61 6c 6c 62 61     /* App callba
2ac0: 63 6b 20 73 65 74 20 62 79 20 53 53 4c 5f 43 54  ck set by SSL_CT
2ad0: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72  X_set_client_cer
2ae0: 74 5f 63 62 20 68 61 73 20 61 73 6b 65 64 20 74  t_cb has asked t
2af0: 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69  o be called agai
2b00: 6e 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 54 68 65  n */..    /* The
2b10: 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
2b20: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
2b30: 75 73 65 20 61 6e 20 61 70 70 6c 69 63 61 74 69  use an applicati
2b40: 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 73 65 74 20  on callback set 
2b50: 62 79 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  by SSL_CTX_set_c
2b60: 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62 28 29 20  lient_cert_cb() 
2b70: 68 61 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20  has asked to be 
2b80: 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f  called again. */
2b90: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
2ba0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
2bb0: 30 39 5f 4c 4f 4f 4b 55 50 22 29 3b 0a 09 20 20  09_LOOKUP");..  
2bc0: 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f    BIO_set_retry_
2bd0: 73 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 72  special(statePtr
2be0: 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42 49 4f  ->bio);..    BIO
2bf0: 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f  _set_retry_reaso
2c00: 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c  n(statePtr->bio,
2c10: 20 42 49 4f 5f 52 52 5f 53 53 4c 5f 58 35 30 39   BIO_RR_SSL_X509
2c20: 5f 4c 4f 4f 4b 55 50 29 3b 0a 09 20 20 20 20 2a  _LOOKUP);..    *
2c30: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
2c40: 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 69  AGAIN;..    dpri
2c50: 6e 74 66 28 22 45 52 52 28 25 64 2c 20 25 64 29  ntf("ERR(%d, %d)
2c60: 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 43 6f   ", rc, *errorCo
2c70: 64 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  dePtr);..    ret
2c80: 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65 20 53  urn -1;...case S
2c90: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53  SL_ERROR_WANT_AS
2ca0: 59 4e 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65  YNC:..    /* Use
2cb0: 64 20 77 69 74 68 20 66 6c 61 67 20 53 53 4c 5f  d with flag SSL_
2cc0: 4d 4f 44 45 5f 41 53 59 4e 43 2c 20 6f 70 20 64  MODE_ASYNC, op d
2cd0: 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 62  idn't complete b
2ce0: 65 63 61 75 73 65 20 61 6e 20 61 73 79 6e 63 20  ecause an async 
2cf0: 65 6e 67 69 6e 65 20 69 73 20 73 74 69 6c 6c 20  engine is still 
2d00: 70 72 6f 63 65 73 73 69 6e 67 20 64 61 74 61 20  processing data 
2d10: 2a 2f 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  */..case SSL_ERR
2d20: 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 5f 4a 4f  OR_WANT_ASYNC_JO
2d30: 42 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 61  B:..    /* The a
2d40: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6a 6f 62 20  synchronous job 
2d50: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 74 61  could not be sta
2d60: 72 74 65 64 20 62 65 63 61 75 73 65 20 74 68 65  rted because the
2d70: 72 65 20 77 65 72 65 20 6e 6f 20 61 73 79 6e 63  re were no async
2d80: 20 6a 6f 62 73 20 61 76 61 69 6c 61 62 6c 65 20   jobs available 
2d90: 69 6e 20 74 68 65 20 70 6f 6f 6c 2e 20 2a 2f 0a  in the pool. */.
2da0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
2db0: 57 41 4e 54 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  WANT_CLIENT_HELL
2dc0: 4f 5f 43 42 3a 0a 09 20 20 20 20 2f 2a 20 54 68  O_CB:..    /* Th
2dd0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  e operation did 
2de0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
2df0: 61 75 73 65 20 61 6e 20 61 70 70 6c 69 63 61 74  ause an applicat
2e00: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 73 65 74  ion callback set
2e10: 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f   by SSL_CTX_set_
2e20: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28  client_hello_cb(
2e30: 29 20 68 61 73 20 61 73 6b 65 64 20 74 6f 20 62  ) has asked to b
2e40: 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20  e called again. 
2e50: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  */.#if OPENSSL_V
2e60: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
2e70: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 63 61   0x30000000L..ca
2e80: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  se SSL_ERROR_WAN
2e90: 54 5f 52 45 54 52 59 5f 56 45 52 49 46 59 3a 0a  T_RETRY_VERIFY:.
2ea0: 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72  .    /* The oper
2eb0: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f  ation did not co
2ec0: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 61  mplete because a
2ed0: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72   certificate ver
2ee0: 69 66 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61  ification callba
2ef0: 63 6b 20 68 61 73 20 61 73 6b 65 64 20 74 6f 20  ck has asked to 
2f00: 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20  be called again 
2f10: 76 69 61 20 53 53 4c 5f 73 65 74 5f 72 65 74 72  via SSL_set_retr
2f20: 79 5f 76 65 72 69 66 79 28 33 29 2e 20 2a 2f 0a  y_verify(3). */.
2f30: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a  #endif..default:
2f40: 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65  ..    /* The ope
2f50: 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63  ration did not c
2f60: 6f 6d 70 6c 65 74 65 20 61 6e 64 20 73 68 6f 75  omplete and shou
2f70: 6c 64 20 62 65 20 72 65 74 72 69 65 64 20 6c 61  ld be retried la
2f80: 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72  ter. */..    dpr
2f90: 69 6e 74 66 28 22 4f 70 65 72 61 74 69 6f 6e 20  intf("Operation 
2fa0: 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  did not complete
2fb0: 2c 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  , call function 
2fc0: 61 67 61 69 6e 20 6c 61 74 65 72 3a 20 25 69 22  again later: %i"
2fd0: 2c 20 72 63 29 3b 0a 09 20 20 20 20 2a 65 72 72  , rc);..    *err
2fe0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
2ff0: 49 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  IN;..    dprintf
3000: 28 22 45 52 52 28 25 64 2c 20 25 64 29 20 22 2c  ("ERR(%d, %d) ",
3010: 20 72 63 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50   rc, *errorCodeP
3020: 74 72 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72  tr);..    Tls_Er
3030: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 4f  ror(statePtr, "O
3040: 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
3050: 20 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c 6c 20   complete, call 
3060: 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  function again l
3070: 61 74 65 72 22 29 3b 0a 09 20 20 20 20 72 65 74  ater");..    ret
3080: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
3090: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 6d 6f     dprintf("Remo
30a0: 76 69 6e 67 20 74 68 65 20 5c 22 54 4c 53 5f 54  ving the \"TLS_T
30b0: 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67 20 73  CL_INIT\" flag s
30c0: 69 6e 63 65 20 77 65 20 68 61 76 65 20 63 6f 6d  ince we have com
30d0: 70 6c 65 74 65 64 20 74 68 65 20 68 61 6e 64 73  pleted the hands
30e0: 68 61 6b 65 22 29 3b 0a 20 20 20 20 73 74 61 74  hake");.    stat
30f0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  ePtr->flags &= ~
3100: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20  TLS_TCL_INIT;.. 
3110: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
3120: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
3130: 22 29 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f  ");.    *errorCo
3140: 64 65 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 72  dePtr = 0;.    r
3150: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
3160: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
31b0: 2a 0a 20 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f  *. * TlsInputPro
31c0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
31d0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
31e0: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  oked by the gene
31f0: 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 74 6f  ric I/O layer to
3200: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 0a   read data from.
3210: 20 2a 09 74 68 65 20 42 49 4f 20 77 68 65 6e 65   *.the BIO whene
3220: 76 65 72 20 74 68 65 20 54 63 6c 5f 52 65 61 64  ver the Tcl_Read
3230: 28 29 2c 20 54 63 6c 5f 52 65 61 64 43 68 61 72  (), Tcl_ReadChar
3240: 73 2c 20 54 63 6c 5f 47 65 74 73 2c 20 61 6e 64  s, Tcl_Gets, and
3250: 0a 20 2a 09 54 63 6c 5f 47 65 74 73 4f 62 6a 20  . *.Tcl_GetsObj 
3260: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73  functions are us
3270: 65 64 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 74  ed. Equivalent t
3280: 6f 20 53 53 4c 5f 72 65 61 64 5f 65 78 20 61 6e  o SSL_read_ex an
3290: 64 20 53 53 4c 5f 72 65 61 64 2e 0a 20 2a 0a 20  d SSL_read.. *. 
32a0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65  * Results:. *.Re
32b0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
32c0: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 6f   of bytes read o
32d0: 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 53  r -1 on error. S
32e0: 65 74 73 20 65 72 72 6f 72 43 6f 64 65 50 74 72  ets errorCodePtr
32f0: 20 74 6f 0a 20 2a 09 61 20 50 4f 53 49 58 20 65   to. *.a POSIX e
3300: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
3310: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
3320: 6f 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a  or 0 if none.. *
3330: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3340: 3a 0a 20 2a 20 20 20 20 52 65 61 64 73 20 69 6e  :. *    Reads in
3350: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  put from the inp
3360: 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 68 65  ut device of the
3370: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20   channel.. *. * 
3380: 44 61 74 61 20 69 73 20 72 65 63 65 69 76 65 64  Data is received
3390: 20 69 6e 20 77 68 6f 6c 65 20 62 6c 6f 63 6b 73   in whole blocks
33a0: 20 6b 6e 6f 77 6e 20 61 73 20 72 65 63 6f 72 64   known as record
33b0: 73 20 66 72 6f 6d 20 74 68 65 20 70 65 65 72 2e  s from the peer.
33c0: 20 41 20 77 68 6f 6c 65 0a 20 2a 20 72 65 63 6f   A whole. * reco
33d0: 72 64 20 69 73 20 70 72 6f 63 65 73 73 65 64 20  rd is processed 
33e0: 28 65 2e 67 2e 20 64 65 63 72 79 70 74 65 64 29  (e.g. decrypted)
33f0: 20 69 6e 20 6f 6e 65 20 67 6f 20 61 6e 64 20 69   in one go and i
3400: 73 20 62 75 66 66 65 72 65 64 20 62 79 20 4f 70  s buffered by Op
3410: 65 6e 53 53 4c 0a 20 2a 20 75 6e 74 69 6c 20 69  enSSL. * until i
3420: 74 20 69 73 20 72 65 61 64 20 62 79 20 74 68 65  t is read by the
3430: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 76 69 61   application via
3440: 20 61 20 63 61 6c 6c 20 74 6f 20 53 53 4c 5f 72   a call to SSL_r
3450: 65 61 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ead.. *. *------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
34b0: 69 63 20 69 6e 74 20 54 6c 73 49 6e 70 75 74 50  ic int TlsInputP
34c0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
34d0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 63 68 61  nstanceData, cha
34e0: 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 53  r *buf, int bufS
34f0: 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43  ize, int *errorC
3500: 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 75 6e  odePtr) {.    un
3510: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b  signed long back
3520: 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20 53 74  ingError;.    St
3530: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
3540: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
3550: 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  ceData;.    int 
3560: 62 79 74 65 73 52 65 61 64 2c 20 65 72 72 3b 0a  bytesRead, err;.
3570: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
3580: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  r = 0;..    dpri
3590: 6e 74 66 28 22 52 65 61 64 28 25 64 29 22 2c 20  ntf("Read(%d)", 
35a0: 62 75 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 2f  bufSize);..    /
35b0: 2a 20 53 6b 69 70 20 69 66 20 75 73 65 72 20 76  * Skip if user v
35c0: 65 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69  erify callback i
35d0: 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20  s still running 
35e0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
35f0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
3600: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b  _TCL_CALLBACK) {
3610: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62  ..dprintf("Callb
3620: 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20  ack is running, 
3630: 72 65 61 64 69 6e 67 20 30 20 62 79 74 65 73 22  reading 0 bytes"
3640: 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  );..return 0;.  
3650: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
3660: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ot initialized, 
3670: 64 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20  do connect */.  
3680: 20 20 2f 2a 20 43 61 6e 20 61 6c 73 6f 20 63 68    /* Can also ch
3690: 65 63 6b 20 53 53 4c 5f 69 73 5f 69 6e 69 74 5f  eck SSL_is_init_
36a0: 66 69 6e 69 73 68 65 64 28 73 73 6c 29 20 2a 2f  finished(ssl) */
36b0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
36c0: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
36d0: 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 69 6e 74 20  CL_INIT) {..int 
36e0: 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70  tlsConnect;...dp
36f0: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54  rintf("Calling T
3700: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
3710: 74 22 29 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63  t");...tlsConnec
3720: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  t = Tls_WaitForC
3730: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c  onnect(statePtr,
3740: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 30   errorCodePtr, 0
3750: 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f 6e 6e 65  );..if (tlsConne
3760: 63 74 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 64  ct < 0) {..    d
3770: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65  printf("Got an e
3780: 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f 20  rror waiting to 
3790: 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e  connect (tlsConn
37a0: 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72  ect = %i, *error
37b0: 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c 20  CodePtr = %i)", 
37c0: 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72  tlsConnect, *err
37d0: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 20 20  orCodePtr);..   
37e0: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65   Tls_Error(state
37f0: 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28 2a 65  Ptr, strerror(*e
3800: 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a  rrorCodePtr));..
3810: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
3820: 20 2d 31 3b 0a 09 20 20 20 20 69 66 20 28 2a 65   -1;..    if (*e
3830: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45  rrorCodePtr == E
3840: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 64  CONNRESET) {...d
3850: 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e  printf("Got conn
3860: 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a  ection reset");.
3870: 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f  ../* Soft EOF */
3880: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
3890: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61   = 0;...bytesRea
38a0: 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20  d = 0;..    }.. 
38b0: 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 52     return bytesR
38c0: 65 61 64 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ead;..}.    }.. 
38d0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20     /*.     * We 
38e0: 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68  need to clear th
38f0: 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63  e SSL error stac
3900: 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65  k now because we
3910: 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68   sometimes reach
3920: 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e  .     * this fun
3930: 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f  ction with lefto
3940: 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68  ver errors in th
3950: 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f  e stack.  If BIO
3960: 5f 72 65 61 64 0a 20 20 20 20 20 2a 20 72 65 74  _read.     * ret
3970: 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65  urns -1 and inte
3980: 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72  nds EAGAIN, ther
3990: 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20  e is a leftover 
39a0: 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62  error, it will b
39b0: 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73  e.     * miscons
39c0: 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f  trued as an erro
39d0: 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20  r, not EAGAIN.. 
39e0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74      *.     * Alt
39f0: 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d  ernatively, we m
3a00: 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c  ay want to handl
3a10: 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20  e the <0 return 
3a20: 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  codes from.     
3a30: 2a 20 42 49 4f 5f 72 65 61 64 20 73 70 65 63 69  * BIO_read speci
3a40: 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73 65 64  ally (as advised
3a50: 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73   in the RSA docs
3a60: 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20  ).  TLS's lower 
3a70: 6c 65 76 65 6c 20 42 49 4f 0a 20 20 20 20 20 2a  level BIO.     *
3a80: 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20   functions play 
3a90: 77 69 74 68 20 74 68 65 20 72 65 74 72 79 20 66  with the retry f
3aa0: 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64  lags though, and
3ab0: 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f 20 77   this seems to w
3ac0: 6f 72 6b 0a 20 20 20 20 20 2a 20 63 6f 72 72 65  ork.     * corre
3ad0: 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66  ctly.  Similar f
3ae0: 69 78 20 69 6e 20 54 6c 73 4f 75 74 70 75 74 50  ix in TlsOutputP
3af0: 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20  roc. - hobbs.   
3b00: 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65    */.    ERR_cle
3b10: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20  ar_error();.    
3b20: 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f  BIO_clear_retry_
3b30: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e  flags(statePtr->
3b40: 62 69 6f 29 3b 0a 20 20 20 20 62 79 74 65 73 52  bio);.    bytesR
3b50: 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73  ead = BIO_read(s
3b60: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75  tatePtr->bio, bu
3b70: 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20  f, bufSize);.   
3b80: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65   dprintf("BIO_re
3b90: 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73  ad -> %d", bytes
3ba0: 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  Read);..    /* S
3bb0: 61 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c  ame as SSL_want,
3bc0: 20 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73   but also checks
3bd0: 20 74 68 65 20 65 72 72 6f 72 20 71 75 65 75 65   the error queue
3be0: 20 2a 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 53   */.    err = SS
3bf0: 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74  L_get_error(stat
3c00: 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73  ePtr->ssl, bytes
3c10: 52 65 61 64 29 3b 0a 20 20 20 20 62 61 63 6b 69  Read);.    backi
3c20: 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65  ngError = ERR_ge
3c30: 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  t_error();..    
3c40: 69 66 20 28 62 79 74 65 73 52 65 61 64 20 3c 3d  if (bytesRead <=
3c50: 20 30 29 20 7b 0a 09 2f 2a 20 54 68 65 20 72 65   0) {../* The re
3c60: 74 72 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  try flag is set 
3c70: 62 79 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72  by the BIO_set_r
3c80: 65 74 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73  etry_* functions
3c90: 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f   */..if (BIO_sho
3ca0: 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50  uld_retry(stateP
3cb0: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20  tr->bio)) {..   
3cc0: 20 64 70 72 69 6e 74 66 28 22 52 65 61 64 20 66   dprintf("Read f
3cd0: 61 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 3d  ailed with code=
3ce0: 25 64 2c 20 62 79 74 65 73 20 72 65 61 64 3d 25  %d, bytes read=%
3cf0: 64 3a 20 73 68 6f 75 6c 64 20 72 65 74 72 79 22  d: should retry"
3d00: 2c 20 65 72 72 2c 20 62 79 74 65 73 52 65 61 64  , err, bytesRead
3d10: 29 3b 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20  );..    /* Some 
3d20: 64 6f 63 73 20 69 6d 70 6c 79 20 77 65 20 73 68  docs imply we sh
3d30: 6f 75 6c 64 20 72 65 64 6f 20 74 68 65 20 42 49  ould redo the BI
3d40: 4f 5f 72 65 61 64 20 6e 6f 77 20 2a 2f 0a 09 7d  O_read now */..}
3d50: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72   else {..    dpr
3d60: 69 6e 74 66 28 22 52 65 61 64 20 66 61 69 6c 65  intf("Read faile
3d70: 64 20 77 69 74 68 20 63 6f 64 65 3d 25 64 2c 20  d with code=%d, 
3d80: 62 79 74 65 73 20 72 65 61 64 3d 25 64 3a 20 65  bytes read=%d: e
3d90: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 22 2c  rror condition",
3da0: 20 65 72 72 2c 20 62 79 74 65 73 52 65 61 64 29   err, bytesRead)
3db0: 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22  ;..}...dprintf("
3dc0: 42 49 4f 20 69 73 20 45 4f 46 20 25 64 22 2c 20  BIO is EOF %d", 
3dd0: 42 49 4f 5f 65 6f 66 28 73 74 61 74 65 50 74 72  BIO_eof(statePtr
3de0: 2d 3e 62 69 6f 29 29 3b 0a 0a 09 2f 2a 20 54 68  ->bio));.../* Th
3df0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
3e00: 20 61 73 20 42 49 4f 5f 72 65 74 72 79 5f 74 79   as BIO_retry_ty
3e10: 70 65 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73  pe */..if (BIO_s
3e20: 68 6f 75 6c 64 5f 72 65 61 64 28 73 74 61 74 65  hould_read(state
3e30: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20  Ptr->bio)) {..  
3e40: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68    dprintf("BIO h
3e50: 61 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  as insufficient 
3e60: 64 61 74 61 20 74 6f 20 72 65 61 64 20 61 6e 64  data to read and
3e70: 20 72 65 74 75 72 6e 22 29 3b 0a 09 20 20 20 20   return");..    
3e80: 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c  statePtr->want |
3e90: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a  = TCL_READABLE;.
3ea0: 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75  .}..if (BIO_shou
3eb0: 6c 64 5f 77 72 69 74 65 28 73 74 61 74 65 50 74  ld_write(statePt
3ec0: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20  r->bio)) {..    
3ed0: 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73  dprintf("BIO has
3ee0: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f   pending data to
3ef0: 20 77 72 69 74 65 22 29 3b 0a 09 20 20 20 20 73   write");..    s
3f00: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d  tatePtr->want |=
3f10: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09   TCL_WRITABLE;..
3f20: 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c  }..if (BIO_shoul
3f30: 64 5f 69 6f 5f 73 70 65 63 69 61 6c 28 73 74 61  d_io_special(sta
3f40: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09  tePtr->bio)) {..
3f50: 20 20 20 20 69 6e 74 20 72 65 61 73 6f 6e 20 3d      int reason =
3f60: 20 42 49 4f 5f 67 65 74 5f 72 65 74 72 79 5f 72   BIO_get_retry_r
3f70: 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  eason(statePtr->
3f80: 62 69 6f 29 3b 0a 09 20 20 20 20 64 70 72 69 6e  bio);..    dprin
3f90: 74 66 28 22 42 49 4f 20 68 61 73 20 73 6f 6d 65  tf("BIO has some
3fa0: 20 73 70 65 63 69 61 6c 20 63 6f 6e 64 69 74 69   special conditi
3fb0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 72 65  on other than re
3fc0: 61 64 20 6f 72 20 77 72 69 74 65 3a 20 63 6f 64  ad or write: cod
3fd0: 65 3d 25 64 22 2c 20 72 65 61 73 6f 6e 29 3b 0a  e=%d", reason);.
3fe0: 09 7d 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  .}..dprintf("BIO
3ff0: 20 68 61 73 20 70 65 6e 64 69 6e 67 20 64 61 74   has pending dat
4000: 61 20 74 6f 20 77 72 69 74 65 22 29 3b 0a 20 20  a to write");.  
4010: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20    }..    switch 
4020: 28 65 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53  (err) {..case SS
4030: 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20  L_ERROR_NONE:.. 
4040: 20 20 20 2f 2a 20 49 2f 4f 20 6f 70 65 72 61 74     /* I/O operat
4050: 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f  ion completed */
4060: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
4070: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b  SL_ERROR_NONE");
4080: 0a 09 20 20 20 20 64 70 72 69 6e 74 42 75 66 66  ..    dprintBuff
4090: 65 72 28 62 75 66 2c 20 62 79 74 65 73 52 65 61  er(buf, bytesRea
40a0: 64 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  d);..    break;.
40b0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
40c0: 5f 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20  _SSL:..    /* A 
40d0: 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c  non-recoverable,
40e0: 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 6e 20   fatal error in 
40f0: 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 20  the SSL library 
4100: 6f 63 63 75 72 72 65 64 2c 20 75 73 75 61 6c 6c  occurred, usuall
4110: 79 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72  y a protocol err
4120: 6f 72 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  or */..    dprin
4130: 74 66 28 22 53 53 4c 20 65 72 72 6f 72 2c 20 69  tf("SSL error, i
4140: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
4150: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
4160: 73 20 62 65 65 6e 20 61 62 6f 72 74 65 64 22 29  s been aborted")
4170: 3b 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69  ;..    if (backi
4180: 6e 67 45 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a  ngError != 0) {.
4190: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74  ..Tls_Error(stat
41a0: 65 50 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e  ePtr, ERR_reason
41b0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61  _error_string(ba
41c0: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20  ckingError));.. 
41d0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 53 53     } else if (SS
41e0: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
41f0: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
4200: 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29  l) != X509_V_OK)
4210: 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73   {...Tls_Error(s
4220: 74 61 74 65 50 74 72 2c 20 58 35 30 39 5f 76 65  tatePtr, X509_ve
4230: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
4240: 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76  string(SSL_get_v
4250: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
4260: 74 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09  tePtr->ssl)));..
4270: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54      } else {...T
4280: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4290: 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20  r, "Unknown SSL 
42a0: 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 7d 0a  error");..    }.
42b0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
42c0: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45  tr = ECONNABORTE
42d0: 44 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61  D;..    bytesRea
42e0: 64 20 3d 20 2d 31 3b 0a 0a 23 69 66 20 4f 50 45  d = -1;..#if OPE
42f0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
4300: 42 45 52 20 3e 3d 20 30 78 33 30 30 30 30 30 30  BER >= 0x3000000
4310: 30 4c 0a 09 20 20 20 20 2f 2a 20 55 6e 65 78 70  0L..    /* Unexp
4320: 65 63 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 74  ected EOF from t
4330: 68 65 20 70 65 65 72 20 66 6f 72 20 4f 70 65 6e  he peer for Open
4340: 53 53 4c 20 33 2e 30 2b 20 2a 2f 0a 09 20 20 20  SSL 3.0+ */..   
4350: 20 69 66 20 28 45 52 52 5f 47 45 54 5f 52 45 41   if (ERR_GET_REA
4360: 53 4f 4e 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  SON(backingError
4370: 29 20 3d 3d 20 53 53 4c 5f 52 5f 55 4e 45 58 50  ) == SSL_R_UNEXP
4380: 45 43 54 45 44 5f 45 4f 46 5f 57 48 49 4c 45 5f  ECTED_EOF_WHILE_
4390: 52 45 41 44 49 4e 47 29 20 7b 0a 09 09 64 70 72  READING) {...dpr
43a0: 69 6e 74 66 28 22 28 55 6e 65 78 70 65 63 74 65  intf("(Unexpecte
43b0: 64 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 29  d) EOF reached")
43c0: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
43d0: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61   = 0;...bytesRea
43e0: 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72  d = 0;...Tls_Err
43f0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f  or(statePtr, "EO
4400: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 09 20 20  F reached");..  
4410: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 20 20 20 20    }.#endif..    
4420: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
4430: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41  L_ERROR_WANT_REA
4440: 44 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 20 64 69  D:..    /* Op di
4450: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64  d not complete d
4460: 75 65 20 74 6f 20 6e 6f 74 20 65 6e 6f 75 67 68  ue to not enough
4470: 20 64 61 74 61 20 77 61 73 20 61 76 61 69 6c 61   data was availa
4480: 62 6c 65 2e 20 52 65 74 72 79 20 6c 61 74 65 72  ble. Retry later
4490: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  . */..    dprint
44a0: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52  f("Got SSL_ERROR
44b0: 5f 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70  _WANT_READ, mapp
44c0: 69 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47 41  ing this to EAGA
44d0: 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  IN");..    *erro
44e0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
44f0: 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61  N;..    bytesRea
4500: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61  d = -1;..    sta
4510: 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54  tePtr->want |= T
4520: 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20  CL_READABLE;..  
4530: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74    Tls_Error(stat
4540: 65 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52  ePtr, "SSL_ERROR
4550: 5f 57 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20  _WANT_READ");.. 
4560: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
4570: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e  _read(statePtr->
4580: 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  bio);..    break
4590: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
45a0: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09  OR_WANT_WRITE:..
45b0: 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 20 6e 6f      /* Op did no
45c0: 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20 74  t complete due t
45d0: 6f 20 75 6e 61 62 6c 65 20 74 6f 20 73 65 6e 74  o unable to sent
45e0: 20 61 6c 6c 20 64 61 74 61 20 74 6f 20 74 68 65   all data to the
45f0: 20 42 49 4f 2e 20 52 65 74 72 79 20 6c 61 74 65   BIO. Retry late
4600: 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  r. */..    dprin
4610: 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f  tf("Got SSL_ERRO
4620: 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d 61  R_WANT_WRITE, ma
4630: 70 70 69 6e 67 20 74 68 69 73 20 74 6f 20 45 41  pping this to EA
4640: 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72  GAIN");..    *er
4650: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47  rorCodePtr = EAG
4660: 41 49 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52  AIN;..    bytesR
4670: 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73  ead = -1;..    s
4680: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d  tatePtr->want |=
4690: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09   TCL_WRITABLE;..
46a0: 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74      Tls_Error(st
46b0: 61 74 65 50 74 72 2c 20 22 53 53 4c 5f 45 52 52  atePtr, "SSL_ERR
46c0: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 22 29 3b  OR_WANT_WRITE");
46d0: 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65  ..    BIO_set_re
46e0: 74 72 79 5f 77 72 69 74 65 28 73 74 61 74 65 50  try_write(stateP
46f0: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62  tr->bio);..    b
4700: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c  reak;...case SSL
4710: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39  _ERROR_WANT_X509
4720: 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 2a  _LOOKUP:..    /*
4730: 20 4f 70 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c   Op didn't compl
4740: 65 74 65 20 73 69 6e 63 65 20 63 61 6c 6c 62 61  ete since callba
4750: 63 6b 20 73 65 74 20 62 79 20 53 53 4c 5f 43 54  ck set by SSL_CT
4760: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72  X_set_client_cer
4770: 74 5f 63 62 28 29 20 61 73 6b 65 64 20 74 6f 20  t_cb() asked to 
4780: 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20  be called again 
4790: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
47a0: 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57  "Got SSL_ERROR_W
47b0: 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c  ANT_X509_LOOKUP,
47c0: 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45   mapping it to E
47d0: 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65  AGAIN");..    *e
47e0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
47f0: 47 41 49 4e 3b 0a 09 20 20 20 20 62 79 74 65 73  GAIN;..    bytes
4800: 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20  Read = -1;..    
4810: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
4820: 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57  tr, "SSL_ERROR_W
4830: 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 22  ANT_X509_LOOKUP"
4840: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  );..    break;..
4850: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
4860: 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a  SYSCALL:..    /*
4870: 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65   Some non-recove
4880: 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f  rable, fatal I/O
4890: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
48a0: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
48b0: 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41  "SSL_ERROR_SYSCA
48c0: 4c 4c 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28  LL");...    if (
48d0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20  backingError == 
48e0: 30 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d  0 && bytesRead =
48f0: 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 55 6e 65 78  = 0) {.../* Unex
4900: 70 65 63 74 65 64 20 45 4f 46 20 66 72 6f 6d 20  pected EOF from 
4910: 74 68 65 20 70 65 65 72 20 66 6f 72 20 4f 70 65  the peer for Ope
4920: 6e 53 53 4c 20 31 2e 31 20 2a 2f 0a 09 09 64 70  nSSL 1.1 */...dp
4930: 72 69 6e 74 66 28 22 28 55 6e 65 78 70 65 63 74  rintf("(Unexpect
4940: 65 64 29 20 45 4f 46 20 72 65 61 63 68 65 64 22  ed) EOF reached"
4950: 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  )...*errorCodePt
4960: 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65  r = 0;...bytesRe
4970: 61 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72  ad = 0;...Tls_Er
4980: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45  ror(statePtr, "E
4990: 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09  OF reached");...
49a0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62      } else if (b
49b0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30  ackingError == 0
49c0: 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d   && bytesRead ==
49d0: 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66   -1) {...dprintf
49e0: 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  ("I/O error occu
49f0: 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c  rred (errno = %l
4a00: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
4a10: 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 72 6e  ong) Tcl_GetErrn
4a20: 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f  o());...*errorCo
4a30: 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45  dePtr = Tcl_GetE
4a40: 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73 52  rrno();...bytesR
4a50: 65 61 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f  ead = -1;...Tls_
4a60: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
4a70: 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a 65 72  Tcl_ErrnoMsg(*er
4a80: 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09  rorCodePtr));...
4a90: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64      } else {...d
4aa0: 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f  printf("I/O erro
4ab0: 72 20 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b  r occurred (back
4ac0: 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22  ingError = %lu)"
4ad0: 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b  , backingError);
4ae0: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
4af0: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28   = Tcl_GetErrno(
4b00: 29 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d  );...bytesRead =
4b10: 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72   -1;...Tls_Error
4b20: 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72  (statePtr, ERR_r
4b30: 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69  eason_error_stri
4b40: 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29  ng(backingError)
4b50: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62  );..    }..    b
4b60: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c  reak;...case SSL
4b70: 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55  _ERROR_ZERO_RETU
4b80: 52 4e 3a 0a 09 20 20 20 20 2f 2a 20 50 65 65 72  RN:..    /* Peer
4b90: 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20   has closed the 
4ba0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65  connection by se
4bb0: 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f  nding the close_
4bc0: 6e 6f 74 69 66 79 20 61 6c 65 72 74 2e 20 43 61  notify alert. Ca
4bd0: 6e 27 74 20 72 65 61 64 2c 20 62 75 74 20 63 61  n't read, but ca
4be0: 6e 20 77 72 69 74 65 2e 20 2a 2f 0a 09 20 20 20  n write. */..   
4bf0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 74 75   /* Need to retu
4c00: 72 6e 20 61 6e 20 45 4f 46 2c 20 73 6f 20 63 68  rn an EOF, so ch
4c10: 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 20  annel is closed 
4c20: 77 68 69 63 68 20 77 69 6c 6c 20 73 65 6e 64 20  which will send 
4c30: 61 6e 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28  an SSL_shutdown(
4c40: 29 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  ). */..    dprin
4c50: 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f  tf("Got SSL_ERRO
4c60: 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74  R_ZERO_RETURN, t
4c70: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46  his means an EOF
4c80: 20 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65   has been reache
4c90: 64 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52  d");..    bytesR
4ca0: 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65  ead = 0;..    *e
4cb0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
4cc0: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28  ..    Tls_Error(
4cd0: 73 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20  statePtr, "Peer 
4ce0: 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63  has closed the c
4cf0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72  onnection for wr
4d00: 69 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67  iting by sending
4d10: 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66   the close_notif
4d20: 79 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20  y alert");..    
4d30: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53  break;...case SS
4d40: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59  L_ERROR_WANT_ASY
4d50: 4e 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65 64  NC:..    /* Used
4d60: 20 77 69 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d   with flag SSL_M
4d70: 4f 44 45 5f 41 53 59 4e 43 2c 20 6f 70 20 64 69  ODE_ASYNC, op di
4d80: 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  dn't complete be
4d90: 63 61 75 73 65 20 61 6e 20 61 73 79 6e 63 20 65  cause an async e
4da0: 6e 67 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70  ngine is still p
4db0: 72 6f 63 65 73 73 69 6e 67 20 64 61 74 61 20 2a  rocessing data *
4dc0: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
4dd0: 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41  Got SSL_ERROR_WA
4de0: 4e 54 5f 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e  NT_ASYNC, mappin
4df0: 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e  g this to EAGAIN
4e00: 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65  ");..    bytesRe
4e10: 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 2a 65  ad = -1;..    *e
4e20: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
4e30: 47 41 49 4e 3b 0a 09 20 20 20 20 54 6c 73 5f 45  GAIN;..    Tls_E
4e40: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22  rror(statePtr, "
4e50: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41  SSL_ERROR_WANT_A
4e60: 53 59 4e 43 22 29 3b 0a 09 20 20 20 20 62 72 65  SYNC");..    bre
4e70: 61 6b 3b 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09  ak;...default:..
4e80: 20 20 20 20 64 70 72 69 6e 74 66 28 22 55 6e 6b      dprintf("Unk
4e90: 6e 6f 77 6e 20 65 72 72 6f 72 20 28 65 72 72 20  nown error (err 
4ea0: 3d 20 25 69 29 2c 20 6d 61 70 70 69 6e 67 20 74  = %i), mapping t
4eb0: 6f 20 45 4f 46 22 2c 20 65 72 72 29 3b 0a 09 20  o EOF", err);.. 
4ec0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
4ed0: 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73   = 0;..    bytes
4ee0: 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 54  Read = 0;..    T
4ef0: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4f00: 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f  r, "Unknown erro
4f10: 72 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  r");..    break;
4f20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
4f30: 6e 74 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d  ntf("Input(%d) -
4f40: 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53  > %d [%d]", bufS
4f50: 69 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20  ize, bytesRead, 
4f60: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a  *errorCodePtr);.
4f70: 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73      return bytes
4f80: 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  Read;.}../*. *--
4f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4fe0: 2a 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20  * TlsOutputProc 
4ff0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
5000: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
5010: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
5020: 63 20 49 2f 4f 20 6c 61 79 65 72 20 74 6f 20 77  c I/O layer to w
5030: 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
5040: 0a 20 2a 09 42 49 4f 20 77 68 65 6e 65 76 65 72  . *.BIO whenever
5050: 20 74 68 65 20 74 68 65 20 54 63 6c 5f 57 72 69   the the Tcl_Wri
5060: 74 65 28 29 2c 20 54 63 6c 5f 57 72 69 74 65 43  te(), Tcl_WriteC
5070: 68 61 72 73 2c 20 61 6e 64 20 54 63 6c 5f 57 72  hars, and Tcl_Wr
5080: 69 74 65 4f 62 6a 0a 20 2a 09 66 75 6e 63 74 69  iteObj. *.functi
5090: 6f 6e 73 20 61 72 65 20 75 73 65 64 2e 20 45 71  ons are used. Eq
50a0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 53 53 4c 5f  uivalent to SSL_
50b0: 77 72 69 74 65 5f 65 78 20 61 6e 64 20 53 53 4c  write_ex and SSL
50c0: 5f 77 72 69 74 65 2e 0a 20 2a 0a 20 2a 20 52 65  _write.. *. * Re
50d0: 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 52 65 74  sults:. *    Ret
50e0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
50f0: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
5100: 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e   or -1 on error.
5110: 20 53 65 74 73 20 65 72 72 6f 72 43 6f 64 65 50   Sets errorCodeP
5120: 74 72 0a 20 2a 20 20 20 20 74 6f 20 61 20 50 4f  tr. *    to a PO
5130: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  SIX error code i
5140: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5150: 72 65 64 2c 20 6f 72 20 30 20 69 66 20 6e 6f 6e  red, or 0 if non
5160: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
5170: 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 57 72 69  fects:. *    Wri
5180: 74 65 73 20 6f 75 74 70 75 74 20 6f 6e 20 74 68  tes output on th
5190: 65 20 6f 75 74 70 75 74 20 64 65 76 69 63 65 20  e output device 
51a0: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a  of the channel..
51b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
5210: 74 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 28  t TlsOutputProc(
5220: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
5230: 6e 63 65 44 61 74 61 2c 20 63 6f 6e 73 74 20 63  nceData, const c
5240: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f  har *buf, int to
5250: 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f  Write, int *erro
5260: 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20  rCodePtr) {.    
5270: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61  unsigned long ba
5280: 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20  ckingError;.    
5290: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
52a0: 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74  = (State *) inst
52b0: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e  anceData;.    in
52c0: 74 20 77 72 69 74 74 65 6e 2c 20 65 72 72 3b 0a  t written, err;.
52d0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
52e0: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  r = 0;..    dpri
52f0: 6e 74 66 28 22 57 72 69 74 65 28 25 70 2c 20 25  ntf("Write(%p, %
5300: 64 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74  d)", (void *) st
5310: 61 74 65 50 74 72 2c 20 74 6f 57 72 69 74 65 29  atePtr, toWrite)
5320: 3b 0a 20 20 20 20 64 70 72 69 6e 74 42 75 66 66  ;.    dprintBuff
5330: 65 72 28 62 75 66 2c 20 74 6f 57 72 69 74 65 29  er(buf, toWrite)
5340: 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 69  ;..    /* Skip i
5350: 66 20 75 73 65 72 20 76 65 72 69 66 79 20 63 61  f user verify ca
5360: 6c 6c 62 61 63 6b 20 69 73 20 73 74 69 6c 6c 20  llback is still 
5370: 72 75 6e 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 69  running */.    i
5380: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  f (statePtr->fla
5390: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c  gs & TLS_TCL_CAL
53a0: 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74  LBACK) {..dprint
53b0: 66 28 22 44 6f 6e 27 74 20 70 72 6f 63 65 73 73  f("Don't process
53c0: 20 6f 75 74 70 75 74 20 77 68 69 6c 65 20 63 61   output while ca
53d0: 6c 6c 62 61 63 6b 73 20 61 72 65 20 72 75 6e 6e  llbacks are runn
53e0: 69 6e 67 22 29 3b 0a 09 77 72 69 74 74 65 6e 20  ing");..written 
53f0: 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64  = -1;..*errorCod
5400: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09  ePtr = EAGAIN;..
5410: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
5420: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ..    /* If not 
5430: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 64 6f 20  initialized, do 
5440: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 2f  connect */.    /
5450: 2a 20 43 61 6e 20 61 6c 73 6f 20 63 68 65 63 6b  * Can also check
5460: 20 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e   SSL_is_init_fin
5470: 69 73 68 65 64 28 73 73 6c 29 20 2a 2f 0a 20 20  ished(ssl) */.  
5480: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
5490: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
54a0: 49 4e 49 54 29 20 7b 0a 09 69 6e 74 20 74 6c 73  INIT) {..int tls
54b0: 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70 72 69 6e  Connect;...dprin
54c0: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f  tf("Calling Tls_
54d0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29  WaitForConnect")
54e0: 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63 74 20 3d  ;...tlsConnect =
54f0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
5500: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72  ect(statePtr, er
5510: 72 6f 72 43 6f 64 65 50 74 72 2c 20 31 29 3b 0a  rorCodePtr, 1);.
5520: 09 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20  .if (tlsConnect 
5530: 3c 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69  < 0) {..    dpri
5540: 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f  ntf("Got an erro
5550: 72 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e  r waiting to con
5560: 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74  nect (tlsConnect
5570: 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64   = %i, *errorCod
5580: 65 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73  ePtr = %i)", tls
5590: 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43  Connect, *errorC
55a0: 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 20 54 6c  odePtr);..    Tl
55b0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
55c0: 2c 20 73 74 72 65 72 72 6f 72 28 2a 65 72 72 6f  , strerror(*erro
55d0: 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20 20  rCodePtr));...  
55e0: 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a    written = -1;.
55f0: 09 20 20 20 20 69 66 20 28 2a 65 72 72 6f 72 43  .    if (*errorC
5600: 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52  odePtr == ECONNR
5610: 45 53 45 54 29 20 7b 0a 09 09 64 70 72 69 6e 74  ESET) {...dprint
5620: 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f  f("Got connectio
5630: 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 2f 2a 20  n reset");.../* 
5640: 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 09 2a 65  Soft EOF */...*e
5650: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
5660: 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a  ...written = 0;.
5670: 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75  .    }..    retu
5680: 72 6e 20 77 72 69 74 74 65 6e 3b 0a 09 7d 0a 20  rn written;..}. 
5690: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f     }..    if (to
56a0: 57 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64  Write == 0) {..d
56b0: 70 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69  printf("zero-wri
56c0: 74 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f  te");..err = BIO
56d0: 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d  _flush(statePtr-
56e0: 3e 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72  >bio);...if (err
56f0: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70   <= 0) {..    dp
5700: 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20  rintf("Flushing 
5710: 66 61 69 6c 65 64 22 29 3b 0a 09 20 20 20 20 54  failed");..    T
5720: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
5730: 72 2c 20 22 46 6c 75 73 68 20 66 61 69 6c 65 64  r, "Flush failed
5740: 22 29 3b 0a 0a 09 20 20 20 20 2a 65 72 72 6f 72  ");...    *error
5750: 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 09  CodePtr = EIO;..
5760: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b      written = 0;
5770: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
5780: 0a 09 7d 0a 0a 09 77 72 69 74 74 65 6e 20 3d 20  ..}...written = 
5790: 30 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  0;..*errorCodePt
57a0: 72 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 30  r = 0;..return 0
57b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
57c0: 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74       * We need t
57d0: 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20  o clear the SSL 
57e0: 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20  error stack now 
57f0: 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74  because we somet
5800: 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 20  imes reach.     
5810: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
5820: 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72  with leftover er
5830: 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63  rors in the stac
5840: 6b 2e 20 20 49 66 20 42 49 4f 5f 77 72 69 74 65  k.  If BIO_write
5850: 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20  .     * returns 
5860: 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45  -1 and intends E
5870: 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20  AGAIN, there is 
5880: 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72  a leftover error
5890: 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  , it will be.   
58a0: 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64    * misconstrued
58b0: 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f   as an error, no
58c0: 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a  t EAGAIN..     *
58d0: 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74  .     * Alternat
58e0: 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61  ively, we may wa
58f0: 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  nt to handle the
5900: 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73   <0 return codes
5910: 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f   from.     * BIO
5920: 5f 77 72 69 74 65 20 73 70 65 63 69 61 6c 6c 79  _write specially
5930: 20 28 61 73 20 61 64 76 69 73 65 64 20 69 6e 20   (as advised in 
5940: 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20  the RSA docs).  
5950: 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65  TLS's lower leve
5960: 6c 0a 20 20 20 20 20 2a 20 42 49 4f 20 66 75 6e  l.     * BIO fun
5970: 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68  ctions play with
5980: 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 73   the retry flags
5990: 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69   though, and thi
59a0: 73 20 73 65 65 6d 73 20 74 6f 0a 20 20 20 20 20  s seems to.     
59b0: 2a 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  * work correctly
59c0: 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69  .  Similar fix i
59d0: 6e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2e 20  n TlsInputProc. 
59e0: 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a  - hobbs.     */.
59f0: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
5a00: 72 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f 5f 63  ror();.    BIO_c
5a10: 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 73  lear_retry_flags
5a20: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
5a30: 0a 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 42  .    written = B
5a40: 49 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50 74  IO_write(statePt
5a50: 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57  r->bio, buf, toW
5a60: 72 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e  rite);.    dprin
5a70: 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 70  tf("BIO_write(%p
5a80: 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20  , %d) -> [%d]", 
5a90: 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74  (void *) statePt
5aa0: 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74  r, toWrite, writ
5ab0: 74 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 61  ten);..    /* Sa
5ac0: 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20  me as SSL_want, 
5ad0: 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20  but also checks 
5ae0: 74 68 65 20 65 72 72 6f 72 20 71 75 65 75 65 20  the error queue 
5af0: 2a 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c  */.    err = SSL
5b00: 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65  _get_error(state
5b10: 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65  Ptr->ssl, writte
5b20: 6e 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67 45  n);.    backingE
5b30: 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65  rror = ERR_get_e
5b40: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 66 20  rror();..    if 
5b50: 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 20 7b  (written <= 0) {
5b60: 0a 09 2f 2a 20 54 68 65 20 72 65 74 72 79 20 66  ../* The retry f
5b70: 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68  lag is set by th
5b80: 65 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f  e BIO_set_retry_
5b90: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 09  * functions */..
5ba0: 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72  if (BIO_should_r
5bb0: 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62  etry(statePtr->b
5bc0: 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69  io)) {..    dpri
5bd0: 6e 74 66 28 22 57 72 69 74 65 20 66 61 69 6c 65  ntf("Write faile
5be0: 64 20 77 69 74 68 20 63 6f 64 65 20 25 64 2c 20  d with code %d, 
5bf0: 62 79 74 65 73 20 77 72 69 74 74 65 6e 3d 25 64  bytes written=%d
5c00: 3a 20 73 68 6f 75 6c 64 20 72 65 74 72 79 22 2c  : should retry",
5c10: 20 65 72 72 2c 20 77 72 69 74 74 65 6e 29 3b 0a   err, written);.
5c20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64  .} else {..    d
5c30: 70 72 69 6e 74 66 28 22 57 72 69 74 65 20 66 61  printf("Write fa
5c40: 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 20 25  iled with code %
5c50: 64 2c 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  d, bytes written
5c60: 3d 25 64 3a 20 65 72 72 6f 72 20 63 6f 6e 64 69  =%d: error condi
5c70: 74 69 6f 6e 22 2c 20 65 72 72 2c 20 77 72 69 74  tion", err, writ
5c80: 74 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 68  ten);..}.../* Th
5c90: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
5ca0: 20 61 73 20 42 49 4f 5f 72 65 74 72 79 5f 74 79   as BIO_retry_ty
5cb0: 70 65 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73  pe */..if (BIO_s
5cc0: 68 6f 75 6c 64 5f 72 65 61 64 28 73 74 61 74 65  hould_read(state
5cd0: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20  Ptr->bio)) {..  
5ce0: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68    dprintf("BIO h
5cf0: 61 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  as insufficient 
5d00: 64 61 74 61 20 74 6f 20 72 65 61 64 20 61 6e 64  data to read and
5d10: 20 72 65 74 75 72 6e 22 29 3b 0a 09 7d 0a 09 69   return");..}..i
5d20: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 77 72  f (BIO_should_wr
5d30: 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ite(statePtr->bi
5d40: 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  o)) {..    dprin
5d50: 74 66 28 22 42 49 4f 20 68 61 73 20 70 65 6e 64  tf("BIO has pend
5d60: 69 6e 67 20 64 61 74 61 20 74 6f 20 77 72 69 74  ing data to writ
5d70: 65 22 29 3b 0a 09 7d 0a 09 69 66 20 28 42 49 4f  e");..}..if (BIO
5d80: 5f 73 68 6f 75 6c 64 5f 69 6f 5f 73 70 65 63 69  _should_io_speci
5d90: 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  al(statePtr->bio
5da0: 29 29 20 7b 0a 09 20 20 20 20 69 6e 74 20 72 65  )) {..    int re
5db0: 61 73 6f 6e 20 3d 20 42 49 4f 5f 67 65 74 5f 72  ason = BIO_get_r
5dc0: 65 74 72 79 5f 72 65 61 73 6f 6e 28 73 74 61 74  etry_reason(stat
5dd0: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20  ePtr->bio);..   
5de0: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61   dprintf("BIO ha
5df0: 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 63  s some special c
5e00: 6f 6e 64 69 74 69 6f 6e 20 6f 74 68 65 72 20 74  ondition other t
5e10: 68 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  han read or writ
5e20: 65 3a 20 63 6f 64 65 3d 25 64 22 2c 20 72 65 61  e: code=%d", rea
5e30: 73 6f 6e 29 3b 0a 09 7d 0a 09 64 70 72 69 6e 74  son);..}..dprint
5e40: 66 28 22 42 49 4f 20 68 61 73 20 70 65 6e 64 69  f("BIO has pendi
5e50: 6e 67 20 64 61 74 61 20 74 6f 20 77 72 69 74 65  ng data to write
5e60: 22 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ");..    } else 
5e70: 7b 0a 09 42 49 4f 5f 66 6c 75 73 68 28 73 74 61  {..BIO_flush(sta
5e80: 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 20 20 20  tePtr->bio);.   
5e90: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28   }..    switch (
5ea0: 65 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53 4c  err) {..case SSL
5eb0: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20  _ERROR_NONE:..  
5ec0: 20 20 2f 2a 20 49 2f 4f 20 6f 70 65 72 61 74 69    /* I/O operati
5ed0: 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a  on completed */.
5ee0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
5ef0: 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b 0a  L_ERROR_NONE");.
5f00: 09 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e  .    if (written
5f10: 20 3c 20 30 29 20 7b 0a 09 09 77 72 69 74 74 65   < 0) {...writte
5f20: 6e 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20  n = 0;..    }.. 
5f30: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
5f40: 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a   SSL_ERROR_SSL:.
5f50: 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65  .    /* A non-re
5f60: 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c  coverable, fatal
5f70: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53   error in the SS
5f80: 4c 20 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72  L library occurr
5f90: 65 64 2c 20 75 73 75 61 6c 6c 79 20 61 20 70 72  ed, usually a pr
5fa0: 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a  otocol error */.
5fb0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
5fc0: 4c 20 65 72 72 6f 72 2c 20 69 6e 64 69 63 61 74  L error, indicat
5fd0: 69 6e 67 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ing that the con
5fe0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  nection has been
5ff0: 20 61 62 6f 72 74 65 64 22 29 3b 0a 09 20 20 20   aborted");..   
6000: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f   if (backingErro
6010: 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f  r != 0) {...Tls_
6020: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
6030: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
6040: 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45  _string(backingE
6050: 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 20 65  rror));..    } e
6060: 6c 73 65 20 69 66 20 28 53 53 4c 5f 67 65 74 5f  lse if (SSL_get_
6070: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74  verify_result(st
6080: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20  atePtr->ssl) != 
6090: 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54  X509_V_OK) {...T
60a0: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
60b0: 72 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r, X509_verify_c
60c0: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
60d0: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
60e0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
60f0: 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20  >ssl)));..    } 
6100: 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72  else {...Tls_Err
6110: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e  or(statePtr, "Un
6120: 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22  known SSL error"
6130: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a  );..    }..    *
6140: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
6150: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20  CONNABORTED;..  
6160: 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a    written = -1;.
6170: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
6180: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  se SSL_ERROR_WAN
6190: 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f 2a 20  T_READ:..    /* 
61a0: 4f 70 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c  Op did not compl
61b0: 65 74 65 20 64 75 65 20 74 6f 20 6e 6f 74 20 65  ete due to not e
61c0: 6e 6f 75 67 68 20 64 61 74 61 20 77 61 73 20 61  nough data was a
61d0: 76 61 69 6c 61 62 6c 65 2e 20 52 65 74 72 79 20  vailable. Retry 
61e0: 6c 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64  later. */..    d
61f0: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f  printf("Got SSL_
6200: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 2c  ERROR_WANT_READ,
6210: 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45   mapping it to E
6220: 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65  AGAIN");..    *e
6230: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
6240: 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74  GAIN;..    writt
6250: 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74  en = -1;..    st
6260: 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20  atePtr->want |= 
6270: 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20  TCL_READABLE;.. 
6280: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61     Tls_Error(sta
6290: 74 65 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f  tePtr, "SSL_ERRO
62a0: 52 5f 57 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09  R_WANT_READ");..
62b0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72      BIO_set_retr
62c0: 79 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d  y_read(statePtr-
62d0: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61  >bio);..    brea
62e0: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
62f0: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a  ROR_WANT_WRITE:.
6300: 09 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 20 6e  .    /* Op did n
6310: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20  ot complete due 
6320: 74 6f 20 75 6e 61 62 6c 65 20 74 6f 20 73 65 6e  to unable to sen
6330: 74 20 61 6c 6c 20 64 61 74 61 20 74 6f 20 74 68  t all data to th
6340: 65 20 42 49 4f 2e 20 52 65 74 72 79 20 6c 61 74  e BIO. Retry lat
6350: 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  er. */..    dpri
6360: 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52  ntf("Got SSL_ERR
6370: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d  OR_WANT_WRITE, m
6380: 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47  apping it to EAG
6390: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  AIN");..    *err
63a0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
63b0: 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e  IN;..    written
63c0: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74   = -1;..    stat
63d0: 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43  ePtr->want |= TC
63e0: 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 20  L_WRITABLE;..   
63f0: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65   Tls_Error(state
6400: 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f  Ptr, "SSL_ERROR_
6410: 57 41 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09 20  WANT_WRITE");.. 
6420: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
6430: 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d  _write(statePtr-
6440: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61  >bio);..    brea
6450: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
6460: 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f  ROR_WANT_X509_LO
6470: 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 2a 20 4f 70  OKUP:..    /* Op
6480: 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65   didn't complete
6490: 20 73 69 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20   since callback 
64a0: 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73  set by SSL_CTX_s
64b0: 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63  et_client_cert_c
64c0: 62 28 29 20 61 73 6b 65 64 20 74 6f 20 62 65 20  b() asked to be 
64d0: 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 2a 2f 0a  called again */.
64e0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
64f0: 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  t SSL_ERROR_WANT
6500: 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d 61  _X509_LOOKUP, ma
6510: 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41  pping it to EAGA
6520: 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  IN");..    *erro
6530: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
6540: 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  N;..    written 
6550: 3d 20 2d 31 3b 0a 09 20 20 20 20 54 6c 73 5f 45  = -1;..    Tls_E
6560: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22  rror(statePtr, "
6570: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58  SSL_ERROR_WANT_X
6580: 35 30 39 5f 4c 4f 4f 4b 55 50 22 29 3b 0a 09 20  509_LOOKUP");.. 
6590: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
65a0: 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41   SSL_ERROR_SYSCA
65b0: 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65  LL:..    /* Some
65c0: 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65   non-recoverable
65d0: 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f  , fatal I/O erro
65e0: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20  r occurred */.. 
65f0: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
6600: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 22 29 3b  ERROR_SYSCALL");
6610: 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69  ...    if (backi
6620: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20  ngError == 0 && 
6630: 77 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b 0a  written == 0) {.
6640: 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20 72  ..dprintf("EOF r
6650: 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72 6f  eached")...*erro
6660: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09  rCodePtr = 0;...
6670: 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09 54  written = 0;...T
6680: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
6690: 72 2c 20 22 45 4f 46 20 72 65 61 63 68 65 64 22  r, "EOF reached"
66a0: 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
66b0: 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  if (backingError
66c0: 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e   == 0 && written
66d0: 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69   == -1) {...dpri
66e0: 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f  ntf("I/O error o
66f0: 63 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d  ccurred (errno =
6700: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
6710: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45  d long) Tcl_GetE
6720: 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f  rrno());...*erro
6730: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
6740: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69  etErrno();...wri
6750: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c 73  tten = -1;...Tls
6760: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
6770: 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a 65   Tcl_ErrnoMsg(*e
6780: 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a  rrorCodePtr));..
6790: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
67a0: 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72  dprintf("I/O err
67b0: 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 61 63  or occurred (bac
67c0: 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29  kingError = %lu)
67d0: 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29  ", backingError)
67e0: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ;...*errorCodePt
67f0: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  r = Tcl_GetErrno
6800: 28 29 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20  ();...written = 
6810: 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28  -1;...Tls_Error(
6820: 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65  statePtr, ERR_re
6830: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
6840: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29  g(backingError))
6850: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72  ;..    }..    br
6860: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
6870: 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52  ERROR_ZERO_RETUR
6880: 4e 3a 0a 09 20 20 20 20 2f 2a 20 50 65 65 72 20  N:..    /* Peer 
6890: 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63  has closed the c
68a0: 6f 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e  onnection by sen
68b0: 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e  ding the close_n
68c0: 6f 74 69 66 79 20 61 6c 65 72 74 2e 20 43 61 6e  otify alert. Can
68d0: 27 74 20 72 65 61 64 2c 20 62 75 74 20 63 61 6e  't read, but can
68e0: 20 77 72 69 74 65 2e 20 2a 2f 0a 09 20 20 20 20   write. */..    
68f0: 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 74 75 72  /* Need to retur
6900: 6e 20 61 6e 20 45 4f 46 2c 20 73 6f 20 63 68 61  n an EOF, so cha
6910: 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 20 77  nnel is closed w
6920: 68 69 63 68 20 77 69 6c 6c 20 73 65 6e 64 20 61  hich will send a
6930: 6e 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 29  n SSL_shutdown()
6940: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74  . */..    dprint
6950: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52  f("Got SSL_ERROR
6960: 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74 68  _ZERO_RETURN, th
6970: 69 73 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46 20  is means an EOF 
6980: 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64  has been reached
6990: 22 29 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e  ");..    written
69a0: 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72 72 6f   = 0;..    *erro
69b0: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20  rCodePtr = 0;.. 
69c0: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61     Tls_Error(sta
69d0: 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 61 73  tePtr, "Peer has
69e0: 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e   closed the conn
69f0: 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69  ection for writi
6a00: 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68  ng by sending th
6a10: 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61  e close_notify a
6a20: 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65  lert");..    bre
6a30: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
6a40: 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a  RROR_WANT_ASYNC:
6a50: 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69  ..    /* Used wi
6a60: 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45  th flag SSL_MODE
6a70: 5f 41 53 59 4e 43 2c 20 6f 70 20 64 69 64 6e 27  _ASYNC, op didn'
6a80: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
6a90: 73 65 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69  se an async engi
6aa0: 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63  ne is still proc
6ab0: 65 73 73 69 6e 67 20 64 61 74 61 20 2a 2f 0a 09  essing data */..
6ac0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
6ad0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
6ae0: 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20 74  ASYNC, mapping t
6af0: 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b  his to EAGAIN");
6b00: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
6b10: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
6b20: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b     written = -1;
6b30: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28  ..    Tls_Error(
6b40: 73 74 61 74 65 50 74 72 2c 20 22 53 53 4c 5f 45  statePtr, "SSL_E
6b50: 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 22  RROR_WANT_ASYNC"
6b60: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  );..    break;..
6b70: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64  .default:..    d
6b80: 70 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20  printf("unknown 
6b90: 65 72 72 6f 72 3a 20 25 64 22 2c 20 65 72 72 29  error: %d", err)
6ba0: 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72  ;..    Tls_Error
6bb0: 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e  (statePtr, "Unkn
6bc0: 6f 77 6e 20 65 72 72 6f 72 22 29 3b 0a 09 20 20  own error");..  
6bd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6be0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 75 74      dprintf("Out
6bf0: 70 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20  put(%d) -> %d", 
6c00: 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e  toWrite, written
6c10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 72  );.    return wr
6c20: 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  itten;.}../*. *-
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6c80: 20 2a 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74   * Tls_GetParent
6c90: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 47 65 74   --. *. *    Get
6ca0: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20   parent channel 
6cb0: 66 6f 72 20 61 20 73 74 61 63 6b 65 64 20 63 68  for a stacked ch
6cc0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73  annel.. *. * Res
6cd0: 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54 63 6c 5f  ults:. *    Tcl_
6ce0: 43 68 61 6e 6e 65 6c 20 6f 72 20 4e 55 4c 4c 20  Channel or NULL 
6cf0: 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d  if none.. *. *--
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6d50: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 54 6c 73 5f  Tcl_Channel Tls_
6d60: 47 65 74 50 61 72 65 6e 74 28 53 74 61 74 65 20  GetParent(State 
6d70: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 6d  *statePtr, int m
6d80: 61 73 6b 46 6c 61 67 73 29 20 7b 0a 20 20 20 20  askFlags) {.    
6d90: 64 70 72 69 6e 74 66 28 22 52 65 71 75 65 73 74  dprintf("Request
6da0: 65 64 20 74 6f 20 67 65 74 20 70 61 72 65 6e 74  ed to get parent
6db0: 20 6f 66 20 63 68 61 6e 6e 65 6c 20 25 70 22 2c   of channel %p",
6dc0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29   statePtr->self)
6dd0: 3b 0a 0a 20 20 20 20 69 66 20 28 28 73 74 61 74  ;..    if ((stat
6de0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 7e 6d  ePtr->flags & ~m
6df0: 61 73 6b 46 6c 61 67 73 29 20 26 20 54 4c 53 5f  askFlags) & TLS_
6e00: 54 43 4c 5f 46 41 53 54 50 41 54 48 29 20 7b 0a  TCL_FASTPATH) {.
6e10: 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20  .dprintf("Asked 
6e20: 74 6f 20 67 65 74 20 74 68 65 20 70 61 72 65 6e  to get the paren
6e30: 74 20 63 68 61 6e 6e 65 6c 20 77 68 69 6c 65 20  t channel while 
6e40: 77 65 20 61 72 65 20 75 73 69 6e 67 20 46 61 73  we are using Fas
6e50: 74 50 61 74 68 20 2d 2d 20 72 65 74 75 72 6e 69  tPath -- returni
6e60: 6e 67 20 4e 55 4c 4c 22 29 3b 0a 09 72 65 74 75  ng NULL");..retu
6e70: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  rn NULL;.    }. 
6e80: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65     return Tcl_Ge
6e90: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
6ea0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
6eb0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
6f10: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d  SetOptionProc --
6f20: 0a 20 2a 0a 20 2a 09 53 65 74 73 20 61 6e 20 6f  . *. *.Sets an o
6f30: 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65 20 66  ption to value f
6f40: 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20  or a SSL socket 
6f50: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 20 43  based channel. C
6f60: 61 6c 6c 65 64 20 62 79 20 74 68 65 0a 20 2a 09  alled by the. *.
6f70: 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65  generic I/O laye
6f80: 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 54  r whenever the T
6f90: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
6fa0: 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ion() function i
6fb0: 73 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65  s used.. *. * Re
6fc0: 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54 43 4c  sults:. *    TCL
6fd0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
6fe0: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69  l or TCL_ERROR i
6ff0: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20  f failed.. *. * 
7000: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
7010: 20 20 20 20 55 70 64 61 74 65 73 20 63 68 61 6e      Updates chan
7020: 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65  nel option to ne
7030: 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d  w value.. *. *--
7040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
7090: 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 53 65  static int.TlsSe
70a0: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65  tOptionProc(Clie
70b0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
70c0: 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65  ata,    /* Socke
70d0: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20  t state. */.    
70e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
70f0: 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f  rp,../* For erro
7100: 72 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c  rs - can be NULL
7110: 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  . */.    const c
7120: 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c  har *optionName,
7130: 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  ./* Name of the 
7140: 6f 70 74 69 6f 6e 20 74 6f 20 73 65 74 20 74 68  option to set th
7150: 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 0a  e value for, or.
7160: 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 67  .... * NULL to g
7170: 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61  et all options a
7180: 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e  nd their values.
7190: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
71a0: 61 72 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29  ar *optionValue)
71b0: 09 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 6f 70  ./* Value for op
71c0: 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53  tion. */.{.    S
71d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
71e0: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61   (State *) insta
71f0: 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c  nceData;.    Tcl
7200: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20  _Channel parent 
7210: 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28  = Tls_GetParent(
7220: 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43  statePtr, TLS_TC
7230: 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20  L_FASTPATH);.   
7240: 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70   Tcl_DriverSetOp
7250: 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74  tionProc *setOpt
7260: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70  ionProc;..    dp
7270: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
7280: 0a 0a 20 20 20 20 2f 2a 20 50 61 73 73 20 74 6f  ..    /* Pass to
7290: 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 73   parent */.    s
72a0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54  etOptionProc = T
72b0: 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74  cl_ChannelSetOpt
72c0: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43  ionProc(Tcl_GetC
72d0: 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e  hannelType(paren
72e0: 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74  t));.    if (set
72f0: 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55  OptionProc != NU
7300: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a  LL) {..return (*
7310: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54  setOptionProc)(T
7320: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
7330: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74  tanceData(parent
7340: 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f  ), interp, optio
7350: 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c  nName, optionVal
7360: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ue);.    }.    /
7370: 2a 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73 74  *.     * Request
7380: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
7390: 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61  option has to fa
73a0: 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76  il, we don't hav
73b0: 65 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20  e any..     */. 
73c0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61     return Tcl_Ba
73d0: 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  dChannelOption(i
73e0: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d  nterp, optionNam
73f0: 65 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  e, "");.}../*. *
7400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7440: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74  ---. *. * TlsGet
7450: 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a  OptionProc --. *
7460: 0a 20 2a 09 47 65 74 20 61 20 6f 70 74 69 6f 6e  . *.Get a option
7470: 27 73 20 76 61 6c 75 65 20 66 6f 72 20 61 20 53  's value for a S
7480: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
7490: 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 20 6c 69  channel, or a li
74a0: 73 74 20 6f 66 20 61 6c 6c 0a 20 2a 09 6f 70 74  st of all. *.opt
74b0: 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76  ions and their v
74c0: 61 6c 75 65 73 2e 20 43 61 6c 6c 65 64 20 62 79  alues. Called by
74d0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f   the generic I/O
74e0: 20 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72 20   layer whenever 
74f0: 74 68 65 0a 20 2a 09 54 63 6c 5f 47 65 74 43 68  the. *.Tcl_GetCh
7500: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 29 20 66 75  annelOption() fu
7510: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  nction is used..
7520: 20 2a 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   *. *. * Results
7530: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
7540: 54 63 6c 20 72 65 73 75 6c 74 2e 20 54 68 65 20  Tcl result. The 
7550: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 70 65  value of the spe
7560: 63 69 66 69 65 64 20 6f 70 74 69 6f 6e 20 6f 72  cified option or
7570: 20 61 20 6c 69 73 74 20 6f 66 0a 20 2a 09 61 6c   a list of. *.al
7580: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68  l options and th
7590: 65 69 72 20 76 61 6c 75 65 73 20 69 73 20 72 65  eir values is re
75a0: 74 75 72 6e 65 64 20 69 6e 20 74 68 65 20 73 75  turned in the su
75b0: 70 70 6c 69 65 64 20 44 53 74 72 69 6e 67 2e 0a  pplied DString..
75c0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
75d0: 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a  ts:. *    None..
75e0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
7630: 74 69 63 20 69 6e 74 0a 54 6c 73 47 65 74 4f 70  tic int.TlsGetOp
7640: 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44  tionProc(ClientD
7650: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
7660: 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73  ,    /* Socket s
7670: 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  tate. */.    Tcl
7680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7690: 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20  ../* For errors 
76a0: 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a  - can be NULL. *
76b0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
76c0: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a   *optionName,./*
76d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74   Name of the opt
76e0: 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
76f0: 74 68 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f  the value for, o
7700: 72 0a 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f  r..... * NULL to
7710: 20 67 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73   get all options
7720: 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65   and their value
7730: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  s. */.    Tcl_DS
7740: 74 72 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c  tring *optionVal
7750: 75 65 29 09 2f 2a 20 57 68 65 72 65 20 74 6f 20  ue)./* Where to 
7760: 73 74 6f 72 65 20 74 68 65 20 63 6f 6d 70 75 74  store the comput
7770: 65 64 20 76 61 6c 75 65 20 69 6e 69 74 69 61 6c  ed value initial
7780: 69 7a 65 64 20 62 79 20 63 61 6c 6c 65 72 2e 20  ized by caller. 
7790: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
77a0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
77b0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
77c0: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
77d0: 65 6c 20 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f  el parent = Tls_
77e0: 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50  GetParent(stateP
77f0: 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54  tr, TLS_TCL_FAST
7800: 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44  PATH);.    Tcl_D
7810: 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 72  riverGetOptionPr
7820: 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f  oc *getOptionPro
7830: 63 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  c;..    dprintf(
7840: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
7850: 2f 2a 20 50 61 73 73 20 74 6f 20 70 61 72 65 6e  /* Pass to paren
7860: 74 20 2a 2f 0a 20 20 20 20 67 65 74 4f 70 74 69  t */.    getOpti
7870: 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  onProc = Tcl_Cha
7880: 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f  nnelGetOptionPro
7890: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  c(Tcl_GetChannel
78a0: 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20  Type(parent));. 
78b0: 20 20 20 69 66 20 28 67 65 74 4f 70 74 69 6f 6e     if (getOption
78c0: 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Proc != NULL) {.
78d0: 09 72 65 74 75 72 6e 20 28 2a 67 65 74 4f 70 74  .return (*getOpt
78e0: 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74  ionProc)(Tcl_Get
78f0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
7900: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74  ata(parent), int
7910: 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c  erp, optionName,
7920: 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20   optionValue);. 
7930: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70     } else if (op
7940: 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61  tionName == (cha
7950: 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a  r*) NULL) {../*.
7960: 09 20 2a 20 52 65 71 75 65 73 74 20 69 73 20 71  . * Request is q
7970: 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74  uery for all opt
7980: 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b  ions, this is ok
7990: 2e 0a 09 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54  ... */..return T
79a0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
79b0: 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 71 75 65   /*.     * Reque
79c0: 73 74 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  st for a specifi
79d0: 63 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20  c option has to 
79e0: 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68  fail, we don't h
79f0: 61 76 65 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f  ave any..     */
7a00: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
7a10: 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  BadChannelOption
7a20: 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e  (interp, optionN
7a30: 61 6d 65 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a  ame, "");.}../*.
7a40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7a90: 20 2a 0a 20 2a 20 20 20 20 54 6c 73 43 68 61 6e   *. *    TlsChan
7aa0: 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20  nelHandlerTimer 
7ab0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
7ac0: 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  by the notifier 
7ad0: 76 69 61 20 61 20 74 69 6d 65 72 2c 20 74 6f 20  via a timer, to 
7ae0: 66 6c 75 73 68 20 6f 75 74 20 64 61 74 61 20 77  flush out data w
7af0: 61 69 74 69 6e 67 20 69 6e 0a 20 2a 09 63 68 61  aiting in. *.cha
7b00: 6e 6e 65 6c 20 62 75 66 66 65 72 73 2e 20 63 61  nnel buffers. ca
7b10: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  lled by the gene
7b20: 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68  ric I/O layer wh
7b30: 65 6e 65 76 65 72 20 74 68 65 0a 20 2a 09 54 63  enever the. *.Tc
7b40: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64  l_GetChannelHand
7b50: 6c 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  le() function is
7b60: 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73   used.. *. * Res
7b70: 75 6c 74 73 3a 0a 20 2a 20 20 20 20 20 20 20 20  ults:. *        
7b80: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  None.. *. * Side
7b90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65   effects:. *.Cre
7ba0: 61 74 65 73 20 6e 6f 74 69 66 69 63 61 74 69 6f  ates notificatio
7bb0: 6e 20 65 76 65 6e 74 2e 0a 20 2a 0a 20 2a 2d 2d  n event.. *. *--
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
7c10: 73 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43  static void TlsC
7c20: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d  hannelHandlerTim
7c30: 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  er(ClientData cl
7c40: 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20  ientData) {.    
7c50: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
7c60: 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6c 69 65  = (State *) clie
7c70: 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  ntData;.    int 
7c80: 6d 61 73 6b 20 3d 20 73 74 61 74 65 50 74 72 2d  mask = statePtr-
7c90: 3e 77 61 6e 74 3b 20 2f 2a 20 49 6e 69 74 20 74  >want; /* Init t
7ca0: 6f 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  o SSL_ERROR_WANT
7cb0: 5f 52 45 41 44 20 61 6e 64 20 53 53 4c 5f 45 52  _READ and SSL_ER
7cc0: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 20 2a  ROR_WANT_WRITE *
7cd0: 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
7ce0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73  Called");..    s
7cf0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
7d00: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
7d10: 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  ) NULL;..    /* 
7d20: 43 68 65 63 6b 20 66 6f 72 20 61 6d 6f 75 6e 74  Check for amount
7d30: 20 6f 66 20 64 61 74 61 20 70 65 6e 64 69 6e 67   of data pending
7d40: 20 69 6e 20 42 49 4f 20 77 72 69 74 65 20 62 75   in BIO write bu
7d50: 66 66 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28  ffer */.    if (
7d60: 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61  BIO_wpending(sta
7d70: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09  tePtr->bio)) {..
7d80: 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25  dprintf("[chan=%
7d90: 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c 65 22  p] BIO writable"
7da0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
7db0: 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c  );...mask |= TCL
7dc0: 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d  _WRITABLE;.    }
7dd0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
7de0: 6f 72 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74  or amount of dat
7df0: 61 20 70 65 6e 64 69 6e 67 20 69 6e 20 42 49 4f  a pending in BIO
7e00: 20 72 65 61 64 20 62 75 66 66 65 72 20 2a 2f 0a   read buffer */.
7e10: 20 20 20 20 69 66 20 28 42 49 4f 5f 70 65 6e 64      if (BIO_pend
7e20: 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ing(statePtr->bi
7e30: 6f 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  o)) {..dprintf("
7e40: 5b 63 68 61 6e 3d 25 70 5d 20 42 49 4f 20 72 65  [chan=%p] BIO re
7e50: 61 64 61 62 6c 65 22 2c 20 73 74 61 74 65 50 74  adable", statePt
7e60: 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61 73 6b  r->self);...mask
7e70: 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   |= TCL_READABLE
7e80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7e90: 4e 6f 74 69 66 79 20 74 68 65 20 67 65 6e 65 72  Notify the gener
7ea0: 69 63 20 49 4f 20 6c 61 79 65 72 20 74 68 61 74  ic IO layer that
7eb0: 20 74 68 65 20 6d 61 73 6b 20 65 76 65 6e 74 73   the mask events
7ec0: 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 6f   have occurred o
7ed0: 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f  n the channel */
7ee0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 4e 6f  .    dprintf("No
7ef0: 74 69 66 79 69 6e 67 20 6f 75 72 73 65 6c 76 65  tifying ourselve
7f00: 73 22 29 3b 0a 20 20 20 20 54 63 6c 5f 4e 6f 74  s");.    Tcl_Not
7f10: 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  ifyChannel(state
7f20: 50 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29  Ptr->self, mask)
7f30: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
7f40: 77 61 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 64  want = 0;..    d
7f50: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
7f60: 67 22 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  g");..    return
7f70: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
7fd0: 73 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a  sWatchProc --. *
7fe0: 0a 20 2a 09 53 65 74 20 75 70 20 74 68 65 20 65  . *.Set up the e
7ff0: 76 65 6e 74 20 6e 6f 74 69 66 69 65 72 20 74 6f  vent notifier to
8000: 20 77 61 74 63 68 20 66 6f 72 20 65 76 65 6e 74   watch for event
8010: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 20 66 72  s of interest fr
8020: 6f 6d 20 74 68 69 73 0a 20 2a 09 63 68 61 6e 6e  om this. *.chann
8030: 65 6c 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68  el. Called by th
8040: 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61  e generic I/O la
8050: 79 65 72 20 77 68 65 6e 65 76 65 72 20 74 68 65  yer whenever the
8060: 20 75 73 65 72 20 28 6f 72 20 74 68 65 0a 20 2a   user (or the. *
8070: 09 73 79 73 74 65 6d 29 20 61 6e 6e 6f 75 6e 63  .system) announc
8080: 65 73 20 69 74 73 20 28 64 69 73 29 69 6e 74 65  es its (dis)inte
8090: 72 65 73 74 20 69 6e 20 65 76 65 6e 74 73 20 6f  rest in events o
80a0: 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 54  n the channel. T
80b0: 68 69 73 20 69 73 0a 20 2a 09 63 61 6c 6c 65 64  his is. *.called
80c0: 20 72 65 70 65 61 74 65 64 6c 79 2e 0a 20 2a 0a   repeatedly.. *.
80d0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20   * Results:. *  
80e0: 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69    None.. *. * Si
80f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
8100: 65 74 73 20 75 70 20 74 68 65 20 74 69 6d 65 2d  ets up the time-
8110: 62 61 73 65 64 20 6e 6f 74 69 66 69 65 72 20 73  based notifier s
8120: 6f 20 74 68 61 74 20 66 75 74 75 72 65 20 65 76  o that future ev
8130: 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e  ents on the chan
8140: 6e 65 6c 0a 20 2a 09 77 69 6c 6c 20 62 65 20 73  nel. *.will be s
8150: 65 65 6e 20 62 79 20 54 43 4c 2e 0a 20 2a 0a 20  een by TCL.. *. 
8160: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
81b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54  */.static void.T
81c0: 6c 73 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65  lsWatchProc(Clie
81d0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
81e0: 61 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 20 73  ata,    /* The s
81f0: 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a  ocket state. */.
8200: 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09      int mask)...
8210: 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74  /* Events of int
8220: 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 20  erest; an OR-ed 
8230: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 09  combination of..
8240: 09 09 09 20 2a 20 54 43 4c 5f 52 45 41 44 41 42  ... * TCL_READAB
8250: 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  LE, TCL_WRITABLE
8260: 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49   and TCL_EXCEPTI
8270: 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c  ON. */.{.    Tcl
8280: 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 70 61 72  _Channel     par
8290: 65 6e 74 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  ent;.    State *
82a0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
82b0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
82c0: 61 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65  a;.    Tcl_Drive
82d0: 72 57 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63  rWatchProc *watc
82e0: 68 50 72 6f 63 3b 0a 20 20 20 20 69 6e 74 20 70  hProc;.    int p
82f0: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 20  ending = 0;..   
8300: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 57 61 74   dprintf("TlsWat
8310: 63 68 50 72 6f 63 28 30 78 25 78 29 22 2c 20 6d  chProc(0x%x)", m
8320: 61 73 6b 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ask);.    dprint
8330: 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 3b  Flags(statePtr);
8340: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64  ..    /* Pretend
8350: 20 74 6f 20 62 65 20 64 65 61 64 20 61 73 20 6c   to be dead as l
8360: 6f 6e 67 20 61 73 20 74 68 65 20 76 65 72 69 66  ong as the verif
8370: 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75  y callback is ru
8380: 6e 6e 69 6e 67 2e 0a 20 20 20 20 20 2a 20 4f 74  nning..     * Ot
8390: 68 65 72 77 69 73 65 20 74 68 61 74 20 63 61 6c  herwise that cal
83a0: 6c 62 61 63 6b 20 63 6f 75 6c 64 20 62 65 20 69  lback could be i
83b0: 6e 76 6f 6b 65 64 20 72 65 63 75 72 73 69 76 65  nvoked recursive
83c0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ly. */.    if (s
83d0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
83e0: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43   TLS_TCL_CALLBAC
83f0: 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43  K) {..dprintf("C
8400: 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67 6f  allback is on-go
8410: 69 6e 67 2c 20 64 6f 69 6e 67 20 6e 6f 74 68 69  ing, doing nothi
8420: 6e 67 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20  ng");..return;. 
8430: 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 65 6e 74     }..    parent
8440: 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74   = Tls_GetParent
8450: 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54  (statePtr, TLS_T
8460: 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 0a 20  CL_FASTPATH);.. 
8470: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
8480: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
8490: 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45  _HANDSHAKE_FAILE
84a0: 44 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41  D) {..dprintf("A
84b0: 73 6b 65 64 20 74 6f 20 77 61 74 63 68 20 61 20  sked to watch a 
84c0: 73 6f 63 6b 65 74 20 77 69 74 68 20 61 20 66 61  socket with a fa
84d0: 69 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 20 2d  iled handshake -
84e0: 2d 20 6e 6f 74 68 69 6e 67 20 63 61 6e 20 68 61  - nothing can ha
84f0: 70 70 65 6e 20 68 65 72 65 22 29 3b 0a 09 64 70  ppen here");..dp
8500: 72 69 6e 74 66 28 22 55 6e 72 65 67 69 73 74 65  rintf("Unregiste
8510: 72 69 6e 67 20 69 6e 74 65 72 65 73 74 20 69 6e  ring interest in
8520: 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e   the lower chann
8530: 65 6c 22 29 3b 0a 0a 09 77 61 74 63 68 50 72 6f  el");...watchPro
8540: 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57  c = Tcl_ChannelW
8550: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
8560: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65  ChannelType(pare
8570: 6e 74 29 29 3b 0a 09 77 61 74 63 68 50 72 6f 63  nt));..watchProc
8580: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  (Tcl_GetChannelI
8590: 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65  nstanceData(pare
85a0: 6e 74 29 2c 20 30 29 3b 0a 09 73 74 61 74 65 50  nt), 0);..stateP
85b0: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20  tr->watchMask = 
85c0: 30 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  0;..return;.    
85d0: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
85e0: 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73  >watchMask = mas
85f0: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 68  k;..    /* No ch
8600: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 61  annel handlers a
8610: 6e 79 20 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c  ny more. We will
8620: 20 62 65 20 6e 6f 74 69 66 69 65 64 20 61 75 74   be notified aut
8630: 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 20 20 20  omatically.     
8640: 2a 20 61 62 6f 75 74 20 65 76 65 6e 74 73 20 6f  * about events o
8650: 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65  n the channel be
8660: 6c 6f 77 20 76 69 61 20 61 20 63 61 6c 6c 20 74  low via a call t
8670: 6f 20 6f 75 72 0a 20 20 20 20 20 2a 20 27 54 72  o our.     * 'Tr
8680: 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 79 50 72 6f  ansformNotifyPro
8690: 63 27 2e 20 42 75 74 20 77 65 20 68 61 76 65 20  c'. But we have 
86a0: 74 6f 20 70 61 73 73 20 74 68 65 20 69 6e 74 65  to pass the inte
86b0: 72 65 73 74 20 64 6f 77 6e 20 6e 6f 77 2e 0a 20  rest down now.. 
86c0: 20 20 20 20 2a 20 57 65 20 61 72 65 20 61 6c 6c      * We are all
86d0: 6f 77 65 64 20 74 6f 20 61 64 64 20 61 64 64 69  owed to add addi
86e0: 74 69 6f 6e 61 6c 20 27 69 6e 74 65 72 65 73 74  tional 'interest
86f0: 27 20 74 6f 20 74 68 65 20 6d 61 73 6b 20 69 66  ' to the mask if
8700: 20 77 65 20 77 61 6e 74 0a 20 20 20 20 20 2a 20   we want.     * 
8710: 74 6f 2e 20 42 75 74 20 74 68 69 73 20 74 72 61  to. But this tra
8720: 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20  nsformation has 
8730: 6e 6f 20 73 75 63 68 20 69 6e 74 65 72 65 73 74  no such interest
8740: 2e 20 49 74 20 6a 75 73 74 20 70 61 73 73 65 73  . It just passes
8750: 0a 20 20 20 20 20 2a 20 74 68 65 20 72 65 71 75  .     * the requ
8760: 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61 6e  est down, unchan
8770: 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ged..     */.   
8780: 20 64 70 72 69 6e 74 66 28 22 52 65 67 69 73 74   dprintf("Regist
8790: 65 72 69 6e 67 20 6f 75 72 20 69 6e 74 65 72 65  ering our intere
87a0: 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20  st in the lower 
87b0: 63 68 61 6e 6e 65 6c 20 28 63 68 61 6e 3d 25 70  channel (chan=%p
87c0: 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 70 61 72  )", (void *) par
87d0: 65 6e 74 29 3b 0a 20 20 20 20 77 61 74 63 68 50  ent);.    watchP
87e0: 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65  roc = Tcl_Channe
87f0: 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47  lWatchProc(Tcl_G
8800: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61  etChannelType(pa
8810: 72 65 6e 74 29 29 3b 0a 20 20 20 20 77 61 74 63  rent));.    watc
8820: 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61  hProc(Tcl_GetCha
8830: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
8840: 28 70 61 72 65 6e 74 29 2c 20 6d 61 73 6b 29 3b  (parent), mask);
8850: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 77 65 20 68  ..    /* Do we h
8860: 61 76 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  ave any pending 
8870: 65 76 65 6e 74 73 20 2a 2f 0a 20 20 20 20 70 65  events */.    pe
8880: 6e 64 69 6e 67 20 3d 20 28 73 74 61 74 65 50 74  nding = (statePt
8890: 72 2d 3e 77 61 6e 74 20 7c 7c 20 5c 0a 09 28 28  r->want || \..((
88a0: 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41  mask & TCL_READA
88b0: 42 4c 45 29 20 26 26 20 28 28 54 63 6c 5f 49 6e  BLE) && ((Tcl_In
88c0: 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74  putBuffered(stat
88d0: 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29  ePtr->self) > 0)
88e0: 20 7c 7c 20 28 42 49 4f 5f 63 74 72 6c 5f 70 65   || (BIO_ctrl_pe
88f0: 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e  nding(statePtr->
8900: 62 69 6f 29 20 3e 20 30 29 29 29 20 7c 7c 0a 09  bio) > 0))) ||..
8910: 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 57 52 49  ((mask & TCL_WRI
8920: 54 41 42 4c 45 29 20 26 26 20 28 28 54 63 6c 5f  TABLE) && ((Tcl_
8930: 4f 75 74 70 75 74 42 75 66 66 65 72 65 64 28 73  OutputBuffered(s
8940: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e  tatePtr->self) >
8950: 20 30 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72 6c   0) || (BIO_ctrl
8960: 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50  _wpending(stateP
8970: 74 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29 29 29  tr->bio) > 0))))
8980: 3b 0a 0a 20 20 20 20 69 66 20 28 21 28 6d 61 73  ;..    if (!(mas
8990: 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  k & TCL_READABLE
89a0: 29 20 7c 7c 20 70 65 6e 64 69 6e 67 20 3d 3d 20  ) || pending == 
89b0: 30 29 20 7b 0a 09 2f 2a 20 52 65 6d 6f 76 65 20  0) {../* Remove 
89c0: 74 69 6d 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f  timer, if any */
89d0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
89e0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
89f0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
8a00: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
8a10: 41 20 74 69 6d 65 72 20 77 61 73 20 66 6f 75 6e  A timer was foun
8a20: 64 2c 20 64 65 6c 65 74 69 6e 67 20 69 74 22 29  d, deleting it")
8a30: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 6c 65 74  ;..    Tcl_Delet
8a40: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
8a50: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
8a60: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74  .    statePtr->t
8a70: 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65  imer = (Tcl_Time
8a80: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 09 7d  rToken) NULL;..}
8a90: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
8aa0: 2f 2a 20 41 64 64 20 74 69 6d 65 72 2c 20 69 66  /* Add timer, if
8ab0: 20 6e 6f 6e 65 20 2a 2f 0a 09 69 66 20 28 73 74   none */..if (st
8ac0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 3d  atePtr->timer ==
8ad0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
8ae0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 64  ) NULL) {..    d
8af0: 70 72 69 6e 74 66 28 22 43 72 65 61 74 69 6e 67  printf("Creating
8b00: 20 61 20 6e 65 77 20 74 69 6d 65 72 20 73 69 6e   a new timer sin
8b10: 63 65 20 64 61 74 61 20 61 70 70 65 61 72 73 20  ce data appears 
8b20: 74 6f 20 62 65 20 77 61 69 74 69 6e 67 22 29 3b  to be waiting");
8b30: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
8b40: 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61  timer = Tcl_Crea
8b50: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 54  teTimerHandler(T
8b60: 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c 20 54 6c  LS_TCL_DELAY, Tl
8b70: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54  sChannelHandlerT
8b80: 69 6d 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74  imer, (ClientDat
8b90: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 7d  a) statePtr);..}
8ba0: 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
8c00: 20 2a 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50   * TlsGetHandleP
8c10: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
8c20: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
8c30: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65  nvoked by the ge
8c40: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74  neric IO level t
8c50: 6f 20 72 65 74 72 69 65 76 65 20 61 6e 20 4f 53  o retrieve an OS
8c60: 0a 20 2a 09 73 70 65 63 69 66 69 63 20 68 61 6e  . *.specific han
8c70: 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
8c80: 69 74 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e  ith the channel.
8c90: 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 74 72   Not used for tr
8ca0: 61 6e 73 66 6f 72 6d 73 2e 0a 20 2a 0a 20 2a 20  ansforms.. *. * 
8cb0: 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54  Results:. *    T
8cc0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 54  he appropriate T
8cd0: 63 6c 5f 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  cl_File handle o
8ce0: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 2e 0a  r NULL if none..
8cf0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8d00: 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a  ts:. *    None..
8d10: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
8d70: 74 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72  t TlsGetHandlePr
8d80: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  oc(ClientData in
8d90: 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f  stanceData,    /
8da0: 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20  * Socket state. 
8db0: 2a 2f 0a 20 20 20 20 69 6e 74 20 64 69 72 65 63  */.    int direc
8dc0: 74 69 6f 6e 2c 09 09 2f 2a 20 54 43 4c 5f 52 45  tion,../* TCL_RE
8dd0: 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52  ADABLE or TCL_WR
8de0: 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 43 6c  ITABLE */.    Cl
8df0: 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65  ientData *handle
8e00: 50 74 72 29 09 2f 2a 20 48 61 6e 64 6c 65 20 61  Ptr)./* Handle a
8e10: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
8e20: 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 7b 0a  he channel */.{.
8e30: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
8e40: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
8e50: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20  instanceData;.. 
8e60: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65     return Tcl_Ge
8e70: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54  tChannelHandle(T
8e80: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61  ls_GetParent(sta
8e90: 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46  tePtr, TLS_TCL_F
8ea0: 41 53 54 50 41 54 48 29 2c 20 64 69 72 65 63 74  ASTPATH), direct
8eb0: 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b  ion, handlePtr);
8ec0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f10: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
8f20: 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 2a  NotifyProc --. *
8f30: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
8f40: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  re is invoked by
8f50: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20   the generic IO 
8f60: 6c 65 76 65 6c 20 74 6f 20 6e 6f 74 69 66 79 20  level to notify 
8f70: 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 74  the channel. *.t
8f80: 68 61 74 20 61 6e 20 65 76 65 6e 74 20 68 61 73  hat an event has
8f90: 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 74 68 65   occurred on the
8fa0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e   underlying chan
8fb0: 6e 65 6c 2e 20 49 74 20 69 73 20 75 73 65 64 20  nel. It is used 
8fc0: 62 79 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e  by stacked chann
8fd0: 65 6c 20 64 72 69 76 65 72 73 20 74 68 61 74 0a  el drivers that.
8fe0: 20 2a 09 77 69 73 68 20 74 6f 20 62 65 20 6e 6f   *.wish to be no
8ff0: 74 69 66 69 65 64 20 6f 66 20 65 76 65 6e 74 73  tified of events
9000: 20 74 68 61 74 20 6f 63 63 75 72 20 6f 6e 20 74   that occur on t
9010: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 28 73  he underlying (s
9020: 74 61 63 6b 65 64 29 0a 20 2a 09 63 68 61 6e 6e  tacked). *.chann
9030: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  el.. *. * Result
9040: 73 3a 0a 20 2a 20 20 20 20 54 79 70 65 20 6f 66  s:. *    Type of
9050: 20 65 76 65 6e 74 20 6f 72 20 30 20 69 66 20 66   event or 0 if f
9060: 61 69 6c 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65  ailed. *. * Side
9070: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20   effects:. *    
9080: 4d 61 79 20 70 72 6f 63 65 73 73 20 74 68 65 20  May process the 
9090: 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 62  incoming event b
90a0: 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d  y itself.. *. *-
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
9100: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4e  .static int TlsN
9110: 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74  otifyProc(Client
9120: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
9130: 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20  a,    /* Socket 
9140: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  state. */.    in
9150: 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 74 79 70  t mask).../* typ
9160: 65 20 6f 66 20 65 76 65 6e 74 20 74 68 61 74 20  e of event that 
9170: 6f 63 63 75 72 72 65 64 3a 0a 09 09 09 09 20 2a  occurred:..... *
9180: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
9190: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42  on of TCL_READAB
91a0: 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42  LE or TCL_WRITAB
91b0: 4c 45 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74  LE */.{.    Stat
91c0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
91d0: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65  tate *) instance
91e0: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 65 72  Data;.    int er
91f0: 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 0a 20 20  rorCode = 0;..  
9200: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
9210: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  d");..    /*.   
9220: 20 20 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 78    * Delete an ex
9230: 69 73 74 69 6e 67 20 74 69 6d 65 72 2e 20 49 74  isting timer. It
9240: 20 77 61 73 20 6e 6f 74 20 66 69 72 65 64 2c 20   was not fired, 
9250: 79 65 74 20 77 65 20 61 72 65 0a 20 20 20 20 20  yet we are.     
9260: 2a 20 68 65 72 65 2c 20 73 6f 20 74 68 65 20 63  * here, so the c
9270: 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 67 65 6e  hannel below gen
9280: 65 72 61 74 65 64 20 73 75 63 68 20 61 6e 20 65  erated such an e
9290: 76 65 6e 74 20 61 6e 64 20 77 65 0a 20 20 20 20  vent and we.    
92a0: 20 2a 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f   * don't have to
92b0: 2e 20 54 68 65 20 72 65 6e 65 77 61 6c 20 6f 66  . The renewal of
92c0: 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 61 66   the interest af
92d0: 74 65 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65  ter the.     * e
92e0: 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 61 6e  xecution of chan
92f0: 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 69 6c  nel handlers wil
9300: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 75  l eventually cau
9310: 73 65 20 75 73 20 74 6f 0a 20 20 20 20 20 2a 20  se us to.     * 
9320: 72 65 63 72 65 61 74 65 20 74 68 65 20 74 69 6d  recreate the tim
9330: 65 72 20 28 69 6e 20 57 61 74 63 68 50 72 6f 63  er (in WatchProc
9340: 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  )..     */.    i
9350: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
9360: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
9370: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
9380: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
9390: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
93a0: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
93b0: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
93c0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
93d0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
93e0: 20 53 6b 69 70 20 69 66 20 75 73 65 72 20 76 65   Skip if user ve
93f0: 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73  rify callback is
9400: 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 2a   still running *
9410: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
9420: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
9430: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a  TCL_CALLBACK) {.
9440: 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61  .dprintf("Callba
9450: 63 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20  ck is on-going, 
9460: 72 65 74 75 72 6e 69 6e 67 20 66 61 69 6c 65 64  returning failed
9470: 22 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  ");..return 0;. 
9480: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
9490: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  not initialized,
94a0: 20 64 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20   do connect */. 
94b0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
94c0: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
94d0: 5f 49 4e 49 54 29 20 7b 0a 09 64 70 72 69 6e 74  _INIT) {..dprint
94e0: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57  f("Calling Tls_W
94f0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b  aitForConnect");
9500: 0a 09 69 66 20 28 54 6c 73 5f 57 61 69 74 46 6f  ..if (Tls_WaitFo
9510: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  rConnect(statePt
9520: 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c 20 31  r, &errorCode, 1
9530: 29 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 54 6c  ) < 0) {..    Tl
9540: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
9550: 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 6f 72  , strerror(error
9560: 43 6f 64 65 29 29 3b 0a 09 20 20 20 20 69 66 20  Code));..    if 
9570: 28 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41  (errorCode == EA
9580: 47 41 49 4e 29 20 7b 0a 09 09 64 70 72 69 6e 74  GAIN) {...dprint
9590: 66 28 22 41 73 79 6e 63 20 66 6c 61 67 20 63 6f  f("Async flag co
95a0: 75 6c 64 20 62 65 20 73 65 74 20 28 64 69 64 6e  uld be set (didn
95b0: 27 74 20 63 68 65 63 6b 29 20 61 6e 64 20 65 72  't check) and er
95c0: 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 41 49  rorCode == EAGAI
95d0: 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61  N:  Returning fa
95e0: 69 6c 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72  iled");....retur
95f0: 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  n 0;..    }...  
9600: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57    dprintf("Tls_W
9610: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65  aitForConnect re
9620: 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 22  turned an error"
9630: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
9640: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
9650: 69 6e 67 20 25 69 22 2c 20 6d 61 73 6b 29 3b 0a  ing %i", mask);.
9660: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41  .    /*.     * A
9670: 6e 20 65 76 65 6e 74 20 6f 63 63 75 72 72 65 64  n event occurred
9680: 20 69 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69   in the underlyi
9690: 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69  ng channel.  Thi
96a0: 73 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f  s.     * transfo
96b0: 72 6d 61 74 69 6f 6e 20 64 6f 65 73 6e 27 74 20  rmation doesn't 
96c0: 70 72 6f 63 65 73 73 20 73 75 63 68 20 65 76 65  process such eve
96d0: 6e 74 73 20 74 68 75 73 20 72 65 74 75 72 6e 73  nts thus returns
96e0: 20 74 68 65 0a 20 20 20 20 20 2a 20 69 6e 63 6f   the.     * inco
96f0: 6d 69 6e 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e  ming mask unchan
9700: 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ged..     */.   
9710: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
9720: 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9770: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 68  ---. *. * Tls_Ch
9780: 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a  annelType --. *.
9790: 20 2a 09 44 65 66 69 6e 65 73 20 74 68 65 20 63   *.Defines the c
97a0: 6f 72 72 65 63 74 20 54 4c 53 20 63 68 61 6e 6e  orrect TLS chann
97b0: 65 6c 20 64 72 69 76 65 72 20 68 61 6e 64 6c 65  el driver handle
97c0: 72 73 20 66 6f 72 20 74 68 69 73 20 63 68 61 6e  rs for this chan
97d0: 6e 65 6c 20 74 79 70 65 2e 0a 20 2a 0a 20 2a 20  nel type.. *. * 
97e0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 5f  Results:. *.Tcl_
97f0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 73 74 72 75  ChannelType stru
9800: 63 74 75 72 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  cture.. *. * Sid
9810: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20  e effects:. *   
9820: 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   None.. *. *----
9830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
9880: 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43  atic const Tcl_C
9890: 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c 73 43 68  hannelType tlsCh
98a0: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20  annelType = {.  
98b0: 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a 20 54 79    "tls",.../* Ty
98c0: 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54  pe name */.    T
98d0: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49  CL_CHANNEL_VERSI
98e0: 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 6e  ON_5,./* v5 chan
98f0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c  nel */.    TlsCl
9900: 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f  oseProc,../* Clo
9910: 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54  se proc */.    T
9920: 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a  lsInputProc,../*
9930: 20 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20   Input proc */. 
9940: 20 20 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63     TlsOutputProc
9950: 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f  ,../* Output pro
9960: 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09  c */.    NULL,..
9970: 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f  ./* Seek proc */
9980: 0a 20 20 20 20 54 6c 73 53 65 74 4f 70 74 69 6f  .    TlsSetOptio
9990: 6e 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20 6f  nProc,../* Set o
99a0: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20  ption proc */.  
99b0: 20 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72    TlsGetOptionPr
99c0: 6f 63 2c 09 09 2f 2a 20 47 65 74 20 6f 70 74 69  oc,../* Get opti
99d0: 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54  on proc */.    T
99e0: 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a  lsWatchProc,../*
99f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69   Initialize noti
9a00: 66 69 65 72 20 2a 2f 0a 20 20 20 20 54 6c 73 47  fier */.    TlsG
9a10: 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 09 2f  etHandleProc,../
9a20: 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73  * Get OS handles
9a30: 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20   out of channel 
9a40: 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 32  */.    TlsClose2
9a50: 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32  Proc,../* close2
9a60: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 42  proc */.    TlsB
9a70: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f  lockModeProc,../
9a80: 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e  * Set blocking/n
9a90: 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a  onblocking mode*
9aa0: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  /.    NULL,.../*
9ab0: 20 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20   Flush proc */. 
9ac0: 20 20 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63     TlsNotifyProc
9ad0: 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f  ,../* Handling o
9ae0: 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c 69 6e  f events bubblin
9af0: 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c  g up */.    NULL
9b00: 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65 65 6b  ,.../* Wide seek
9b10: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c   proc */.    NUL
9b20: 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 20 61  L,.../* Thread a
9b30: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c  ction */.    NUL
9b40: 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 20  L.../* Truncate 
9b50: 2a 2f 0a 7d 3b 0a 0a 63 6f 6e 73 74 20 54 63 6c  */.};..const Tcl
9b60: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 54 6c  _ChannelType *Tl
9b70: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 76 6f  s_ChannelType(vo
9b80: 69 64 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  id) {.    return
9b90: 20 26 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65   &tlsChannelType
9ba0: 3b 0a 7d 0a                                      ;.}.