0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 4d 61 (C) 1997-2000 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 Copyright (C) 2
0050: 30 30 30 20 41 6a 75 62 61 20 53 6f 6c 75 74 69 000 Ajuba Soluti
0060: 6f 6e 73 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 ons. *. * TLS (a
0070: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0080: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0090: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
00a0: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
00b0: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
00c0: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
00d0: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
00e0: 20 77 61 73 20 62 75 69 6c 74 20 66 72 6f 6d 20 was built from
00f0: 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75 70 scratch based up
0100: 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f on observation o
0110: 66 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 f OpenSSL 0.9.2B
0120: 0a 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 . *. * Addition
0130: 63 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f credit is due fo
0140: 72 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 r Andreas Kuprie
0150: 73 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 s (a.kupries@wes
0160: 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 tend.com), for.
0170: 2a 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 * providing the
0180: 54 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e Tcl_ReplaceChann
0190: 65 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 el mechanism and
01a0: 20 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 working closely
01b0: 20 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 with me. * to e
01c0: 6e 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 nhance it to sup
01d0: 70 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 port full fileev
01e0: 65 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 ent semantics..
01f0: 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 *. * Also work d
0200: 6f 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f one by the follo
0210: 77 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 w people provide
0220: 64 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f d the impetus to
0230: 20 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 do this "right"
0240: 3a 0a 20 2a 20 20 20 20 74 63 6c 53 53 4c 20 28 :. * tclSSL (
0250: 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c Colin McCormack,
0260: 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f Shared Technolo
0270: 67 79 29 0a 20 2a 20 20 20 20 53 53 4c 74 63 6c gy). * SSLtcl
0280: 20 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a (Peter Antman).
0290: 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 *. */..#include
02a0: 20 22 74 6c 73 49 6e 74 2e 68 22 0a 0a 2f 2a 0a "tlsInt.h"../*.
02b0: 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 * Forward decla
02c0: 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 73 74 61 74 rations. */.stat
02d0: 69 63 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e ic void TlsChann
02e0: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 28 43 elHandlerTimer(C
02f0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
0300: 44 61 74 61 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 4c Data);../*. * TL
0310: 53 20 43 68 61 6e 6e 65 6c 20 54 79 70 65 0a 20 S Channel Type.
0320: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 */.static Tcl_Ch
0330: 61 6e 6e 65 6c 54 79 70 65 20 2a 74 6c 73 43 68 annelType *tlsCh
0340: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 4e 55 4c 4c annelType = NULL
0350: 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ;../*. *--------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
03a0: 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 * TlsBlockModePr
03b0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54 oc --. *. * T
03c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
03d0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 invoked by the
03e0: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c generic IO level
03f0: 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 73 65 74 . * to set
0400: 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f blocking and no
0410: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a nblocking modes.
0420: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 * Results:. *
0430: 20 20 30 20 69 66 20 73 75 63 63 65 73 73 66 75 0 if successfu
0440: 6c 2c 20 65 72 72 6e 6f 20 77 68 65 6e 20 66 61 l, errno when fa
0450: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 iled.. *. * Side
0460: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 effects:. *
0470: 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65 20 Sets the device
0480: 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 into blocking or
0490: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 nonblocking mod
04a0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
04f0: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42 6c static int TlsBl
0500: 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 ockModeProc(Clie
0510: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
0520: 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b ata, int mode) {
0530: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
0540: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
0550: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a instanceData;..
0560: 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 if (mode ==
0570: 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 TCL_MODE_NONBLOC
0580: 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 KING) {..statePt
0590: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
05a0: 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d TCL_ASYNC;. }
05b0: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 else {..statePt
05c0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
05d0: 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 S_TCL_ASYNC);.
05e0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28 30 }. return(0
05f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0640: 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 72 6f *. * TlsClosePro
0650: 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54 68 c --. *. * Th
0660: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
0670: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 invoked by the g
0680: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 eneric IO level
0690: 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 20 20 20 to perform. *
06a0: 20 63 68 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 channel-type-sp
06b0: 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77 ecific cleanup w
06c0: 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
06d0: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
06e0: 2a 20 20 20 20 69 73 20 63 6c 6f 73 65 64 2e 0a * is closed..
06f0: 20 2a 0a 20 2a 20 20 20 20 4e 6f 74 65 3a 20 77 *. * Note: w
0700: 65 20 6c 65 61 76 65 20 74 68 65 20 75 6e 64 65 e leave the unde
0710: 72 6c 79 69 6e 67 20 73 6f 63 6b 65 74 20 61 6c rlying socket al
0720: 6f 6e 65 2c 20 69 73 20 74 68 69 73 20 72 69 67 one, is this rig
0730: 68 74 3f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ht?. *. * Result
0740: 73 3a 0a 20 2a 20 20 20 20 30 20 69 66 20 73 75 s:. * 0 if su
0750: 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 76 61 ccessful, the va
0760: 6c 75 65 20 6f 66 20 54 63 6c 5f 47 65 74 45 72 lue of Tcl_GetEr
0770: 72 6e 6f 28 29 20 69 66 20 66 61 69 6c 65 64 2e rno() if failed.
0780: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0790: 63 74 73 3a 0a 20 2a 20 20 20 20 43 6c 6f 73 65 cts:. * Close
07a0: 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f 66 20 s the socket of
07b0: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a the channel.. *.
07c0: 20 2a 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 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
0810: 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 50 72 6f int TlsClosePro
0820: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
0830: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 tanceData, Tcl_I
0840: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
0850: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
0860: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
0870: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a instanceData;..
0880: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 dprintf("Tls
0890: 43 6c 6f 73 65 50 72 6f 63 28 25 70 29 22 2c 20 CloseProc(%p)",
08a0: 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 (void *) statePt
08b0: 72 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 r);.. Tls_Cle
08c0: 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 an(statePtr);.
08d0: 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 Tcl_Eventually
08e0: 46 72 65 65 28 28 43 6c 69 65 6e 74 44 61 74 61 Free((ClientData
08f0: 29 73 74 61 74 65 50 74 72 2c 20 54 6c 73 5f 46 )statePtr, Tls_F
0900: 72 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ree);. return
0910: 28 30 29 3b 0a 0a 09 2f 2a 20 49 6e 74 65 72 70 (0);.../* Interp
0920: 20 69 73 20 75 6e 75 73 65 64 2e 20 2a 2f 0a 09 is unused. */..
0930: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b interp = interp;
0940: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 54 .}..static int T
0950: 6c 73 43 6c 6f 73 65 50 72 6f 63 32 28 43 6c 69 lsCloseProc2(Cli
0960: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
0970: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
0980: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c *interp, int fl
0990: 61 67 73 29 20 7b 0a 20 20 20 20 69 66 20 28 28 ags) {. if ((
09a0: 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f flags & (TCL_CLO
09b0: 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 4c 4f 53 SE_READ|TCL_CLOS
09c0: 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 20 E_WRITE)) == 0)
09d0: 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73 43 6c 6f {..return TlsClo
09e0: 73 65 50 72 6f 63 28 69 6e 73 74 61 6e 63 65 44 seProc(instanceD
09f0: 61 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata, interp);.
0a00: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 45 }. return E
0a10: 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d INVAL;.}../*. *-
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a50: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 -----*. *. *
0a60: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
0a70: 63 74 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 53 ct --. *. * S
0a80: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 ide effects:. *
0a90: 20 20 20 20 20 20 20 49 73 73 75 65 73 20 53 53 Issues SS
0aa0: 4c 5f 61 63 63 65 70 74 20 6f 72 20 53 53 4c 5f L_accept or SSL_
0ab0: 63 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 20 20 20 connect. *. *
0ac0: 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 Result:. *
0ad0: 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d None.. *. *--
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b10: 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 69 6e 74 20 54 6c ----*. */.int Tl
0b20: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
0b30: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
0b40: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 , int *errorCode
0b50: 50 74 72 2c 20 69 6e 74 20 68 61 6e 64 73 68 61 Ptr, int handsha
0b60: 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61 keFailureIsPerma
0b70: 6e 65 6e 74 29 20 7b 0a 20 20 20 20 75 6e 73 69 nent) {. unsi
0b80: 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e gned long backin
0b90: 67 45 72 72 6f 72 3b 0a 20 20 20 20 69 6e 74 20 gError;. int
0ba0: 65 72 72 2c 20 72 63 3b 0a 20 20 20 20 69 6e 74 err, rc;. int
0bb0: 20 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 3b bioShouldRetry;
0bc0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 .. dprintf("W
0bd0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 25 70 aitForConnect(%p
0be0: 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 )", (void *) sta
0bf0: 74 65 50 74 72 29 3b 0a 20 20 20 20 64 70 72 69 tePtr);. dpri
0c00: 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 ntFlags(statePtr
0c10: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 28 73 74 );.. if (!(st
0c20: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
0c30: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 29 20 7b TLS_TCL_INIT)) {
0c40: 0a 09 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 ..dprintf("Tls_W
0c50: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 63 61 aitForConnect ca
0c60: 6c 6c 65 64 20 6f 6e 20 61 6c 72 65 61 64 79 20 lled on already
0c70: 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 68 61 6e initialized chan
0c80: 6e 65 6c 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 nel -- returning
0c90: 20 77 69 74 68 20 69 6d 6d 65 64 69 61 74 65 20 with immediate
0ca0: 73 75 63 63 65 73 73 22 29 3b 0a 09 2a 65 72 72 success");..*err
0cb0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 orCodePtr = 0;..
0cc0: 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d return(0);. }
0cd0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
0ce0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
0cf0: 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 TCL_HANDSHAKE_FA
0d00: 49 4c 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 ILED) {../*.. *
0d10: 44 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 Different types
0d20: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 68 61 of operations ha
0d30: 76 65 20 64 69 66 66 65 72 65 6e 74 20 72 65 71 ve different req
0d40: 75 69 72 65 6d 65 6e 74 73 0a 09 20 2a 20 53 53 uirements.. * SS
0d50: 4c 20 62 65 69 6e 67 20 65 73 74 61 62 6c 69 73 L being establis
0d60: 68 65 64 0a 09 20 2a 2f 0a 09 69 66 20 28 68 61 hed.. */..if (ha
0d70: 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73 ndshakeFailureIs
0d80: 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20 Permanent) {..
0d90: 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
0da0: 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 to wait for a T
0db0: 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 LS handshake tha
0dc0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 t has already fa
0dd0: 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 iled. Returning
0de0: 20 66 61 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a fatal error");.
0df0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
0e00: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 tr = ECONNABORTE
0e10: 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 D;..} else {..
0e20: 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
0e30: 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 to wait for a T
0e40: 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 LS handshake tha
0e50: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 t has already fa
0e60: 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 iled. Returning
0e70: 20 73 6f 66 74 20 65 72 72 6f 72 22 29 3b 0a 09 soft error");..
0e80: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
0e90: 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a r = ECONNRESET;.
0ea0: 09 7d 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a .}..return(-1);.
0eb0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 }.. for (
0ec0: 3b 3b 29 20 7b 0a 09 2f 2a 20 4e 6f 74 20 69 6e ;;) {../* Not in
0ed0: 69 74 69 61 6c 69 7a 65 64 20 79 65 74 21 20 2a itialized yet! *
0ee0: 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d /..if (statePtr-
0ef0: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
0f00: 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 _SERVER) {..
0f10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 dprintf("Calling
0f20: 20 53 53 4c 5f 61 63 63 65 70 74 28 29 22 29 3b SSL_accept()");
0f30: 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f .. err = SSL_
0f40: 61 63 63 65 70 74 28 73 74 61 74 65 50 74 72 2d accept(statePtr-
0f50: 3e 73 73 6c 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 >ssl);...} else
0f60: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
0f70: 43 61 6c 6c 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e Calling SSL_conn
0f80: 65 63 74 28 29 22 29 3b 0a 09 20 20 20 20 65 72 ect()");.. er
0f90: 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 r = SSL_connect(
0fa0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
0fb0: 09 7d 0a 0a 09 69 66 20 28 65 72 72 20 3e 20 30 .}...if (err > 0
0fc0: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
0fd0: 28 22 54 68 61 74 20 73 65 65 6d 73 20 74 6f 20 ("That seems to
0fe0: 68 61 76 65 20 67 6f 6e 65 20 6f 6b 61 79 22 29 have gone okay")
0ff0: 3b 0a 0a 09 20 20 20 20 65 72 72 20 3d 20 42 49 ;... err = BI
1000: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 O_flush(statePtr
1010: 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 69 66 20 ->bio);.. if
1020: 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 09 64 (err <= 0) {...d
1030: 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 printf("Flushing
1040: 20 74 68 65 20 6c 6f 77 65 72 20 6c 61 79 65 72 the lower layer
1050: 73 20 66 61 69 6c 65 64 2c 20 74 68 69 73 20 77 s failed, this w
1060: 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 74 65 72 ill probably ter
1070: 6d 69 6e 61 74 65 20 74 68 69 73 20 73 65 73 73 minate this sess
1080: 69 6f 6e 22 29 3b 0a 09 20 20 20 20 7d 0a 09 7d ion");.. }..}
1090: 0a 0a 09 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f ...rc = SSL_get_
10a0: 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e error(statePtr->
10b0: 73 73 6c 2c 20 65 72 72 29 3b 0a 0a 09 64 70 72 ssl, err);...dpr
10c0: 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a intf("Got error:
10d0: 20 25 69 20 28 72 63 20 3d 20 25 69 29 22 2c 20 %i (rc = %i)",
10e0: 65 72 72 2c 20 72 63 29 3b 0a 09 64 70 72 69 6e err, rc);..dprin
10f0: 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 tf("Got error: %
1100: 73 22 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 s", ERR_reason_e
1110: 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f rror_string(ERR_
1120: 67 65 74 5f 65 72 72 6f 72 28 29 29 29 3b 0a 0a get_error()));..
1130: 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 .bioShouldRetry
1140: 3d 20 30 3b 0a 09 69 66 20 28 65 72 72 20 3c 3d = 0;..if (err <=
1150: 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 72 0) {.. if (r
1160: 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 c == SSL_ERROR_W
1170: 41 4e 54 5f 43 4f 4e 4e 45 43 54 20 7c 7c 20 72 ANT_CONNECT || r
1180: 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 c == SSL_ERROR_W
1190: 41 4e 54 5f 41 43 43 45 50 54 20 7c 7c 20 72 63 ANT_ACCEPT || rc
11a0: 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 == SSL_ERROR_WA
11b0: 4e 54 5f 52 45 41 44 20 7c 7c 20 72 63 20 3d 3d NT_READ || rc ==
11c0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
11d0: 57 52 49 54 45 29 20 7b 0a 09 09 62 69 6f 53 68 WRITE) {...bioSh
11e0: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 ouldRetry = 1;..
11f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 42 } else if (B
1200: 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 IO_should_retry(
1210: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 statePtr->bio))
1220: 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 {...bioShouldRet
1230: 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20 65 ry = 1;.. } e
1240: 6c 73 65 20 69 66 20 28 72 63 20 3d 3d 20 53 53 lse if (rc == SS
1250: 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 20 L_ERROR_SYSCALL
1260: 26 26 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 && Tcl_GetErrno(
1270: 29 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 ) == EAGAIN) {..
1280: 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 .bioShouldRetry
1290: 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 = 1;.. }..} e
12a0: 6c 73 65 20 7b 0a 09 20 20 20 20 69 66 20 28 21 lse {.. if (!
12b0: 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 SSL_is_init_fini
12c0: 73 68 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 shed(statePtr->s
12d0: 73 6c 29 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 sl)) {...bioShou
12e0: 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 ldRetry = 1;..
12f0: 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 28 62 69 6f }..}...if (bio
1300: 53 68 6f 75 6c 64 52 65 74 72 79 29 20 7b 0a 09 ShouldRetry) {..
1310: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 68 65 dprintf("The
1320: 20 49 2f 4f 20 64 69 64 20 6e 6f 74 20 63 6f 6d I/O did not com
1330: 70 6c 65 74 65 20 2d 2d 20 62 75 74 20 77 65 20 plete -- but we
1340: 73 68 6f 75 6c 64 20 74 72 79 20 69 74 20 61 67 should try it ag
1350: 61 69 6e 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 ain");... if
1360: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
1370: 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 & TLS_TCL_ASYNC
1380: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 52 ) {...dprintf("R
1390: 65 74 75 72 6e 69 6e 67 20 45 41 47 41 49 4e 20 eturning EAGAIN
13a0: 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 so that it can b
13b0: 65 20 72 65 74 72 69 65 64 20 6c 61 74 65 72 22 e retried later"
13c0: 29 3b 0a 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 );....*errorCode
13d0: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 09 Ptr = EAGAIN;...
13e0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 20 20 20 return(-1);..
13f0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 } else {...dpri
1400: 6e 74 66 28 22 44 6f 69 6e 67 20 73 6f 20 6e 6f ntf("Doing so no
1410: 77 22 29 3b 0a 0a 09 09 63 6f 6e 74 69 6e 75 65 w");....continue
1420: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 64 70 ;.. }..}...dp
1430: 72 69 6e 74 66 28 22 57 65 20 68 61 76 65 20 65 rintf("We have e
1440: 69 74 68 65 72 20 63 6f 6d 70 6c 65 74 65 6c 79 ither completely
1450: 20 65 73 74 61 62 6c 69 73 68 65 64 20 74 68 65 established the
1460: 20 73 65 73 73 69 6f 6e 20 6f 72 20 63 6f 6d 70 session or comp
1470: 6c 65 74 65 6c 79 20 66 61 69 6c 65 64 20 69 74 letely failed it
1480: 20 2d 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20 -- there is no
1490: 6d 6f 72 65 20 6e 65 65 64 20 74 6f 20 65 76 65 more need to eve
14a0: 72 20 72 65 74 72 79 20 69 74 20 74 68 6f 75 67 r retry it thoug
14b0: 68 22 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 h");..break;.
14c0: 20 7d 0a 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f }.. *errorCo
14d0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a dePtr = EINVAL;.
14e0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 72 63 29 . switch (rc)
14f0: 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 {..case SSL_ERR
1500: 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a OR_NONE:.. /*
1510: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
1520: 69 73 20 75 70 2c 20 77 65 20 61 72 65 20 64 6f is up, we are do
1530: 6e 65 20 68 65 72 65 20 2a 2f 0a 09 20 20 20 20 ne here */..
1540: 64 70 72 69 6e 74 66 28 22 54 68 65 20 63 6f 6e dprintf("The con
1550: 6e 65 63 74 69 6f 6e 20 69 73 20 75 70 22 29 3b nection is up");
1560: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
1570: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 se SSL_ERROR_ZER
1580: 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 64 O_RETURN:.. d
1590: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f printf("SSL_ERRO
15a0: 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 20 43 R_ZERO_RETURN: C
15b0: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 20 onnect returned
15c0: 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 an invalid value
15d0: 2e 2e 2e 22 29 0a 09 20 20 20 20 72 65 74 75 72 ...").. retur
15e0: 6e 28 2d 31 29 3b 0a 09 63 61 73 65 20 53 53 4c n(-1);..case SSL
15f0: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a _ERROR_SYSCALL:.
1600: 09 20 20 20 20 62 61 63 6b 69 6e 67 45 72 72 6f . backingErro
1610: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f r = ERR_get_erro
1620: 72 28 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 62 r();... if (b
1630: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 ackingError == 0
1640: 20 26 26 20 65 72 72 20 3d 3d 20 30 29 20 7b 0a && err == 0) {.
1650: 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20 72 ..dprintf("EOF r
1660: 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72 6f eached")...*erro
1670: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
1680: 52 45 53 45 54 3b 0a 09 20 20 20 20 7d 20 65 6c RESET;.. } el
1690: 73 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 se if (backingEr
16a0: 72 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20 ror == 0 && err
16b0: 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e == -1) {...dprin
16c0: 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 tf("I/O error oc
16d0: 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 curred (errno =
16e0: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu)", (unsigned
16f0: 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 long) Tcl_GetEr
1700: 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 rno());...*error
1710: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 CodePtr = Tcl_Ge
1720: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28 tErrno();...if (
1730: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d *errorCodePtr ==
1740: 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 ECONNRESET) {..
1750: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
1760: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 tr = ECONNABORTE
1770: 44 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c D;...}.. } el
1780: 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 se {...dprintf("
1790: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 I/O error occurr
17a0: 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 ed (backingError
17b0: 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e = %lu)", backin
17c0: 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f gError);...*erro
17d0: 72 43 6f 64 65 50 74 72 20 3d 20 62 61 63 6b 69 rCodePtr = backi
17e0: 6e 67 45 72 72 6f 72 3b 0a 09 09 69 66 20 28 2a ngError;...if (*
17f0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 errorCodePtr ==
1800: 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 ECONNRESET) {...
1810: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
1820: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 r = ECONNABORTED
1830: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 09 20 ;...}.. }...
1840: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 statePtr->fla
1850: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 gs |= TLS_TCL_HA
1860: 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a NDSHAKE_FAILED;.
1870: 09 20 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b . return(-1);
1880: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ...case SSL_ERRO
1890: 52 5f 53 53 4c 3a 0a 09 20 20 20 20 64 70 72 69 R_SSL:.. dpri
18a0: 6e 74 66 28 22 47 6f 74 20 70 65 72 6d 61 6e 65 ntf("Got permane
18b0: 6e 74 20 66 61 74 61 6c 20 53 53 4c 20 65 72 72 nt fatal SSL err
18c0: 6f 72 2c 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d or, aborting imm
18d0: 65 64 69 61 74 65 6c 79 22 29 3b 0a 09 20 20 20 ediately");..
18e0: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 Tls_Error(state
18f0: 50 74 72 2c 20 28 63 68 61 72 20 2a 29 45 52 52 Ptr, (char *)ERR
1900: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 _reason_error_st
1910: 72 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72 ring(ERR_get_err
1920: 6f 72 28 29 29 29 3b 0a 09 20 20 20 20 73 74 61 or()));.. sta
1930: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
1940: 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b TLS_TCL_HANDSHAK
1950: 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 2a E_FAILED;.. *
1960: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
1970: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 CONNABORTED;..
1980: 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 0a 09 return(-1);...
1990: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 case SSL_ERROR_W
19a0: 41 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09 63 61 ANT_CONNECT:..ca
19b0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
19c0: 54 5f 41 43 43 45 50 54 3a 0a 09 63 61 73 65 20 T_ACCEPT:..case
19d0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 SSL_ERROR_WANT_X
19e0: 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 64 65 66 509_LOOKUP:..def
19f0: 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 69 6e ault:.. dprin
1a00: 74 66 28 22 57 65 20 67 6f 74 20 61 20 63 6f 6e tf("We got a con
1a10: 66 75 73 69 6e 67 20 72 65 70 6c 79 3a 20 25 69 fusing reply: %i
1a20: 22 2c 20 72 63 29 3b 0a 09 20 20 20 20 2a 65 72 ", rc);.. *er
1a30: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c rorCodePtr = Tcl
1a40: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 _GetErrno();..
1a50: 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 25 dprintf("ERR(%
1a60: 64 2c 20 25 64 29 20 22 2c 20 72 63 2c 20 2a 65 d, %d) ", rc, *e
1a70: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 rrorCodePtr);..
1a80: 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 20 return(-1);.
1a90: 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 }..#if 0.
1aa0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c if (statePtr->fl
1ab0: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 ags & TLS_TCL_SE
1ac0: 52 56 45 52 29 20 7b 0a 09 64 70 72 69 6e 74 66 RVER) {..dprintf
1ad0: 28 22 54 68 69 73 20 69 73 20 61 6e 20 54 4c 53 ("This is an TLS
1ae0: 20 73 65 72 76 65 72 2c 20 63 68 65 63 6b 69 6e server, checkin
1af0: 67 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 g the certificat
1b00: 65 20 66 6f 72 20 74 68 65 20 70 65 65 72 22 29 e for the peer")
1b10: 3b 0a 0a 09 65 72 72 20 3d 20 53 53 4c 5f 67 65 ;...err = SSL_ge
1b20: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 t_verify_result(
1b30: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
1b40: 09 69 66 20 28 65 72 72 20 21 3d 20 58 35 30 39 .if (err != X509
1b50: 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 64 70 _V_OK) {.. dp
1b60: 72 69 6e 74 66 28 22 49 6e 76 61 6c 69 64 20 63 rintf("Invalid c
1b70: 65 72 74 69 66 69 63 61 74 65 2c 20 72 65 74 75 ertificate, retu
1b80: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
1b90: 22 29 3b 0a 0a 09 20 20 20 20 54 6c 73 5f 45 72 ");... Tls_Er
1ba0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 ror(statePtr, (c
1bb0: 68 61 72 20 2a 29 58 35 30 39 5f 76 65 72 69 66 har *)X509_verif
1bc0: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
1bd0: 69 6e 67 28 65 72 72 29 29 3b 0a 09 20 20 20 20 ing(err));..
1be0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
1bf0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 |= TLS_TCL_HANDS
1c00: 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 HAKE_FAILED;..
1c10: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
1c20: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a = ECONNABORTED;.
1c30: 09 20 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b . return(-1);
1c40: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ..}. }.#endif
1c50: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
1c60: 65 6d 6f 76 69 6e 67 20 74 68 65 20 5c 22 54 4c emoving the \"TL
1c70: 53 5f 54 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 S_TCL_INIT\" fla
1c80: 67 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 g since we have
1c90: 63 6f 6d 70 6c 65 74 65 64 20 74 68 65 20 68 61 completed the ha
1ca0: 6e 64 73 68 61 6b 65 22 29 3b 0a 20 20 20 20 73 ndshake");. s
1cb0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
1cc0: 3d 20 7e 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b = ~TLS_TCL_INIT;
1cd0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
1ce0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 eturning in succ
1cf0: 65 73 73 22 29 3b 0a 20 20 20 20 2a 65 72 72 6f ess");. *erro
1d00: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 20 20 rCodePtr = 0;.
1d10: 20 20 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a return(0);.}..
1d20: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
1d70: 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 lsInputProc --.
1d80: 2a 0a 20 2a 20 20 20 20 54 68 69 73 20 70 72 6f *. * This pro
1d90: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
1da0: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 d by the generic
1db0: 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 IO level. *
1dc0: 20 20 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 to read input
1dd0: 20 66 72 6f 6d 20 61 20 53 53 4c 20 73 6f 63 6b from a SSL sock
1de0: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
1df0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
1e00: 0a 20 2a 20 20 20 20 54 68 65 20 6e 75 6d 62 65 . * The numbe
1e10: 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 r of bytes read
1e20: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 72 20 2d is returned or -
1e30: 31 20 6f 6e 20 65 72 72 6f 72 2e 20 41 6e 20 6f 1 on error. An o
1e40: 75 74 70 75 74 0a 20 2a 20 20 20 20 61 72 67 75 utput. * argu
1e50: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 ment contains th
1e60: 65 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f e POSIX error co
1e70: 64 65 20 6f 6e 20 65 72 72 6f 72 2c 20 6f 72 20 de on error, or
1e80: 7a 65 72 6f 20 69 66 20 6e 6f 0a 20 2a 20 20 20 zero if no. *
1e90: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2e error occurred.
1ea0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
1eb0: 63 74 73 3a 0a 20 2a 20 20 20 20 52 65 61 64 73 cts:. * Reads
1ec0: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 input from the
1ed0: 69 6e 70 75 74 20 64 65 76 69 63 65 20 6f 66 20 input device of
1ee0: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a the channel.. *.
1ef0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f30: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
1f40: 20 69 6e 74 20 54 6c 73 49 6e 70 75 74 50 72 6f int TlsInputPro
1f50: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
1f60: 74 61 6e 63 65 44 61 74 61 2c 20 63 68 61 72 20 tanceData, char
1f70: 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 53 69 7a *buf, int bufSiz
1f80: 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 e, int *errorCod
1f90: 65 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 ePtr) {. unsi
1fa0: 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e gned long backin
1fb0: 67 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 gError;. Stat
1fc0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
1fd0: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 tate *) instance
1fe0: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 Data;. int by
1ff0: 74 65 73 52 65 61 64 3b 0a 20 20 20 20 69 6e 74 tesRead;. int
2000: 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 20 20 20 tlsConnect;.
2010: 20 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 20 2a int err;.. *
2020: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 errorCodePtr = 0
2030: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
2040: 42 49 4f 5f 72 65 61 64 28 25 64 29 22 2c 20 62 BIO_read(%d)", b
2050: 75 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 ufSize);.. if
2060: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 (statePtr->flag
2070: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c s & TLS_TCL_CALL
2080: 42 41 43 4b 29 20 7b 0a 09 2f 2a 20 64 6f 6e 27 BACK) {../* don'
2090: 74 20 70 72 6f 63 65 73 73 20 61 6e 79 20 62 79 t process any by
20a0: 74 65 73 20 77 68 69 6c 65 20 76 65 72 69 66 79 tes while verify
20b0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e callback is run
20c0: 6e 69 6e 67 20 2a 2f 0a 09 64 70 72 69 6e 74 66 ning */..dprintf
20d0: 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 ("Callback is ru
20e0: 6e 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 20 30 nning, reading 0
20f0: 20 62 79 74 65 73 22 29 3b 0a 09 72 65 74 75 72 bytes");..retur
2100: 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 n(0);. }..
2110: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e dprintf("Callin
2120: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e g Tls_WaitForCon
2130: 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c 73 43 nect");. tlsC
2140: 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 onnect = Tls_Wai
2150: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 tForConnect(stat
2160: 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 ePtr, errorCodeP
2170: 74 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 tr, 0);. if (
2180: 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20 tlsConnect < 0)
2190: 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 {..dprintf("Got
21a0: 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 an error waiting
21b0: 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 to connect (tls
21c0: 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 Connect = %i, *e
21d0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 rrorCodePtr = %i
21e0: 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 )", tlsConnect,
21f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a *errorCodePtr);.
2200: 0a 09 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 ..bytesRead = -1
2210: 3b 0a 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 ;..if (*errorCod
2220: 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 ePtr == ECONNRES
2230: 45 54 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e ET) {.. dprin
2240: 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 tf("Got connecti
2250: 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 on reset");..
2260: 20 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a /* Soft EOF */.
2270: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
2280: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 tr = 0;.. byt
2290: 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 7d 0a 09 esRead = 0;..}..
22a0: 72 65 74 75 72 6e 28 62 79 74 65 73 52 65 61 64 return(bytesRead
22b0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
22c0: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 . * We need
22d0: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c to clear the SSL
22e0: 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 error stack now
22f0: 20 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 because we some
2300: 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 times reach.
2310: 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e * this function
2320: 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 with leftover e
2330: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 rrors in the sta
2340: 63 6b 2e 20 20 49 66 20 42 49 4f 5f 72 65 61 64 ck. If BIO_read
2350: 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 . * returns
2360: 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 -1 and intends E
2370: 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 AGAIN, there is
2380: 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 a leftover error
2390: 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 , it will be.
23a0: 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 * misconstrued
23b0: 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f as an error, no
23c0: 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a t EAGAIN.. *
23d0: 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 . * Alternat
23e0: 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 ively, we may wa
23f0: 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 nt to handle the
2400: 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 <0 return codes
2410: 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f from. * BIO
2420: 5f 72 65 61 64 20 73 70 65 63 69 61 6c 6c 79 20 _read specially
2430: 28 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 (as advised in t
2440: 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 he RSA docs). T
2450: 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c LS's lower level
2460: 20 42 49 4f 0a 20 20 20 20 20 2a 20 66 75 6e 63 BIO. * func
2470: 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 tions play with
2480: 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 the retry flags
2490: 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 though, and this
24a0: 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 0a 20 seems to work.
24b0: 20 20 20 20 2a 20 63 6f 72 72 65 63 74 6c 79 2e * correctly.
24c0: 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e Similar fix in
24d0: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e 20 TlsOutputProc.
24e0: 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a - hobbs. */.
24f0: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
2500: 72 6f 72 28 29 3b 0a 20 20 20 20 62 79 74 65 73 ror();. bytes
2510: 52 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 Read = BIO_read(
2520: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 statePtr->bio, b
2530: 75 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 uf, bufSize);.
2540: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 dprintf("BIO_r
2550: 65 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 ead -> %d", byte
2560: 73 52 65 61 64 29 3b 0a 0a 20 20 20 20 65 72 72 sRead);.. err
2570: 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 = SSL_get_error
2580: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
2590: 62 79 74 65 73 52 65 61 64 29 3b 0a 0a 23 69 66 bytesRead);..#if
25a0: 20 30 0a 20 20 20 20 69 66 20 28 62 79 74 65 73 0. if (bytes
25b0: 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 69 66 Read <= 0) {..if
25c0: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 (BIO_should_ret
25d0: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ry(statePtr->bio
25e0: 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 )) {.. dprint
25f0: 66 28 22 49 2f 4f 20 66 61 69 6c 65 64 2c 20 77 f("I/O failed, w
2600: 69 6c 6c 20 72 65 74 72 79 20 62 61 73 65 64 20 ill retry based
2610: 6f 6e 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 on EAGAIN");..
2620: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
2630: 3d 20 45 41 47 41 49 4e 3b 0a 09 7d 0a 20 20 20 = EAGAIN;..}.
2640: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 }.#endif.. s
2650: 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 63 witch (err) {..c
2660: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f ase SSL_ERROR_NO
2670: 4e 45 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 42 NE:.. dprintB
2680: 75 66 66 65 72 28 62 75 66 2c 20 62 79 74 65 73 uffer(buf, bytes
2690: 52 65 61 64 29 3b 0a 09 20 20 20 20 62 72 65 61 Read);.. brea
26a0: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 k;...case SSL_ER
26b0: 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 64 70 ROR_SSL:.. dp
26c0: 72 69 6e 74 66 28 22 53 53 4c 20 6e 65 67 6f 74 rintf("SSL negot
26d0: 69 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 69 6e iation error, in
26e0: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 dicating that th
26f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 e connection has
2700: 20 62 65 65 6e 20 61 62 6f 72 74 65 64 22 29 3b been aborted");
2710: 0a 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 ... Tls_Error
2720: 28 73 74 61 74 65 50 74 72 2c 20 54 43 4c 54 4c (statePtr, TCLTL
2730: 53 5f 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 S_SSL_ERROR(stat
2740: 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 ePtr->ssl, bytes
2750: 52 65 61 64 29 29 3b 0a 09 20 20 20 20 2a 65 72 Read));.. *er
2760: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f rorCodePtr = ECO
2770: 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 NNABORTED;..
2780: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a bytesRead = -1;.
2790: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 . break;...ca
27a0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 se SSL_ERROR_SYS
27b0: 43 41 4c 4c 3a 0a 09 20 20 20 20 62 61 63 6b 69 CALL:.. backi
27c0: 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 ngError = ERR_ge
27d0: 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 20 20 20 t_error();...
27e0: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f if (backingErro
27f0: 72 20 3d 3d 20 30 20 26 26 20 62 79 74 65 73 52 r == 0 && bytesR
2800: 65 61 64 20 3d 3d 20 30 29 20 7b 0a 09 09 64 70 ead == 0) {...dp
2810: 72 69 6e 74 66 28 22 45 4f 46 20 72 65 61 63 68 rintf("EOF reach
2820: 65 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 ed")...*errorCod
2830: 65 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 ePtr = 0;...byte
2840: 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 sRead = 0;..
2850: 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b 69 } else if (backi
2860: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 ngError == 0 &&
2870: 62 79 74 65 73 52 65 61 64 20 3d 3d 20 2d 31 29 bytesRead == -1)
2880: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f {...dprintf("I/
2890: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 O error occurred
28a0: 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c (errno = %lu)",
28b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
28c0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 Tcl_GetErrno())
28d0: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 ;...*errorCodePt
28e0: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f r = Tcl_GetErrno
28f0: 28 29 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 ();...bytesRead
2900: 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 = -1;.. } els
2910: 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 e {...dprintf("I
2920: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 /O error occurre
2930: 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 d (backingError
2940: 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 = %lu)", backing
2950: 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 Error);...*error
2960: 43 6f 64 65 50 74 72 20 3d 20 62 61 63 6b 69 6e CodePtr = backin
2970: 67 45 72 72 6f 72 3b 0a 09 09 62 79 74 65 73 52 gError;...bytesR
2980: 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 7d ead = -1;.. }
2990: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 .. break;...c
29a0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
29b0: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 RO_RETURN:..
29c0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c dprintf("Got SSL
29d0: 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 _ERROR_ZERO_RETU
29e0: 52 4e 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 61 RN, this means a
29f0: 6e 20 45 4f 46 20 68 61 73 20 62 65 65 6e 20 72 n EOF has been r
2a00: 65 61 63 68 65 64 22 29 3b 0a 09 20 20 20 20 62 eached");.. b
2a10: 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 ytesRead = 0;..
2a20: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
2a30: 20 3d 20 30 3b 0a 09 20 20 20 20 62 72 65 61 6b = 0;.. break
2a40: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
2a50: 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 OR_WANT_READ:..
2a60: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
2a70: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 SSL_ERROR_WANT_R
2a80: 45 41 44 2c 20 6d 61 70 70 69 6e 67 20 74 68 69 EAD, mapping thi
2a90: 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 s to EAGAIN");..
2aa0: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
2ab0: 2d 31 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 -1;.. *errorC
2ac0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
2ad0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64 .. break;...d
2ae0: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 efault:.. dpr
2af0: 69 6e 74 66 28 22 55 6e 6b 6e 6f 77 6e 20 65 72 intf("Unknown er
2b00: 72 6f 72 20 28 65 72 72 20 3d 20 25 69 29 2c 20 ror (err = %i),
2b10: 6d 61 70 70 69 6e 67 20 74 6f 20 45 4f 46 22 2c mapping to EOF",
2b20: 20 65 72 72 29 3b 0a 09 20 20 20 20 2a 65 72 72 err);.. *err
2b30: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 orCodePtr = 0;..
2b40: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
2b50: 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 0;.. break;.
2b60: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
2b70: 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d 3e 20 f("Input(%d) ->
2b80: 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 69 7a %d [%d]", bufSiz
2b90: 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20 2a 65 e, bytesRead, *e
2ba0: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20 20 rrorCodePtr);.
2bb0: 20 20 72 65 74 75 72 6e 28 62 79 74 65 73 52 65 return(bytesRe
2bc0: 61 64 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ad);.}../*. *---
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c10: 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70 75 74 . *. * TlsOutput
2c20: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 Proc --. *. *
2c30: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 This procedure
2c40: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 is invoked by th
2c50: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 e generic IO lev
2c60: 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 77 el. * to w
2c70: 72 69 74 65 20 6f 75 74 70 75 74 20 74 6f 20 61 rite output to a
2c80: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
2c90: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a d channel.. *. *
2ca0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 Results:. *
2cb0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 The number of by
2cc0: 74 65 73 20 77 72 69 74 74 65 6e 20 69 73 20 72 tes written is r
2cd0: 65 74 75 72 6e 65 64 2e 20 41 6e 20 6f 75 74 70 eturned. An outp
2ce0: 75 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 ut argument is.
2cf0: 2a 20 20 20 20 73 65 74 20 74 6f 20 61 20 50 4f * set to a PO
2d00: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 SIX error code i
2d10: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 f an error occur
2d20: 72 65 64 2c 20 6f 72 20 7a 65 72 6f 2e 0a 20 2a red, or zero.. *
2d30: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2d40: 3a 0a 20 2a 20 20 20 20 57 72 69 74 65 73 20 6f :. * Writes o
2d50: 75 74 70 75 74 20 6f 6e 20 74 68 65 20 6f 75 74 utput on the out
2d60: 70 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 68 put device of th
2d70: 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a e channel.. *. *
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2dc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
2dd0: 6e 74 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 nt TlsOutputProc
2de0: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
2df0: 61 6e 63 65 44 61 74 61 2c 20 63 6f 6e 73 74 20 anceData, const
2e00: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 char *buf, int t
2e10: 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 oWrite, int *err
2e20: 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 orCodePtr) {.
2e30: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 unsigned long b
2e40: 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 ackingError;.
2e50: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
2e60: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
2e70: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 tanceData;. i
2e80: 6e 74 20 77 72 69 74 74 65 6e 2c 20 65 72 72 3b nt written, err;
2e90: 0a 20 20 20 20 69 6e 74 20 74 6c 73 43 6f 6e 6e . int tlsConn
2ea0: 65 63 74 3b 0a 0a 20 20 20 20 2a 65 72 72 6f 72 ect;.. *error
2eb0: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 CodePtr = 0;..
2ec0: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 77 dprintf("BIO_w
2ed0: 72 69 74 65 28 25 70 2c 20 25 64 29 22 2c 20 28 rite(%p, %d)", (
2ee0: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 void *) statePtr
2ef0: 2c 20 74 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 , toWrite);.
2f00: 64 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 dprintBuffer(buf
2f10: 2c 20 74 6f 57 72 69 74 65 29 3b 0a 0a 20 20 20 , toWrite);..
2f20: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 if (statePtr->f
2f30: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 lags & TLS_TCL_C
2f40: 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 ALLBACK) {..dpri
2f50: 6e 74 66 28 22 44 6f 6e 27 74 20 70 72 6f 63 65 ntf("Don't proce
2f60: 73 73 20 6f 75 74 70 75 74 20 77 68 69 6c 65 20 ss output while
2f70: 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20 72 75 callbacks are ru
2f80: 6e 6e 69 6e 67 22 29 3b 0a 09 77 72 69 74 74 65 nning");..writte
2f90: 6e 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 n = -1;..*errorC
2fa0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
2fb0: 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 20 20 ..return(-1);.
2fc0: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
2fd0: 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 ("Calling Tls_Wa
2fe0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a itForConnect");.
2ff0: 20 20 20 20 74 6c 73 43 6f 6e 6e 65 63 74 20 3d tlsConnect =
3000: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
3010: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 ect(statePtr, er
3020: 72 6f 72 43 6f 64 65 50 74 72 2c 20 31 29 3b 0a rorCodePtr, 1);.
3030: 20 20 20 20 69 66 20 28 74 6c 73 43 6f 6e 6e 65 if (tlsConne
3040: 63 74 20 3c 20 30 29 20 7b 0a 09 64 70 72 69 6e ct < 0) {..dprin
3050: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 tf("Got an error
3060: 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e waiting to conn
3070: 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 ect (tlsConnect
3080: 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65 = %i, *errorCode
3090: 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73 43 Ptr = %i)", tlsC
30a0: 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43 6f onnect, *errorCo
30b0: 64 65 50 74 72 29 3b 0a 0a 09 77 72 69 74 74 65 dePtr);...writte
30c0: 6e 20 3d 20 2d 31 3b 0a 09 69 66 20 28 2a 65 72 n = -1;..if (*er
30d0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 rorCodePtr == EC
30e0: 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 20 20 20 ONNRESET) {..
30f0: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f dprintf("Got co
3100: 6e 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 nnection reset")
3110: 3b 0a 09 20 20 20 20 2f 2a 20 53 6f 66 74 20 45 ;.. /* Soft E
3120: 4f 46 20 2a 2f 0a 09 20 20 20 20 2a 65 72 72 6f OF */.. *erro
3130: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 rCodePtr = 0;..
3140: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a written = 0;.
3150: 09 7d 0a 09 72 65 74 75 72 6e 28 77 72 69 74 74 .}..return(writt
3160: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 en);. }..
3170: 69 66 20 28 74 6f 57 72 69 74 65 20 3d 3d 20 30 if (toWrite == 0
3180: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 7a 65 ) {..dprintf("ze
3190: 72 6f 2d 77 72 69 74 65 22 29 3b 0a 09 65 72 72 ro-write");..err
31a0: 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 = BIO_flush(sta
31b0: 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 69 tePtr->bio);...i
31c0: 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 f (err <= 0) {..
31d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 46 6c 75 dprintf("Flu
31e0: 73 68 69 6e 67 20 66 61 69 6c 65 64 22 29 3b 0a shing failed");.
31f0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
3200: 50 74 72 20 3d 20 45 49 4f 3b 0a 09 20 20 20 20 Ptr = EIO;..
3210: 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 written = 0;..
3220: 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d return(-1);..}
3230: 0a 0a 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a ...written = 0;.
3240: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
3250: 20 30 3b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 0;..return(0);.
3260: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
3270: 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 * We need to
3280: 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65 72 clear the SSL er
3290: 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62 65 ror stack now be
32a0: 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69 6d cause we sometim
32b0: 65 73 20 72 65 61 63 68 0a 20 20 20 20 20 2a 20 es reach. *
32c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 this function wi
32d0: 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f th leftover erro
32e0: 72 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b 2e rs in the stack.
32f0: 20 20 49 66 20 42 49 4f 5f 77 72 69 74 65 0a 20 If BIO_write.
3300: 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d 31 * returns -1
3310: 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41 47 and intends EAG
3320: 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61 20 AIN, there is a
3330: 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c 20 leftover error,
3340: 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 it will be.
3350: 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20 61 * misconstrued a
3360: 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20 s an error, not
3370: 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a 20 EAGAIN.. *.
3380: 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 * Alternativ
3390: 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e 74 ely, we may want
33a0: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 3c to handle the <
33b0: 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 66 0 return codes f
33c0: 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f 77 rom. * BIO_w
33d0: 72 69 74 65 20 73 70 65 63 69 61 6c 6c 79 20 28 rite specially (
33e0: 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 68 as advised in th
33f0: 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c e RSA docs). TL
3400: 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 0a S's lower level.
3410: 20 20 20 20 20 2a 20 42 49 4f 20 66 75 6e 63 74 * BIO funct
3420: 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 74 ions play with t
3430: 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 74 he retry flags t
3440: 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 20 hough, and this
3450: 73 65 65 6d 73 20 74 6f 0a 20 20 20 20 20 2a 20 seems to. *
3460: 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 work correctly.
3470: 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e 20 Similar fix in
3480: 54 6c 73 49 6e 70 75 74 50 72 6f 63 2e 20 2d 20 TlsInputProc. -
3490: 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20 20 hobbs. */.
34a0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
34b0: 72 28 29 3b 0a 20 20 20 20 77 72 69 74 74 65 6e r();. written
34c0: 20 3d 20 42 49 4f 5f 77 72 69 74 65 28 73 74 61 = BIO_write(sta
34d0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c tePtr->bio, buf,
34e0: 20 74 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 64 toWrite);. d
34f0: 70 72 69 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 printf("BIO_writ
3500: 65 28 25 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64 e(%p, %d) -> [%d
3510: 5d 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 ]", (void *) sta
3520: 74 65 50 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 tePtr, toWrite,
3530: 77 72 69 74 74 65 6e 29 3b 0a 0a 20 20 20 20 65 written);.. e
3540: 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 rr = SSL_get_err
3550: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c or(statePtr->ssl
3560: 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 , written);.
3570: 73 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 switch (err) {..
3580: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e case SSL_ERROR_N
3590: 4f 4e 45 3a 0a 09 20 20 20 20 69 66 20 28 77 72 ONE:.. if (wr
35a0: 69 74 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09 77 itten < 0) {...w
35b0: 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 ritten = 0;..
35c0: 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a }.. break;..
35d0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
35e0: 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 WANT_WRITE:..
35f0: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 dprintf("Got SS
3600: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 L_ERROR_WANT_WRI
3610: 54 45 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 TE, mapping it t
3620: 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 o EAGAIN");..
3630: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
3640: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 EAGAIN;.. wr
3650: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 itten = -1;..
3660: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 break;...case S
3670: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
3680: 41 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 AD:.. dprintf
3690: 28 22 20 77 72 69 74 65 20 52 20 42 4c 4f 43 4b (" write R BLOCK
36a0: 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ");.. break;.
36b0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 ..case SSL_ERROR
36c0: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 _WANT_X509_LOOKU
36d0: 50 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 P:.. dprintf(
36e0: 22 20 77 72 69 74 65 20 58 20 42 4c 4f 43 4b 22 " write X BLOCK"
36f0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a );.. break;..
3700: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
3710: 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 ZERO_RETURN:..
3720: 20 20 64 70 72 69 6e 74 66 28 22 20 63 6c 6f 73 dprintf(" clos
3730: 65 64 22 29 3b 0a 09 20 20 20 20 77 72 69 74 74 ed");.. writt
3740: 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72 en = 0;.. *er
3750: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
3760: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 . break;...ca
3770: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 se SSL_ERROR_SYS
3780: 43 41 4c 4c 3a 0a 09 20 20 20 20 62 61 63 6b 69 CALL:.. backi
3790: 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 ngError = ERR_ge
37a0: 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 20 20 20 t_error();...
37b0: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f if (backingErro
37c0: 72 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 r == 0 && writte
37d0: 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 n == 0) {...dpri
37e0: 6e 74 66 28 22 45 4f 46 20 72 65 61 63 68 65 64 ntf("EOF reached
37f0: 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 ")...*errorCodeP
3800: 74 72 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 tr = 0;...writte
3810: 6e 20 3d 20 30 3b 0a 09 20 20 20 20 7d 20 65 6c n = 0;.. } el
3820: 73 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 se if (backingEr
3830: 72 6f 72 20 3d 3d 20 30 20 26 26 20 77 72 69 74 ror == 0 && writ
3840: 74 65 6e 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 ten == -1) {...d
3850: 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f printf("I/O erro
3860: 72 20 6f 63 63 75 72 72 65 64 20 28 65 72 72 6e r occurred (errn
3870: 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 o = %lu)", (unsi
3880: 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 gned long) Tcl_G
3890: 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 etErrno());...*e
38a0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 rrorCodePtr = Tc
38b0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 l_GetErrno();...
38c0: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 written = -1;..
38d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 } else {...dp
38e0: 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 rintf("I/O error
38f0: 20 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b 69 occurred (backi
3900: 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c ngError = %lu)",
3910: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a backingError);.
3920: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
3930: 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a = backingError;.
3940: 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a ..written = -1;.
3950: 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 . }.. brea
3960: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 k;...case SSL_ER
3970: 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 54 6c ROR_SSL:.. Tl
3980: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
3990: 2c 20 54 43 4c 54 4c 53 5f 53 53 4c 5f 45 52 52 , TCLTLS_SSL_ERR
39a0: 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c OR(statePtr->ssl
39b0: 2c 20 77 72 69 74 74 65 6e 29 29 3b 0a 09 20 20 , written));..
39c0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
39d0: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a = ECONNABORTED;.
39e0: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d . written = -
39f0: 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 1;.. break;..
3a00: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 .default:.. d
3a10: 70 72 69 6e 74 66 28 22 20 75 6e 6b 6e 6f 77 6e printf(" unknown
3a20: 20 65 72 72 3a 20 25 64 22 2c 20 65 72 72 29 3b err: %d", err);
3a30: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 .. break;.
3a40: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
3a50: 22 4f 75 74 70 75 74 28 25 64 29 20 2d 3e 20 25 "Output(%d) -> %
3a60: 64 22 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 d", toWrite, wri
3a70: 74 74 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 tten);. retur
3a80: 6e 28 77 72 69 74 74 65 6e 29 3b 0a 7d 0a 0a 2f n(written);.}../
3a90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ad0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
3ae0: 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d sSetOptionProc -
3af0: 2d 0a 20 2a 0a 20 2a 20 20 20 20 43 6f 6d 70 75 -. *. * Compu
3b00: 74 65 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61 tes an option va
3b10: 6c 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f lue for a SSL so
3b20: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
3b30: 65 6c 2c 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c el, or a. * l
3b40: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f ist of all optio
3b50: 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c ns and their val
3b60: 75 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ues.. *. * Resul
3b70: 74 73 3a 0a 20 2a 20 20 20 20 41 20 73 74 61 6e ts:. * A stan
3b80: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
3b90: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 The value of th
3ba0: 65 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 69 e specified opti
3bb0: 6f 6e 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69 on or a. * li
3bc0: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e st of all option
3bd0: 73 20 61 6e 64 20 20 20 20 74 68 65 69 72 20 76 s and their v
3be0: 61 6c 75 65 73 20 69 73 20 72 65 74 75 72 6e 65 alues is returne
3bf0: 64 20 69 6e 20 74 68 65 0a 20 2a 20 20 20 20 73 d in the. * s
3c00: 75 70 70 6c 69 65 64 20 44 53 74 72 69 6e 67 2e upplied DString.
3c10: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3c20: 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e cts:. * None.
3c30: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
3c80: 61 74 69 63 20 69 6e 74 0a 54 6c 73 53 65 74 4f atic int.TlsSetO
3c90: 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 ptionProc(Client
3ca0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
3cb0: 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 a, /* Socket
3cc0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 state. */. Tc
3cd0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
3ce0: 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 ,../* For errors
3cf0: 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 - can be NULL.
3d00: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 */. const cha
3d10: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f r *optionName,./
3d20: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 * Name of the op
3d30: 74 69 6f 6e 20 74 6f 20 73 65 74 20 74 68 65 20 tion to set the
3d40: 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 0a 09 09 value for, or...
3d50: 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 67 65 74 .. * NULL to get
3d60: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 all options and
3d70: 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20 2a their values. *
3d80: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 /. const char
3d90: 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 09 2f *optionValue)./
3da0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 6f 70 74 69 * Value for opti
3db0: 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 on. */.{. Sta
3dc0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
3dd0: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
3de0: 65 44 61 74 61 3b 0a 0a 20 20 20 20 54 63 6c 5f eData;.. Tcl_
3df0: 43 68 61 6e 6e 65 6c 20 64 6f 77 6e 43 68 61 6e Channel downChan
3e00: 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 = Tls_GetParent
3e10: 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 (statePtr, TLS_T
3e20: 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 CL_FASTPATH);.
3e30: 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f Tcl_DriverSetO
3e40: 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 ptionProc *setOp
3e50: 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 73 tionProc;.. s
3e60: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 etOptionProc = T
3e70: 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 cl_ChannelSetOpt
3e80: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 ionProc(Tcl_GetC
3e90: 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 hannelType(downC
3ea0: 68 61 6e 29 29 3b 0a 20 20 20 20 69 66 20 28 73 han));. if (s
3eb0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 etOptionProc !=
3ec0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
3ed0: 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 (*setOptionProc)
3ee0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 (Tcl_GetChannelI
3ef0: 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e nstanceData(down
3f00: 43 68 61 6e 29 2c 20 69 6e 74 65 72 70 2c 20 6f Chan), interp, o
3f10: 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f ptionName, optio
3f20: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 nValue);. } e
3f30: 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 lse if (optionNa
3f40: 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 me == (char*) NU
3f50: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 LL) {../*.. * Re
3f60: 71 75 65 73 74 20 69 73 20 71 75 65 72 79 20 66 quest is query f
3f70: 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 or all options,
3f80: 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f this is ok... */
3f90: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b ..return TCL_OK;
3fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 . }. /*.
3fb0: 20 20 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 * Request for
3fc0: 20 61 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 a specific opti
3fd0: 6f 6e 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 on has to fail,
3fe0: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e we don't have an
3ff0: 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 y.. */. r
4000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
4010: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
4060: 20 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 * TlsGetOptionP
4070: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 roc --. *. *
4080: 43 6f 6d 70 75 74 65 73 20 61 6e 20 6f 70 74 69 Computes an opti
4090: 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 53 on value for a S
40a0: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 SL socket based
40b0: 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a 20 2a channel, or a. *
40c0: 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 list of all
40d0: 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 options and thei
40e0: 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a 20 r values.. *. *
40f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 41 Results:. * A
4100: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
4110: 73 75 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 20 sult. The value
4120: 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 of the specified
4130: 20 6f 70 74 69 6f 6e 20 6f 72 20 61 0a 20 2a 20 option or a. *
4140: 20 20 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f list of all o
4150: 70 74 69 6f 6e 73 20 61 6e 64 20 20 20 20 74 68 ptions and th
4160: 65 69 72 20 76 61 6c 75 65 73 20 69 73 20 72 65 eir values is re
4170: 74 75 72 6e 65 64 20 69 6e 20 74 68 65 0a 20 2a turned in the. *
4180: 20 20 20 20 73 75 70 70 6c 69 65 64 20 44 53 74 supplied DSt
4190: 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 ring.. *. * Side
41a0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 effects:. *
41b0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
4200: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c */.static int.Tl
4210: 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 sGetOptionProc(C
4220: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
4230: 63 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f ceData, /* So
4240: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 cket state. */.
4250: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
4260: 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 nterp,../* For e
4270: 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 4e rrors - can be N
4280: 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 ULL. */. cons
4290: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 t char *optionNa
42a0: 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 me,./* Name of t
42b0: 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20 72 65 74 he option to ret
42c0: 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 65 20 rieve the value
42d0: 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e for, or..... * N
42e0: 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f ULL to get all o
42f0: 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 ptions and their
4300: 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 values. */.
4310: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 Tcl_DString *dsP
4320: 74 72 29 09 09 2f 2a 20 57 68 65 72 65 20 74 6f tr)../* Where to
4330: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6d 70 75 store the compu
4340: 74 65 64 20 76 61 6c 75 65 20 69 6e 69 74 69 61 ted value initia
4350: 6c 69 7a 65 64 20 62 79 20 63 61 6c 6c 65 72 2e lized by caller.
4360: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 */.{. State
4370: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
4380: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 te *) instanceDa
4390: 74 61 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 68 61 ta;.. Tcl_Cha
43a0: 6e 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 nnel downChan =
43b0: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 Tls_GetParent(st
43c0: 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f atePtr, TLS_TCL_
43d0: 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20 54 FASTPATH);. T
43e0: 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 cl_DriverGetOpti
43f0: 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f onProc *getOptio
4400: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 67 65 74 4f nProc;.. getO
4410: 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f ptionProc = Tcl_
4420: 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e ChannelGetOption
4430: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e Proc(Tcl_GetChan
4440: 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e nelType(downChan
4450: 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f ));. if (getO
4460: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c ptionProc != NUL
4470: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67 L) {..return (*g
4480: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 etOptionProc)(Tc
4490: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
44a0: 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 61 anceData(downCha
44b0: 6e 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 n), interp, opti
44c0: 6f 6e 4e 61 6d 65 2c 20 64 73 50 74 72 29 3b 0a onName, dsPtr);.
44d0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f } else if (o
44e0: 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 ptionName == (ch
44f0: 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a ar*) NULL) {../*
4500: 0a 09 20 2a 20 52 65 71 75 65 73 74 20 69 73 20 .. * Request is
4510: 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 query for all op
4520: 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f tions, this is o
4530: 6b 2e 0a 09 20 2a 2f 0a 09 72 65 74 75 72 6e 20 k... */..return
4540: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 TCL_OK;. }.
4550: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 71 75 /*. * Requ
4560: 65 73 74 20 66 6f 72 20 61 20 73 70 65 63 69 66 est for a specif
4570: 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f ic option has to
4580: 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 fail, we don't
4590: 68 61 76 65 20 61 6e 79 2e 0a 20 20 20 20 20 2a have any.. *
45a0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c /. return TCL
45b0: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 20 2a _ERROR;.}../*. *
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4600: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 61 74 ---. *. * TlsWat
4610: 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 chProc --. *. *
4620: 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 Initialize th
4630: 65 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 e notifier to wa
4640: 74 63 68 20 54 63 6c 5f 46 69 6c 65 73 20 66 72 tch Tcl_Files fr
4650: 6f 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e om this channel.
4660: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
4670: 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 * None.. *.
4680: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
4690: 20 2a 20 20 20 20 53 65 74 73 20 75 70 20 74 68 * Sets up th
46a0: 65 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 74 68 e notifier so th
46b0: 61 74 20 61 20 66 75 74 75 72 65 20 65 76 65 6e at a future even
46c0: 74 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c t on the channel
46d0: 0a 20 2a 20 20 20 20 77 69 6c 6c 20 62 65 20 73 . * will be s
46e0: 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20 2a 0a 20 een by Tcl.. *.
46f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4730: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4740: 76 6f 69 64 0a 54 6c 73 57 61 74 63 68 50 72 6f void.TlsWatchPro
4750: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
4760: 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a tanceData, /*
4770: 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 The socket stat
4780: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 e. */. int ma
4790: 73 6b 29 09 09 2f 2a 20 45 76 65 6e 74 73 20 6f sk)../* Events o
47a0: 66 20 69 6e 74 65 72 65 73 74 3b 20 61 6e 20 4f f interest; an O
47b0: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e R-ed combination
47c0: 20 6f 66 0a 09 09 09 2a 20 54 43 4c 5f 52 45 41 of....* TCL_REA
47d0: 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 DABLE, TCL_WRITA
47e0: 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 BLE and TCL_EXCE
47f0: 50 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 PTION. */.{.
4800: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 Tcl_Channel
4810: 64 6f 77 6e 43 68 61 6e 3b 0a 20 20 20 20 53 74 downChan;. St
4820: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
4830: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
4840: 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ceData;.. dpr
4850: 69 6e 74 66 28 22 54 6c 73 57 61 74 63 68 50 72 intf("TlsWatchPr
4860: 6f 63 28 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 oc(0x%x)", mask)
4870: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 65 6e ;.. /* Preten
4880: 64 20 74 6f 20 62 65 20 64 65 61 64 20 61 73 20 d to be dead as
4890: 6c 6f 6e 67 20 61 73 20 74 68 65 20 76 65 72 69 long as the veri
48a0: 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 fy callback is r
48b0: 75 6e 6e 69 6e 67 2e 0a 20 20 20 20 20 2a 20 4f unning.. * O
48c0: 74 68 65 72 77 69 73 65 20 74 68 61 74 20 63 61 therwise that ca
48d0: 6c 6c 62 61 63 6b 20 63 6f 75 6c 64 20 62 65 20 llback could be
48e0: 69 6e 76 6f 6b 65 64 20 72 65 63 75 72 73 69 76 invoked recursiv
48f0: 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 ely. */. if (
4900: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
4910: 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 & TLS_TCL_CALLBA
4920: 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 CK) {..dprintf("
4930: 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67 Callback is on-g
4940: 6f 69 6e 67 2c 20 64 6f 69 6e 67 20 6e 6f 74 68 oing, doing noth
4950: 69 6e 67 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a ing");..return;.
4960: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
4970: 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 tFlags(statePtr)
4980: 3b 0a 0a 20 20 20 20 64 6f 77 6e 43 68 61 6e 20 ;.. downChan
4990: 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 = Tls_GetParent(
49a0: 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 statePtr, TLS_TC
49b0: 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 0a 20 20 L_FASTPATH);..
49c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
49d0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
49e0: 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 HANDSHAKE_FAILED
49f0: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 ) {..dprintf("As
4a00: 6b 65 64 20 74 6f 20 77 61 74 63 68 20 61 20 73 ked to watch a s
4a10: 6f 63 6b 65 74 20 77 69 74 68 20 61 20 66 61 69 ocket with a fai
4a20: 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 20 2d 2d led handshake --
4a30: 20 6e 6f 74 68 69 6e 67 20 63 61 6e 20 68 61 70 nothing can hap
4a40: 70 65 6e 20 68 65 72 65 22 29 3b 0a 09 64 70 72 pen here");..dpr
4a50: 69 6e 74 66 28 22 55 6e 72 65 67 69 73 74 65 72 intf("Unregister
4a60: 69 6e 67 20 69 6e 74 65 72 65 73 74 20 69 6e 20 ing interest in
4a70: 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 the lower channe
4a80: 6c 22 29 3b 0a 0a 09 28 54 63 6c 5f 47 65 74 43 l");...(Tcl_GetC
4a90: 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 hannelType(downC
4aa0: 68 61 6e 29 29 2d 3e 77 61 74 63 68 50 72 6f 63 han))->watchProc
4ab0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 (Tcl_GetChannelI
4ac0: 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e nstanceData(down
4ad0: 43 68 61 6e 29 2c 20 30 29 3b 0a 09 73 74 61 74 Chan), 0);..stat
4ae0: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 ePtr->watchMask
4af0: 3d 20 30 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 = 0;..return;.
4b00: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 }.. statePt
4b10: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d r->watchMask = m
4b20: 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 ask;.. /* No
4b30: 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 channel handlers
4b40: 20 61 6e 79 20 6d 6f 72 65 2e 20 57 65 20 77 69 any more. We wi
4b50: 6c 6c 20 62 65 20 6e 6f 74 69 66 69 65 64 20 61 ll be notified a
4b60: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 20 utomatically.
4b70: 20 20 2a 20 61 62 6f 75 74 20 65 76 65 6e 74 73 * about events
4b80: 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 on the channel
4b90: 62 65 6c 6f 77 20 76 69 61 20 61 20 63 61 6c 6c below via a call
4ba0: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 2a 20 27 to our. * '
4bb0: 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 79 50 TransformNotifyP
4bc0: 72 6f 63 27 2e 20 42 75 74 20 77 65 20 68 61 76 roc'. But we hav
4bd0: 65 20 74 6f 20 70 61 73 73 20 74 68 65 20 69 6e e to pass the in
4be0: 74 65 72 65 73 74 20 64 6f 77 6e 20 6e 6f 77 2e terest down now.
4bf0: 0a 20 20 20 20 20 2a 20 57 65 20 61 72 65 20 61 . * We are a
4c00: 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64 20 61 64 llowed to add ad
4c10: 64 69 74 69 6f 6e 61 6c 20 27 69 6e 74 65 72 65 ditional 'intere
4c20: 73 74 27 20 74 6f 20 74 68 65 20 6d 61 73 6b 20 st' to the mask
4c30: 69 66 20 77 65 20 77 61 6e 74 0a 20 20 20 20 20 if we want.
4c40: 2a 20 74 6f 2e 20 42 75 74 20 74 68 69 73 20 74 * to. But this t
4c50: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68 61 ransformation ha
4c60: 73 20 6e 6f 20 73 75 63 68 20 69 6e 74 65 72 65 s no such intere
4c70: 73 74 2e 20 49 74 20 6a 75 73 74 20 70 61 73 73 st. It just pass
4c80: 65 73 0a 20 20 20 20 20 2a 20 74 68 65 20 72 65 es. * the re
4c90: 71 75 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63 68 quest down, unch
4ca0: 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 anged.. */.
4cb0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 67 69 dprintf("Regi
4cc0: 73 74 65 72 69 6e 67 20 6f 75 72 20 69 6e 74 65 stering our inte
4cd0: 72 65 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 rest in the lowe
4ce0: 72 20 63 68 61 6e 6e 65 6c 20 28 63 68 61 6e 3d r channel (chan=
4cf0: 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 64 %p)", (void *) d
4d00: 6f 77 6e 43 68 61 6e 29 3b 0a 20 20 20 20 28 54 ownChan);. (T
4d10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
4d20: 65 28 64 6f 77 6e 43 68 61 6e 29 29 2d 3e 77 61 e(downChan))->wa
4d30: 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 tchProc(Tcl_GetC
4d40: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
4d50: 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 6d 61 ta(downChan), ma
4d60: 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 sk);.. /*.
4d70: 20 20 2a 20 4d 61 6e 61 67 65 6d 65 6e 74 20 6f * Management o
4d80: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74 f the internal t
4d90: 69 6d 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 imer.. */.
4da0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
4db0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
4dc0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 merToken) NULL)
4dd0: 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 20 74 69 {..dprintf("A ti
4de0: 6d 65 72 20 77 61 73 20 66 6f 75 6e 64 2c 20 64 mer was found, d
4df0: 65 6c 65 74 69 6e 67 20 69 74 22 29 3b 0a 09 54 eleting it");..T
4e00: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
4e10: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
4e20: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
4e30: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
4e40: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
4e50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
4e60: 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 ((mask & TCL_REA
4e70: 44 41 42 4c 45 29 20 26 26 0a 09 28 28 54 63 6c DABLE) &&..((Tcl
4e80: 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 _InputBuffered(s
4e90: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e tatePtr->self) >
4ea0: 20 30 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72 6c 0) || (BIO_ctrl
4eb0: 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 _pending(statePt
4ec0: 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29 29 20 7b r->bio) > 0))) {
4ed0: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
4ee0: 20 54 68 65 72 65 20 69 73 20 69 6e 74 65 72 65 There is intere
4ef0: 73 74 20 69 6e 20 72 65 61 64 61 62 6c 65 20 65 st in readable e
4f00: 76 65 6e 74 73 20 61 6e 64 20 77 65 20 61 63 74 vents and we act
4f10: 75 61 6c 6c 79 20 68 61 76 65 0a 09 20 20 20 20 ually have..
4f20: 20 2a 20 64 61 74 61 20 77 61 69 74 69 6e 67 2c * data waiting,
4f30: 20 73 6f 20 67 65 6e 65 72 61 74 65 20 61 20 74 so generate a t
4f40: 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 74 68 imer to flush th
4f50: 61 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 at... */..
4f60: 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 dprintf("Creat
4f70: 69 6e 67 20 61 20 6e 65 77 20 74 69 6d 65 72 20 ing a new timer
4f80: 73 69 6e 63 65 20 64 61 74 61 20 61 70 70 65 61 since data appea
4f90: 72 73 20 74 6f 20 62 65 20 77 61 69 74 69 6e 67 rs to be waiting
4fa0: 22 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ");.. statePt
4fb0: 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 r->timer = Tcl_C
4fc0: 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 reateTimerHandle
4fd0: 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c r(TLS_TCL_DELAY,
4fe0: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c TlsChannelHandl
4ff0: 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 65 6e 74 erTimer, (Client
5000: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
5010: 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d . }.}../*. *-
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5060: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 48 --. *. * TlsGetH
5070: 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a andleProc --. *.
5080: 20 2a 20 20 20 20 43 61 6c 6c 65 64 20 66 72 6f * Called fro
5090: 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c m Tcl_GetChannel
50a0: 46 69 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 File to retrieve
50b0: 20 6f 2f 73 20 66 69 6c 65 20 68 61 6e 64 6c 65 o/s file handle
50c0: 72 0a 20 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 r. * from the
50d0: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
50e0: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a d channel.. *. *
50f0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 Results:. *
5100: 54 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 The appropriate
5110: 54 63 6c 5f 46 69 6c 65 20 6f 72 20 4e 55 4c 4c Tcl_File or NULL
5120: 20 69 66 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e if not present.
5130: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
5140: 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e cts:. * None.
5150: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
51a0: 61 74 69 63 20 69 6e 74 20 54 6c 73 47 65 74 48 atic int TlsGetH
51b0: 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 andleProc(Client
51c0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
51d0: 61 2c 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e a, int direction
51e0: 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 , ClientData *ha
51f0: 6e 64 6c 65 50 74 72 29 20 7b 0a 20 20 20 20 53 ndlePtr) {. S
5200: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
5210: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
5220: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 72 65 nceData;.. re
5230: 74 75 72 6e 28 54 63 6c 5f 47 65 74 43 68 61 6e turn(Tcl_GetChan
5240: 6e 65 6c 48 61 6e 64 6c 65 28 54 6c 73 5f 47 65 nelHandle(Tls_Ge
5250: 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 tParent(statePtr
5260: 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 , TLS_TCL_FASTPA
5270: 54 48 29 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 TH), direction,
5280: 68 61 6e 64 6c 65 50 74 72 29 29 3b 0a 7d 0a 0a handlePtr));.}..
5290: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
52e0: 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a lsNotifyProc --.
52f0: 20 2a 0a 20 2a 20 20 20 20 48 61 6e 64 6c 65 72 *. * Handler
5300: 20 63 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 called by Tcl t
5310: 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 o inform us of a
5320: 63 74 69 76 69 74 79 0a 20 2a 20 20 20 20 6f 6e ctivity. * on
5330: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
5340: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 channel.. *. * R
5350: 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 4e 6f esults:. * No
5360: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ne.. *. * Side e
5370: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4d 61 ffects:. * Ma
5380: 79 20 70 72 6f 63 65 73 73 20 74 68 65 20 69 6e y process the in
5390: 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 62 79 20 coming event by
53a0: 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d 2d itself.. *. *---
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53f0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
5400: 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c TlsNotifyProc(Cl
5410: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
5420: 65 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 eData, int mask)
5430: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
5440: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
5450: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b *) instanceData;
5460: 0a 20 20 20 20 69 6e 74 20 65 72 72 6f 72 43 6f . int errorCo
5470: 64 65 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 de;.. /*.
5480: 20 2a 20 41 6e 20 65 76 65 6e 74 20 6f 63 63 75 * An event occu
5490: 72 72 65 64 20 69 6e 20 74 68 65 20 75 6e 64 65 rred in the unde
54a0: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 rlying channel.
54b0: 20 54 68 69 73 0a 20 20 20 20 20 2a 20 74 72 61 This. * tra
54c0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 64 6f 65 73 nsformation does
54d0: 6e 27 74 20 70 72 6f 63 65 73 73 20 73 75 63 68 n't process such
54e0: 20 65 76 65 6e 74 73 20 74 68 75 73 20 72 65 74 events thus ret
54f0: 75 72 6e 73 20 74 68 65 0a 20 20 20 20 20 2a 20 urns the. *
5500: 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 6b 20 75 6e incoming mask un
5510: 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f changed.. */
5520: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
5530: 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c r->timer != (Tcl
5540: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
5550: 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 65 6c L) {../*.. * Del
5560: 65 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 ete an existing
5570: 74 69 6d 65 72 2e 20 49 74 20 77 61 73 20 6e 6f timer. It was no
5580: 74 20 66 69 72 65 64 2c 20 79 65 74 20 77 65 20 t fired, yet we
5590: 61 72 65 0a 09 20 2a 20 68 65 72 65 2c 20 73 6f are.. * here, so
55a0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c the channel bel
55b0: 6f 77 20 67 65 6e 65 72 61 74 65 64 20 73 75 63 ow generated suc
55c0: 68 20 61 6e 20 65 76 65 6e 74 20 61 6e 64 20 77 h an event and w
55d0: 65 0a 09 20 2a 20 64 6f 6e 27 74 20 68 61 76 65 e.. * don't have
55e0: 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 61 6c to. The renewal
55f0: 20 6f 66 20 74 68 65 20 69 6e 74 65 72 65 73 74 of the interest
5600: 20 61 66 74 65 72 20 74 68 65 0a 09 20 2a 20 65 after the.. * e
5610: 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 61 6e xecution of chan
5620: 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 69 6c nel handlers wil
5630: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 75 l eventually cau
5640: 73 65 20 75 73 20 74 6f 0a 09 20 2a 20 72 65 63 se us to.. * rec
5650: 72 65 61 74 65 20 74 68 65 20 74 69 6d 65 72 20 reate the timer
5660: 28 69 6e 20 57 61 74 63 68 50 72 6f 63 29 2e 0a (in WatchProc)..
5670: 09 20 2a 2f 0a 09 54 63 6c 5f 44 65 6c 65 74 65 . */..Tcl_Delete
5680: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
5690: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
56a0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
56b0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
56c0: 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a n) NULL;. }..
56d0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
56e0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
56f0: 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 L_CALLBACK) {..d
5700: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
5710: 67 20 30 20 64 75 65 20 74 6f 20 63 61 6c 6c 62 g 0 due to callb
5720: 61 63 6b 22 29 3b 0a 09 72 65 74 75 72 6e 20 30 ack");..return 0
5730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
5740: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c intf("Calling Tl
5750: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
5760: 22 29 3b 0a 20 20 20 20 65 72 72 6f 72 43 6f 64 ");. errorCod
5770: 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 54 e = 0;. if (T
5780: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
5790: 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 t(statePtr, &err
57a0: 6f 72 43 6f 64 65 2c 20 31 29 20 3c 20 30 29 20 orCode, 1) < 0)
57b0: 7b 0a 09 69 66 20 28 65 72 72 6f 72 43 6f 64 65 {..if (errorCode
57c0: 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 20 == EAGAIN) {..
57d0: 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 79 6e dprintf("Asyn
57e0: 63 20 66 6c 61 67 20 63 6f 75 6c 64 20 62 65 20 c flag could be
57f0: 73 65 74 20 28 64 69 64 6e 27 74 20 63 68 65 63 set (didn't chec
5800: 6b 29 20 61 6e 64 20 65 72 72 6f 72 43 6f 64 65 k) and errorCode
5810: 20 3d 3d 20 45 41 47 41 49 4e 3a 20 20 52 65 74 == EAGAIN: Ret
5820: 75 72 6e 69 6e 67 20 30 22 29 3b 0a 0a 09 20 20 urning 0");...
5830: 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a return 0;..}..
5840: 09 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 .dprintf("Tls_Wa
5850: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 itForConnect ret
5860: 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 22 29 urned an error")
5870: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
5880: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
5890: 25 69 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 %i", mask);..
58a0: 20 72 65 74 75 72 6e 28 6d 61 73 6b 29 3b 0a 7d return(mask);.}
58b0: 0a 0a 23 69 66 20 30 0a 2f 2a 0a 20 2a 2d 2d 2d ..#if 0./*. *---
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58f0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 ---*. *. *
5900: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 TlsChannelHandle
5910: 72 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 20 20 r --. *. *
5920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5950: 2a 0a 20 2a 20 20 20 20 20 20 48 61 6e 64 6c 65 *. * Handle
5960: 72 20 63 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 r called by Tcl
5970: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 0a 20 as a result of.
5980: 2a 20 20 20 20 20 20 54 63 6c 5f 43 72 65 61 74 * Tcl_Creat
5990: 65 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 eChannelHandler
59a0: 2d 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f - to inform us o
59b0: 66 20 61 63 74 69 76 69 74 79 0a 20 2a 20 20 20 f activity. *
59c0: 20 20 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c on the underl
59d0: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a ying channel.. *
59e0: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a10: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 ------*. *. *
5a20: 20 20 20 53 69 64 65 20 65 66 66 65 63 74 73 3a Side effects:
5a30: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 . *
5a40: 20 4d 61 79 20 67 65 6e 65 72 61 74 65 20 73 75 May generate su
5a50: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 bsequent calls t
5a60: 6f 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 o. *
5a70: 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e Tcl_NotifyChan
5a80: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 20 nel.. *. *
5a90: 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 20 Result:. *
5aa0: 20 20 20 20 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a None.. *
5ab0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
5af0: 74 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 43 68 tatic void.TlsCh
5b00: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 28 43 6c annelHandler (Cl
5b10: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
5b20: 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b ata, int mask) {
5b30: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
5b40: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
5b50: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
5b60: 20 20 64 70 72 69 6e 74 66 28 22 48 41 4e 44 4c dprintf("HANDL
5b70: 45 52 28 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 ER(0x%x)", mask)
5b80: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
5b90: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 73 ve((ClientData)s
5ba0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 tatePtr);.. i
5bb0: 66 20 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 f (mask & TCL_RE
5bc0: 41 44 41 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 ADABLE) {..BIO_s
5bd0: 65 74 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 et_flags(statePt
5be0: 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c r->p_bio, BIO_FL
5bf0: 41 47 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d AGS_READ);. }
5c00: 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f 63 6c 65 else {..BIO_cle
5c10: 61 72 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 ar_flags(statePt
5c20: 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c r->p_bio, BIO_FL
5c30: 41 47 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d AGS_READ);. }
5c40: 0a 0a 20 20 20 20 69 66 20 28 6d 61 73 6b 20 26 .. if (mask &
5c50: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 20 7b TCL_WRITABLE) {
5c60: 0a 09 42 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 ..BIO_set_flags(
5c70: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c statePtr->p_bio,
5c80: 20 42 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 BIO_FLAGS_WRITE
5c90: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
5ca0: 09 42 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 73 .BIO_clear_flags
5cb0: 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f (statePtr->p_bio
5cc0: 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 , BIO_FLAGS_WRIT
5cd0: 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d E);. }.. m
5ce0: 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 ask = 0;. if
5cf0: 28 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 (BIO_wpending(st
5d00: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
5d10: 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 .mask |= TCL_WRI
5d20: 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 TABLE;. }.
5d30: 20 69 66 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 if (BIO_pending
5d40: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 (statePtr->bio))
5d50: 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f {..mask |= TCL_
5d60: 52 45 41 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a READABLE;. }.
5d70: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 . /*. * T
5d80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4e 6f 74 he following Not
5d90: 69 66 79 43 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 ifyChannel calls
5da0: 20 73 65 65 6d 73 20 74 6f 20 62 65 20 69 6d 70 seems to be imp
5db0: 6f 72 74 61 6e 74 2c 20 62 75 74 0a 20 20 20 20 ortant, but.
5dc0: 20 2a 20 77 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 * we don't know
5dd0: 20 77 68 79 2e 20 20 49 74 20 6c 6f 6f 6b 73 20 why. It looks
5de0: 6c 69 6b 65 20 69 66 20 74 68 65 20 6d 61 73 6b like if the mask
5df0: 20 69 73 20 65 76 65 72 20 6e 6f 6e 2d 7a 65 72 is ever non-zer
5e00: 6f 0a 20 20 20 20 20 2a 20 74 68 61 74 20 69 74 o. * that it
5e10: 20 77 69 6c 6c 20 65 6e 74 65 72 20 61 6e 20 69 will enter an i
5e20: 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 2e 0a 20 20 nfinite loop..
5e30: 20 20 20 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 69 *. * Noti
5e40: 66 79 20 74 68 65 20 75 70 70 65 72 20 63 68 61 fy the upper cha
5e50: 6e 6e 65 6c 20 6f 66 20 74 68 65 20 63 75 72 72 nnel of the curr
5e60: 65 6e 74 20 42 49 4f 20 73 74 61 74 65 20 73 6f ent BIO state so
5e70: 20 74 68 65 20 65 76 65 6e 74 0a 20 20 20 20 20 the event.
5e80: 2a 20 63 6f 6e 74 69 6e 75 65 73 20 74 6f 20 70 * continues to p
5e90: 72 6f 70 61 67 61 74 65 20 75 70 20 74 68 65 20 ropagate up the
5ea0: 63 68 61 69 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 chain.. *.
5eb0: 20 20 20 2a 20 73 74 61 6e 74 6f 6e 3a 20 49 74 * stanton: It
5ec0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 looks like this
5ed0: 20 63 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e could result in
5ee0: 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f an infinite loo
5ef0: 70 20 69 66 0a 20 20 20 20 20 2a 20 74 68 65 20 p if. * the
5f00: 75 70 70 65 72 20 63 68 61 6e 6e 65 6c 20 64 6f upper channel do
5f10: 65 73 6e 27 74 20 63 61 75 73 65 20 43 68 61 6e esn't cause Chan
5f20: 6e 65 6c 48 61 6e 64 6c 65 72 20 74 6f 20 62 65 nelHandler to be
5f30: 20 72 65 6d 6f 76 65 64 0a 20 20 20 20 20 2a 20 removed. *
5f40: 62 65 66 6f 72 65 20 54 63 6c 5f 4e 6f 74 69 66 before Tcl_Notif
5f50: 79 43 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 63 yChannel calls c
5f60: 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 hannel handlers
5f70: 6f 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 on the lower cha
5f80: 6e 6e 65 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 nnel.. */.
5f90: 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e Tcl_NotifyChan
5fa0: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 nel(statePtr->se
5fb0: 6c 66 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 lf, mask);..
5fc0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
5fd0: 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
5fe0: 72 54 6f 6b 65 6e 29 4e 55 4c 4c 29 20 7b 0a 09 rToken)NULL) {..
5ff0: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
6000: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
6010: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 >timer);..stateP
6020: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c tr->timer = (Tcl
6030: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c _TimerToken)NULL
6040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
6050: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 (mask & TCL_READ
6060: 41 42 4c 45 29 20 26 26 20 54 63 6c 5f 49 6e 70 ABLE) && Tcl_Inp
6070: 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 utBuffered(state
6080: 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20 Ptr->self) > 0)
6090: 7b 0a 09 2f 2a 0a 09 20 2a 20 44 61 74 61 20 69 {../*.. * Data i
60a0: 73 20 77 61 69 74 69 6e 67 2c 20 66 6c 75 73 68 s waiting, flush
60b0: 20 69 74 20 6f 75 74 20 69 6e 20 73 68 6f 72 74 it out in short
60c0: 20 74 69 6d 65 0a 09 20 2a 2f 0a 09 73 74 61 74 time.. */..stat
60d0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 ePtr->timer = Tc
60e0: 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e l_CreateTimerHan
60f0: 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c dler(TLS_TCL_DEL
6100: 41 59 2c 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 AY, TlsChannelHa
6110: 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 ndlerTimer, (Cli
6120: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
6130: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 r);. }. Tc
6140: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
6150: 74 44 61 74 61 29 73 74 61 74 65 50 74 72 29 3b tData)statePtr);
6160: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a .}.#endif../*. *
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61a0: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 ------*. *. *
61b0: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c TlsChannelHandl
61c0: 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a erTimer --. *. *
61d0: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
61e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6200: 2d 2d 2d 2d 2a 0a 20 2a 20 20 20 20 43 61 6c 6c ----*. * Call
6210: 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 ed by the notifi
6220: 65 72 20 28 2d 3e 20 74 69 6d 65 72 29 20 74 6f er (-> timer) to
6230: 20 66 6c 75 73 68 20 6f 75 74 0a 20 2a 20 20 20 flush out. *
6240: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 information wai
6250: 74 69 6e 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 ting in channel
6260: 62 75 66 66 65 72 73 2e 0a 20 2a 20 20 20 20 2d buffers.. * -
6270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
62a0: 0a 20 2a 0a 20 2a 20 20 20 20 53 69 64 65 20 65 . *. * Side e
62b0: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 20 20 ffects:. *
62c0: 20 20 41 73 20 6f 66 20 27 54 6c 73 43 68 61 6e As of 'TlsChan
62d0: 6e 65 6c 48 61 6e 64 6c 65 72 27 2e 0a 20 2a 0a nelHandler'.. *.
62e0: 20 2a 20 20 20 20 52 65 73 75 6c 74 3a 0a 20 2a * Result:. *
62f0: 20 20 20 20 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a None.. *
6300: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
6340: 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 68 tatic void TlsCh
6350: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 annelHandlerTime
6360: 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 r(ClientData cli
6370: 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 53 entData) {. S
6380: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
6390: 20 28 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e (State *) clien
63a0: 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d tData;. int m
63b0: 61 73 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ask = 0;.. dp
63c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
63d0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
63e0: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d timer = (Tcl_Tim
63f0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a erToken) NULL;..
6400: 20 20 20 20 69 66 20 28 42 49 4f 5f 77 70 65 6e if (BIO_wpen
6410: 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 ding(statePtr->b
6420: 69 6f 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 io)) {..dprintf(
6430: 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49 4f 20 77 "[chan=%p] BIO w
6440: 72 69 74 61 62 6c 65 22 2c 20 73 74 61 74 65 50 ritable", stateP
6450: 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61 73 tr->self);...mas
6460: 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c k |= TCL_WRITABL
6470: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 E;. }.. if
6480: 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 (BIO_pending(st
6490: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
64a0: 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d .dprintf("[chan=
64b0: 25 70 5d 20 42 49 4f 20 72 65 61 64 61 62 6c 65 %p] BIO readable
64c0: 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c ", statePtr->sel
64d0: 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 f);...mask |= TC
64e0: 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20 20 20 L_READABLE;.
64f0: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
6500: 4e 6f 74 69 66 79 69 6e 67 20 6f 75 72 73 65 6c Notifying oursel
6510: 76 65 73 22 29 3b 0a 20 20 20 20 54 63 6c 5f 4e ves");. Tcl_N
6520: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 otifyChannel(sta
6530: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 tePtr->self, mas
6540: 6b 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 k);.. dprintf
6550: 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a ("Returning");..
6560: 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 54 return;.}..T
6570: 63 6c 5f 43 68 61 6e 6e 65 6c 20 54 6c 73 5f 47 cl_Channel Tls_G
6580: 65 74 50 61 72 65 6e 74 28 53 74 61 74 65 20 2a etParent(State *
6590: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 6d 61 statePtr, int ma
65a0: 73 6b 46 6c 61 67 73 29 20 7b 0a 20 20 20 20 64 skFlags) {. d
65b0: 70 72 69 6e 74 66 28 22 52 65 71 75 65 73 74 65 printf("Requeste
65c0: 64 20 74 6f 20 67 65 74 20 70 61 72 65 6e 74 20 d to get parent
65d0: 6f 66 20 63 68 61 6e 6e 65 6c 20 25 70 22 2c 20 of channel %p",
65e0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b statePtr->self);
65f0: 0a 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 .. if ((state
6600: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 7e 6d 61 Ptr->flags & ~ma
6610: 73 6b 46 6c 61 67 73 29 20 26 20 54 4c 53 5f 54 skFlags) & TLS_T
6620: 43 4c 5f 46 41 53 54 50 41 54 48 29 20 7b 0a 09 CL_FASTPATH) {..
6630: 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
6640: 6f 20 67 65 74 20 74 68 65 20 70 61 72 65 6e 74 o get the parent
6650: 20 63 68 61 6e 6e 65 6c 20 77 68 69 6c 65 20 77 channel while w
6660: 65 20 61 72 65 20 75 73 69 6e 67 20 46 61 73 74 e are using Fast
6670: 50 61 74 68 20 2d 2d 20 72 65 74 75 72 6e 69 6e Path -- returnin
6680: 67 20 4e 55 4c 4c 22 29 3b 0a 09 72 65 74 75 72 g NULL");..retur
6690: 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 n(NULL);. }.
66a0: 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 47 65 return(Tcl_Ge
66b0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 tStackedChannel(
66c0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
66d0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6720: 0a 20 2a 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 . * Tls_ChannelT
6730: 79 70 65 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 ype --. *. *
6740: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 72 72 65 Return the corre
6750: 63 74 20 54 4c 53 20 63 68 61 6e 6e 65 6c 20 64 ct TLS channel d
6760: 72 69 76 65 72 20 69 6e 66 6f 0a 20 2a 0a 20 2a river info. *. *
6770: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 Results:. *
6780: 54 68 65 20 63 6f 72 72 65 63 74 20 63 68 61 6e The correct chan
6790: 6e 65 6c 20 64 72 69 76 65 72 20 66 6f 72 20 74 nel driver for t
67a0: 68 65 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 he current versi
67b0: 6f 6e 20 6f 66 20 54 63 6c 2e 0a 20 2a 0a 20 2a on of Tcl.. *. *
67c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
67d0: 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a * None.. *. *
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6820: 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 43 68 61 6e ---. */.Tcl_Chan
6830: 6e 65 6c 54 79 70 65 20 2a 54 6c 73 5f 43 68 61 nelType *Tls_Cha
6840: 6e 6e 65 6c 54 79 70 65 28 76 6f 69 64 29 20 7b nnelType(void) {
6850: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
6860: 74 20 73 69 7a 65 3b 0a 0a 20 20 20 20 2f 2a 0a t size;.. /*.
6870: 20 20 20 20 20 2a 20 49 6e 69 74 69 61 6c 69 7a * Initializ
6880: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 e the channel ty
6890: 70 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a pe if necessary.
68a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
68b0: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d tlsChannelType =
68c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 = NULL) {../*..
68d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 65 77 20 63 * Allocate new c
68e0: 68 61 6e 6e 65 6c 74 79 70 65 20 73 74 72 75 63 hanneltype struc
68f0: 74 75 72 65 0a 09 20 2a 2f 0a 09 73 69 7a 65 20 ture.. */..size
6900: 3d 20 73 69 7a 65 6f 66 28 54 63 6c 5f 43 68 61 = sizeof(Tcl_Cha
6910: 6e 6e 65 6c 54 79 70 65 29 3b 20 2f 2a 20 42 61 nnelType); /* Ba
6920: 73 65 20 73 69 7a 65 20 2a 2f 0a 0a 09 74 6c 73 se size */...tls
6930: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 28 54 ChannelType = (T
6940: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a cl_ChannelType *
6950: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 29 3b ) ckalloc(size);
6960: 0a 09 6d 65 6d 73 65 74 28 28 76 6f 69 64 20 2a ..memset((void *
6970: 29 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 ) tlsChannelType
6980: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 0a 09 74 6c , 0, size);...tl
6990: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 74 79 sChannelType->ty
69a0: 70 65 4e 61 6d 65 09 3d 20 22 74 6c 73 22 3b 0a peName.= "tls";.
69b0: 23 69 66 64 65 66 20 54 43 4c 5f 43 48 41 4e 4e #ifdef TCL_CHANN
69c0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 0a 09 74 6c EL_VERSION_5..tl
69d0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 76 65 sChannelType->ve
69e0: 72 73 69 6f 6e 09 09 3d 20 54 43 4c 5f 43 48 41 rsion..= TCL_CHA
69f0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 3b 0a NNEL_VERSION_5;.
6a00: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d .tlsChannelType-
6a10: 3e 63 6c 6f 73 65 50 72 6f 63 09 3d 20 54 6c 73 >closeProc.= Tls
6a20: 43 6c 6f 73 65 50 72 6f 63 3b 0a 09 74 6c 73 43 CloseProc;..tlsC
6a30: 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 69 6e 70 75 hannelType->inpu
6a40: 74 50 72 6f 63 09 3d 20 54 6c 73 49 6e 70 75 74 tProc.= TlsInput
6a50: 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 Proc;..tlsChanne
6a60: 6c 54 79 70 65 2d 3e 6f 75 74 70 75 74 50 72 6f lType->outputPro
6a70: 63 09 3d 20 54 6c 73 4f 75 74 70 75 74 50 72 6f c.= TlsOutputPro
6a80: 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 c;..tlsChannelTy
6a90: 70 65 2d 3e 73 65 65 6b 50 72 6f 63 09 3d 20 4e pe->seekProc.= N
6aa0: 55 4c 4c 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c ULL;..tlsChannel
6ab0: 54 79 70 65 2d 3e 73 65 74 4f 70 74 69 6f 6e 50 Type->setOptionP
6ac0: 72 6f 63 09 3d 20 54 6c 73 53 65 74 4f 70 74 69 roc.= TlsSetOpti
6ad0: 6f 6e 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e onProc;..tlsChan
6ae0: 6e 65 6c 54 79 70 65 2d 3e 67 65 74 4f 70 74 69 nelType->getOpti
6af0: 6f 6e 50 72 6f 63 09 3d 20 54 6c 73 47 65 74 4f onProc.= TlsGetO
6b00: 70 74 69 6f 6e 50 72 6f 63 3b 0a 09 74 6c 73 43 ptionProc;..tlsC
6b10: 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 77 61 74 63 hannelType->watc
6b20: 68 50 72 6f 63 09 3d 20 54 6c 73 57 61 74 63 68 hProc.= TlsWatch
6b30: 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 Proc;..tlsChanne
6b40: 6c 54 79 70 65 2d 3e 67 65 74 48 61 6e 64 6c 65 lType->getHandle
6b50: 50 72 6f 63 09 3d 20 54 6c 73 47 65 74 48 61 6e Proc.= TlsGetHan
6b60: 64 6c 65 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 dleProc;..tlsCha
6b70: 6e 6e 65 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 32 nnelType->close2
6b80: 50 72 6f 63 09 3d 20 54 6c 73 43 6c 6f 73 65 50 Proc.= TlsCloseP
6b90: 72 6f 63 32 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 roc2;..tlsChanne
6ba0: 6c 54 79 70 65 2d 3e 62 6c 6f 63 6b 4d 6f 64 65 lType->blockMode
6bb0: 50 72 6f 63 09 3d 20 54 6c 73 42 6c 6f 63 6b 4d Proc.= TlsBlockM
6bc0: 6f 64 65 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 odeProc;..tlsCha
6bd0: 6e 6e 65 6c 54 79 70 65 2d 3e 66 6c 75 73 68 50 nnelType->flushP
6be0: 72 6f 63 09 3d 20 4e 55 4c 4c 3b 0a 09 74 6c 73 roc.= NULL;..tls
6bf0: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 68 61 6e ChannelType->han
6c00: 64 6c 65 72 50 72 6f 63 09 3d 20 54 6c 73 4e 6f dlerProc.= TlsNo
6c10: 74 69 66 79 50 72 6f 63 3b 0a 09 74 6c 73 43 68 tifyProc;..tlsCh
6c20: 61 6e 6e 65 6c 54 79 70 65 2d 3e 77 69 64 65 53 annelType->wideS
6c30: 65 65 6b 50 72 6f 63 09 3d 20 4e 55 4c 4c 3b 0a eekProc.= NULL;.
6c40: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d .tlsChannelType-
6c50: 3e 74 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f >threadActionPro
6c60: 63 20 3d 20 4e 55 4c 4c 3b 0a 09 74 6c 73 43 68 c = NULL;..tlsCh
6c70: 61 6e 6e 65 6c 54 79 70 65 2d 3e 74 72 75 6e 63 annelType->trunc
6c80: 61 74 65 50 72 6f 63 09 3d 20 4e 55 4c 4c 3b 0a ateProc.= NULL;.
6c90: 23 65 6c 73 65 0a 09 74 6c 73 43 68 61 6e 6e 65 #else..tlsChanne
6ca0: 6c 54 79 70 65 2d 3e 76 65 72 73 69 6f 6e 09 09 lType->version..
6cb0: 3d 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 = TCL_CHANNEL_VE
6cc0: 52 53 49 4f 4e 5f 32 3b 0a 09 74 6c 73 43 68 61 RSION_2;..tlsCha
6cd0: 6e 6e 65 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 50 nnelType->closeP
6ce0: 72 6f 63 09 3d 20 54 6c 73 43 6c 6f 73 65 50 72 roc.= TlsClosePr
6cf0: 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 oc;..tlsChannelT
6d00: 79 70 65 2d 3e 69 6e 70 75 74 50 72 6f 63 09 3d ype->inputProc.=
6d10: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 3b 0a 09 TlsInputProc;..
6d20: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e tlsChannelType->
6d30: 6f 75 74 70 75 74 50 72 6f 63 09 3d 20 54 6c 73 outputProc.= Tls
6d40: 4f 75 74 70 75 74 50 72 6f 63 3b 0a 09 74 6c 73 OutputProc;..tls
6d50: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 73 65 65 ChannelType->see
6d60: 6b 50 72 6f 63 09 3d 20 4e 55 4c 4c 3b 0a 09 74 kProc.= NULL;..t
6d70: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 73 lsChannelType->s
6d80: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 09 3d 20 54 etOptionProc.= T
6d90: 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b lsSetOptionProc;
6da0: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 ..tlsChannelType
6db0: 2d 3e 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 09 ->getOptionProc.
6dc0: 3d 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 = TlsGetOptionPr
6dd0: 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 oc;..tlsChannelT
6de0: 79 70 65 2d 3e 77 61 74 63 68 50 72 6f 63 09 3d ype->watchProc.=
6df0: 20 54 6c 73 57 61 74 63 68 50 72 6f 63 3b 0a 09 TlsWatchProc;..
6e00: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e tlsChannelType->
6e10: 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 09 3d 20 getHandleProc.=
6e20: 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 TlsGetHandleProc
6e30: 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 ;..tlsChannelTyp
6e40: 65 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 09 3d 20 e->close2Proc.=
6e50: 4e 55 4c 4c 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 NULL;..tlsChanne
6e60: 6c 54 79 70 65 2d 3e 62 6c 6f 63 6b 4d 6f 64 65 lType->blockMode
6e70: 50 72 6f 63 09 3d 20 54 6c 73 42 6c 6f 63 6b 4d Proc.= TlsBlockM
6e80: 6f 64 65 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 odeProc;..tlsCha
6e90: 6e 6e 65 6c 54 79 70 65 2d 3e 66 6c 75 73 68 50 nnelType->flushP
6ea0: 72 6f 63 09 3d 20 4e 55 4c 4c 3b 0a 09 74 6c 73 roc.= NULL;..tls
6eb0: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 68 61 6e ChannelType->han
6ec0: 64 6c 65 72 50 72 6f 63 09 3d 20 54 6c 73 4e 6f dlerProc.= TlsNo
6ed0: 74 69 66 79 50 72 6f 63 3b 0a 23 65 6e 64 69 66 tifyProc;.#endif
6ee0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
6ef0: 6e 28 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 n(tlsChannelType
6f00: 29 3b 0a 7d 0a );.}.