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