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