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