Hex Artifact Content

Artifact d289c975da2be270e5d428b56dcf9b9a174db72f48d261961dfb4c7b64397ef2:


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 54 4c 53 20 28 61 6b 61 20 53 53 4c  . * TLS (aka SSL
0110: 29 20 43 68 61 6e 6e 65 6c 20 2d 20 63 61 6e 20  ) Channel - can 
0120: 62 65 20 6c 61 79 65 72 65 64 20 6f 6e 20 61 6e  be layered on an
0130: 79 20 62 69 2d 64 69 72 65 63 74 69 6f 6e 61 6c  y bi-directional
0140: 0a 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  . * Tcl_Channel 
0150: 28 4e 6f 74 65 3a 20 52 65 71 75 69 72 65 73 20  (Note: Requires 
0160: 54 72 66 20 43 6f 72 65 20 50 61 74 63 68 29 0a  Trf Core Patch).
0170: 20 2a 0a 20 2a 20 54 68 69 73 20 77 61 73 20 62   *. * This was b
0180: 75 69 6c 74 20 66 72 6f 6d 20 73 63 72 61 74 63  uilt from scratc
0190: 68 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73  h based upon obs
01a0: 65 72 76 61 74 69 6f 6e 20 6f 66 20 4f 70 65 6e  ervation of Open
01b0: 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a 20 2a  SSL 0.9.2B. *. *
01c0: 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 69 74   Addition credit
01d0: 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e 64 72   is due for Andr
01e0: 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 2e 6b  eas Kupries (a.k
01f0: 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 2e 63  upries@westend.c
0200: 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76  om), for. * prov
0210: 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f 52 65  iding the Tcl_Re
0220: 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63  placeChannel mec
0230: 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69  hanism and worki
0240: 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 68 20  ng closely with 
0250: 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65  me. * to enhance
0260: 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 20 66   it to support f
0270: 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 73 65  ull fileevent se
0280: 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41  mantics.. *. * A
0290: 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79  lso work done by
02a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70   the follow peop
02b0: 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 65 20  le provided the 
02c0: 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 74 68  impetus to do th
02d0: 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a 20 20  is "right":. *  
02e0: 20 20 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20    tclSSL (Colin 
02f0: 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65  McCormack, Share
0300: 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a  d Technology). *
0310: 20 20 20 20 53 53 4c 74 63 6c 20 28 50 65 74 65      SSLtcl (Pete
0320: 72 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f  r Antman). *. */
0330: 0a 0a 2f 2a 0a 09 09 74 6c 73 42 49 4f 2e 63 09  ../*...tlsBIO.c.
0340: 09 09 09 74 6c 73 49 4f 2e 63 0a 20 20 2b 2d 2d  ...tlsIO.c.  +--
0350: 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20  ----+           
0360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d                +-
0370: 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20  ----+           
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0390: 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d            +-----
03a0: 2d 2b 0a 20 20 7c 20 20 20 20 20 20 7c 54 63 6c  -+.  |      |Tcl
03b0: 5f 57 72 69 74 65 52 61 77 20 3c 2d 2d 20 42 69  _WriteRaw <-- Bi
03c0: 6f 57 72 69 74 65 7c 20 53 53 4c 20 7c 42 49 4f  oWrite| SSL |BIO
03d0: 5f 77 72 69 74 65 20 3c 2d 2d 20 54 6c 73 4f 75  _write <-- TlsOu
03e0: 74 70 75 74 50 72 6f 63 20 3c 2d 2d 20 57 72 69  tputProc <-- Wri
03f0: 74 65 7c 20 20 20 20 20 20 7c 0a 20 20 7c 73 6f  te|      |.  |so
0400: 63 6b 65 74 7c 20 20 20 20 20 20 3c 65 6e 63 72  cket|      <encr
0410: 79 70 74 65 64 3e 20 20 20 20 20 20 20 20 7c 20  ypted>        | 
0420: 42 49 4f 20 7c 20 20 20 20 20 20 20 20 20 20 20  BIO |           
0430: 20 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e 20 20   <unencrypted>  
0440: 20 20 20 20 20 20 20 20 20 20 7c 20 41 70 70 20            | App 
0450: 20 7c 20 0a 20 20 7c 20 20 20 20 20 20 7c 54 63   | .  |      |Tc
0460: 6c 5f 52 65 61 64 52 61 77 20 20 2d 2d 3e 20 20  l_ReadRaw  -->  
0470: 42 69 6f 52 65 61 64 7c 20 20 20 20 20 7c 42 49  BioRead|     |BI
0480: 4f 5f 52 65 61 64 20 20 2d 2d 3e 20 54 6c 73 49  O_Read  --> TlsI
0490: 6e 70 75 74 50 72 6f 63 20 20 2d 2d 3e 20 20 52  nputProc  -->  R
04a0: 65 61 64 7c 20 20 20 20 20 20 7c 0a 20 20 2b 2d  ead|      |.  +-
04b0: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20  -----+          
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
04d0: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20  -----+          
04e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04f0: 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d             +----
0500: 2d 2d 2b 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  --+.*/..#include
0510: 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63   "tlsInt.h".#inc
0520: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a  lude <errno.h>..
0530: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 42 6c 6f 63  --. *. * TlsBloc
0590: 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a  kModeProc --. *.
05a0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
05b0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  e is invoked by 
05c0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
05d0: 65 76 65 6c 20 74 6f 20 73 65 74 20 63 68 61 6e  evel to set chan
05e0: 6e 65 6c 20 74 6f 0a 20 2a 09 62 6c 6f 63 6b 69  nel to. *.blocki
05f0: 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e  ng or nonblockin
0600: 67 20 6d 6f 64 65 2e 20 43 61 6c 6c 65 64 20 62  g mode. Called b
0610: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f  y the generic I/
0620: 4f 20 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72  O layer whenever
0630: 0a 20 2a 09 74 68 65 20 54 63 6c 5f 53 65 74 43  . *.the Tcl_SetC
0640: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 29 20 66  hannelOption() f
0650: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
0660: 77 69 74 68 20 6f 70 74 69 6f 6e 20 2d 62 6c 6f  with option -blo
0670: 63 6b 69 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 73  cking.. *. * Res
0680: 75 6c 74 73 3a 0a 20 2a 20 20 20 20 30 20 69 66  ults:. *    0 if
0690: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50   successful or P
06a0: 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20  OSIX error code 
06b0: 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a  if failed.. *. *
06c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
06d0: 2a 20 20 20 20 53 65 74 73 20 74 68 65 20 64 65  *    Sets the de
06e0: 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b 69  vice into blocki
06f0: 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e  ng or nonblockin
0700: 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  g mode.. *. *---
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
0760: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42 6c 6f  tatic int TlsBlo
0770: 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e  ckModeProc(Clien
0780: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
0790: 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a  ta, int mode) {.
07a0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
07b0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
07c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20  instanceData;.. 
07d0: 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54     if (mode == T
07e0: 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b  CL_MODE_NONBLOCK
07f0: 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72  ING) {..statePtr
0800: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
0810: 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20  CL_ASYNC;.    } 
0820: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72  else {..statePtr
0830: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53  ->flags &= ~(TLS
0840: 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20  _TCL_ASYNC);.   
0850: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
0860: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
0870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
08c0: 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a  CloseProc --. *.
08d0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
08e0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  e is invoked by 
08f0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
0900: 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 20  evel to perform 
0910: 63 68 61 6e 6e 65 6c 0a 20 2a 09 74 79 70 65 20  channel. *.type 
0920: 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70  specific cleanup
0930: 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b   when a SSL sock
0940: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
0950: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 09 43   is closed.. *.C
0960: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e  alled by the gen
0970: 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77  eric I/O layer w
0980: 68 65 6e 65 76 65 72 20 74 68 65 20 54 63 6c 5f  henever the Tcl_
0990: 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
09a0: 20 69 73 0a 20 2a 09 75 73 65 64 2e 0a 20 2a 0a   is. *.used.. *.
09b0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20   * Results:. *  
09c0: 20 20 30 20 69 66 20 73 75 63 63 65 73 73 66 75    0 if successfu
09d0: 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72  l or POSIX error
09e0: 20 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e   code if failed.
09f0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
0a00: 63 74 73 3a 0a 20 2a 20 20 20 20 43 6c 6f 73 65  cts:. *    Close
0a10: 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f 66 20  s the socket of 
0a20: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  the channel.. *.
0a30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0a80: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
0a90: 6c 73 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65  lsCloseProc(Clie
0aa0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
0ab0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
0ac0: 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 53  *interp) {.    S
0ad0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
0ae0: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61   (State *) insta
0af0: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  nceData;..    dp
0b00: 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 65 50  rintf("TlsCloseP
0b10: 72 6f 63 28 25 70 29 22 2c 20 28 76 6f 69 64 20  roc(%p)", (void 
0b20: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  *) statePtr);.. 
0b30: 20 20 20 2f 2a 20 46 6c 75 73 68 20 61 6e 79 20     /* Flush any 
0b40: 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pending data */.
0b50: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 73 68 75  .    /* Send shu
0b60: 74 64 6f 77 6e 20 6e 6f 74 69 66 69 63 61 74 69  tdown notificati
0b70: 6f 6e 2e 20 57 69 6c 6c 20 72 65 74 75 72 6e 20  on. Will return 
0b80: 30 20 77 68 69 6c 65 20 69 6e 20 70 72 6f 63 65  0 while in proce
0b90: 73 73 2c 20 74 68 65 6e 20 31 20 77 68 65 6e 20  ss, then 1 when 
0ba0: 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20  complete. */.   
0bb0: 20 2f 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 77   /* Closes the w
0bc0: 72 69 74 65 20 64 69 72 65 63 74 69 6f 6e 20 6f  rite direction o
0bd0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
0be0: 3b 20 74 68 65 20 72 65 61 64 20 64 69 72 65 63  ; the read direc
0bf0: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 20 62  tion is closed b
0c00: 79 20 74 68 65 20 70 65 65 72 2e 20 2a 2f 0a 20  y the peer. */. 
0c10: 20 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 61     /* Does not a
0c20: 66 66 65 63 74 20 73 6f 63 6b 65 74 20 73 74 61  ffect socket sta
0c30: 74 65 2e 20 44 6f 6e 27 74 20 63 61 6c 6c 20 61  te. Don't call a
0c40: 66 74 65 72 20 66 61 74 61 6c 20 65 72 72 6f 72  fter fatal error
0c50: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  . */.    if (sta
0c60: 74 65 50 74 72 2d 3e 73 73 6c 20 21 3d 20 4e 55  tePtr->ssl != NU
0c70: 4c 4c 20 26 26 20 21 28 73 74 61 74 65 50 74 72  LL && !(statePtr
0c80: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
0c90: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c  L_HANDSHAKE_FAIL
0ca0: 45 44 29 29 20 7b 0a 09 53 53 4c 5f 73 68 75 74  ED)) {..SSL_shut
0cb0: 64 6f 77 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  down(statePtr->s
0cc0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sl);.    }..    
0cd0: 2f 2a 20 54 6c 73 5f 46 72 65 65 20 63 61 6c 6c  /* Tls_Free call
0ce0: 73 20 54 6c 73 5f 43 6c 65 61 6e 20 2a 2f 0a 20  s Tls_Clean */. 
0cf0: 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c     Tcl_Eventuall
0d00: 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44 61 74  yFree((ClientDat
0d10: 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c 73 5f  a)statePtr, Tls_
0d20: 46 72 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Free);.    retur
0d30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  n 0;.}../*. *---
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0d90: 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 20 2d   TlsClose2Proc -
0da0: 2d 0a 20 2a 0a 20 2a 09 53 69 6d 69 6c 61 72 20  -. *. *.Similar 
0db0: 74 6f 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c  to TlsCloseProc,
0dc0: 20 62 75 74 20 61 6c 6c 6f 77 73 20 66 6f 72 20   but allows for 
0dd0: 73 65 70 61 72 61 74 65 20 63 6c 6f 73 65 20 72  separate close r
0de0: 65 61 64 20 61 6e 64 20 77 72 69 74 65 0a 20 2a  ead and write. *
0df0: 09 73 69 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c  .side of channel
0e00: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
0e60: 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f  int TlsClose2Pro
0e70: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
0e80: 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a  tanceData,    /*
0e90: 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74   The socket stat
0ea0: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  e. */.    Tcl_In
0eb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
0ec0: 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63  * For errors - c
0ed0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  an be NULL. */. 
0ee0: 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09 09     int flags)...
0ef0: 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 6c 6f 73  /* Flags to clos
0f00: 65 20 72 65 61 64 20 61 6e 64 2f 6f 72 20 77 72  e read and/or wr
0f10: 69 74 65 20 73 69 64 65 20 6f 66 20 63 68 61 6e  ite side of chan
0f20: 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61  nel */.{.    Sta
0f30: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
0f40: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
0f50: 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  eData;..    dpri
0f60: 6e 74 66 28 22 54 6c 73 43 6c 6f 73 65 32 50 72  ntf("TlsClose2Pr
0f70: 6f 63 28 25 70 29 22 2c 20 28 76 6f 69 64 20 2a  oc(%p)", (void *
0f80: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
0f90: 20 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 28    if ((flags & (
0fa0: 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 7c 54  TCL_CLOSE_READ|T
0fb0: 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 29  CL_CLOSE_WRITE))
0fc0: 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 6e   == 0) {..return
0fd0: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 69 6e   TlsCloseProc(in
0fe0: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 65  stanceData, inte
0ff0: 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rp);.    }.    r
1000: 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a  eturn EINVAL;.}.
1010: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 57 61  ---. *. * Tls_Wa
1070: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d 2d 0a  itForConnect --.
1080: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 63 6f   *. *.Perform co
1090: 6e 6e 65 63 74 20 28 63 6c 69 65 6e 74 29 20 6f  nnect (client) o
10a0: 72 20 61 63 63 65 70 74 20 28 73 65 72 76 65 72  r accept (server
10b0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 41 6c 73 6f  ) function. Also
10c0: 20 70 65 72 66 6f 72 6d 73 0a 20 2a 09 65 71 75   performs. *.equ
10d0: 69 76 61 6c 65 6e 74 20 6f 66 20 68 61 6e 64 73  ivalent of hands
10e0: 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  hake function.. 
10f0: 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 20  *. * Result:. * 
1100: 20 20 20 30 20 69 66 20 73 75 63 63 65 73 73 66     0 if successf
1110: 75 6c 2c 20 2d 31 20 69 66 20 66 61 69 6c 65 64  ul, -1 if failed
1120: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
1130: 65 63 74 73 3a 0a 20 2a 20 20 20 20 49 73 73 75  ects:. *    Issu
1140: 65 73 20 53 53 4c 5f 61 63 63 65 70 74 20 6f 72  es SSL_accept or
1150: 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 0a 20 2a 0a   SSL_connect. *.
1160: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
11b0: 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 57 61 69 74   */.int Tls_Wait
11c0: 46 6f 72 43 6f 6e 6e 65 63 74 28 53 74 61 74 65  ForConnect(State
11d0: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20   *statePtr, int 
11e0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 69  *errorCodePtr, i
11f0: 6e 74 20 68 61 6e 64 73 68 61 6b 65 46 61 69 6c  nt handshakeFail
1200: 75 72 65 49 73 50 65 72 6d 61 6e 65 6e 74 29 20  ureIsPermanent) 
1210: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  {.    unsigned l
1220: 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72  ong backingError
1230: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 2c 20 72  ;.    int err, r
1240: 63 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62  c = 0;.    int b
1250: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 3b 0a 20  ioShouldRetry;. 
1260: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
1270: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
1280: 74 66 28 22 57 61 69 74 46 6f 72 43 6f 6e 6e 65  tf("WaitForConne
1290: 63 74 28 25 70 29 22 2c 20 28 76 6f 69 64 20 2a  ct(%p)", (void *
12a0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
12b0: 20 64 70 72 69 6e 74 46 6c 61 67 73 28 73 74 61   dprintFlags(sta
12c0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
12d0: 43 61 6e 20 61 6c 73 6f 20 63 68 65 63 6b 20 53  Can also check S
12e0: 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73  SL_is_init_finis
12f0: 68 65 64 28 73 73 6c 29 20 2a 2f 0a 20 20 20 20  hed(ssl) */.    
1300: 69 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e  if (!(statePtr->
1310: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
1320: 49 4e 49 54 29 29 20 7b 0a 09 64 70 72 69 6e 74  INIT)) {..dprint
1330: 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  f("Tls_WaitForCo
1340: 6e 6e 65 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20  nnect called on 
1350: 61 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69  already initiali
1360: 7a 65 64 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72  zed channel -- r
1370: 65 74 75 72 6e 69 6e 67 20 77 69 74 68 20 69 6d  eturning with im
1380: 6d 65 64 69 61 74 65 20 73 75 63 63 65 73 73 22  mediate success"
1390: 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  );..return 0;.  
13a0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
13b0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
13c0: 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45  LS_TCL_HANDSHAKE
13d0: 5f 46 41 49 4c 45 44 29 20 7b 0a 09 2f 2a 0a 09  _FAILED) {../*..
13e0: 20 2a 20 44 69 66 66 65 72 65 6e 74 20 74 79 70   * Different typ
13f0: 65 73 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  es of operations
1400: 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 20   have different 
1410: 72 65 71 75 69 72 65 6d 65 6e 74 73 0a 09 20 2a  requirements.. *
1420: 20 53 53 4c 20 62 65 69 6e 67 20 65 73 74 61 62   SSL being estab
1430: 6c 69 73 68 65 64 0a 09 20 2a 2f 0a 09 69 66 20  lished.. */..if 
1440: 28 68 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72  (handshakeFailur
1450: 65 49 73 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a  eIsPermanent) {.
1460: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73  .    dprintf("As
1470: 6b 65 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20  ked to wait for 
1480: 61 20 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20  a TLS handshake 
1490: 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
14a0: 20 66 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e   failed.  Return
14b0: 69 6e 67 20 66 61 74 61 6c 20 65 72 72 6f 72 22  ing fatal error"
14c0: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
14d0: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f  dePtr = ECONNABO
14e0: 52 54 45 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  RTED;..} else {.
14f0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73  .    dprintf("As
1500: 6b 65 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20  ked to wait for 
1510: 61 20 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20  a TLS handshake 
1520: 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1530: 20 66 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e   failed.  Return
1540: 69 6e 67 20 73 6f 66 74 20 65 72 72 6f 72 22 29  ing soft error")
1550: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
1560: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45  ePtr = ECONNRESE
1570: 54 3b 0a 09 7d 0a 09 54 6c 73 5f 45 72 72 6f 72  T;..}..Tls_Error
1580: 28 73 74 61 74 65 50 74 72 2c 20 22 57 61 69 74  (statePtr, "Wait
1590: 20 66 6f 72 20 66 61 69 6c 65 64 20 68 61 6e 64   for failed hand
15a0: 73 68 61 6b 65 22 29 3b 0a 09 72 65 74 75 72 6e  shake");..return
15b0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
15c0: 66 6f 72 20 28 3b 3b 29 20 7b 0a 09 45 52 52 5f  for (;;) {..ERR_
15d0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 09  clear_error();..
15e0: 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f  BIO_clear_retry_
15f0: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e  flags(statePtr->
1600: 62 69 6f 29 3b 0a 0a 09 2f 2a 20 4e 6f 74 20 69  bio);.../* Not i
1610: 6e 69 74 69 61 6c 69 7a 65 64 20 79 65 74 21 20  nitialized yet! 
1620: 41 6c 73 6f 20 63 61 6c 6c 73 20 53 53 4c 5f 64  Also calls SSL_d
1630: 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a  o_handshake(). *
1640: 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  /..if (statePtr-
1650: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
1660: 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20  _SERVER) {..    
1670: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67  dprintf("Calling
1680: 20 53 53 4c 5f 61 63 63 65 70 74 28 29 22 29 3b   SSL_accept()");
1690: 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f  ..    err = SSL_
16a0: 61 63 63 65 70 74 28 73 74 61 74 65 50 74 72 2d  accept(statePtr-
16b0: 3e 73 73 6c 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  >ssl);...} else 
16c0: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
16d0: 43 61 6c 6c 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e  Calling SSL_conn
16e0: 65 63 74 28 29 22 29 3b 0a 09 20 20 20 20 65 72  ect()");..    er
16f0: 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28  r = SSL_connect(
1700: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
1710: 09 7d 0a 0a 09 2f 2a 20 31 3d 73 75 63 63 65 73  .}.../* 1=succes
1720: 73 66 75 6c 2c 20 30 3d 6e 6f 74 20 73 75 63 63  sful, 0=not succ
1730: 65 73 73 66 75 6c 20 61 6e 64 20 73 68 75 74 20  essful and shut 
1740: 64 6f 77 6e 2c 20 3c 30 3d 66 61 74 61 6c 20 65  down, <0=fatal e
1750: 72 72 6f 72 20 2a 2f 0a 09 69 66 20 28 65 72 72  rror */..if (err
1760: 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72   > 0) {..    dpr
1770: 69 6e 74 66 28 22 41 63 63 65 70 74 20 6f 72 20  intf("Accept or 
1780: 63 6f 6e 6e 65 63 74 20 77 61 73 20 73 75 63 63  connect was succ
1790: 65 73 73 66 75 6c 22 29 3b 0a 0a 09 20 20 20 20  essful");...    
17a0: 65 72 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28  err = BIO_flush(
17b0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
17c0: 09 20 20 20 20 69 66 20 28 65 72 72 20 3c 3d 20  .    if (err <= 
17d0: 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  0) {...dprintf("
17e0: 46 6c 75 73 68 69 6e 67 20 74 68 65 20 6c 6f 77  Flushing the low
17f0: 65 72 20 6c 61 79 65 72 73 20 66 61 69 6c 65 64  er layers failed
1800: 2c 20 74 68 69 73 20 77 69 6c 6c 20 70 72 6f 62  , this will prob
1810: 61 62 6c 79 20 74 65 72 6d 69 6e 61 74 65 20 74  ably terminate t
1820: 68 69 73 20 73 65 73 73 69 6f 6e 22 29 3b 0a 09  his session");..
1830: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a      }..} else {.
1840: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 63  .    dprintf("Ac
1850: 63 65 70 74 20 6f 72 20 63 6f 6e 6e 65 63 74 20  cept or connect 
1860: 66 61 69 6c 65 64 22 29 3b 0a 09 7d 0a 0a 09 2f  failed");..}.../
1870: 2a 20 53 61 6d 65 20 61 73 20 53 53 4c 5f 77 61  * Same as SSL_wa
1880: 6e 74 2c 20 62 75 74 20 61 6c 73 6f 20 63 68 65  nt, but also che
1890: 63 6b 73 20 74 68 65 20 65 72 72 6f 72 20 71 75  cks the error qu
18a0: 65 75 65 20 2a 2f 0a 09 72 63 20 3d 20 53 53 4c  eue */..rc = SSL
18b0: 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65  _get_error(state
18c0: 50 74 72 2d 3e 73 73 6c 2c 20 65 72 72 29 3b 0a  Ptr->ssl, err);.
18d0: 09 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20  .backingError = 
18e0: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b  ERR_get_error();
18f0: 0a 09 69 66 20 28 72 63 20 21 3d 20 53 53 4c 5f  ..if (rc != SSL_
1900: 45 52 52 4f 52 5f 4e 4f 4e 45 29 20 7b 0a 09 20  ERROR_NONE) {.. 
1910: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
1920: 65 72 72 6f 72 3a 20 25 69 20 28 72 63 20 3d 20  error: %i (rc = 
1930: 25 69 29 22 2c 20 65 72 72 2c 20 72 63 29 3b 0a  %i)", err, rc);.
1940: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
1950: 74 20 65 72 72 6f 72 3a 20 25 73 22 2c 20 45 52  t error: %s", ER
1960: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73  R_reason_error_s
1970: 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72  tring(backingErr
1980: 6f 72 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 68  or));..}.../* Th
1990: 65 20 72 65 74 72 79 20 66 6c 61 67 20 69 73 20  e retry flag is 
19a0: 73 65 74 20 62 79 20 74 68 65 20 42 49 4f 5f 73  set by the BIO_s
19b0: 65 74 5f 72 65 74 72 79 5f 2a 20 66 75 6e 63 74  et_retry_* funct
19c0: 69 6f 6e 73 20 2a 2f 0a 09 62 69 6f 53 68 6f 75  ions */..bioShou
19d0: 6c 64 52 65 74 72 79 20 3d 20 42 49 4f 5f 73 68  ldRetry = BIO_sh
19e0: 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65  ould_retry(state
19f0: 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 69 66 20  Ptr->bio);...if 
1a00: 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 20  (err <= 0) {..  
1a10: 20 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f    if (rc == SSL_
1a20: 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45  ERROR_WANT_CONNE
1a30: 43 54 20 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f  CT || rc == SSL_
1a40: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50  ERROR_WANT_ACCEP
1a50: 54 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64  T) {...bioShould
1a60: 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20  Retry = 1;..    
1a70: 7d 20 65 6c 73 65 20 69 66 20 28 72 63 20 3d 3d  } else if (rc ==
1a80: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
1a90: 52 45 41 44 29 20 7b 0a 09 09 62 69 6f 53 68 6f  READ) {...bioSho
1aa0: 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 09  uldRetry = 1;...
1ab0: 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c  statePtr->want |
1ac0: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a  = TCL_READABLE;.
1ad0: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
1ae0: 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f  rc == SSL_ERROR_
1af0: 57 41 4e 54 5f 57 52 49 54 45 29 20 7b 0a 09 09  WANT_WRITE) {...
1b00: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d  bioShouldRetry =
1b10: 20 31 3b 0a 09 09 73 74 61 74 65 50 74 72 2d 3e   1;...statePtr->
1b20: 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 57 52 49 54  want |= TCL_WRIT
1b30: 41 42 4c 45 3b 0a 09 20 20 20 20 7d 20 65 6c 73  ABLE;..    } els
1b40: 65 20 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64  e if (BIO_should
1b50: 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d  _retry(statePtr-
1b60: 3e 62 69 6f 29 29 20 7b 0a 09 09 62 69 6f 53 68  >bio)) {...bioSh
1b70: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09  ouldRetry = 1;..
1b80: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72      } else if (r
1b90: 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53  c == SSL_ERROR_S
1ba0: 59 53 43 41 4c 4c 20 26 26 20 54 63 6c 5f 47 65  YSCALL && Tcl_Ge
1bb0: 74 45 72 72 6e 6f 28 29 20 3d 3d 20 45 41 47 41  tErrno() == EAGA
1bc0: 49 4e 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c  IN) {...bioShoul
1bd0: 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 20  dRetry = 1;..   
1be0: 20 7d 0a 09 7d 0a 0a 09 69 66 20 28 62 69 6f 53   }..}...if (bioS
1bf0: 68 6f 75 6c 64 52 65 74 72 79 29 20 7b 0a 09 20  houldRetry) {.. 
1c00: 20 20 20 64 70 72 69 6e 74 66 28 22 54 68 65 20     dprintf("The 
1c10: 49 2f 4f 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70  I/O did not comp
1c20: 6c 65 74 65 20 2d 2d 20 62 75 74 20 77 65 20 73  lete -- but we s
1c30: 68 6f 75 6c 64 20 74 72 79 20 69 74 20 61 67 61  hould try it aga
1c40: 69 6e 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28  in");...    if (
1c50: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
1c60: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29  & TLS_TCL_ASYNC)
1c70: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 52 65   {...dprintf("Re
1c80: 74 75 72 6e 69 6e 67 20 45 41 47 41 49 4e 20 73  turning EAGAIN s
1c90: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
1ca0: 20 72 65 74 72 69 65 64 20 6c 61 74 65 72 22 29   retried later")
1cb0: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ;...*errorCodePt
1cc0: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 09 54 6c  r = EAGAIN;...Tl
1cd0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
1ce0: 2c 20 22 48 61 6e 64 73 68 61 6b 65 20 6e 6f 74  , "Handshake not
1cf0: 20 63 6f 6d 70 6c 65 74 65 2c 20 77 69 6c 6c 20   complete, will 
1d00: 72 65 74 72 79 20 6c 61 74 65 72 22 29 3b 0a 09  retry later");..
1d10: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20  .return -1;..   
1d20: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69   } else {...dpri
1d30: 6e 74 66 28 22 44 6f 69 6e 67 20 73 6f 20 6e 6f  ntf("Doing so no
1d40: 77 22 29 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b  w");...continue;
1d50: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 64 70 72  ..    }..}...dpr
1d60: 69 6e 74 66 28 22 57 65 20 68 61 76 65 20 65 69  intf("We have ei
1d70: 74 68 65 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  ther completely 
1d80: 65 73 74 61 62 6c 69 73 68 65 64 20 74 68 65 20  established the 
1d90: 73 65 73 73 69 6f 6e 20 6f 72 20 63 6f 6d 70 6c  session or compl
1da0: 65 74 65 6c 79 20 66 61 69 6c 65 64 20 69 74 20  etely failed it 
1db0: 2d 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  -- there is no m
1dc0: 6f 72 65 20 6e 65 65 64 20 74 6f 20 65 76 65 72  ore need to ever
1dd0: 20 72 65 74 72 79 20 69 74 20 74 68 6f 75 67 68   retry it though
1de0: 22 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  ");..break;.    
1df0: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 72  }..    switch (r
1e00: 63 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45  c) {..case SSL_E
1e10: 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20  RROR_NONE:..    
1e20: 2f 2a 20 54 68 65 20 54 4c 53 2f 53 53 4c 20 49  /* The TLS/SSL I
1e30: 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d  /O operation com
1e40: 70 6c 65 74 65 64 20 73 75 63 63 65 73 73 66 75  pleted successfu
1e50: 6c 6c 79 20 2a 2f 0a 09 20 20 20 20 64 70 72 69  lly */..    dpri
1e60: 6e 74 66 28 22 54 68 65 20 63 6f 6e 6e 65 63 74  ntf("The connect
1e70: 69 6f 6e 20 69 73 20 67 6f 6f 64 22 29 3b 0a 09  ion is good");..
1e80: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
1e90: 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 72 65 61  r = 0;..    brea
1ea0: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
1eb0: 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 2f 2a  ROR_SSL:..    /*
1ec0: 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62   A non-recoverab
1ed0: 6c 65 2c 20 66 61 74 61 6c 20 65 72 72 6f 72 20  le, fatal error 
1ee0: 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61  in the SSL libra
1ef0: 72 79 20 6f 63 63 75 72 72 65 64 2c 20 75 73 75  ry occurred, usu
1f00: 61 6c 6c 79 20 61 20 70 72 6f 74 6f 63 6f 6c 20  ally a protocol 
1f10: 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 64 70  error */..    dp
1f20: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52  rintf("SSL_ERROR
1f30: 5f 53 53 4c 3a 20 47 6f 74 20 70 65 72 6d 61 6e  _SSL: Got perman
1f40: 65 6e 74 20 66 61 74 61 6c 20 53 53 4c 20 65 72  ent fatal SSL er
1f50: 72 6f 72 2c 20 61 62 6f 72 74 69 6e 67 20 69 6d  ror, aborting im
1f60: 6d 65 64 69 61 74 65 6c 79 22 29 3b 0a 09 20 20  mediately");..  
1f70: 20 20 69 66 20 28 53 53 4c 5f 67 65 74 5f 76 65    if (SSL_get_ve
1f80: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
1f90: 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35  ePtr->ssl) != X5
1fa0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73  09_V_OK) {...Tls
1fb0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
1fc0: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
1fd0: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53  t_error_string(S
1fe0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
1ff0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
2000: 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20  sl)));..    }.. 
2010: 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72     if (backingEr
2020: 72 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c  ror != 0) {...Tl
2030: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
2040: 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72  , ERR_reason_err
2050: 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e  or_string(backin
2060: 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d  gError));..    }
2070: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
2080: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
2090: 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45  _HANDSHAKE_FAILE
20a0: 44 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  D;..    *errorCo
20b0: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f  dePtr = ECONNABO
20c0: 52 54 45 44 3b 0a 09 20 20 20 20 72 65 74 75 72  RTED;..    retur
20d0: 6e 20 2d 31 3b 0a 0a 09 63 61 73 65 20 53 53 4c  n -1;...case SSL
20e0: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a  _ERROR_SYSCALL:.
20f0: 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e  .    /* Some non
2100: 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61  -recoverable, fa
2110: 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63  tal I/O error oc
2120: 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 20 64  curred */..    d
2130: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f  printf("SSL_ERRO
2140: 52 5f 53 59 53 43 41 4c 4c 22 29 3b 0a 0a 09 20  R_SYSCALL");... 
2150: 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72     if (backingEr
2160: 72 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20  ror == 0 && err 
2170: 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74  == 0) {...dprint
2180: 66 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 29  f("EOF reached")
2190: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
21a0: 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09   = ECONNRESET;..
21b0: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65  .Tls_Error(state
21c0: 50 74 72 2c 20 22 28 75 6e 65 78 70 65 63 74 65  Ptr, "(unexpecte
21d0: 64 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 29  d) EOF reached")
21e0: 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
21f0: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  f (backingError 
2200: 3d 3d 20 30 20 26 26 20 65 72 72 20 3d 3d 20 2d  == 0 && err == -
2210: 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  1) {...dprintf("
2220: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72  I/O error occurr
2230: 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29  ed (errno = %lu)
2240: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2250: 67 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28  g) Tcl_GetErrno(
2260: 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65  ));...*errorCode
2270: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72  Ptr = Tcl_GetErr
2280: 6e 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 72 72  no();...if (*err
2290: 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f  orCodePtr == ECO
22a0: 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 20 20  NNRESET) {...   
22b0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
22c0: 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09   ECONNABORTED;..
22d0: 09 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73  .}...Tls_Error(s
22e0: 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 45 72 72  tatePtr, Tcl_Err
22f0: 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65  noMsg(*errorCode
2300: 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65  Ptr));...    } e
2310: 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28  lse {...dprintf(
2320: 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  "I/O error occur
2330: 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f  red (backingErro
2340: 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69  r = %lu)", backi
2350: 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72  ngError);...*err
2360: 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f  orCodePtr = Tcl_
2370: 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 69 66  GetErrno();...if
2380: 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20   (*errorCodePtr 
2390: 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b  == ECONNRESET) {
23a0: 0a 09 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ...    *errorCod
23b0: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
23c0: 54 45 44 3b 0a 09 09 7d 0a 09 09 54 6c 73 5f 45  TED;...}...Tls_E
23d0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45  rror(statePtr, E
23e0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
23f0: 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72  string(backingEr
2400: 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09  ror));..    }...
2410: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
2420: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48  ags |= TLS_TCL_H
2430: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b  ANDSHAKE_FAILED;
2440: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
2450: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f  ...case SSL_ERRO
2460: 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09  R_ZERO_RETURN:..
2470: 20 20 20 20 2f 2a 20 50 65 65 72 20 68 61 73 20      /* Peer has 
2480: 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65  closed the conne
2490: 63 74 69 6f 6e 20 62 79 20 73 65 6e 64 69 6e 67  ction by sending
24a0: 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66   the close_notif
24b0: 79 20 61 6c 65 72 74 2e 20 43 61 6e 27 74 20 72  y alert. Can't r
24c0: 65 61 64 2c 20 62 75 74 20 63 61 6e 20 77 72 69  ead, but can wri
24d0: 74 65 2e 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 4e  te. */..    /* N
24e0: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  eed to return an
24f0: 20 45 4f 46 2c 20 73 6f 20 63 68 61 6e 6e 65 6c   EOF, so channel
2500: 20 69 73 20 63 6c 6f 73 65 64 20 77 68 69 63 68   is closed which
2510: 20 77 69 6c 6c 20 73 65 6e 64 20 61 6e 20 53 53   will send an SS
2520: 4c 5f 73 68 75 74 64 6f 77 6e 28 29 2e 20 2a 2f  L_shutdown(). */
2530: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
2540: 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45  SL_ERROR_ZERO_RE
2550: 54 55 52 4e 3a 20 43 6f 6e 6e 65 63 74 20 72 65  TURN: Connect re
2560: 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
2570: 64 20 76 61 6c 75 65 2e 2e 2e 22 29 3b 0a 09 20  d value...");.. 
2580: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
2590: 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09   = ECONNRESET;..
25a0: 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74      Tls_Error(st
25b0: 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 61  atePtr, "Peer ha
25c0: 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e  s closed the con
25d0: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74  nection for writ
25e0: 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74  ing by sending t
25f0: 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20  he close_notify 
2600: 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 72 65  alert");..    re
2610: 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65 20  turn -1;...case 
2620: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52  SSL_ERROR_WANT_R
2630: 45 41 44 3a 0a 09 20 20 20 20 2f 2a 20 4d 6f 72  EAD:..    /* Mor
2640: 65 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  e data must be r
2650: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  ead from the und
2660: 65 72 6c 79 69 6e 67 20 42 49 4f 20 6c 61 79 65  erlying BIO laye
2670: 72 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  r in order to co
2680: 6d 70 6c 65 74 65 20 74 68 65 20 61 63 74 75 61  mplete the actua
2690: 6c 20 53 53 4c 5f 2a 28 29 20 6f 70 65 72 61 74  l SSL_*() operat
26a0: 69 6f 6e 2e 20 20 2a 2f 0a 09 20 20 20 20 64 70  ion.  */..    dp
26b0: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52  rintf("SSL_ERROR
26c0: 5f 57 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20  _WANT_READ");.. 
26d0: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
26e0: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e  _read(statePtr->
26f0: 62 69 6f 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  bio);..    *erro
2700: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
2710: 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  N;..    dprintf(
2720: 22 45 52 52 28 25 64 2c 20 25 64 29 20 22 2c 20  "ERR(%d, %d) ", 
2730: 72 63 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  rc, *errorCodePt
2740: 72 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74  r);..    statePt
2750: 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 52  r->want |= TCL_R
2760: 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 72 65  EADABLE;..    re
2770: 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65 20  turn -1;...case 
2780: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57  SSL_ERROR_WANT_W
2790: 52 49 54 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68  RITE:..    /* Th
27a0: 65 72 65 20 69 73 20 64 61 74 61 20 69 6e 20 74  ere is data in t
27b0: 68 65 20 53 53 4c 20 62 75 66 66 65 72 20 74 68  he SSL buffer th
27c0: 61 74 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  at must be writt
27d0: 65 6e 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  en to the underl
27e0: 79 69 6e 67 20 42 49 4f 20 69 6e 20 6f 72 64 65  ying BIO in orde
27f0: 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
2800: 65 20 53 53 4c 5f 2a 28 29 20 6f 70 65 72 61 74  e SSL_*() operat
2810: 69 6f 6e 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72  ion. */..    dpr
2820: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f  intf("SSL_ERROR_
2830: 57 41 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09 20  WANT_WRITE");.. 
2840: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
2850: 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d  _write(statePtr-
2860: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 2a 65 72 72  >bio);..    *err
2870: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
2880: 49 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  IN;..    dprintf
2890: 28 22 45 52 52 28 25 64 2c 20 25 64 29 20 22 2c  ("ERR(%d, %d) ",
28a0: 20 72 63 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50   rc, *errorCodeP
28b0: 74 72 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50  tr);..    stateP
28c0: 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f  tr->want |= TCL_
28d0: 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 20 20 72  WRITABLE;..    r
28e0: 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65  eturn -1;...case
28f0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
2900: 43 4f 4e 4e 45 43 54 3a 0a 09 20 20 20 20 2f 2a  CONNECT:..    /*
2910: 20 43 6f 6e 6e 65 63 74 20 77 6f 75 6c 64 20 68   Connect would h
2920: 61 76 65 20 62 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  ave blocked. */.
2930: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53  .    dprintf("SS
2940: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e  L_ERROR_WANT_CON
2950: 4e 45 43 54 22 29 3b 0a 09 20 20 20 20 42 49 4f  NECT");..    BIO
2960: 5f 73 65 74 5f 72 65 74 72 79 5f 73 70 65 63 69  _set_retry_speci
2970: 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  al(statePtr->bio
2980: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f  );..    BIO_set_
2990: 72 65 74 72 79 5f 72 65 61 73 6f 6e 28 73 74 61  retry_reason(sta
29a0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 42 49 4f 5f  tePtr->bio, BIO_
29b0: 52 52 5f 43 4f 4e 4e 45 43 54 29 3b 0a 09 20 20  RR_CONNECT);..  
29c0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
29d0: 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64  = EAGAIN;..    d
29e0: 70 72 69 6e 74 66 28 22 45 52 52 28 25 64 2c 20  printf("ERR(%d, 
29f0: 25 64 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f  %d) ", rc, *erro
2a00: 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 20  rCodePtr);..    
2a10: 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73  return -1;...cas
2a20: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  e SSL_ERROR_WANT
2a30: 5f 41 43 43 45 50 54 3a 0a 09 20 20 20 20 2f 2a  _ACCEPT:..    /*
2a40: 20 41 63 63 65 70 74 20 77 6f 75 6c 64 20 68 61   Accept would ha
2a50: 76 65 20 62 6c 6f 63 6b 65 64 20 2a 2f 0a 09 20  ve blocked */.. 
2a60: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f     dprintf("SSL_
2a70: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50  ERROR_WANT_ACCEP
2a80: 54 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65  T");..    BIO_se
2a90: 74 5f 72 65 74 72 79 5f 73 70 65 63 69 61 6c 28  t_retry_special(
2aa0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
2ab0: 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74  .    BIO_set_ret
2ac0: 72 79 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 50  ry_reason(stateP
2ad0: 74 72 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52 5f  tr->bio, BIO_RR_
2ae0: 41 43 43 45 50 54 29 3b 0a 09 20 20 20 20 2a 65  ACCEPT);..    *e
2af0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
2b00: 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e  GAIN;..    dprin
2b10: 74 66 28 22 45 52 52 28 25 64 2c 20 25 64 29 20  tf("ERR(%d, %d) 
2b20: 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 43 6f 64  ", rc, *errorCod
2b30: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
2b40: 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65 20 53 53  rn -1;...case SS
2b50: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30  L_ERROR_WANT_X50
2b60: 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 2f  9_LOOKUP:..    /
2b70: 2a 20 41 70 70 20 63 61 6c 6c 62 61 63 6b 20 73  * App callback s
2b80: 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 65  et by SSL_CTX_se
2b90: 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62  t_client_cert_cb
2ba0: 20 68 61 73 20 61 73 6b 65 64 20 74 6f 20 62 65   has asked to be
2bb0: 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 2a 2f   called again */
2bc0: 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65  ..    /* The ope
2bd0: 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63  ration did not c
2be0: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
2bf0: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  an application c
2c00: 61 6c 6c 62 61 63 6b 20 73 65 74 20 62 79 20 53  allback set by S
2c10: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
2c20: 74 5f 63 65 72 74 5f 63 62 28 29 20 68 61 73 20  t_cert_cb() has 
2c30: 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  asked to be call
2c40: 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 09 20 20  ed again. */..  
2c50: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45    dprintf("SSL_E
2c60: 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c  RROR_WANT_X509_L
2c70: 4f 4f 4b 55 50 22 29 3b 0a 09 20 20 20 20 42 49  OOKUP");..    BI
2c80: 4f 5f 73 65 74 5f 72 65 74 72 79 5f 73 70 65 63  O_set_retry_spec
2c90: 69 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ial(statePtr->bi
2ca0: 6f 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74  o);..    BIO_set
2cb0: 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e 28 73 74  _retry_reason(st
2cc0: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 42 49 4f  atePtr->bio, BIO
2cd0: 5f 52 52 5f 53 53 4c 5f 58 35 30 39 5f 4c 4f 4f  _RR_SSL_X509_LOO
2ce0: 4b 55 50 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  KUP);..    *erro
2cf0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
2d00: 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  N;..    dprintf(
2d10: 22 45 52 52 28 25 64 2c 20 25 64 29 20 22 2c 20  "ERR(%d, %d) ", 
2d20: 72 63 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  rc, *errorCodePt
2d30: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
2d40: 2d 31 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  -1;...case SSL_E
2d50: 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a  RROR_WANT_ASYNC:
2d60: 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69  ..    /* Used wi
2d70: 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45  th flag SSL_MODE
2d80: 5f 41 53 59 4e 43 2c 20 6f 70 20 64 69 64 6e 27  _ASYNC, op didn'
2d90: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
2da0: 73 65 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69  se an async engi
2db0: 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63  ne is still proc
2dc0: 65 73 73 69 6e 67 20 64 61 74 61 20 2a 2f 0a 09  essing data */..
2dd0: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57  case SSL_ERROR_W
2de0: 41 4e 54 5f 41 53 59 4e 43 5f 4a 4f 42 3a 0a 09  ANT_ASYNC_JOB:..
2df0: 20 20 20 20 2f 2a 20 54 68 65 20 61 73 79 6e 63      /* The async
2e00: 68 72 6f 6e 6f 75 73 20 6a 6f 62 20 63 6f 75 6c  hronous job coul
2e10: 64 20 6e 6f 74 20 62 65 20 73 74 61 72 74 65 64  d not be started
2e20: 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20 77   because there w
2e30: 65 72 65 20 6e 6f 20 61 73 79 6e 63 20 6a 6f 62  ere no async job
2e40: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  s available in t
2e50: 68 65 20 70 6f 6f 6c 2e 20 2a 2f 0a 09 63 61 73  he pool. */..cas
2e60: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  e SSL_ERROR_WANT
2e70: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 43 42  _CLIENT_HELLO_CB
2e80: 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  :..    /* The op
2e90: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
2ea0: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
2eb0: 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   an application 
2ec0: 63 61 6c 6c 62 61 63 6b 20 73 65 74 20 62 79 20  callback set by 
2ed0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
2ee0: 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 29 20 68 61  nt_hello_cb() ha
2ef0: 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61  s asked to be ca
2f00: 6c 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 23  lled again. */.#
2f10: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
2f20: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33  ON_NUMBER >= 0x3
2f30: 30 30 30 30 30 30 30 4c 0a 09 63 61 73 65 20 53  0000000L..case S
2f40: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
2f50: 54 52 59 5f 56 45 52 49 46 59 3a 0a 09 20 20 20  TRY_VERIFY:..   
2f60: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   /* The operatio
2f70: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  n did not comple
2f80: 74 65 20 62 65 63 61 75 73 65 20 61 20 63 65 72  te because a cer
2f90: 74 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63  tificate verific
2fa0: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 68  ation callback h
2fb0: 61 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63  as asked to be c
2fc0: 61 6c 6c 65 64 20 61 67 61 69 6e 20 76 69 61 20  alled again via 
2fd0: 53 53 4c 5f 73 65 74 5f 72 65 74 72 79 5f 76 65  SSL_set_retry_ve
2fe0: 72 69 66 79 28 33 29 2e 20 2a 2f 0a 23 65 6e 64  rify(3). */.#end
2ff0: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  if..default:..  
3000: 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69    /* The operati
3010: 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c  on did not compl
3020: 65 74 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  ete and should b
3030: 65 20 72 65 74 72 69 65 64 20 6c 61 74 65 72 2e  e retried later.
3040: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
3050: 28 22 4f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  ("Operation did 
3060: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 2c 20 63 61  not complete, ca
3070: 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  ll function agai
3080: 6e 20 6c 61 74 65 72 3a 20 25 69 22 2c 20 72 63  n later: %i", rc
3090: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
30a0: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
30b0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 52  .    dprintf("ER
30c0: 52 28 25 64 2c 20 25 64 29 20 22 2c 20 72 63 2c  R(%d, %d) ", rc,
30d0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b   *errorCodePtr);
30e0: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28  ..    Tls_Error(
30f0: 73 74 61 74 65 50 74 72 2c 20 22 4f 70 65 72 61  statePtr, "Opera
3100: 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d  tion did not com
3110: 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66 75 6e 63  plete, call func
3120: 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74 65 72  tion again later
3130: 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ");..    return 
3140: 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  -1;.    }..    d
3150: 70 72 69 6e 74 66 28 22 52 65 6d 6f 76 69 6e 67  printf("Removing
3160: 20 74 68 65 20 5c 22 54 4c 53 5f 54 43 4c 5f 49   the \"TLS_TCL_I
3170: 4e 49 54 5c 22 20 66 6c 61 67 20 73 69 6e 63 65  NIT\" flag since
3180: 20 77 65 20 68 61 76 65 20 63 6f 6d 70 6c 65 74   we have complet
3190: 65 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  ed the handshake
31a0: 22 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  ");.    statePtr
31b0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 4c 53 5f  ->flags &= ~TLS_
31c0: 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20 20 20 20 64  TCL_INIT;..    d
31d0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
31e0: 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a  g in success");.
31f0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
3200: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
3210: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  n 0;.}../*. *---
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3270: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d   TlsInputProc --
3280: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
3290: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
32a0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
32b0: 49 2f 4f 20 6c 61 79 65 72 20 74 6f 20 72 65 61  I/O layer to rea
32c0: 64 20 64 61 74 61 20 66 72 6f 6d 0a 20 2a 09 74  d data from. *.t
32d0: 68 65 20 42 49 4f 20 77 68 65 6e 65 76 65 72 20  he BIO whenever 
32e0: 74 68 65 20 54 63 6c 5f 52 65 61 64 28 29 2c 20  the Tcl_Read(), 
32f0: 54 63 6c 5f 52 65 61 64 43 68 61 72 73 2c 20 54  Tcl_ReadChars, T
3300: 63 6c 5f 47 65 74 73 2c 20 61 6e 64 0a 20 2a 09  cl_Gets, and. *.
3310: 54 63 6c 5f 47 65 74 73 4f 62 6a 20 66 75 6e 63  Tcl_GetsObj func
3320: 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 2e 20  tions are used. 
3330: 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 53 53  Equivalent to SS
3340: 4c 5f 72 65 61 64 5f 65 78 20 61 6e 64 20 53 53  L_read_ex and SS
3350: 4c 5f 72 65 61 64 2e 0a 20 2a 0a 20 2a 20 52 65  L_read.. *. * Re
3360: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e  sults:. *.Return
3370: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3380: 62 79 74 65 73 20 72 65 61 64 20 6f 72 20 2d 31  bytes read or -1
3390: 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20   on error. Sets 
33a0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 74 6f 0a  errorCodePtr to.
33b0: 20 2a 09 61 20 50 4f 53 49 58 20 65 72 72 6f 72   *.a POSIX error
33c0: 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
33d0: 72 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30  r occurred, or 0
33e0: 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20   if none.. *. * 
33f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
3400: 20 20 20 20 52 65 61 64 73 20 69 6e 70 75 74 20      Reads input 
3410: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 64  from the input d
3420: 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 61  evice of the cha
3430: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 44 61 74 61  nnel.. *. * Data
3440: 20 69 73 20 72 65 63 65 69 76 65 64 20 69 6e 20   is received in 
3450: 77 68 6f 6c 65 20 62 6c 6f 63 6b 73 20 6b 6e 6f  whole blocks kno
3460: 77 6e 20 61 73 20 72 65 63 6f 72 64 73 20 66 72  wn as records fr
3470: 6f 6d 20 74 68 65 20 70 65 65 72 2e 20 41 20 77  om the peer. A w
3480: 68 6f 6c 65 0a 20 2a 20 72 65 63 6f 72 64 20 69  hole. * record i
3490: 73 20 70 72 6f 63 65 73 73 65 64 20 28 65 2e 67  s processed (e.g
34a0: 2e 20 64 65 63 72 79 70 74 65 64 29 20 69 6e 20  . decrypted) in 
34b0: 6f 6e 65 20 67 6f 20 61 6e 64 20 69 73 20 62 75  one go and is bu
34c0: 66 66 65 72 65 64 20 62 79 20 4f 70 65 6e 53 53  ffered by OpenSS
34d0: 4c 0a 20 2a 20 75 6e 74 69 6c 20 69 74 20 69 73  L. * until it is
34e0: 20 72 65 61 64 20 62 79 20 74 68 65 20 61 70 70   read by the app
34f0: 6c 69 63 61 74 69 6f 6e 20 76 69 61 20 61 20 63  lication via a c
3500: 61 6c 6c 20 74 6f 20 53 53 4c 5f 72 65 61 64 2e  all to SSL_read.
3510: 20 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d   . *. *---------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3570: 69 6e 74 20 54 6c 73 49 6e 70 75 74 50 72 6f 63  int TlsInputProc
3580: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
3590: 61 6e 63 65 44 61 74 61 2c 20 63 68 61 72 20 2a  anceData, char *
35a0: 62 75 66 2c 20 69 6e 74 20 62 75 66 53 69 7a 65  buf, int bufSize
35b0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
35c0: 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 67  Ptr) {.    unsig
35d0: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67  ned long backing
35e0: 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65  Error;.    State
35f0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
3600: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
3610: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 74  ata;.    int byt
3620: 65 73 52 65 61 64 2c 20 65 72 72 3b 0a 20 20 20  esRead, err;.   
3630: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
3640: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
3650: 28 22 52 65 61 64 28 25 64 29 22 2c 20 62 75 66  ("Read(%d)", buf
3660: 53 69 7a 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  Size);..    /* S
3670: 6b 69 70 20 69 66 20 75 73 65 72 20 76 65 72 69  kip if user veri
3680: 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73  fy callback is s
3690: 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 2a 2f 0a  till running */.
36a0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
36b0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
36c0: 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64  L_CALLBACK) {..d
36d0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b  printf("Callback
36e0: 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 72 65 61   is running, rea
36f0: 64 69 6e 67 20 30 20 62 79 74 65 73 22 29 3b 0a  ding 0 bytes");.
3700: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d  .return 0;.    }
3710: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ..    /* If not 
3720: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 64 6f 20  initialized, do 
3730: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 2f  connect */.    /
3740: 2a 20 43 61 6e 20 61 6c 73 6f 20 63 68 65 63 6b  * Can also check
3750: 20 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e   SSL_is_init_fin
3760: 69 73 68 65 64 28 73 73 6c 29 20 2a 2f 0a 20 20  ished(ssl) */.  
3770: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3780: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
3790: 49 4e 49 54 29 20 7b 0a 09 69 6e 74 20 74 6c 73  INIT) {..int tls
37a0: 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70 72 69 6e  Connect;...dprin
37b0: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f  tf("Calling Tls_
37c0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29  WaitForConnect")
37d0: 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63 74 20 3d  ;...tlsConnect =
37e0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
37f0: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72  ect(statePtr, er
3800: 72 6f 72 43 6f 64 65 50 74 72 2c 20 30 29 3b 0a  rorCodePtr, 0);.
3810: 09 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20  .if (tlsConnect 
3820: 3c 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69  < 0) {..    dpri
3830: 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f  ntf("Got an erro
3840: 72 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e  r waiting to con
3850: 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74  nect (tlsConnect
3860: 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64   = %i, *errorCod
3870: 65 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73  ePtr = %i)", tls
3880: 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43  Connect, *errorC
3890: 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 20 54 6c  odePtr);..    Tl
38a0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
38b0: 2c 20 73 74 72 65 72 72 6f 72 28 2a 65 72 72 6f  , strerror(*erro
38c0: 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20 20  rCodePtr));...  
38d0: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31    bytesRead = -1
38e0: 3b 0a 09 20 20 20 20 69 66 20 28 2a 65 72 72 6f  ;..    if (*erro
38f0: 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e  rCodePtr == ECON
3900: 4e 52 45 53 45 54 29 20 7b 0a 09 09 64 70 72 69  NRESET) {...dpri
3910: 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74  ntf("Got connect
3920: 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 2f  ion reset");.../
3930: 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 09  * Soft EOF */...
3940: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3950: 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d  0;...bytesRead =
3960: 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20   0;..    }..    
3970: 72 65 74 75 72 6e 20 62 79 74 65 73 52 65 61 64  return bytesRead
3980: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
3990: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65  /*.     * We nee
39a0: 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53  d to clear the S
39b0: 53 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e  SL error stack n
39c0: 6f 77 20 62 65 63 61 75 73 65 20 77 65 20 73 6f  ow because we so
39d0: 6d 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20  metimes reach.  
39e0: 20 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69     * this functi
39f0: 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72  on with leftover
3a00: 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73   errors in the s
3a10: 74 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 72 65  tack.  If BIO_re
3a20: 61 64 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e  ad.     * return
3a30: 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73  s -1 and intends
3a40: 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69   EAGAIN, there i
3a50: 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72  s a leftover err
3a60: 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20  or, it will be. 
3a70: 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75      * misconstru
3a80: 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20  ed as an error, 
3a90: 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20  not EAGAIN..    
3aa0: 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e   *.     * Altern
3ab0: 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20  atively, we may 
3ac0: 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74  want to handle t
3ad0: 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64  he <0 return cod
3ae0: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42  es from.     * B
3af0: 49 4f 5f 72 65 61 64 20 73 70 65 63 69 61 6c 6c  IO_read speciall
3b00: 79 20 28 61 73 20 61 64 76 69 73 65 64 20 69 6e  y (as advised in
3b10: 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20   the RSA docs). 
3b20: 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76   TLS's lower lev
3b30: 65 6c 20 42 49 4f 0a 20 20 20 20 20 2a 20 66 75  el BIO.     * fu
3b40: 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74  nctions play wit
3b50: 68 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 67  h the retry flag
3b60: 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68  s though, and th
3b70: 69 73 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b  is seems to work
3b80: 0a 20 20 20 20 20 2a 20 63 6f 72 72 65 63 74 6c  .     * correctl
3b90: 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20  y.  Similar fix 
3ba0: 69 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63  in TlsOutputProc
3bb0: 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a  . - hobbs.     *
3bc0: 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  /.    ERR_clear_
3bd0: 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f  error();.    BIO
3be0: 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c 61  _clear_retry_fla
3bf0: 67 73 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  gs(statePtr->bio
3c00: 29 3b 0a 20 20 20 20 62 79 74 65 73 52 65 61 64  );.    bytesRead
3c10: 20 3d 20 42 49 4f 5f 72 65 61 64 28 73 74 61 74   = BIO_read(stat
3c20: 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20  ePtr->bio, buf, 
3c30: 62 75 66 53 69 7a 65 29 3b 0a 20 20 20 20 64 70  bufSize);.    dp
3c40: 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 61 64 20  rintf("BIO_read 
3c50: 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52 65 61  -> %d", bytesRea
3c60: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 61 6d 65  d);..    /* Same
3c70: 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62 75   as SSL_want, bu
3c80: 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68  t also checks th
3c90: 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a 2f  e error queue */
3ca0: 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 67  .    err = SSL_g
3cb0: 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74  et_error(statePt
3cc0: 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61  r->ssl, bytesRea
3cd0: 64 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67 45  d);.    backingE
3ce0: 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65  rror = ERR_get_e
3cf0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 66 20  rror();..    if 
3d00: 28 62 79 74 65 73 52 65 61 64 20 3c 3d 20 30 29  (bytesRead <= 0)
3d10: 20 7b 0a 09 2f 2a 20 54 68 65 20 72 65 74 72 79   {../* The retry
3d20: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
3d30: 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 65 74 72  the BIO_set_retr
3d40: 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  y_* functions */
3d50: 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64  ..if (BIO_should
3d60: 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d  _retry(statePtr-
3d70: 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70  >bio)) {..    dp
3d80: 72 69 6e 74 66 28 22 52 65 61 64 20 66 61 69 6c  rintf("Read fail
3d90: 65 64 20 77 69 74 68 20 63 6f 64 65 3d 25 64 2c  ed with code=%d,
3da0: 20 62 79 74 65 73 20 72 65 61 64 3d 25 64 3a 20   bytes read=%d: 
3db0: 73 68 6f 75 6c 64 20 72 65 74 72 79 22 2c 20 65  should retry", e
3dc0: 72 72 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a  rr, bytesRead);.
3dd0: 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 64 6f 63  .    /* Some doc
3de0: 73 20 69 6d 70 6c 79 20 77 65 20 73 68 6f 75 6c  s imply we shoul
3df0: 64 20 72 65 64 6f 20 74 68 65 20 42 49 4f 5f 72  d redo the BIO_r
3e00: 65 61 64 20 6e 6f 77 20 2a 2f 0a 09 7d 20 65 6c  ead now */..} el
3e10: 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  se {..    dprint
3e20: 66 28 22 52 65 61 64 20 66 61 69 6c 65 64 20 77  f("Read failed w
3e30: 69 74 68 20 63 6f 64 65 3d 25 64 2c 20 62 79 74  ith code=%d, byt
3e40: 65 73 20 72 65 61 64 3d 25 64 3a 20 65 72 72 6f  es read=%d: erro
3e50: 72 20 63 6f 6e 64 69 74 69 6f 6e 22 2c 20 65 72  r condition", er
3e60: 72 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a 09  r, bytesRead);..
3e70: 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  }...dprintf("BIO
3e80: 20 69 73 20 45 4f 46 20 25 64 22 2c 20 42 49 4f   is EOF %d", BIO
3e90: 5f 65 6f 66 28 73 74 61 74 65 50 74 72 2d 3e 62  _eof(statePtr->b
3ea0: 69 6f 29 29 3b 0a 09 0a 09 2f 2a 20 54 68 65 73  io));..../* Thes
3eb0: 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  e are the same a
3ec0: 73 20 42 49 4f 5f 72 65 74 72 79 5f 74 79 70 65  s BIO_retry_type
3ed0: 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f   */..if (BIO_sho
3ee0: 75 6c 64 5f 72 65 61 64 28 73 74 61 74 65 50 74  uld_read(statePt
3ef0: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20  r->bio)) {..    
3f00: 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73  dprintf("BIO has
3f10: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 64 61   insufficient da
3f20: 74 61 20 74 6f 20 72 65 61 64 20 61 6e 64 20 72  ta to read and r
3f30: 65 74 75 72 6e 22 29 3b 0a 09 20 20 20 20 73 74  eturn");..    st
3f40: 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20  atePtr->want |= 
3f50: 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 7d  TCL_READABLE;..}
3f60: 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64  ..if (BIO_should
3f70: 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d  _write(statePtr-
3f80: 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70  >bio)) {..    dp
3f90: 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20 70  rintf("BIO has p
3fa0: 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f 20 77  ending data to w
3fb0: 72 69 74 65 22 29 3b 0a 09 20 20 20 20 73 74 61  rite");..    sta
3fc0: 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54  tePtr->want |= T
3fd0: 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 7d 0a  CL_WRITABLE;..}.
3fe0: 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f  .if (BIO_should_
3ff0: 69 6f 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65  io_special(state
4000: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20  Ptr->bio)) {..  
4010: 20 20 69 6e 74 20 72 65 61 73 6f 6e 20 3d 20 42    int reason = B
4020: 49 4f 5f 67 65 74 5f 72 65 74 72 79 5f 72 65 61  IO_get_retry_rea
4030: 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69  son(statePtr->bi
4040: 6f 29 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  o);..    dprintf
4050: 28 22 42 49 4f 20 68 61 73 20 73 6f 6d 65 20 73  ("BIO has some s
4060: 70 65 63 69 61 6c 20 63 6f 6e 64 69 74 69 6f 6e  pecial condition
4070: 20 6f 74 68 65 72 20 74 68 61 6e 20 72 65 61 64   other than read
4080: 20 6f 72 20 77 72 69 74 65 3a 20 63 6f 64 65 3d   or write: code=
4090: 25 64 22 2c 20 72 65 61 73 6f 6e 29 3b 0a 09 7d  %d", reason);..}
40a0: 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68  ..dprintf("BIO h
40b0: 61 73 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20  as pending data 
40c0: 74 6f 20 77 72 69 74 65 22 29 3b 0a 20 20 20 20  to write");.    
40d0: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 65  }..    switch (e
40e0: 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f  rr) {..case SSL_
40f0: 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20  ERROR_NONE:..   
4100: 20 2f 2a 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f   /* I/O operatio
4110: 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 09  n completed */..
4120: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c      dprintf("SSL
4130: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09  _ERROR_NONE");..
4140: 20 20 20 20 64 70 72 69 6e 74 42 75 66 66 65 72      dprintBuffer
4150: 28 62 75 66 2c 20 62 79 74 65 73 52 65 61 64 29  (buf, bytesRead)
4160: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
4170: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53  case SSL_ERROR_S
4180: 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f  SL:..    /* A no
4190: 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66  n-recoverable, f
41a0: 61 74 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 68  atal error in th
41b0: 65 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 63  e SSL library oc
41c0: 63 75 72 72 65 64 2c 20 75 73 75 61 6c 6c 79 20  curred, usually 
41d0: 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72  a protocol error
41e0: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
41f0: 28 22 53 53 4c 20 65 72 72 6f 72 2c 20 69 6e 64  ("SSL error, ind
4200: 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
4210: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
4220: 62 65 65 6e 20 61 62 6f 72 74 65 64 22 29 3b 0a  been aborted");.
4230: 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67  .    if (backing
4240: 45 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09  Error != 0) {...
4250: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
4260: 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65  tr, ERR_reason_e
4270: 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b  rror_string(back
4280: 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20  ingError));..   
4290: 20 7d 20 65 6c 73 65 20 69 66 20 28 53 53 4c 5f   } else if (SSL_
42a0: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c  get_verify_resul
42b0: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  t(statePtr->ssl)
42c0: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b   != X509_V_OK) {
42d0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61  ...Tls_Error(sta
42e0: 74 65 50 74 72 2c 20 58 35 30 39 5f 76 65 72 69  tePtr, X509_veri
42f0: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
4300: 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72  ring(SSL_get_ver
4310: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
4320: 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20  Ptr->ssl)));..  
4330: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 6c 73    } else {...Tls
4340: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
4350: 20 22 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 72   "Unknown SSL er
4360: 72 6f 72 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20  ror");..    }.. 
4370: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
4380: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b   = ECONNABORTED;
4390: 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20  ..    bytesRead 
43a0: 3d 20 2d 31 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  = -1;..#if OPENS
43b0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
43c0: 52 20 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c  R >= 0x30000000L
43d0: 0a 09 20 20 20 20 2f 2a 20 55 6e 65 78 70 65 63  ..    /* Unexpec
43e0: 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 74 68 65  ted EOF from the
43f0: 20 70 65 65 72 20 66 6f 72 20 4f 70 65 6e 53 53   peer for OpenSS
4400: 4c 20 33 2e 30 2b 20 2a 2f 0a 09 20 20 20 20 69  L 3.0+ */..    i
4410: 66 20 28 45 52 52 5f 47 45 54 5f 52 45 41 53 4f  f (ERR_GET_REASO
4420: 4e 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 20  N(backingError) 
4430: 3d 3d 20 53 53 4c 5f 52 5f 55 4e 45 58 50 45 43  == SSL_R_UNEXPEC
4440: 54 45 44 5f 45 4f 46 5f 57 48 49 4c 45 5f 52 45  TED_EOF_WHILE_RE
4450: 41 44 49 4e 47 29 20 7b 0a 09 09 64 70 72 69 6e  ADING) {...dprin
4460: 74 66 28 22 28 55 6e 65 78 70 65 63 74 65 64 29  tf("(Unexpected)
4470: 20 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09   EOF reached")..
4480: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
4490: 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20   0;...bytesRead 
44a0: 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72  = 0;...Tls_Error
44b0: 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20  (statePtr, "EOF 
44c0: 72 65 61 63 68 65 64 22 29 3b 0a 09 20 20 20 20  reached");..    
44d0: 7d 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 62 72  }.#endif..    br
44e0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
44f0: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a  ERROR_WANT_READ:
4500: 0a 09 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 20  ..    /* Op did 
4510: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65  not complete due
4520: 20 74 6f 20 6e 6f 74 20 65 6e 6f 75 67 68 20 64   to not enough d
4530: 61 74 61 20 77 61 73 20 61 76 61 69 6c 61 62 6c  ata was availabl
4540: 65 2e 20 52 65 74 72 79 20 6c 61 74 65 72 2e 20  e. Retry later. 
4550: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
4560: 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57  "Got SSL_ERROR_W
4570: 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 6e  ANT_READ, mappin
4580: 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e  g this to EAGAIN
4590: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  ");..    *errorC
45a0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
45b0: 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20  ..    bytesRead 
45c0: 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 65  = -1;..    state
45d0: 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c  Ptr->want |= TCL
45e0: 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20  _READABLE;..    
45f0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
4600: 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57  tr, "SSL_ERROR_W
4610: 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20 20 20  ANT_READ");..   
4620: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72   BIO_set_retry_r
4630: 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ead(statePtr->bi
4640: 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  o);..    break;.
4650: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52  ..case SSL_ERROR
4660: 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20  _WANT_WRITE:..  
4670: 20 20 2f 2a 20 4f 70 20 64 69 64 20 6e 6f 74 20    /* Op did not 
4680: 63 6f 6d 70 6c 65 74 65 20 64 75 65 20 74 6f 20  complete due to 
4690: 75 6e 61 62 6c 65 20 74 6f 20 73 65 6e 74 20 61  unable to sent a
46a0: 6c 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 42  ll data to the B
46b0: 49 4f 2e 20 52 65 74 72 79 20 6c 61 74 65 72 2e  IO. Retry later.
46c0: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
46d0: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
46e0: 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d 61 70 70  WANT_WRITE, mapp
46f0: 69 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47 41  ing this to EAGA
4700: 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  IN");..    *erro
4710: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
4720: 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61  N;..    bytesRea
4730: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61  d = -1;..    sta
4740: 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54  tePtr->want |= T
4750: 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20  CL_WRITABLE;..  
4760: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74    Tls_Error(stat
4770: 65 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52  ePtr, "SSL_ERROR
4780: 5f 57 41 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09  _WANT_WRITE");..
4790: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72      BIO_set_retr
47a0: 79 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72  y_write(statePtr
47b0: 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65  ->bio);..    bre
47c0: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
47d0: 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c  RROR_WANT_X509_L
47e0: 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 2a 20 4f  OOKUP:..    /* O
47f0: 70 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74  p didn't complet
4800: 65 20 73 69 6e 63 65 20 63 61 6c 6c 62 61 63 6b  e since callback
4810: 20 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f   set by SSL_CTX_
4820: 73 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f  set_client_cert_
4830: 63 62 28 29 20 61 73 6b 65 64 20 74 6f 20 62 65  cb() asked to be
4840: 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 2a 2f   called again */
4850: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47  ..    dprintf("G
4860: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  ot SSL_ERROR_WAN
4870: 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d  T_X509_LOOKUP, m
4880: 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47  apping it to EAG
4890: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72  AIN");..    *err
48a0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
48b0: 49 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65  IN;..    bytesRe
48c0: 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 54 6c  ad = -1;..    Tl
48d0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
48e0: 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  , "SSL_ERROR_WAN
48f0: 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 22 29 3b  T_X509_LOOKUP");
4900: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
4910: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59  ase SSL_ERROR_SY
4920: 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53  SCALL:..    /* S
4930: 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61  ome non-recovera
4940: 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65  ble, fatal I/O e
4950: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
4960: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53  ..    dprintf("S
4970: 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c  SL_ERROR_SYSCALL
4980: 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 62 61  ");...    if (ba
4990: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20  ckingError == 0 
49a0: 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20  && bytesRead == 
49b0: 30 29 20 7b 0a 09 09 2f 2a 20 55 6e 65 78 70 65  0) {.../* Unexpe
49c0: 63 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 74 68  cted EOF from th
49d0: 65 20 70 65 65 72 20 66 6f 72 20 4f 70 65 6e 53  e peer for OpenS
49e0: 53 4c 20 31 2e 31 20 2a 2f 0a 09 09 64 70 72 69  SL 1.1 */...dpri
49f0: 6e 74 66 28 22 28 55 6e 65 78 70 65 63 74 65 64  ntf("(Unexpected
4a00: 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a  ) EOF reached").
4a10: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
4a20: 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64  = 0;...bytesRead
4a30: 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f   = 0;...Tls_Erro
4a40: 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46  r(statePtr, "EOF
4a50: 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20   reached");...  
4a60: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63    } else if (bac
4a70: 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26  kingError == 0 &
4a80: 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20 2d  & bytesRead == -
4a90: 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  1) {...dprintf("
4aa0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72  I/O error occurr
4ab0: 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29  ed (errno = %lu)
4ac0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
4ad0: 67 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28  g) Tcl_GetErrno(
4ae0: 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65  ));...*errorCode
4af0: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72  Ptr = Tcl_GetErr
4b00: 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73 52 65 61  no();...bytesRea
4b10: 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72  d = -1;...Tls_Er
4b20: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 54 63  ror(statePtr, Tc
4b30: 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a 65 72 72 6f  l_ErrnoMsg(*erro
4b40: 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20 20  rCodePtr));...  
4b50: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72    } else {...dpr
4b60: 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20  intf("I/O error 
4b70: 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b 69 6e  occurred (backin
4b80: 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20  gError = %lu)", 
4b90: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09  backingError);..
4ba0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
4bb0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b   Tcl_GetErrno();
4bc0: 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 2d  ...bytesRead = -
4bd0: 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73  1;...Tls_Error(s
4be0: 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 61  tatePtr, ERR_rea
4bf0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  son_error_string
4c00: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b  (backingError));
4c10: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65  ..    }..    bre
4c20: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
4c30: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e  RROR_ZERO_RETURN
4c40: 3a 0a 09 20 20 20 20 2f 2a 20 50 65 65 72 20 68  :..    /* Peer h
4c50: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f  as closed the co
4c60: 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64  nnection by send
4c70: 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f  ing the close_no
4c80: 74 69 66 79 20 61 6c 65 72 74 2e 20 43 61 6e 27  tify alert. Can'
4c90: 74 20 72 65 61 64 2c 20 62 75 74 20 63 61 6e 20  t read, but can 
4ca0: 77 72 69 74 65 2e 20 2a 2f 0a 09 20 20 20 20 2f  write. */..    /
4cb0: 2a 20 4e 65 65 64 20 74 6f 20 72 65 74 75 72 6e  * Need to return
4cc0: 20 61 6e 20 45 4f 46 2c 20 73 6f 20 63 68 61 6e   an EOF, so chan
4cd0: 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 20 77 68  nel is closed wh
4ce0: 69 63 68 20 77 69 6c 6c 20 73 65 6e 64 20 61 6e  ich will send an
4cf0: 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 29 2e   SSL_shutdown().
4d00: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
4d10: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
4d20: 5a 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74 68 69  ZERO_RETURN, thi
4d30: 73 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46 20 68  s means an EOF h
4d40: 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64 22  as been reached"
4d50: 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61  );..    bytesRea
4d60: 64 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72 72  d = 0;..    *err
4d70: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09  orCodePtr = 0;..
4d80: 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74      Tls_Error(st
4d90: 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 61  atePtr, "Peer ha
4da0: 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e  s closed the con
4db0: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74  nection for writ
4dc0: 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74  ing by sending t
4dd0: 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20  he close_notify 
4de0: 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62 72  alert");..    br
4df0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f  eak;...case SSL_
4e00: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43  ERROR_WANT_ASYNC
4e10: 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77  :..    /* Used w
4e20: 69 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44  ith flag SSL_MOD
4e30: 45 5f 41 53 59 4e 43 2c 20 6f 70 20 64 69 64 6e  E_ASYNC, op didn
4e40: 27 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  't complete beca
4e50: 75 73 65 20 61 6e 20 61 73 79 6e 63 20 65 6e 67  use an async eng
4e60: 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f  ine is still pro
4e70: 63 65 73 73 69 6e 67 20 64 61 74 61 20 2a 2f 0a  cessing data */.
4e80: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
4e90: 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  t SSL_ERROR_WANT
4ea0: 5f 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20  _ASYNC, mapping 
4eb0: 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29  this to EAGAIN")
4ec0: 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64  ;..    bytesRead
4ed0: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 2a 65 72 72   = -1;..    *err
4ee0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
4ef0: 49 4e 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72  IN;..    Tls_Err
4f00: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 53  or(statePtr, "SS
4f10: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59  L_ERROR_WANT_ASY
4f20: 4e 43 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  NC");..    break
4f30: 3b 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  ;...default:..  
4f40: 20 20 64 70 72 69 6e 74 66 28 22 55 6e 6b 6e 6f    dprintf("Unkno
4f50: 77 6e 20 65 72 72 6f 72 20 28 65 72 72 20 3d 20  wn error (err = 
4f60: 25 69 29 2c 20 6d 61 70 70 69 6e 67 20 74 6f 20  %i), mapping to 
4f70: 45 4f 46 22 2c 20 65 72 72 29 3b 0a 09 20 20 20  EOF", err);..   
4f80: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
4f90: 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65   0;..    bytesRe
4fa0: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73  ad = 0;..    Tls
4fb0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
4fc0: 20 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22   "Unknown error"
4fd0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  );..    break;. 
4fe0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
4ff0: 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d 3e 20  f("Input(%d) -> 
5000: 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 69 7a  %d [%d]", bufSiz
5010: 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20 2a 65  e, bytesRead, *e
5020: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20 20  rrorCodePtr);.  
5030: 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 52 65    return bytesRe
5040: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ad;.}../*. *----
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
50a0: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d  TlsOutputProc --
50b0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
50c0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
50d0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
50e0: 49 2f 4f 20 6c 61 79 65 72 20 74 6f 20 77 72 69  I/O layer to wri
50f0: 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 20  te data to the. 
5100: 2a 09 42 49 4f 20 77 68 65 6e 65 76 65 72 20 74  *.BIO whenever t
5110: 68 65 20 74 68 65 20 54 63 6c 5f 57 72 69 74 65  he the Tcl_Write
5120: 28 29 2c 20 54 63 6c 5f 57 72 69 74 65 43 68 61  (), Tcl_WriteCha
5130: 72 73 2c 20 61 6e 64 20 54 63 6c 5f 57 72 69 74  rs, and Tcl_Writ
5140: 65 4f 62 6a 20 0a 20 2a 09 66 75 6e 63 74 69 6f  eObj . *.functio
5150: 6e 73 20 61 72 65 20 75 73 65 64 2e 20 45 71 75  ns are used. Equ
5160: 69 76 61 6c 65 6e 74 20 74 6f 20 53 53 4c 5f 77  ivalent to SSL_w
5170: 72 69 74 65 5f 65 78 20 61 6e 64 20 53 53 4c 5f  rite_ex and SSL_
5180: 77 72 69 74 65 2e 0a 20 2a 0a 20 2a 20 52 65 73  write.. *. * Res
5190: 75 6c 74 73 3a 0a 20 2a 20 20 20 20 52 65 74 75  ults:. *    Retu
51a0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
51b0: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
51c0: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20  or -1 on error. 
51d0: 53 65 74 73 20 65 72 72 6f 72 43 6f 64 65 50 74  Sets errorCodePt
51e0: 72 0a 20 2a 20 20 20 20 74 6f 20 61 20 50 4f 53  r. *    to a POS
51f0: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IX error code if
5200: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
5210: 65 64 2c 20 6f 72 20 30 20 69 66 20 6e 6f 6e 65  ed, or 0 if none
5220: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
5230: 65 63 74 73 3a 0a 20 2a 20 20 20 20 57 72 69 74  ects:. *    Writ
5240: 65 73 20 6f 75 74 70 75 74 20 6f 6e 20 74 68 65  es output on the
5250: 20 6f 75 74 70 75 74 20 64 65 76 69 63 65 20 6f   output device o
5260: 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20  f the channel.. 
5270: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
52d0: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 28 43   TlsOutputProc(C
52e0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
52f0: 63 65 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68  ceData, const ch
5300: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57  ar *buf, int toW
5310: 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72  rite, int *error
5320: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 75  CodePtr) {.    u
5330: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63  nsigned long bac
5340: 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20 53  kingError;.    S
5350: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
5360: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61   (State *) insta
5370: 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74  nceData;.    int
5380: 20 77 72 69 74 74 65 6e 2c 20 65 72 72 3b 0a 20   written, err;. 
5390: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
53a0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
53b0: 74 66 28 22 57 72 69 74 65 28 25 70 2c 20 25 64  tf("Write(%p, %d
53c0: 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61  )", (void *) sta
53d0: 74 65 50 74 72 2c 20 74 6f 57 72 69 74 65 29 3b  tePtr, toWrite);
53e0: 0a 20 20 20 20 64 70 72 69 6e 74 42 75 66 66 65  .    dprintBuffe
53f0: 72 28 62 75 66 2c 20 74 6f 57 72 69 74 65 29 3b  r(buf, toWrite);
5400: 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 69 66  ..    /* Skip if
5410: 20 75 73 65 72 20 76 65 72 69 66 79 20 63 61 6c   user verify cal
5420: 6c 62 61 63 6b 20 69 73 20 73 74 69 6c 6c 20 72  lback is still r
5430: 75 6e 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66  unning */.    if
5440: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
5450: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  s & TLS_TCL_CALL
5460: 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66  BACK) {..dprintf
5470: 28 22 44 6f 6e 27 74 20 70 72 6f 63 65 73 73 20  ("Don't process 
5480: 6f 75 74 70 75 74 20 77 68 69 6c 65 20 63 61 6c  output while cal
5490: 6c 62 61 63 6b 73 20 61 72 65 20 72 75 6e 6e 69  lbacks are runni
54a0: 6e 67 22 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d  ng");..written =
54b0: 20 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65   -1;..*errorCode
54c0: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 72  Ptr = EAGAIN;..r
54d0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
54e0: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  .    /* If not i
54f0: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 64 6f 20 63  nitialized, do c
5500: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 2f 2a  onnect */.    /*
5510: 20 43 61 6e 20 61 6c 73 6f 20 63 68 65 63 6b 20   Can also check 
5520: 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69  SSL_is_init_fini
5530: 73 68 65 64 28 73 73 6c 29 20 2a 2f 0a 20 20 20  shed(ssl) */.   
5540: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
5550: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49  lags & TLS_TCL_I
5560: 4e 49 54 29 20 7b 0a 09 69 6e 74 20 74 6c 73 43  NIT) {..int tlsC
5570: 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70 72 69 6e 74  onnect;...dprint
5580: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57  f("Calling Tls_W
5590: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b  aitForConnect");
55a0: 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20  ...tlsConnect = 
55b0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
55c0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 72  ct(statePtr, err
55d0: 6f 72 43 6f 64 65 50 74 72 2c 20 31 29 3b 0a 09  orCodePtr, 1);..
55e0: 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c  if (tlsConnect <
55f0: 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e   0) {..    dprin
5600: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72  tf("Got an error
5610: 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e   waiting to conn
5620: 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20  ect (tlsConnect 
5630: 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65  = %i, *errorCode
5640: 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73 43  Ptr = %i)", tlsC
5650: 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43 6f  onnect, *errorCo
5660: 64 65 50 74 72 29 3b 0a 09 20 20 20 20 54 6c 73  dePtr);..    Tls
5670: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
5680: 20 73 74 72 65 72 72 6f 72 28 2a 65 72 72 6f 72   strerror(*error
5690: 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20 20 20  CodePtr));...   
56a0: 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09   written = -1;..
56b0: 20 20 20 20 69 66 20 28 2a 65 72 72 6f 72 43 6f      if (*errorCo
56c0: 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45  dePtr == ECONNRE
56d0: 53 45 54 29 20 7b 0a 09 09 64 70 72 69 6e 74 66  SET) {...dprintf
56e0: 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  ("Got connection
56f0: 20 72 65 73 65 74 22 29 3b 0a 09 09 2f 2a 20 53   reset");.../* S
5700: 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 09 2a 65 72  oft EOF */...*er
5710: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
5720: 09 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09  ..written = 0;..
5730: 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72      }..    retur
5740: 6e 20 77 72 69 74 74 65 6e 3b 0a 09 7d 0a 20 20  n written;..}.  
5750: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f 57    }..    if (toW
5760: 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70  rite == 0) {..dp
5770: 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69 74  rintf("zero-writ
5780: 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f 5f  e");..err = BIO_
5790: 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e  flush(statePtr->
57a0: 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72 20  bio);...if (err 
57b0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72  <= 0) {..    dpr
57c0: 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 66  intf("Flushing f
57d0: 61 69 6c 65 64 22 29 3b 0a 09 20 20 20 20 54 6c  ailed");..    Tl
57e0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
57f0: 2c 20 22 46 6c 75 73 68 20 66 61 69 6c 65 64 22  , "Flush failed"
5800: 29 3b 0a 0a 09 20 20 20 20 2a 65 72 72 6f 72 43  );...    *errorC
5810: 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 09 20  odePtr = EIO;.. 
5820: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a     written = 0;.
5830: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
5840: 09 7d 0a 0a 09 77 72 69 74 74 65 6e 20 3d 20 30  .}...written = 0
5850: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ;..*errorCodePtr
5860: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 30 3b   = 0;..return 0;
5870: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
5880: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f      * We need to
5890: 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65   clear the SSL e
58a0: 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62  rror stack now b
58b0: 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69  ecause we someti
58c0: 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 20 2a  mes reach.     *
58d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
58e0: 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72 72  ith leftover err
58f0: 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b  ors in the stack
5900: 2e 20 20 49 66 20 42 49 4f 5f 77 72 69 74 65 0a  .  If BIO_write.
5910: 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d       * returns -
5920: 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41  1 and intends EA
5930: 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61  GAIN, there is a
5940: 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c   leftover error,
5950: 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20   it will be.    
5960: 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20   * misconstrued 
5970: 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74  as an error, not
5980: 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a   EAGAIN..     *.
5990: 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69       * Alternati
59a0: 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e  vely, we may wan
59b0: 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  t to handle the 
59c0: 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  <0 return codes 
59d0: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f  from.     * BIO_
59e0: 77 72 69 74 65 20 73 70 65 63 69 61 6c 6c 79 20  write specially 
59f0: 28 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 74  (as advised in t
5a00: 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54  he RSA docs).  T
5a10: 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c  LS's lower level
5a20: 0a 20 20 20 20 20 2a 20 42 49 4f 20 66 75 6e 63  .     * BIO func
5a30: 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20  tions play with 
5a40: 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 20  the retry flags 
5a50: 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73  though, and this
5a60: 20 73 65 65 6d 73 20 74 6f 0a 20 20 20 20 20 2a   seems to.     *
5a70: 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
5a80: 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e    Similar fix in
5a90: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2e 20 2d   TlsInputProc. -
5aa0: 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20   hobbs.     */. 
5ab0: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
5ac0: 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f 5f 63 6c  or();.    BIO_cl
5ad0: 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 73 28  ear_retry_flags(
5ae0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
5af0: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 42 49      written = BI
5b00: 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72  O_write(statePtr
5b10: 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72  ->bio, buf, toWr
5b20: 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ite);.    dprint
5b30: 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 70 2c  f("BIO_write(%p,
5b40: 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28   %d) -> [%d]", (
5b50: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72  void *) statePtr
5b60: 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74  , toWrite, writt
5b70: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 61 6d  en);..    /* Sam
5b80: 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62  e as SSL_want, b
5b90: 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74  ut also checks t
5ba0: 68 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a  he error queue *
5bb0: 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f  /.    err = SSL_
5bc0: 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50  get_error(stateP
5bd0: 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 6e  tr->ssl, written
5be0: 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67 45 72  );.    backingEr
5bf0: 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  ror = ERR_get_er
5c00: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 66 20 28  ror();..    if (
5c10: 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 20 7b 0a  written <= 0) {.
5c20: 09 2f 2a 20 54 68 65 20 72 65 74 72 79 20 66 6c  ./* The retry fl
5c30: 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68 65  ag is set by the
5c40: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 2a   BIO_set_retry_*
5c50: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 09 69   functions */..i
5c60: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65  f (BIO_should_re
5c70: 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69  try(statePtr->bi
5c80: 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  o)) {..    dprin
5c90: 74 66 28 22 57 72 69 74 65 20 66 61 69 6c 65 64  tf("Write failed
5ca0: 20 77 69 74 68 20 63 6f 64 65 20 25 64 2c 20 62   with code %d, b
5cb0: 79 74 65 73 20 77 72 69 74 74 65 6e 3d 25 64 3a  ytes written=%d:
5cc0: 20 73 68 6f 75 6c 64 20 72 65 74 72 79 22 2c 20   should retry", 
5cd0: 65 72 72 2c 20 77 72 69 74 74 65 6e 29 3b 0a 09  err, written);..
5ce0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70  } else {..    dp
5cf0: 72 69 6e 74 66 28 22 57 72 69 74 65 20 66 61 69  rintf("Write fai
5d00: 6c 65 64 20 77 69 74 68 20 63 6f 64 65 20 25 64  led with code %d
5d10: 2c 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 3d  , bytes written=
5d20: 25 64 3a 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  %d: error condit
5d30: 69 6f 6e 22 2c 20 65 72 72 2c 20 77 72 69 74 74  ion", err, writt
5d40: 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 68 65  en);..}.../* The
5d50: 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  se are the same 
5d60: 61 73 20 42 49 4f 5f 72 65 74 72 79 5f 74 79 70  as BIO_retry_typ
5d70: 65 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73 68  e */..if (BIO_sh
5d80: 6f 75 6c 64 5f 72 65 61 64 28 73 74 61 74 65 50  ould_read(stateP
5d90: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20  tr->bio)) {..   
5da0: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61   dprintf("BIO ha
5db0: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 64  s insufficient d
5dc0: 61 74 61 20 74 6f 20 72 65 61 64 20 61 6e 64 20  ata to read and 
5dd0: 72 65 74 75 72 6e 22 29 3b 0a 09 7d 0a 09 69 66  return");..}..if
5de0: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 77 72 69   (BIO_should_wri
5df0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  te(statePtr->bio
5e00: 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  )) {..    dprint
5e10: 66 28 22 42 49 4f 20 68 61 73 20 70 65 6e 64 69  f("BIO has pendi
5e20: 6e 67 20 64 61 74 61 20 74 6f 20 77 72 69 74 65  ng data to write
5e30: 22 29 3b 0a 09 7d 0a 09 69 66 20 28 42 49 4f 5f  ");..}..if (BIO_
5e40: 73 68 6f 75 6c 64 5f 69 6f 5f 73 70 65 63 69 61  should_io_specia
5e50: 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  l(statePtr->bio)
5e60: 29 20 7b 0a 09 20 20 20 20 69 6e 74 20 72 65 61  ) {..    int rea
5e70: 73 6f 6e 20 3d 20 42 49 4f 5f 67 65 74 5f 72 65  son = BIO_get_re
5e80: 74 72 79 5f 72 65 61 73 6f 6e 28 73 74 61 74 65  try_reason(state
5e90: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20  Ptr->bio);..    
5ea0: 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73  dprintf("BIO has
5eb0: 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 63 6f   some special co
5ec0: 6e 64 69 74 69 6f 6e 20 6f 74 68 65 72 20 74 68  ndition other th
5ed0: 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
5ee0: 3a 20 63 6f 64 65 3d 25 64 22 2c 20 72 65 61 73  : code=%d", reas
5ef0: 6f 6e 29 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66  on);..}..dprintf
5f00: 28 22 42 49 4f 20 68 61 73 20 70 65 6e 64 69 6e  ("BIO has pendin
5f10: 67 20 64 61 74 61 20 74 6f 20 77 72 69 74 65 22  g data to write"
5f20: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  );..    } else {
5f30: 0a 09 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74  ..BIO_flush(stat
5f40: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 20 20 20 20  ePtr->bio);.    
5f50: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 65  }..    switch (e
5f60: 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f  rr) {..case SSL_
5f70: 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20  ERROR_NONE:..   
5f80: 20 2f 2a 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f   /* I/O operatio
5f90: 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 09  n completed */..
5fa0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c      dprintf("SSL
5fb0: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09  _ERROR_NONE");..
5fc0: 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e 20      if (written 
5fd0: 3c 20 30 29 20 7b 0a 09 09 77 72 69 74 74 65 6e  < 0) {...written
5fe0: 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20   = 0;..    }..  
5ff0: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
6000: 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09  SSL_ERROR_SSL:..
6010: 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63      /* A non-rec
6020: 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20  overable, fatal 
6030: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c  error in the SSL
6040: 20 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65   library occurre
6050: 64 2c 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f  d, usually a pro
6060: 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09  tocol error */..
6070: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c      dprintf("SSL
6080: 20 65 72 72 6f 72 2c 20 69 6e 64 69 63 61 74 69   error, indicati
6090: 6e 67 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e  ng that the conn
60a0: 65 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  ection has been 
60b0: 61 62 6f 72 74 65 64 22 29 3b 0a 09 20 20 20 20  aborted");..    
60c0: 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72  if (backingError
60d0: 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45   != 0) {...Tls_E
60e0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45  rror(statePtr, E
60f0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
6100: 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72  string(backingEr
6110: 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c  ror));..    } el
6120: 73 65 20 69 66 20 28 53 53 4c 5f 67 65 74 5f 76  se if (SSL_get_v
6130: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
6140: 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58  tePtr->ssl) != X
6150: 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c  509_V_OK) {...Tl
6160: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
6170: 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  , X509_verify_ce
6180: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
6190: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
61a0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
61b0: 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20 65  ssl)));..    } e
61c0: 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f  lse {...Tls_Erro
61d0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b  r(statePtr, "Unk
61e0: 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22 29  nown SSL error")
61f0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a 65  ;..    }..    *e
6200: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
6210: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20  ONNABORTED;..   
6220: 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09   written = -1;..
6230: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
6240: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  e SSL_ERROR_WANT
6250: 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f 2a 20 4f  _READ:..    /* O
6260: 70 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  p did not comple
6270: 74 65 20 64 75 65 20 74 6f 20 6e 6f 74 20 65 6e  te due to not en
6280: 6f 75 67 68 20 64 61 74 61 20 77 61 73 20 61 76  ough data was av
6290: 61 69 6c 61 62 6c 65 2e 20 52 65 74 72 79 20 6c  ailable. Retry l
62a0: 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70  ater. */..    dp
62b0: 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45  rintf("Got SSL_E
62c0: 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 2c 20  RROR_WANT_READ, 
62d0: 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41  mapping it to EA
62e0: 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72  GAIN");..    *er
62f0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47  rorCodePtr = EAG
6300: 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65  AIN;..    writte
6310: 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61  n = -1;..    sta
6320: 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54  tePtr->want |= T
6330: 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20  CL_READABLE;..  
6340: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74    Tls_Error(stat
6350: 65 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52  ePtr, "SSL_ERROR
6360: 5f 57 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20  _WANT_READ");.. 
6370: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79     BIO_set_retry
6380: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e  _read(statePtr->
6390: 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  bio);..    break
63a0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
63b0: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09  OR_WANT_WRITE:..
63c0: 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 20 6e 6f      /* Op did no
63d0: 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20 74  t complete due t
63e0: 6f 20 75 6e 61 62 6c 65 20 74 6f 20 73 65 6e 74  o unable to sent
63f0: 20 61 6c 6c 20 64 61 74 61 20 74 6f 20 74 68 65   all data to the
6400: 20 42 49 4f 2e 20 52 65 74 72 79 20 6c 61 74 65   BIO. Retry late
6410: 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e  r. */..    dprin
6420: 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f  tf("Got SSL_ERRO
6430: 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d 61  R_WANT_WRITE, ma
6440: 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41  pping it to EAGA
6450: 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f  IN");..    *erro
6460: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
6470: 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  N;..    written 
6480: 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 65  = -1;..    state
6490: 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c  Ptr->want |= TCL
64a0: 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 20 20  _WRITABLE;..    
64b0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50  Tls_Error(stateP
64c0: 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57  tr, "SSL_ERROR_W
64d0: 41 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09 20 20  ANT_WRITE");..  
64e0: 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f    BIO_set_retry_
64f0: 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e  write(statePtr->
6500: 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  bio);..    break
6510: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52  ;...case SSL_ERR
6520: 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f  OR_WANT_X509_LOO
6530: 4b 55 50 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 20  KUP:..    /* Op 
6540: 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20  didn't complete 
6550: 73 69 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 73  since callback s
6560: 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 65  et by SSL_CTX_se
6570: 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62  t_client_cert_cb
6580: 28 29 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63  () asked to be c
6590: 61 6c 6c 65 64 20 61 67 61 69 6e 20 2a 2f 0a 09  alled again */..
65a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
65b0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
65c0: 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d 61 70  X509_LOOKUP, map
65d0: 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49  ping it to EAGAI
65e0: 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  N");..    *error
65f0: 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e  CodePtr = EAGAIN
6600: 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d  ;..    written =
6610: 20 2d 31 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72   -1;..    Tls_Er
6620: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53  ror(statePtr, "S
6630: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
6640: 30 39 5f 4c 4f 4f 4b 55 50 22 29 3b 0a 09 20 20  09_LOOKUP");..  
6650: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
6660: 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c  SSL_ERROR_SYSCAL
6670: 4c 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20  L:..    /* Some 
6680: 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c  non-recoverable,
6690: 20 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72   fatal I/O error
66a0: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20 20   occurred */..  
66b0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45    dprintf("SSL_E
66c0: 52 52 4f 52 5f 53 59 53 43 41 4c 4c 22 29 3b 0a  RROR_SYSCALL");.
66d0: 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e  ..    if (backin
66e0: 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 77  gError == 0 && w
66f0: 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  ritten == 0) {..
6700: 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20 72 65  .dprintf("EOF re
6710: 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72 6f 72  ached")...*error
6720: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 77  CodePtr = 0;...w
6730: 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09 54 6c  ritten = 0;...Tl
6740: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  s_Error(statePtr
6750: 2c 20 22 45 4f 46 20 72 65 61 63 68 65 64 22 29  , "EOF reached")
6760: 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
6770: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20  f (backingError 
6780: 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e 20  == 0 && written 
6790: 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e  == -1) {...dprin
67a0: 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63  tf("I/O error oc
67b0: 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20  curred (errno = 
67c0: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
67d0: 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72   long) Tcl_GetEr
67e0: 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72  rno());...*error
67f0: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65  CodePtr = Tcl_Ge
6800: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69 74  tErrno();...writ
6810: 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f  ten = -1;...Tls_
6820: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
6830: 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a 65 72  Tcl_ErrnoMsg(*er
6840: 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09  rorCodePtr));...
6850: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64      } else {...d
6860: 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f  printf("I/O erro
6870: 72 20 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b  r occurred (back
6880: 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22  ingError = %lu)"
6890: 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b  , backingError);
68a0: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
68b0: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28   = Tcl_GetErrno(
68c0: 29 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d  );...written = -
68d0: 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73  1;...Tls_Error(s
68e0: 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 61  tatePtr, ERR_rea
68f0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  son_error_string
6900: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b  (backingError));
6910: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65  ..    }..    bre
6920: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45  ak;...case SSL_E
6930: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e  RROR_ZERO_RETURN
6940: 3a 0a 09 20 20 20 20 2f 2a 20 50 65 65 72 20 68  :..    /* Peer h
6950: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f  as closed the co
6960: 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64  nnection by send
6970: 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f  ing the close_no
6980: 74 69 66 79 20 61 6c 65 72 74 2e 20 43 61 6e 27  tify alert. Can'
6990: 74 20 72 65 61 64 2c 20 62 75 74 20 63 61 6e 20  t read, but can 
69a0: 77 72 69 74 65 2e 20 2a 2f 0a 09 20 20 20 20 2f  write. */..    /
69b0: 2a 20 4e 65 65 64 20 74 6f 20 72 65 74 75 72 6e  * Need to return
69c0: 20 61 6e 20 45 4f 46 2c 20 73 6f 20 63 68 61 6e   an EOF, so chan
69d0: 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 20 77 68  nel is closed wh
69e0: 69 63 68 20 77 69 6c 6c 20 73 65 6e 64 20 61 6e  ich will send an
69f0: 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 29 2e   SSL_shutdown().
6a00: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
6a10: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f  ("Got SSL_ERROR_
6a20: 5a 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74 68 69  ZERO_RETURN, thi
6a30: 73 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46 20 68  s means an EOF h
6a40: 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64 22  as been reached"
6a50: 29 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20  );..    written 
6a60: 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  = 0;..    *error
6a70: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20  CodePtr = 0;..  
6a80: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74    Tls_Error(stat
6a90: 65 50 74 72 2c 20 22 50 65 65 72 20 68 61 73 20  ePtr, "Peer has 
6aa0: 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65  closed the conne
6ab0: 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e  ction for writin
6ac0: 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65  g by sending the
6ad0: 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c   close_notify al
6ae0: 65 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65 61  ert");..    brea
6af0: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52  k;...case SSL_ER
6b00: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a  ROR_WANT_ASYNC:.
6b10: 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69 74  .    /* Used wit
6b20: 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f  h flag SSL_MODE_
6b30: 41 53 59 4e 43 2c 20 6f 70 20 64 69 64 6e 27 74  ASYNC, op didn't
6b40: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
6b50: 65 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69 6e  e an async engin
6b60: 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63 65  e is still proce
6b70: 73 73 69 6e 67 20 64 61 74 61 20 2a 2f 0a 09 20  ssing data */.. 
6b80: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
6b90: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41  SSL_ERROR_WANT_A
6ba0: 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20 74 68  SYNC, mapping th
6bb0: 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a  is to EAGAIN");.
6bc0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
6bd0: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20  tr = EAGAIN;..  
6be0: 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a    written = -1;.
6bf0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73  .    Tls_Error(s
6c00: 74 61 74 65 50 74 72 2c 20 22 53 53 4c 5f 45 52  tatePtr, "SSL_ER
6c10: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 22 29  ROR_WANT_ASYNC")
6c20: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
6c30: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70  default:..    dp
6c40: 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 65  rintf("unknown e
6c50: 72 72 6f 72 3a 20 25 64 22 2c 20 65 72 72 29 3b  rror: %d", err);
6c60: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28  ..    Tls_Error(
6c70: 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f  statePtr, "Unkno
6c80: 77 6e 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20  wn error");..   
6c90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
6ca0: 20 20 20 64 70 72 69 6e 74 66 28 22 4f 75 74 70     dprintf("Outp
6cb0: 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74  ut(%d) -> %d", t
6cc0: 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29  oWrite, written)
6cd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 72 69  ;.    return wri
6ce0: 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  tten;.}../*. *--
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6d40: 2a 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 20  * Tls_GetParent 
6d50: 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 47 65 74 20  --. *. *    Get 
6d60: 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 66  parent channel f
6d70: 6f 72 20 61 20 73 74 61 63 6b 65 64 20 63 68 61  or a stacked cha
6d80: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nnel.. *. * Resu
6d90: 6c 74 73 3a 0a 20 2a 20 20 20 20 54 63 6c 5f 43  lts:. *    Tcl_C
6da0: 68 61 6e 6e 65 6c 20 6f 72 20 4e 55 4c 4c 20 69  hannel or NULL i
6db0: 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  f none.. *. *---
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54  ----------. */.T
6e10: 63 6c 5f 43 68 61 6e 6e 65 6c 20 54 6c 73 5f 47  cl_Channel Tls_G
6e20: 65 74 50 61 72 65 6e 74 28 53 74 61 74 65 20 2a  etParent(State *
6e30: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 6d 61  statePtr, int ma
6e40: 73 6b 46 6c 61 67 73 29 20 7b 0a 20 20 20 20 64  skFlags) {.    d
6e50: 70 72 69 6e 74 66 28 22 52 65 71 75 65 73 74 65  printf("Requeste
6e60: 64 20 74 6f 20 67 65 74 20 70 61 72 65 6e 74 20  d to get parent 
6e70: 6f 66 20 63 68 61 6e 6e 65 6c 20 25 70 22 2c 20  of channel %p", 
6e80: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
6e90: 0a 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65  ..    if ((state
6ea0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 7e 6d 61  Ptr->flags & ~ma
6eb0: 73 6b 46 6c 61 67 73 29 20 26 20 54 4c 53 5f 54  skFlags) & TLS_T
6ec0: 43 4c 5f 46 41 53 54 50 41 54 48 29 20 7b 0a 09  CL_FASTPATH) {..
6ed0: 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74  dprintf("Asked t
6ee0: 6f 20 67 65 74 20 74 68 65 20 70 61 72 65 6e 74  o get the parent
6ef0: 20 63 68 61 6e 6e 65 6c 20 77 68 69 6c 65 20 77   channel while w
6f00: 65 20 61 72 65 20 75 73 69 6e 67 20 46 61 73 74  e are using Fast
6f10: 50 61 74 68 20 2d 2d 20 72 65 74 75 72 6e 69 6e  Path -- returnin
6f20: 67 20 4e 55 4c 4c 22 29 3b 0a 09 72 65 74 75 72  g NULL");..retur
6f30: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  n NULL;.    }.  
6f40: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74    return Tcl_Get
6f50: 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73  StackedChannel(s
6f60: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a  tatePtr->self);.
6f70: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53  -----. *. * TlsS
6fd0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a  etOptionProc --.
6fe0: 20 2a 0a 20 2a 09 53 65 74 73 20 61 6e 20 6f 70   *. *.Sets an op
6ff0: 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65 20 66 6f  tion to value fo
7000: 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  r a SSL socket b
7010: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 20 43 61  ased channel. Ca
7020: 6c 6c 65 64 20 62 79 20 74 68 65 0a 20 2a 09 67  lled by the. *.g
7030: 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72  eneric I/O layer
7040: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 54 63   whenever the Tc
7050: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
7060: 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  on() function is
7070: 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73   used.. *. * Res
7080: 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54 43 4c 5f  ults:. *    TCL_
7090: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
70a0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66   or TCL_ERROR if
70b0: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53   failed.. *. * S
70c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20  ide effects:. * 
70d0: 20 20 20 55 70 64 61 74 65 73 20 63 68 61 6e 6e     Updates chann
70e0: 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65 77  el option to new
70f0: 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d   value.. *. *---
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
7150: 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 53 65 74  tatic int.TlsSet
7160: 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e  OptionProc(Clien
7170: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
7180: 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74  ta,    /* Socket
7190: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54   state. */.    T
71a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
71b0: 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72  p,../* For error
71c0: 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  s - can be NULL.
71d0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
71e0: 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09  ar *optionName,.
71f0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
7200: 70 74 69 6f 6e 20 74 6f 20 73 65 74 20 74 68 65  ption to set the
7210: 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 0a 09   value for, or..
7220: 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 67 65  ... * NULL to ge
7230: 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e  t all options an
7240: 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20  d their values. 
7250: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
7260: 72 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 09  r *optionValue).
7270: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 6f 70 74  /* Value for opt
7280: 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74  ion. */.{.    St
7290: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
72a0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
72b0: 63 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ceData;.    Tcl_
72c0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d  Channel parent =
72d0: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73   Tls_GetParent(s
72e0: 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c  tatePtr, TLS_TCL
72f0: 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20  _FASTPATH);.    
7300: 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74  Tcl_DriverSetOpt
7310: 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69  ionProc *setOpti
7320: 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70 72  onProc;..    dpr
7330: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
7340: 0a 20 20 20 20 2f 2a 20 50 61 73 73 20 74 6f 20  .    /* Pass to 
7350: 70 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 73 65  parent */.    se
7360: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63  tOptionProc = Tc
7370: 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69  l_ChannelSetOpti
7380: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  onProc(Tcl_GetCh
7390: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
73a0: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f  ));.    if (setO
73b0: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c  ptionProc != NUL
73c0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73  L) {..return (*s
73d0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63  etOptionProc)(Tc
73e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
73f0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
7400: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  , interp, option
7410: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75  Name, optionValu
7420: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  e);.    }.    /*
7430: 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 20  .     * Request 
7440: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 6f  for a specific o
7450: 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 69  ption has to fai
7460: 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65  l, we don't have
7470: 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20   any..     */.  
7480: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64    return Tcl_Bad
7490: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
74a0: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65  terp, optionName
74b0: 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  , "");.}../*. *-
74c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7500: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 4f  --. *. * TlsGetO
7510: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a  ptionProc --. *.
7520: 20 2a 09 47 65 74 20 61 20 6f 70 74 69 6f 6e 27   *.Get a option'
7530: 73 20 76 61 6c 75 65 20 66 6f 72 20 61 20 53 53  s value for a SS
7540: 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
7550: 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 20 6c 69 73  hannel, or a lis
7560: 74 20 6f 66 20 61 6c 6c 0a 20 2a 09 6f 70 74 69  t of all. *.opti
7570: 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61  ons and their va
7580: 6c 75 65 73 2e 20 43 61 6c 6c 65 64 20 62 79 20  lues. Called by 
7590: 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20  the generic I/O 
75a0: 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72 20 74  layer whenever t
75b0: 68 65 0a 20 2a 09 54 63 6c 5f 47 65 74 43 68 61  he. *.Tcl_GetCha
75c0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 29 20 66 75 6e  nnelOption() fun
75d0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 20  ction is used.. 
75e0: 2a 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  *. *. * Results:
75f0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
7600: 63 6c 20 72 65 73 75 6c 74 2e 20 54 68 65 20 76  cl result. The v
7610: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 70 65 63  alue of the spec
7620: 69 66 69 65 64 20 6f 70 74 69 6f 6e 20 6f 72 20  ified option or 
7630: 61 20 6c 69 73 74 20 6f 66 0a 20 2a 09 61 6c 6c  a list of. *.all
7640: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65   options and the
7650: 69 72 20 76 61 6c 75 65 73 20 69 73 20 72 65 74  ir values is ret
7660: 75 72 6e 65 64 20 69 6e 20 74 68 65 20 73 75 70  urned in the sup
7670: 70 6c 69 65 64 20 44 53 74 72 69 6e 67 2e 0a 20  plied DString.. 
7680: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
7690: 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20  s:. *    None.. 
76a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
76f0: 69 63 20 69 6e 74 0a 54 6c 73 47 65 74 4f 70 74  ic int.TlsGetOpt
7700: 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  ionProc(ClientDa
7710: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
7720: 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74      /* Socket st
7730: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ate. */.    Tcl_
7740: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09  Interp *interp,.
7750: 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d  ./* For errors -
7760: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   can be NULL. */
7770: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7780: 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20  *optionName,./* 
7790: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69  Name of the opti
77a0: 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  on to retrieve t
77b0: 68 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72  he value for, or
77c0: 0a 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20  ..... * NULL to 
77d0: 67 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20  get all options 
77e0: 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73  and their values
77f0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74  . */.    Tcl_DSt
7800: 72 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75  ring *optionValu
7810: 65 29 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73  e)./* Where to s
7820: 74 6f 72 65 20 74 68 65 20 63 6f 6d 70 75 74 65  tore the compute
7830: 64 20 76 61 6c 75 65 20 69 6e 69 74 69 61 6c 69  d value initiali
7840: 7a 65 64 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a  zed by caller. *
7850: 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  /.{.    State *s
7860: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
7870: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
7880: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
7890: 6c 20 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f 47  l parent = Tls_G
78a0: 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74  etParent(statePt
78b0: 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50  r, TLS_TCL_FASTP
78c0: 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44 72  ATH);.    Tcl_Dr
78d0: 69 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f  iverGetOptionPro
78e0: 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63  c *getOptionProc
78f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
7900: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
7910: 2a 20 50 61 73 73 20 74 6f 20 70 61 72 65 6e 74  * Pass to parent
7920: 20 2a 2f 0a 20 20 20 20 67 65 74 4f 70 74 69 6f   */.    getOptio
7930: 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e  nProc = Tcl_Chan
7940: 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  nelGetOptionProc
7950: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
7960: 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20  ype(parent));.  
7970: 20 20 69 66 20 28 67 65 74 4f 70 74 69 6f 6e 50    if (getOptionP
7980: 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  roc != NULL) {..
7990: 72 65 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 69  return (*getOpti
79a0: 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43  onProc)(Tcl_GetC
79b0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
79c0: 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65  ta(parent), inte
79d0: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20  rp, optionName, 
79e0: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20  optionValue);.  
79f0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74    } else if (opt
7a00: 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72  ionName == (char
7a10: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  *) NULL) {../*..
7a20: 20 2a 20 52 65 71 75 65 73 74 20 69 73 20 71 75   * Request is qu
7a30: 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69  ery for all opti
7a40: 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e  ons, this is ok.
7a50: 0a 09 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43  .. */..return TC
7a60: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
7a70: 2f 2a 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73  /*.     * Reques
7a80: 74 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  t for a specific
7a90: 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66   option has to f
7aa0: 61 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61  ail, we don't ha
7ab0: 76 65 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a  ve any..     */.
7ac0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 42      return Tcl_B
7ad0: 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  adChannelOption(
7ae0: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61  interp, optionNa
7af0: 6d 65 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20  me, "");.}../*. 
7b00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
7b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7b50: 2a 0a 20 2a 20 20 20 20 54 6c 73 43 68 61 6e 6e  *. *    TlsChann
7b60: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 2d  elHandlerTimer -
7b70: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62  -. *. *.Called b
7b80: 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 76  y the notifier v
7b90: 69 61 20 61 20 74 69 6d 65 72 2c 20 74 6f 20 66  ia a timer, to f
7ba0: 6c 75 73 68 20 6f 75 74 20 64 61 74 61 20 77 61  lush out data wa
7bb0: 69 74 69 6e 67 20 69 6e 0a 20 2a 09 63 68 61 6e  iting in. *.chan
7bc0: 6e 65 6c 20 62 75 66 66 65 72 73 2e 20 63 61 6c  nel buffers. cal
7bd0: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
7be0: 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65  ic I/O layer whe
7bf0: 6e 65 76 65 72 20 74 68 65 0a 20 2a 09 54 63 6c  never the. *.Tcl
7c00: 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c  _GetChannelHandl
7c10: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  e() function is 
7c20: 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  used.. *. * Resu
7c30: 6c 74 73 3a 0a 20 2a 20 20 20 20 20 20 20 20 4e  lts:. *        N
7c40: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
7c50: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61  effects:. *.Crea
7c60: 74 65 73 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e  tes notification
7c70: 20 65 76 65 6e 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d   event.. *. *---
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
7cd0: 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 68  tatic void TlsCh
7ce0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65  annelHandlerTime
7cf0: 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  r(ClientData cli
7d00: 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 53  entData) {.    S
7d10: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
7d20: 20 28 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e   (State *) clien
7d30: 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d  tData;.    int m
7d40: 61 73 6b 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  ask = statePtr->
7d50: 77 61 6e 74 3b 20 2f 2a 20 49 6e 69 74 20 74 6f  want; /* Init to
7d60: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f   SSL_ERROR_WANT_
7d70: 52 45 41 44 20 61 6e 64 20 53 53 4c 5f 45 52 52  READ and SSL_ERR
7d80: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 20 2a 2f  OR_WANT_WRITE */
7d90: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
7da0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 74  alled");..    st
7db0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
7dc0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
7dd0: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 43   NULL;..    /* C
7de0: 68 65 63 6b 20 66 6f 72 20 61 6d 6f 75 6e 74 20  heck for amount 
7df0: 6f 66 20 64 61 74 61 20 70 65 6e 64 69 6e 67 20  of data pending 
7e00: 69 6e 20 42 49 4f 20 77 72 69 74 65 20 62 75 66  in BIO write buf
7e10: 66 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 42  fer */.    if (B
7e20: 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74  IO_wpending(stat
7e30: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64  ePtr->bio)) {..d
7e40: 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70  printf("[chan=%p
7e50: 5d 20 42 49 4f 20 77 72 69 74 61 62 6c 65 22 2c  ] BIO writable",
7e60: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29   statePtr->self)
7e70: 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f  ;...mask |= TCL_
7e80: 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a  WRITABLE;.    }.
7e90: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
7ea0: 72 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61  r amount of data
7eb0: 20 70 65 6e 64 69 6e 67 20 69 6e 20 42 49 4f 20   pending in BIO 
7ec0: 72 65 61 64 20 62 75 66 66 65 72 20 2a 2f 0a 20  read buffer */. 
7ed0: 20 20 20 69 66 20 28 42 49 4f 5f 70 65 6e 64 69     if (BIO_pendi
7ee0: 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ng(statePtr->bio
7ef0: 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 5b  )) {..dprintf("[
7f00: 63 68 61 6e 3d 25 70 5d 20 42 49 4f 20 72 65 61  chan=%p] BIO rea
7f10: 64 61 62 6c 65 22 2c 20 73 74 61 74 65 50 74 72  dable", statePtr
7f20: 2d 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20  ->self);...mask 
7f30: 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b  |= TCL_READABLE;
7f40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
7f50: 6f 74 69 66 79 20 74 68 65 20 67 65 6e 65 72 69  otify the generi
7f60: 63 20 49 4f 20 6c 61 79 65 72 20 74 68 61 74 20  c IO layer that 
7f70: 74 68 65 20 6d 61 73 6b 20 65 76 65 6e 74 73 20  the mask events 
7f80: 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 6f 6e  have occurred on
7f90: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a   the channel */.
7fa0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 4e 6f 74      dprintf("Not
7fb0: 69 66 79 69 6e 67 20 6f 75 72 73 65 6c 76 65 73  ifying ourselves
7fc0: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69  ");.    Tcl_Noti
7fd0: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50  fyChannel(stateP
7fe0: 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b  tr->self, mask);
7ff0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77  .    statePtr->w
8000: 61 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70  ant = 0;..    dp
8010: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
8020: 22 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 3b  ");..    return;
8030: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8080: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
8090: 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a  WatchProc --. *.
80a0: 20 2a 09 53 65 74 20 75 70 20 74 68 65 20 65 76   *.Set up the ev
80b0: 65 6e 74 20 6e 6f 74 69 66 69 65 72 20 74 6f 20  ent notifier to 
80c0: 77 61 74 63 68 20 66 6f 72 20 65 76 65 6e 74 73  watch for events
80d0: 20 6f 66 20 69 6e 74 65 72 65 73 74 20 66 72 6f   of interest fro
80e0: 6d 20 74 68 69 73 0a 20 2a 09 63 68 61 6e 6e 65  m this. *.channe
80f0: 6c 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65  l. Called by the
8100: 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79   generic I/O lay
8110: 65 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  er whenever the 
8120: 75 73 65 72 20 28 6f 72 20 74 68 65 0a 20 2a 09  user (or the. *.
8130: 73 79 73 74 65 6d 29 20 61 6e 6e 6f 75 6e 63 65  system) announce
8140: 73 20 69 74 73 20 28 64 69 73 29 69 6e 74 65 72  s its (dis)inter
8150: 65 73 74 20 69 6e 20 65 76 65 6e 74 73 20 6f 6e  est in events on
8160: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 54 68   the channel. Th
8170: 69 73 20 69 73 0a 20 2a 09 63 61 6c 6c 65 64 20  is is. *.called 
8180: 72 65 70 65 61 74 65 64 6c 79 2e 0a 20 2a 0a 20  repeatedly.. *. 
8190: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20  * Results:. *   
81a0: 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64   None.. *. * Sid
81b0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
81c0: 74 73 20 75 70 20 74 68 65 20 74 69 6d 65 2d 62  ts up the time-b
81d0: 61 73 65 64 20 6e 6f 74 69 66 69 65 72 20 73 6f  ased notifier so
81e0: 20 74 68 61 74 20 66 75 74 75 72 65 20 65 76 65   that future eve
81f0: 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e  nts on the chann
8200: 65 6c 0a 20 2a 09 77 69 6c 6c 20 62 65 20 73 65  el. *.will be se
8210: 65 6e 20 62 79 20 54 43 4c 2e 0a 20 2a 0a 20 2a  en by TCL.. *. *
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 6c  /.static void.Tl
8280: 73 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e  sWatchProc(Clien
8290: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
82a0: 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 20 73 6f  ta,    /* The so
82b0: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20  cket state. */. 
82c0: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f     int mask).../
82d0: 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65  * Events of inte
82e0: 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 20 63  rest; an OR-ed c
82f0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 09 09  ombination of...
8300: 09 09 20 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c  .. * TCL_READABL
8310: 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20  E, TCL_WRITABLE 
8320: 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f  and TCL_EXCEPTIO
8330: 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f  N. */.{.    Tcl_
8340: 43 68 61 6e 6e 65 6c 20 20 20 20 20 70 61 72 65  Channel     pare
8350: 6e 74 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  nt;.    State *s
8360: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
8370: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
8380: 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72  ;.    Tcl_Driver
8390: 57 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68  WatchProc *watch
83a0: 50 72 6f 63 3b 0a 20 20 20 20 69 6e 74 20 70 65  Proc;.    int pe
83b0: 6e 64 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 20 20  nding = 0;..    
83c0: 64 70 72 69 6e 74 66 28 22 54 6c 73 57 61 74 63  dprintf("TlsWatc
83d0: 68 50 72 6f 63 28 30 78 25 78 29 22 2c 20 6d 61  hProc(0x%x)", ma
83e0: 73 6b 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 46  sk);.    dprintF
83f0: 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 3b 0a  lags(statePtr);.
8400: 0a 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20  .    /* Pretend 
8410: 74 6f 20 62 65 20 64 65 61 64 20 61 73 20 6c 6f  to be dead as lo
8420: 6e 67 20 61 73 20 74 68 65 20 76 65 72 69 66 79  ng as the verify
8430: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e   callback is run
8440: 6e 69 6e 67 2e 0a 20 20 20 20 20 2a 20 4f 74 68  ning..     * Oth
8450: 65 72 77 69 73 65 20 74 68 61 74 20 63 61 6c 6c  erwise that call
8460: 62 61 63 6b 20 63 6f 75 6c 64 20 62 65 20 69 6e  back could be in
8470: 76 6f 6b 65 64 20 72 65 63 75 72 73 69 76 65 6c  voked recursivel
8480: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  y. */.    if (st
8490: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
84a0: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
84b0: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61  ) {..dprintf("Ca
84c0: 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67 6f 69  llback is on-goi
84d0: 6e 67 2c 20 64 6f 69 6e 67 20 6e 6f 74 68 69 6e  ng, doing nothin
84e0: 67 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  g");..return;.  
84f0: 20 20 7d 0a 0a 20 20 20 20 70 61 72 65 6e 74 20    }..    parent 
8500: 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28  = Tls_GetParent(
8510: 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43  statePtr, TLS_TC
8520: 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 0a 20 20  L_FASTPATH);..  
8530: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
8540: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
8550: 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44  HANDSHAKE_FAILED
8560: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73  ) {..dprintf("As
8570: 6b 65 64 20 74 6f 20 77 61 74 63 68 20 61 20 73  ked to watch a s
8580: 6f 63 6b 65 74 20 77 69 74 68 20 61 20 66 61 69  ocket with a fai
8590: 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 20 2d 2d  led handshake --
85a0: 20 6e 6f 74 68 69 6e 67 20 63 61 6e 20 68 61 70   nothing can hap
85b0: 70 65 6e 20 68 65 72 65 22 29 3b 0a 09 64 70 72  pen here");..dpr
85c0: 69 6e 74 66 28 22 55 6e 72 65 67 69 73 74 65 72  intf("Unregister
85d0: 69 6e 67 20 69 6e 74 65 72 65 73 74 20 69 6e 20  ing interest in 
85e0: 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65  the lower channe
85f0: 6c 22 29 3b 0a 0a 09 77 61 74 63 68 50 72 6f 63  l");...watchProc
8600: 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61   = Tcl_ChannelWa
8610: 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43  tchProc(Tcl_GetC
8620: 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e  hannelType(paren
8630: 74 29 29 3b 0a 09 77 61 74 63 68 50 72 6f 63 28  t));..watchProc(
8640: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
8650: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e  stanceData(paren
8660: 74 29 2c 20 30 29 3b 0a 09 73 74 61 74 65 50 74  t), 0);..statePt
8670: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 30  r->watchMask = 0
8680: 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  ;..return;.    }
8690: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
86a0: 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b  watchMask = mask
86b0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61  ;..    /* No cha
86c0: 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 61 6e  nnel handlers an
86d0: 79 20 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c 20  y more. We will 
86e0: 62 65 20 6e 6f 74 69 66 69 65 64 20 61 75 74 6f  be notified auto
86f0: 6d 61 74 69 63 61 6c 6c 79 0a 20 20 20 20 20 2a  matically.     *
8700: 20 61 62 6f 75 74 20 65 76 65 6e 74 73 20 6f 6e   about events on
8710: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c   the channel bel
8720: 6f 77 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f  ow via a call to
8730: 20 6f 75 72 0a 20 20 20 20 20 2a 20 27 54 72 61   our.     * 'Tra
8740: 6e 73 66 6f 72 6d 4e 6f 74 69 66 79 50 72 6f 63  nsformNotifyProc
8750: 27 2e 20 42 75 74 20 77 65 20 68 61 76 65 20 74  '. But we have t
8760: 6f 20 70 61 73 73 20 74 68 65 20 69 6e 74 65 72  o pass the inter
8770: 65 73 74 20 64 6f 77 6e 20 6e 6f 77 2e 0a 20 20  est down now..  
8780: 20 20 20 2a 20 57 65 20 61 72 65 20 61 6c 6c 6f     * We are allo
8790: 77 65 64 20 74 6f 20 61 64 64 20 61 64 64 69 74  wed to add addit
87a0: 69 6f 6e 61 6c 20 27 69 6e 74 65 72 65 73 74 27  ional 'interest'
87b0: 20 74 6f 20 74 68 65 20 6d 61 73 6b 20 69 66 20   to the mask if 
87c0: 77 65 20 77 61 6e 74 0a 20 20 20 20 20 2a 20 74  we want.     * t
87d0: 6f 2e 20 42 75 74 20 74 68 69 73 20 74 72 61 6e  o. But this tran
87e0: 73 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20 6e  sformation has n
87f0: 6f 20 73 75 63 68 20 69 6e 74 65 72 65 73 74 2e  o such interest.
8800: 20 49 74 20 6a 75 73 74 20 70 61 73 73 65 73 0a   It just passes.
8810: 20 20 20 20 20 2a 20 74 68 65 20 72 65 71 75 65       * the reque
8820: 73 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61 6e 67  st down, unchang
8830: 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ed..     */.    
8840: 64 70 72 69 6e 74 66 28 22 52 65 67 69 73 74 65  dprintf("Registe
8850: 72 69 6e 67 20 6f 75 72 20 69 6e 74 65 72 65 73  ring our interes
8860: 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 63  t in the lower c
8870: 68 61 6e 6e 65 6c 20 28 63 68 61 6e 3d 25 70 29  hannel (chan=%p)
8880: 22 2c 20 28 76 6f 69 64 20 2a 29 20 70 61 72 65  ", (void *) pare
8890: 6e 74 29 3b 0a 20 20 20 20 77 61 74 63 68 50 72  nt);.    watchPr
88a0: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  oc = Tcl_Channel
88b0: 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65  WatchProc(Tcl_Ge
88c0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72  tChannelType(par
88d0: 65 6e 74 29 29 3b 0a 20 20 20 20 77 61 74 63 68  ent));.    watch
88e0: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e  Proc(Tcl_GetChan
88f0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
8900: 70 61 72 65 6e 74 29 2c 20 6d 61 73 6b 29 3b 0a  parent), mask);.
8910: 0a 20 20 20 20 2f 2a 20 44 6f 20 77 65 20 68 61  .    /* Do we ha
8920: 76 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 65  ve any pending e
8930: 76 65 6e 74 73 20 2a 2f 0a 20 20 20 20 70 65 6e  vents */.    pen
8940: 64 69 6e 67 20 3d 20 28 73 74 61 74 65 50 74 72  ding = (statePtr
8950: 2d 3e 77 61 6e 74 20 7c 7c 20 5c 0a 09 28 28 6d  ->want || \..((m
8960: 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42  ask & TCL_READAB
8970: 4c 45 29 20 26 26 20 28 28 54 63 6c 5f 49 6e 70  LE) && ((Tcl_Inp
8980: 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65  utBuffered(state
8990: 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20  Ptr->self) > 0) 
89a0: 7c 7c 20 28 42 49 4f 5f 63 74 72 6c 5f 70 65 6e  || (BIO_ctrl_pen
89b0: 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62  ding(statePtr->b
89c0: 69 6f 29 20 3e 20 30 29 29 29 20 7c 7c 0a 09 28  io) > 0))) ||..(
89d0: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 57 52 49 54  (mask & TCL_WRIT
89e0: 41 42 4c 45 29 20 26 26 20 28 28 54 63 6c 5f 4f  ABLE) && ((Tcl_O
89f0: 75 74 70 75 74 42 75 66 66 65 72 65 64 28 73 74  utputBuffered(st
8a00: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20  atePtr->self) > 
8a10: 30 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72 6c 5f  0) || (BIO_ctrl_
8a20: 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74  wpending(statePt
8a30: 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29 29 29 3b  r->bio) > 0))));
8a40: 0a 0a 20 20 20 20 69 66 20 28 21 28 6d 61 73 6b  ..    if (!(mask
8a50: 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29   & TCL_READABLE)
8a60: 20 7c 7c 20 70 65 6e 64 69 6e 67 20 3d 3d 20 30   || pending == 0
8a70: 29 20 7b 0a 09 2f 2a 20 52 65 6d 6f 76 65 20 74  ) {../* Remove t
8a80: 69 6d 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  imer, if any */.
8a90: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74  .if (statePtr->t
8aa0: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
8ab0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
8ac0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41  ..    dprintf("A
8ad0: 20 74 69 6d 65 72 20 77 61 73 20 66 6f 75 6e 64   timer was found
8ae0: 2c 20 64 65 6c 65 74 69 6e 67 20 69 74 22 29 3b  , deleting it");
8af0: 0a 09 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  ..    Tcl_Delete
8b00: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61  TimerHandler(sta
8b10: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09  tePtr->timer);..
8b20: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69      statePtr->ti
8b30: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72  mer = (Tcl_Timer
8b40: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 09 7d 0a  Token) NULL;..}.
8b50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
8b60: 2a 20 41 64 64 20 74 69 6d 65 72 2c 20 69 66 20  * Add timer, if 
8b70: 6e 6f 6e 65 20 2a 2f 0a 09 69 66 20 28 73 74 61  none */..if (sta
8b80: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 3d 20  tePtr->timer == 
8b90: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
8ba0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 64 70   NULL) {..    dp
8bb0: 72 69 6e 74 66 28 22 43 72 65 61 74 69 6e 67 20  rintf("Creating 
8bc0: 61 20 6e 65 77 20 74 69 6d 65 72 20 73 69 6e 63  a new timer sinc
8bd0: 65 20 64 61 74 61 20 61 70 70 65 61 72 73 20 74  e data appears t
8be0: 6f 20 62 65 20 77 61 69 74 69 6e 67 22 29 3b 0a  o be waiting");.
8bf0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74  .    statePtr->t
8c00: 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74  imer = Tcl_Creat
8c10: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c  eTimerHandler(TL
8c20: 53 5f 54 43 4c 5f 44 45 4c 41 59 2c 20 54 6c 73  S_TCL_DELAY, Tls
8c30: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69  ChannelHandlerTi
8c40: 6d 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  mer, (ClientData
8c50: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a  ) statePtr);..}.
8c60: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d      }.}../*. *--
8c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
8cc0: 2a 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72  * TlsGetHandlePr
8cd0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  oc --. *. *.This
8ce0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
8cf0: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e  voked by the gen
8d00: 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f  eric IO level to
8d10: 20 72 65 74 72 69 65 76 65 20 61 6e 20 4f 53 0a   retrieve an OS.
8d20: 20 2a 09 73 70 65 63 69 66 69 63 20 68 61 6e 64   *.specific hand
8d30: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
8d40: 74 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20  th the channel. 
8d50: 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 74 72 61  Not used for tra
8d60: 6e 73 66 6f 72 6d 73 2e 0a 20 2a 0a 20 2a 20 52  nsforms.. *. * R
8d70: 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54 68  esults:. *    Th
8d80: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 54 63  e appropriate Tc
8d90: 6c 5f 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 72  l_File handle or
8da0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 2e 0a 20   NULL if none.. 
8db0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8dc0: 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20  s:. *    None.. 
8dd0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
8e30: 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f   TlsGetHandlePro
8e40: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
8e50: 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a  tanceData,    /*
8e60: 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a   Socket state. *
8e70: 2f 0a 20 20 20 20 69 6e 74 20 64 69 72 65 63 74  /.    int direct
8e80: 69 6f 6e 2c 09 09 2f 2a 20 54 43 4c 5f 52 45 41  ion,../* TCL_REA
8e90: 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49  DABLE or TCL_WRI
8ea0: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 43 6c 69  TABLE */.    Cli
8eb0: 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50  entData *handleP
8ec0: 74 72 29 09 2f 2a 20 48 61 6e 64 6c 65 20 61 73  tr)./* Handle as
8ed0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
8ee0: 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 7b 0a 20  e channel */.{. 
8ef0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
8f00: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69  tr = (State *) i
8f10: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
8f20: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74    return Tcl_Get
8f30: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 6c  ChannelHandle(Tl
8f40: 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74  s_GetParent(stat
8f50: 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41  ePtr, TLS_TCL_FA
8f60: 53 54 50 41 54 48 29 2c 20 64 69 72 65 63 74 69  STPATH), directi
8f70: 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a  on, handlePtr);.
8f80: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fd0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4e  -----. *. * TlsN
8fe0: 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a  otifyProc --. *.
8ff0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
9000: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  e is invoked by 
9010: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
9020: 65 76 65 6c 20 74 6f 20 6e 6f 74 69 66 79 20 74  evel to notify t
9030: 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 74 68  he channel. *.th
9040: 61 74 20 61 6e 20 65 76 65 6e 74 20 68 61 73 20  at an event has 
9050: 6f 63 63 75 72 72 65 64 20 6f 6e 20 74 68 65 20  occurred on the 
9060: 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e  underlying chann
9070: 65 6c 2e 20 49 74 20 69 73 20 75 73 65 64 20 62  el. It is used b
9080: 79 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65  y stacked channe
9090: 6c 20 64 72 69 76 65 72 73 20 74 68 61 74 0a 20  l drivers that. 
90a0: 2a 09 77 69 73 68 20 74 6f 20 62 65 20 6e 6f 74  *.wish to be not
90b0: 69 66 69 65 64 20 6f 66 20 65 76 65 6e 74 73 20  ified of events 
90c0: 74 68 61 74 20 6f 63 63 75 72 20 6f 6e 20 74 68  that occur on th
90d0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 28 73 74  e underlying (st
90e0: 61 63 6b 65 64 29 0a 20 2a 09 63 68 61 6e 6e 65  acked). *.channe
90f0: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  l.. *. * Results
9100: 3a 0a 20 2a 20 20 20 20 54 79 70 65 20 6f 66 20  :. *    Type of 
9110: 65 76 65 6e 74 20 6f 72 20 30 20 69 66 20 66 61  event or 0 if fa
9120: 69 6c 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20  iled. *. * Side 
9130: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4d  effects:. *    M
9140: 61 79 20 70 72 6f 63 65 73 73 20 74 68 65 20 69  ay process the i
9150: 6e 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 62 79  ncoming event by
9160: 20 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d   itself.. *. *--
9170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
91c0: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4e 6f  static int TlsNo
91d0: 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44  tifyProc(ClientD
91e0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
91f0: 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73  ,    /* Socket s
9200: 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tate. */.    int
9210: 20 6d 61 73 6b 29 09 09 09 2f 2a 20 74 79 70 65   mask).../* type
9220: 20 6f 66 20 65 76 65 6e 74 20 74 68 61 74 20 6f   of event that o
9230: 63 63 75 72 72 65 64 3a 0a 09 09 09 09 20 2a 20  ccurred:..... * 
9240: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
9250: 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c  n of TCL_READABL
9260: 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c  E or TCL_WRITABL
9270: 45 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65  E */.{.    State
9280: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
9290: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
92a0: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  ata;.    int err
92b0: 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 0a 20 20 20  orCode = 0;..   
92c0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
92d0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
92e0: 20 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 78 69   * Delete an exi
92f0: 73 74 69 6e 67 20 74 69 6d 65 72 2e 20 49 74 20  sting timer. It 
9300: 77 61 73 20 6e 6f 74 20 66 69 72 65 64 2c 20 79  was not fired, y
9310: 65 74 20 77 65 20 61 72 65 0a 20 20 20 20 20 2a  et we are.     *
9320: 20 68 65 72 65 2c 20 73 6f 20 74 68 65 20 63 68   here, so the ch
9330: 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65  annel below gene
9340: 72 61 74 65 64 20 73 75 63 68 20 61 6e 20 65 76  rated such an ev
9350: 65 6e 74 20 61 6e 64 20 77 65 0a 20 20 20 20 20  ent and we.     
9360: 2a 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 2e  * don't have to.
9370: 20 54 68 65 20 72 65 6e 65 77 61 6c 20 6f 66 20   The renewal of 
9380: 74 68 65 20 69 6e 74 65 72 65 73 74 20 61 66 74  the interest aft
9390: 65 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 78  er the.     * ex
93a0: 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 61 6e 6e  ecution of chann
93b0: 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 69 6c 6c  el handlers will
93c0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 75 73   eventually caus
93d0: 65 20 75 73 20 74 6f 0a 20 20 20 20 20 2a 20 72  e us to.     * r
93e0: 65 63 72 65 61 74 65 20 74 68 65 20 74 69 6d 65  ecreate the time
93f0: 72 20 28 69 6e 20 57 61 74 63 68 50 72 6f 63 29  r (in WatchProc)
9400: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ..     */.    if
9410: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
9420: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
9430: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
9440: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
9450: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
9460: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
9470: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f  r->timer = (Tcl_
9480: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
9490: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
94a0: 53 6b 69 70 20 69 66 20 75 73 65 72 20 76 65 72  Skip if user ver
94b0: 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ify callback is 
94c0: 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 2a 2f  still running */
94d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
94e0: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
94f0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09  CL_CALLBACK) {..
9500: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63  dprintf("Callbac
9510: 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20 72  k is on-going, r
9520: 65 74 75 72 6e 69 6e 67 20 66 61 69 6c 65 64 22  eturning failed"
9530: 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  );..return 0;.  
9540: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
9550: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ot initialized, 
9560: 64 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20  do connect */.  
9570: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
9580: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
9590: 49 4e 49 54 29 20 7b 0a 09 64 70 72 69 6e 74 66  INIT) {..dprintf
95a0: 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61  ("Calling Tls_Wa
95b0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a  itForConnect");.
95c0: 09 69 66 20 28 54 6c 73 5f 57 61 69 74 46 6f 72  .if (Tls_WaitFor
95d0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
95e0: 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c 20 31 29  , &errorCode, 1)
95f0: 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 54 6c 73   < 0) {..    Tls
9600: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
9610: 20 73 74 72 65 72 72 6f 72 28 65 72 72 6f 72 43   strerror(errorC
9620: 6f 64 65 29 29 3b 0a 09 20 20 20 20 69 66 20 28  ode));..    if (
9630: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47  errorCode == EAG
9640: 41 49 4e 29 20 7b 0a 09 09 64 70 72 69 6e 74 66  AIN) {...dprintf
9650: 28 22 41 73 79 6e 63 20 66 6c 61 67 20 63 6f 75  ("Async flag cou
9660: 6c 64 20 62 65 20 73 65 74 20 28 64 69 64 6e 27  ld be set (didn'
9670: 74 20 63 68 65 63 6b 29 20 61 6e 64 20 65 72 72  t check) and err
9680: 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 41 49 4e  orCode == EAGAIN
9690: 3a 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 69  :  Returning fai
96a0: 6c 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  led");....return
96b0: 20 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20   0;..    }...   
96c0: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61   dprintf("Tls_Wa
96d0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74  itForConnect ret
96e0: 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 22 29  urned an error")
96f0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
9700: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
9710: 6e 67 20 25 69 22 2c 20 6d 61 73 6b 29 3b 0a 0a  ng %i", mask);..
9720: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e      /*.     * An
9730: 20 65 76 65 6e 74 20 6f 63 63 75 72 72 65 64 20   event occurred 
9740: 69 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  in the underlyin
9750: 67 20 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73  g channel.  This
9760: 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72  .     * transfor
9770: 6d 61 74 69 6f 6e 20 64 6f 65 73 6e 27 74 20 70  mation doesn't p
9780: 72 6f 63 65 73 73 20 73 75 63 68 20 65 76 65 6e  rocess such even
9790: 74 73 20 74 68 75 73 20 72 65 74 75 72 6e 73 20  ts thus returns 
97a0: 74 68 65 0a 20 20 20 20 20 2a 20 69 6e 63 6f 6d  the.     * incom
97b0: 69 6e 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e 67  ing mask unchang
97c0: 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ed..     */.    
97d0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a  return mask;.}..
97e0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
97f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9830: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 68 61  --. *. * Tls_Cha
9840: 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a 20  nnelType --. *. 
9850: 2a 09 44 65 66 69 6e 65 73 20 74 68 65 20 63 6f  *.Defines the co
9860: 72 72 65 63 74 20 54 4c 53 20 63 68 61 6e 6e 65  rrect TLS channe
9870: 6c 20 64 72 69 76 65 72 20 68 61 6e 64 6c 65 72  l driver handler
9880: 73 20 66 6f 72 20 74 68 69 73 20 63 68 61 6e 6e  s for this chann
9890: 65 6c 20 74 79 70 65 2e 0a 20 2a 0a 20 2a 20 52  el type.. *. * R
98a0: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 63 6c 5f 43  esults:. *.Tcl_C
98b0: 68 61 6e 6e 65 6c 54 79 70 65 20 73 74 72 75 63  hannelType struc
98c0: 74 75 72 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  ture.. *. * Side
98d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20   effects:. *    
98e0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
98f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
9940: 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68  tic const Tcl_Ch
9950: 61 6e 6e 65 6c 54 79 70 65 20 74 6c 73 43 68 61  annelType tlsCha
9960: 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 20  nnelType = {.   
9970: 20 22 74 6c 73 22 2c 09 09 09 2f 2a 20 54 79 70   "tls",.../* Typ
9980: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 43  e name */.    TC
9990: 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f  L_CHANNEL_VERSIO
99a0: 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 6e 6e  N_5,./* v5 chann
99b0: 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f  el */.    TlsClo
99c0: 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73  seProc,../* Clos
99d0: 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c  e proc */.    Tl
99e0: 73 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20  sInputProc,../* 
99f0: 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20  Input proc */.  
9a00: 20 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2c    TlsOutputProc,
9a10: 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63  ../* Output proc
9a20: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09   */.    NULL,...
9a30: 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a  /* Seek proc */.
9a40: 20 20 20 20 54 6c 73 53 65 74 4f 70 74 69 6f 6e      TlsSetOption
9a50: 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20 6f 70  Proc,../* Set op
9a60: 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20  tion proc */.   
9a70: 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f   TlsGetOptionPro
9a80: 63 2c 09 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f  c,../* Get optio
9a90: 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c  n proc */.    Tl
9aa0: 73 57 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20  sWatchProc,../* 
9ab0: 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66  Initialize notif
9ac0: 69 65 72 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65  ier */.    TlsGe
9ad0: 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 09 2f 2a  tHandleProc,../*
9ae0: 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20   Get OS handles 
9af0: 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a  out of channel *
9b00: 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 32 50  /.    TlsClose2P
9b10: 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70  roc,../* close2p
9b20: 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 42 6c  roc */.    TlsBl
9b30: 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f 2a  ockModeProc,../*
9b40: 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f   Set blocking/no
9b50: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f  nblocking mode*/
9b60: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20  .    NULL,.../* 
9b70: 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20  Flush proc */.  
9b80: 20 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 2c    TlsNotifyProc,
9b90: 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66  ../* Handling of
9ba0: 20 65 76 65 6e 74 73 20 62 75 62 62 6c 69 6e 67   events bubbling
9bb0: 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c   up */.    NULL,
9bc0: 09 09 09 2f 2a 20 57 69 64 65 20 73 65 65 6b 20  .../* Wide seek 
9bd0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c  proc */.    NULL
9be0: 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 20 61 63  ,.../* Thread ac
9bf0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c  tion */.    NULL
9c00: 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 20 2a  .../* Truncate *
9c10: 2f 0a 7d 3b 0a 0a 63 6f 6e 73 74 20 54 63 6c 5f  /.};..const Tcl_
9c20: 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 54 6c 73  ChannelType *Tls
9c30: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 76 6f 69  _ChannelType(voi
9c40: 64 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d) {.    return 
9c50: 26 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 3b  &tlsChannelType;
9c60: 0a 7d 0a                                         .}.