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 76 elHandlerTimer(v
02f0: 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 oid *clientData)
0300: 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ;../*. *--------
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
0350: 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 * TlsBlockModePr
0360: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54 oc --. *. * T
0370: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
0380: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 invoked by the
0390: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c generic IO level
03a0: 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 73 65 74 . * to set
03b0: 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f blocking and no
03c0: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a nblocking modes.
03d0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
03e0: 2a 20 20 20 20 30 20 69 66 20 73 75 63 63 65 73 * 0 if succes
03f0: 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 sful or POSIX er
0400: 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c ror code if fail
0410: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ed.. *. * Side e
0420: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 53 65 ffects:. * Se
0430: 74 73 20 74 68 65 20 64 65 76 69 63 65 20 69 6e ts the device in
0440: 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e to blocking or n
0450: 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e onblocking mode.
0460: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
0470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
04b0: 61 74 69 63 20 69 6e 74 20 54 6c 73 42 6c 6f 63 atic int TlsBloc
04c0: 6b 4d 6f 64 65 50 72 6f 63 28 76 6f 69 64 20 2a kModeProc(void *
04d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
04e0: 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 53 74 t mode) {. St
04f0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
0500: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
0510: 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 ceData;.. if
0520: 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 (mode == TCL_MOD
0530: 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b E_NONBLOCKING) {
0540: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
0550: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 s |= TLS_TCL_ASY
0560: 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b NC;. } else {
0570: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
0580: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 s &= ~(TLS_TCL_A
0590: 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 SYNC);. }.
05a0: 20 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f return(0);.}../
05b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
0600: 73 43 6c 6f 73 65 32 50 72 6f 63 20 2d 2d 0a 20 sClose2Proc --.
0610: 2a 0a 20 2a 20 20 20 20 54 68 69 73 20 70 72 6f *. * This pro
0620: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
0630: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 d by the generic
0640: 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 IO level to per
0650: 66 6f 72 6d 0a 20 2a 20 20 20 20 63 68 61 6e 6e form. * chann
0660: 65 6c 2d 74 79 70 65 2d 73 70 65 63 69 66 69 63 el-type-specific
0670: 20 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 61 20 cleanup when a
0680: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
0690: 20 63 68 61 6e 6e 65 6c 0a 20 2a 20 20 20 20 69 channel. * i
06a0: 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20 2a 20 s closed.. *. *
06b0: 20 20 20 4e 6f 74 65 3a 20 77 65 20 6c 65 61 76 Note: we leav
06c0: 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 e the underlying
06d0: 20 73 6f 63 6b 65 74 20 61 6c 6f 6e 65 2c 20 69 socket alone, i
06e0: 73 20 74 68 69 73 20 72 69 67 68 74 3f 0a 20 2a s this right?. *
06f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 . * Results:. *
0700: 20 20 20 30 20 69 66 20 73 75 63 63 65 73 73 66 0 if successf
0710: 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f ul or POSIX erro
0720: 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 r code if failed
0730: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
0740: 65 63 74 73 3a 0a 20 2a 20 20 20 20 43 6c 6f 73 ects:. * Clos
0750: 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f 66 es the socket of
0760: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a the channel.. *
0770: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 20 54 ------. */.#if T
07c0: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
07d0: 20 3e 20 38 0a 23 20 20 20 64 65 66 69 6e 65 20 > 8.# define
07e0: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 4e 55 4c TlsCloseProc NUL
07f0: 4c 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 6e L /* No longer n
0800: 65 63 63 65 73 73 61 72 79 20 69 6e 20 54 63 6c eccessary in Tcl
0810: 20 39 20 2a 2f 0a 23 65 6c 73 65 0a 73 74 61 74 9 */.#else.stat
0820: 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 50 ic int TlsCloseP
0830: 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 roc(. void *i
0840: 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 20 nstanceData,.
0850: 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f TCL_UNUSED(Tcl_
0860: 49 6e 74 65 72 70 20 2a 29 29 0a 7b 0a 20 20 20 Interp *)).{.
0870: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
0880: 20 3d 20 28 53 74 61 74 65 20 2a 29 69 6e 73 74 = (State *)inst
0890: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 anceData;.. d
08a0: 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 65 printf("TlsClose
08b0: 50 72 6f 63 28 25 70 29 22 2c 20 73 74 61 74 65 Proc(%p)", state
08c0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 Ptr);.. Tls_C
08d0: 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a lean(statePtr);.
08e0: 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c Tcl_Eventual
08f0: 6c 79 46 72 65 65 28 73 74 61 74 65 50 74 72 2c lyFree(statePtr,
0900: 20 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 Tls_Free);.
0910: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
0920: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 .#endif..static
0930: 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f int TlsClose2Pro
0940: 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 c(. void *ins
0950: 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a tanceData, /*
0960: 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 The socket stat
0970: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e e. */. Tcl_In
0980: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
0990: 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 * For errors - c
09a0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 an be NULL. */.
09b0: 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09 09 int flags)...
09c0: 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 6c 6f 73 /* Flags to clos
09d0: 65 20 72 65 61 64 20 61 6e 64 2f 6f 72 20 77 72 e read and/or wr
09e0: 69 74 65 20 73 69 64 65 20 6f 66 20 63 68 61 6e ite side of chan
09f0: 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 nel */.{. Sta
0a00: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
0a10: 53 74 61 74 65 20 2a 29 69 6e 73 74 61 6e 63 65 State *)instance
0a20: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
0a30: 74 66 28 22 54 6c 73 43 6c 6f 73 65 32 50 72 6f tf("TlsClose2Pro
0a40: 63 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 c(%p)", statePtr
0a50: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 66 6c 61 );.. if ((fla
0a60: 67 73 26 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 gs&(TCL_CLOSE_RE
0a70: 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 AD|TCL_CLOSE_WRI
0a80: 54 45 29 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 TE))) {..return
0a90: 45 49 4e 56 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 EINVAL;. }.
0aa0: 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
0ab0: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 45 ePtr);. Tcl_E
0ac0: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 28 73 74 ventuallyFree(st
0ad0: 61 74 65 50 74 72 2c 20 54 6c 73 5f 46 72 65 65 atePtr, Tls_Free
0ae0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
0af0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d L_OK;.}../*. *--
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 54 6c 73 5f ----*. *. * Tls_
0b40: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d WaitForConnect -
0b50: 2d 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a -. *. * Result:.
0b60: 20 2a 20 20 20 20 30 20 69 66 20 73 75 63 63 65 * 0 if succe
0b70: 73 73 66 75 6c 2c 20 2d 31 20 69 66 20 66 61 69 ssful, -1 if fai
0b80: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 led.. *. * Side
0b90: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 49 effects:. * I
0ba0: 73 73 75 65 73 20 53 53 4c 5f 61 63 63 65 70 74 ssues SSL_accept
0bb0: 20 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 0a or SSL_connect.
0bc0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
0c00: 0a 69 6e 74 20 54 6c 73 5f 57 61 69 74 46 6f 72 .int Tls_WaitFor
0c10: 43 6f 6e 6e 65 63 74 28 53 74 61 74 65 20 2a 73 Connect(State *s
0c20: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 2a 65 72 tatePtr, int *er
0c30: 72 6f 72 43 6f 64 65 50 74 72 2c 20 69 6e 74 20 rorCodePtr, int
0c40: 68 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65 handshakeFailure
0c50: 49 73 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 20 IsPermanent) {.
0c60: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
0c70: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 backingError;.
0c80: 20 20 20 69 6e 74 20 65 72 72 2c 20 72 63 3b 0a int err, rc;.
0c90: 20 20 20 20 69 6e 74 20 62 69 6f 53 68 6f 75 6c int bioShoul
0ca0: 64 52 65 74 72 79 3b 0a 0a 20 20 20 20 64 70 72 dRetry;.. dpr
0cb0: 69 6e 74 66 28 22 57 61 69 74 46 6f 72 43 6f 6e intf("WaitForCon
0cc0: 6e 65 63 74 28 25 70 29 22 2c 20 73 74 61 74 65 nect(%p)", state
0cd0: 50 74 72 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 Ptr);. dprint
0ce0: 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 3b Flags(statePtr);
0cf0: 0a 0a 20 20 20 20 69 66 20 28 21 28 73 74 61 74 .. if (!(stat
0d00: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c ePtr->flags & TL
0d10: 53 5f 54 43 4c 5f 49 4e 49 54 29 29 20 7b 0a 09 S_TCL_INIT)) {..
0d20: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 dprintf("Tls_Wai
0d30: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 63 61 6c 6c tForConnect call
0d40: 65 64 20 6f 6e 20 61 6c 72 65 61 64 79 20 69 6e ed on already in
0d50: 69 74 69 61 6c 69 7a 65 64 20 63 68 61 6e 6e 65 itialized channe
0d60: 6c 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 77 l -- returning w
0d70: 69 74 68 20 69 6d 6d 65 64 69 61 74 65 20 73 75 ith immediate su
0d80: 63 63 65 73 73 22 29 3b 0a 09 2a 65 72 72 6f 72 ccess");..*error
0d90: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 72 65 CodePtr = 0;..re
0da0: 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a turn(0);. }..
0db0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
0dc0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
0dd0: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c L_HANDSHAKE_FAIL
0de0: 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 69 ED) {../*.. * Di
0df0: 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 fferent types of
0e00: 20 6f 70 65 72 61 74 69 6f 6e 73 20 68 61 76 65 operations have
0e10: 20 64 69 66 66 65 72 65 6e 74 20 72 65 71 75 69 different requi
0e20: 72 65 6d 65 6e 74 73 0a 09 20 2a 20 53 53 4c 20 rements.. * SSL
0e30: 62 65 69 6e 67 20 65 73 74 61 62 6c 69 73 68 65 being establishe
0e40: 64 0a 09 20 2a 2f 0a 09 69 66 20 28 68 61 6e 64 d.. */..if (hand
0e50: 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 shakeFailureIsPe
0e60: 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20 20 20 rmanent) {..
0e70: 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
0e80: 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 o wait for a TLS
0e90: 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 handshake that
0ea0: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c has already fail
0eb0: 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 ed. Returning f
0ec0: 61 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a 09 20 atal error");..
0ed0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
0ee0: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
0ef0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
0f00: 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
0f10: 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 o wait for a TLS
0f20: 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 handshake that
0f30: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c has already fail
0f40: 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 73 ed. Returning s
0f50: 6f 66 74 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 oft error");..
0f60: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
0f70: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 7d = ECONNRESET;..}
0f80: 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 20 20 ..return(-1);.
0f90: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 3b 3b }.. for (;;
0fa0: 29 20 7b 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 ) {../* Not init
0fb0: 69 61 6c 69 7a 65 64 20 79 65 74 21 20 2a 2f 0a ialized yet! */.
0fc0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 .if (statePtr->f
0fd0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 lags & TLS_TCL_S
0fe0: 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 64 70 ERVER) {.. dp
0ff0: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 rintf("Calling S
1000: 53 4c 5f 61 63 63 65 70 74 28 29 22 29 3b 0a 09 SL_accept()");..
1010: 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 61 63 err = SSL_ac
1020: 63 65 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73 cept(statePtr->s
1030: 73 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 sl);..} else {..
1040: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
1050: 6c 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 ling SSL_connect
1060: 28 29 22 29 3b 0a 09 20 20 20 20 65 72 72 20 3d ()");.. err =
1070: 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 73 74 61 SSL_connect(sta
1080: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a tePtr->ssl);..}.
1090: 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29 20 7b ..if (err > 0) {
10a0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 .. dprintf("T
10b0: 68 61 74 20 73 65 65 6d 73 20 74 6f 20 68 61 76 hat seems to hav
10c0: 65 20 67 6f 6e 65 20 6f 6b 61 79 22 29 3b 0a 0a e gone okay");..
10d0: 09 20 20 20 20 65 72 72 20 3d 20 42 49 4f 5f 66 . err = BIO_f
10e0: 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e 62 lush(statePtr->b
10f0: 69 6f 29 3b 0a 09 20 20 20 20 69 66 20 28 65 72 io);.. if (er
1100: 72 20 3c 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 r <= 0) {...dpri
1110: 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 74 68 ntf("Flushing th
1120: 65 20 6c 6f 77 65 72 20 6c 61 79 65 72 73 20 66 e lower layers f
1130: 61 69 6c 65 64 2c 20 74 68 69 73 20 77 69 6c 6c ailed, this will
1140: 20 70 72 6f 62 61 62 6c 79 20 74 65 72 6d 69 6e probably termin
1150: 61 74 65 20 74 68 69 73 20 73 65 73 73 69 6f 6e ate this session
1160: 22 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 ");.. }..}...
1170: 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 rc = SSL_get_err
1180: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c or(statePtr->ssl
1190: 2c 20 65 72 72 29 3b 0a 0a 09 64 70 72 69 6e 74 , err);...dprint
11a0: 66 28 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 69 f("Got error: %i
11b0: 20 28 72 63 20 3d 20 25 69 29 22 2c 20 65 72 72 (rc = %i)", err
11c0: 2c 20 72 63 29 3b 0a 0a 09 62 69 6f 53 68 6f 75 , rc);...bioShou
11d0: 6c 64 52 65 74 72 79 20 3d 20 30 3b 0a 09 69 66 ldRetry = 0;..if
11e0: 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 (err <= 0) {..
11f0: 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c if (rc == SSL
1200: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e _ERROR_WANT_CONN
1210: 45 43 54 20 7c 7c 20 72 63 20 3d 3d 20 53 53 4c ECT || rc == SSL
1220: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 _ERROR_WANT_ACCE
1230: 50 54 20 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f PT || rc == SSL_
1240: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 20 ERROR_WANT_READ
1250: 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 || rc == SSL_ERR
1260: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 29 20 7b OR_WANT_WRITE) {
1270: 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 ...bioShouldRetr
1280: 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c y = 1;.. } el
1290: 73 65 20 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c se if (BIO_shoul
12a0: 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 d_retry(statePtr
12b0: 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 62 69 6f 53 ->bio)) {...bioS
12c0: 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a houldRetry = 1;.
12d0: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
12e0: 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f rc == SSL_ERROR_
12f0: 53 59 53 43 41 4c 4c 20 26 26 20 54 63 6c 5f 47 SYSCALL && Tcl_G
1300: 65 74 45 72 72 6e 6f 28 29 20 3d 3d 20 45 41 47 etErrno() == EAG
1310: 41 49 4e 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 AIN) {...bioShou
1320: 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 ldRetry = 1;..
1330: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }..} else {..
1340: 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 if (!SSL_is_i
1350: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 nit_finished(sta
1360: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 tePtr->ssl)) {..
1370: 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 .bioShouldRetry
1380: 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a = 1;.. }..}..
1390: 09 69 66 20 28 62 69 6f 53 68 6f 75 6c 64 52 65 .if (bioShouldRe
13a0: 74 72 79 29 20 7b 0a 09 20 20 20 20 64 70 72 69 try) {.. dpri
13b0: 6e 74 66 28 22 54 68 65 20 49 2f 4f 20 64 69 64 ntf("The I/O did
13c0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 2d 2d not complete --
13d0: 20 62 75 74 20 77 65 20 73 68 6f 75 6c 64 20 74 but we should t
13e0: 72 79 20 69 74 20 61 67 61 69 6e 22 29 3b 0a 0a ry it again");..
13f0: 09 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
1400: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
1410: 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09 64 70 CL_ASYNC) {...dp
1420: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
1430: 20 45 41 47 41 49 4e 20 73 6f 20 74 68 61 74 20 EAGAIN so that
1440: 69 74 20 63 61 6e 20 62 65 20 72 65 74 72 69 65 it can be retrie
1450: 64 20 6c 61 74 65 72 22 29 3b 0a 09 09 2a 65 72 d later");...*er
1460: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
1470: 41 49 4e 3b 0a 09 09 72 65 74 75 72 6e 28 2d 31 AIN;...return(-1
1480: 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b );.. } else {
1490: 0a 09 09 64 70 72 69 6e 74 66 28 22 44 6f 69 6e ...dprintf("Doin
14a0: 67 20 73 6f 20 6e 6f 77 22 29 3b 0a 09 09 63 6f g so now");...co
14b0: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 ntinue;.. }..
14c0: 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 57 65 20 }...dprintf("We
14d0: 68 61 76 65 20 65 69 74 68 65 72 20 63 6f 6d 70 have either comp
14e0: 6c 65 74 65 6c 79 20 65 73 74 61 62 6c 69 73 68 letely establish
14f0: 65 64 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f ed the session o
1500: 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 66 61 69 r completely fai
1510: 6c 65 64 20 69 74 20 2d 2d 20 74 68 65 72 65 20 led it -- there
1520: 69 73 20 6e 6f 20 6d 6f 72 65 20 6e 65 65 64 20 is no more need
1530: 74 6f 20 65 76 65 72 20 72 65 74 72 79 20 69 74 to ever retry it
1540: 20 74 68 6f 75 67 68 22 29 3b 0a 09 62 72 65 61 though");..brea
1550: 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2a k;. }... *
1560: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
1570: 49 4e 56 41 4c 3b 0a 0a 20 20 20 20 73 77 69 74 INVAL;.. swit
1580: 63 68 20 28 72 63 29 20 7b 0a 09 63 61 73 65 20 ch (rc) {..case
1590: 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a SSL_ERROR_NONE:.
15a0: 09 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e . /* The conn
15b0: 65 63 74 69 6f 6e 20 69 73 20 75 70 2c 20 77 65 ection is up, we
15c0: 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 20 2a are done here *
15d0: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 /.. dprintf("
15e0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 The connection i
15f0: 73 20 75 70 22 29 3b 0a 09 20 20 20 20 62 72 65 s up");.. bre
1600: 61 6b 3b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 ak;..case SSL_ER
1610: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a ROR_ZERO_RETURN:
1620: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 .. dprintf("S
1630: 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 SL_ERROR_ZERO_RE
1640: 54 55 52 4e 3a 20 43 6f 6e 6e 65 63 74 20 72 65 TURN: Connect re
1650: 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 turned an invali
1660: 64 20 76 61 6c 75 65 2e 2e 2e 22 29 0a 09 20 20 d value...")..
1670: 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 63 return(-1);..c
1680: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 ase SSL_ERROR_SY
1690: 53 43 41 4c 4c 3a 0a 09 20 20 20 20 62 61 63 6b SCALL:.. back
16a0: 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 ingError = ERR_g
16b0: 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 20 20 et_error();...
16c0: 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 if (backingErr
16d0: 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20 3d or == 0 && err =
16e0: 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 = 0) {...dprintf
16f0: 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a ("EOF reached").
1700: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
1710: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 20 = ECONNRESET;..
1720: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 } else if (ba
1730: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 ckingError == 0
1740: 26 26 20 65 72 72 20 3d 3d 20 2d 31 29 20 7b 0a && err == -1) {.
1750: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 ..dprintf("I/O e
1760: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 rror occurred (e
1770: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 rrno = %lu)", (u
1780: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 nsigned long) Tc
1790: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 l_GetErrno());..
17a0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
17b0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
17c0: 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 ...if (*errorCod
17d0: 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 ePtr == ECONNRES
17e0: 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 ET) {... *err
17f0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e orCodePtr = ECON
1800: 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 20 NABORTED;...}..
1810: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 } else {...dp
1820: 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 rintf("I/O error
1830: 20 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b 69 occurred (backi
1840: 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c ngError = %lu)",
1850: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a backingError);.
1860: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
1870: 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a = backingError;.
1880: 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 ..if (*errorCode
1890: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 Ptr == ECONNRESE
18a0: 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 6f T) {... *erro
18b0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
18c0: 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 09 7d ABORTED;...}...}
18d0: 0a 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 66 6c ....statePtr->fl
18e0: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 ags |= TLS_TCL_H
18f0: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b ANDSHAKE_FAILED;
1900: 0a 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 ....return -1;..
1910: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 case SSL_ERROR_S
1920: 53 4c 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 SL:.. dprintf
1930: 28 22 47 6f 74 20 70 65 72 6d 61 6e 65 6e 74 20 ("Got permanent
1940: 66 61 74 61 6c 20 53 53 4c 20 65 72 72 6f 72 2c fatal SSL error,
1950: 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d 65 64 69 aborting immedi
1960: 61 74 65 6c 79 22 29 3b 0a 09 09 54 6c 73 5f 45 ately");...Tls_E
1970: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 rror(statePtr, (
1980: 63 68 61 72 20 2a 29 45 52 52 5f 72 65 61 73 6f char *)ERR_reaso
1990: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 n_error_string(E
19a0: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 29 RR_get_error()))
19b0: 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d ;.. statePtr-
19c0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
19d0: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c L_HANDSHAKE_FAIL
19e0: 45 44 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 ED;.. *errorC
19f0: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 odePtr = ECONNAB
1a00: 4f 52 54 45 44 3b 0a 09 20 20 20 20 72 65 74 75 ORTED;.. retu
1a10: 72 6e 28 2d 31 29 3b 0a 09 63 61 73 65 20 53 53 rn(-1);..case SS
1a20: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e L_ERROR_WANT_CON
1a30: 4e 45 43 54 3a 0a 09 63 61 73 65 20 53 53 4c 5f NECT:..case SSL_
1a40: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 ERROR_WANT_ACCEP
1a50: 54 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 T:..case SSL_ERR
1a60: 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f OR_WANT_X509_LOO
1a70: 4b 55 50 3a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 KUP:..default:..
1a80: 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 65 20 dprintf("We
1a90: 67 6f 74 20 61 20 63 6f 6e 66 75 73 69 6e 67 20 got a confusing
1aa0: 72 65 70 6c 79 3a 20 25 69 22 2c 20 72 63 29 3b reply: %i", rc);
1ab0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
1ac0: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 Ptr = Tcl_GetErr
1ad0: 6e 6f 28 29 3b 0a 09 20 20 20 20 64 70 72 69 6e no();.. dprin
1ae0: 74 66 28 22 45 52 52 28 25 64 2c 20 25 64 29 20 tf("ERR(%d, %d)
1af0: 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 43 6f 64 ", rc, *errorCod
1b00: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
1b10: 72 6e 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 23 rn(-1);. }..#
1b20: 69 66 20 30 0a 20 20 20 20 69 66 20 28 73 74 61 if 0. if (sta
1b30: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
1b40: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b LS_TCL_SERVER) {
1b50: 0a 09 64 70 72 69 6e 74 66 28 22 54 68 69 73 20 ..dprintf("This
1b60: 69 73 20 61 6e 20 54 4c 53 20 73 65 72 76 65 72 is an TLS server
1b70: 2c 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 63 , checking the c
1b80: 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 74 ertificate for t
1b90: 68 65 20 70 65 65 72 22 29 3b 0a 0a 09 65 72 72 he peer");...err
1ba0: 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 = SSL_get_verif
1bb0: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 y_result(statePt
1bc0: 72 2d 3e 73 73 6c 29 3b 0a 09 69 66 20 28 65 72 r->ssl);..if (er
1bd0: 72 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 r != X509_V_OK)
1be0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 6e 76 {...dprintf("Inv
1bf0: 61 6c 69 64 20 63 65 72 74 69 66 69 63 61 74 65 alid certificate
1c00: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
1c10: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 54 6c 73 ailure");....Tls
1c20: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
1c30: 20 28 63 68 61 72 20 2a 29 58 35 30 39 5f 76 65 (char *)X509_ve
1c40: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
1c50: 73 74 72 69 6e 67 28 65 72 72 29 29 3b 0a 09 09 string(err));...
1c60: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
1c70: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 |= TLS_TCL_HANDS
1c80: 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 09 2a HAKE_FAILED;...*
1c90: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
1ca0: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 72 CONNABORTED;...r
1cb0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 20 20 eturn(-1);..}.
1cc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
1cd0: 64 70 72 69 6e 74 66 28 22 52 65 6d 6f 76 69 6e dprintf("Removin
1ce0: 67 20 74 68 65 20 5c 22 54 4c 53 5f 54 43 4c 5f g the \"TLS_TCL_
1cf0: 49 4e 49 54 5c 22 20 66 6c 61 67 20 73 69 6e 63 INIT\" flag sinc
1d00: 65 20 77 65 20 68 61 76 65 20 63 6f 6d 70 6c 65 e we have comple
1d10: 74 65 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b ted the handshak
1d20: 65 22 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 e");. statePt
1d30: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 4c 53 r->flags &= ~TLS
1d40: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20 20 20 20 _TCL_INIT;..
1d50: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
1d60: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b ng in success");
1d70: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
1d80: 74 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 tr = 0;. retu
1d90: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rn 0;.}../*. *--
1da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1de0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 49 6e 70 75 74 -. *. * TlsInput
1df0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 Proc --. *. *
1e00: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 This procedure
1e10: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 is invoked by th
1e20: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 e generic IO lev
1e30: 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 72 el. * to r
1e40: 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 ead input from a
1e50: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
1e60: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a d channel.. *. *
1e70: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 Results:. *
1e80: 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 Returns the numb
1e90: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 er of bytes read
1ea0: 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e or -1 on error.
1eb0: 20 53 65 74 73 20 65 72 72 6f 72 43 6f 64 65 50 Sets errorCodeP
1ec0: 74 72 0a 20 2a 20 20 20 20 74 6f 20 61 20 50 4f tr. * to a PO
1ed0: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 SIX error code i
1ee0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 f an error occur
1ef0: 72 65 64 2c 20 6f 72 20 30 20 69 66 20 6e 6f 6e red, or 0 if non
1f00: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
1f10: 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 52 65 61 fects:. * Rea
1f20: 64 73 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 ds input from th
1f30: 65 20 69 6e 70 75 74 20 64 65 76 69 63 65 20 6f e input device o
1f40: 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 f the channel..
1f50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
1fa0: 74 69 63 20 69 6e 74 20 54 6c 73 49 6e 70 75 74 tic int TlsInput
1fb0: 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a Proc(. void *
1fc0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 instanceData,.
1fd0: 20 20 63 68 61 72 20 2a 62 75 66 2c 0a 20 20 20 char *buf,.
1fe0: 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 int bufSize,.
1ff0: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 int *errorCode
2000: 50 74 72 29 0a 7b 0a 20 20 20 20 75 6e 73 69 67 Ptr).{. unsig
2010: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 ned long backing
2020: 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65 Error;. State
2030: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
2040: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
2050: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 ata;. int byt
2060: 65 73 52 65 61 64 3b 0a 20 20 20 20 69 6e 74 20 esRead;. int
2070: 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 20 20 20 20 tlsConnect;.
2080: 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 20 2a 65 int err;.. *e
2090: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b rrorCodePtr = 0;
20a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 .. dprintf("B
20b0: 49 4f 5f 72 65 61 64 28 25 64 29 22 2c 20 62 75 IO_read(%d)", bu
20c0: 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 20 fSize);.. if
20d0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
20e0: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 & TLS_TCL_CALLB
20f0: 41 43 4b 29 20 7b 0a 09 2f 2a 20 64 6f 6e 27 74 ACK) {../* don't
2100: 20 70 72 6f 63 65 73 73 20 61 6e 79 20 62 79 74 process any byt
2110: 65 73 20 77 68 69 6c 65 20 76 65 72 69 66 79 20 es while verify
2120: 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e callback is runn
2130: 69 6e 67 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 ing */..dprintf(
2140: 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e "Callback is run
2150: 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 20 30 20 ning, reading 0
2160: 62 79 74 65 73 22 29 3b 0a 09 72 65 74 75 72 6e bytes");..return
2170: 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 (0);. }..
2180: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 dprintf("Calling
2190: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
21a0: 65 63 74 22 29 3b 0a 20 20 20 20 74 6c 73 43 6f ect");. tlsCo
21b0: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 nnect = Tls_Wait
21c0: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
21d0: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 Ptr, errorCodePt
21e0: 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 74 r, 0);. if (t
21f0: 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b lsConnect < 0) {
2200: 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 ..dprintf("Got a
2210: 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 n error waiting
2220: 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 to connect (tlsC
2230: 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 onnect = %i, *er
2240: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 rorCodePtr = %i)
2250: 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a ", tlsConnect, *
2260: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a errorCodePtr);..
2270: 09 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b .bytesRead = -1;
2280: 0a 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 ..if (*errorCode
2290: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 Ptr == ECONNRESE
22a0: 54 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 T) {.. dprint
22b0: 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f f("Got connectio
22c0: 6e 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 20 n reset");..
22d0: 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 /* Soft EOF */..
22e0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
22f0: 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 65 r = 0;.. byte
2300: 73 52 65 61 64 20 3d 20 30 3b 0a 09 7d 0a 09 72 sRead = 0;..}..r
2310: 65 74 75 72 6e 28 62 79 74 65 73 52 65 61 64 29 eturn(bytesRead)
2320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
2330: 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 * We need t
2340: 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 o clear the SSL
2350: 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 error stack now
2360: 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 because we somet
2370: 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 20 imes reach.
2380: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * this function
2390: 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72 with leftover er
23a0: 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63 rors in the stac
23b0: 6b 2e 20 20 49 66 20 42 49 4f 5f 72 65 61 64 0a k. If BIO_read.
23c0: 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d * returns -
23d0: 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41 1 and intends EA
23e0: 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61 GAIN, there is a
23f0: 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c leftover error,
2400: 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 it will be.
2410: 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20 * misconstrued
2420: 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 as an error, not
2430: 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a EAGAIN.. *.
2440: 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69 * Alternati
2450: 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e vely, we may wan
2460: 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 t to handle the
2470: 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 <0 return codes
2480: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f from. * BIO_
2490: 72 65 61 64 20 73 70 65 63 69 61 6c 6c 79 20 28 read specially (
24a0: 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 68 as advised in th
24b0: 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c e RSA docs). TL
24c0: 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 20 S's lower level
24d0: 42 49 4f 0a 20 20 20 20 20 2a 20 66 75 6e 63 74 BIO. * funct
24e0: 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 74 ions play with t
24f0: 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 74 he retry flags t
2500: 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 20 hough, and this
2510: 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 0a 20 20 seems to work.
2520: 20 20 20 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 * correctly.
2530: 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e 20 Similar fix in
2540: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e 20 2d TlsOutputProc. -
2550: 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20 hobbs. */.
2560: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
2570: 6f 72 28 29 3b 0a 20 20 20 20 62 79 74 65 73 52 or();. bytesR
2580: 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73 ead = BIO_read(s
2590: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 tatePtr->bio, bu
25a0: 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20 f, bufSize);.
25b0: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 dprintf("BIO_re
25c0: 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 ad -> %d", bytes
25d0: 52 65 61 64 29 3b 0a 0a 20 20 20 20 65 72 72 20 Read);.. err
25e0: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 = SSL_get_error(
25f0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 statePtr->ssl, b
2600: 79 74 65 73 52 65 61 64 29 3b 0a 0a 23 69 66 20 ytesRead);..#if
2610: 30 0a 20 20 20 20 69 66 20 28 62 79 74 65 73 52 0. if (bytesR
2620: 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 69 66 20 ead <= 0) {..if
2630: 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 (BIO_should_retr
2640: 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 y(statePtr->bio)
2650: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
2660: 28 22 49 2f 4f 20 66 61 69 6c 65 64 2c 20 77 69 ("I/O failed, wi
2670: 6c 6c 20 72 65 74 72 79 20 62 61 73 65 64 20 6f ll retry based o
2680: 6e 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 n EAGAIN");..
2690: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
26a0: 20 45 41 47 41 49 4e 3b 0a 09 7d 0a 20 20 20 20 EAGAIN;..}.
26b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 }.#endif.. sw
26c0: 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 63 61 itch (err) {..ca
26d0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e se SSL_ERROR_NON
26e0: 45 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 42 75 E:.. dprintBu
26f0: 66 66 65 72 28 62 75 66 2c 20 62 79 74 65 73 52 ffer(buf, bytesR
2700: 65 61 64 29 3b 0a 09 20 20 20 20 62 72 65 61 6b ead);.. break
2710: 3b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ;..case SSL_ERRO
2720: 52 5f 53 53 4c 3a 0a 09 20 20 20 20 64 70 72 69 R_SSL:.. dpri
2730: 6e 74 66 28 22 53 53 4c 20 6e 65 67 6f 74 69 61 ntf("SSL negotia
2740: 74 69 6f 6e 20 65 72 72 6f 72 2c 20 69 6e 64 69 tion error, indi
2750: 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 cating that the
2760: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 62 connection has b
2770: 65 65 6e 20 61 62 6f 72 74 65 64 22 29 3b 0a 0a een aborted");..
2780: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
2790: 74 61 74 65 50 74 72 2c 20 54 43 4c 54 4c 53 5f tatePtr, TCLTLS_
27a0: 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 65 50 SSL_ERROR(stateP
27b0: 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 tr->ssl, bytesRe
27c0: 61 64 29 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f ad));.. *erro
27d0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
27e0: 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 62 79 ABORTED;.. by
27f0: 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 0a 09 tesRead = -1;...
2800: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 break;..case
2810: 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 SSL_ERROR_SYSCA
2820: 4c 4c 3a 0a 09 09 62 61 63 6b 69 6e 67 45 72 72 LL:...backingErr
2830: 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 or = ERR_get_err
2840: 6f 72 28 29 3b 0a 0a 09 09 69 66 20 28 62 61 63 or();....if (bac
2850: 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 kingError == 0 &
2860: 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20 30 & bytesRead == 0
2870: 29 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 ) {.....dprintf(
2880: 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 "EOF reached")..
2890: 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
28a0: 20 3d 20 30 3b 0a 09 09 09 09 62 79 74 65 73 52 = 0;.....bytesR
28b0: 65 61 64 20 3d 20 30 3b 0a 09 09 7d 20 65 6c 73 ead = 0;...} els
28c0: 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 e if (backingErr
28d0: 6f 72 20 3d 3d 20 30 20 26 26 20 62 79 74 65 73 or == 0 && bytes
28e0: 52 65 61 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 Read == -1) {...
28f0: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 ..dprintf("I/O e
2900: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 rror occurred (e
2910: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 rrno = %lu)", (u
2920: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 nsigned long) Tc
2930: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 l_GetErrno());..
2940: 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
2950: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 = Tcl_GetErrno(
2960: 29 3b 0a 09 09 09 09 62 79 74 65 73 52 65 61 64 );.....bytesRead
2970: 20 3d 20 2d 31 3b 0a 09 09 7d 20 65 6c 73 65 20 = -1;...} else
2980: 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22 49 {.....dprintf("I
2990: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 /O error occurre
29a0: 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 d (backingError
29b0: 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 = %lu)", backing
29c0: 45 72 72 6f 72 29 3b 0a 09 09 09 09 2a 65 72 72 Error);.....*err
29d0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 62 61 63 6b orCodePtr = back
29e0: 69 6e 67 45 72 72 6f 72 3b 0a 09 09 09 09 62 79 ingError;.....by
29f0: 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 tesRead = -1;...
2a00: 7d 0a 0a 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 }....break;...ca
2a10: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 se SSL_ERROR_ZER
2a20: 4f 5f 52 45 54 55 52 4e 3a 0a 09 09 09 64 70 72 O_RETURN:....dpr
2a30: 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 intf("Got SSL_ER
2a40: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 2c ROR_ZERO_RETURN,
2a50: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 45 this means an E
2a60: 4f 46 20 68 61 73 20 62 65 65 6e 20 72 65 61 63 OF has been reac
2a70: 68 65 64 22 29 3b 0a 09 09 09 62 79 74 65 73 52 hed");....bytesR
2a80: 65 61 64 20 3d 20 30 3b 0a 09 09 09 2a 65 72 72 ead = 0;....*err
2a90: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 orCodePtr = 0;..
2aa0: 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 ..break;...case
2ab0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 SSL_ERROR_WANT_R
2ac0: 45 41 44 3a 0a 09 09 09 64 70 72 69 6e 74 66 28 EAD:....dprintf(
2ad0: 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 "Got SSL_ERROR_W
2ae0: 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 6e ANT_READ, mappin
2af0: 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e g this to EAGAIN
2b00: 22 29 3b 0a 09 09 09 62 79 74 65 73 52 65 61 64 ");....bytesRead
2b10: 20 3d 20 2d 31 3b 0a 09 09 09 2a 65 72 72 6f 72 = -1;....*error
2b20: 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e CodePtr = EAGAIN
2b30: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 ;....break;...de
2b40: 66 61 75 6c 74 3a 0a 09 09 09 64 70 72 69 6e 74 fault:....dprint
2b50: 66 28 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 f("Unknown error
2b60: 20 28 65 72 72 20 3d 20 25 69 29 2c 20 6d 61 70 (err = %i), map
2b70: 70 69 6e 67 20 74 6f 20 45 4f 46 22 2c 20 65 72 ping to EOF", er
2b80: 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 r);...*errorCode
2b90: 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 Ptr = 0;...bytes
2ba0: 52 65 61 64 20 3d 20 30 3b 0a 09 09 62 72 65 61 Read = 0;...brea
2bb0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 k;. }.. dp
2bc0: 72 69 6e 74 66 28 22 49 6e 70 75 74 28 25 64 29 rintf("Input(%d)
2bd0: 20 2d 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 -> %d [%d]", bu
2be0: 66 53 69 7a 65 2c 20 62 79 74 65 73 52 65 61 64 fSize, bytesRead
2bf0: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 , *errorCodePtr)
2c00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 ;. return byt
2c10: 65 73 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a esRead;.}../*. *
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c60: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 ---. *. * TlsOut
2c70: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a putProc --. *. *
2c80: 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 This procedu
2c90: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 re is invoked by
2ca0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 the generic IO
2cb0: 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 level. * t
2cc0: 6f 20 77 72 69 74 65 20 6f 75 74 70 75 74 20 74 o write output t
2cd0: 6f 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 o a SSL socket b
2ce0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a ased channel.. *
2cf0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 . * Results:. *
2d00: 20 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e Returns the n
2d10: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 umber of bytes w
2d20: 72 69 74 74 65 6e 20 6f 72 20 2d 31 20 6f 6e 20 ritten or -1 on
2d30: 65 72 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f error. Sets erro
2d40: 72 43 6f 64 65 50 74 72 0a 20 2a 20 20 20 20 74 rCodePtr. * t
2d50: 6f 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 o a POSIX error
2d60: 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 code if an error
2d70: 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30 20 occurred, or 0
2d80: 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 if none.. *. * S
2d90: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 ide effects:. *
2da0: 20 20 20 57 72 69 74 65 73 20 6f 75 74 70 75 74 Writes output
2db0: 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 on the output d
2dc0: 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 evice of the cha
2dd0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2e20: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 54 */..static int T
2e30: 6c 73 4f 75 74 70 75 74 50 72 6f 63 28 0a 20 20 lsOutputProc(.
2e40: 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 void *instance
2e50: 44 61 74 61 2c 0a 20 20 20 20 63 6f 6e 73 74 20 Data,. const
2e60: 63 68 61 72 20 2a 62 75 66 2c 0a 20 20 20 20 69 char *buf,. i
2e70: 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20 20 20 nt toWrite,.
2e80: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 int *errorCodePt
2e90: 72 29 0a 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 r).{. unsigne
2ea0: 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 d long backingEr
2eb0: 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65 20 2a ror;. State *
2ec0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
2ed0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
2ee0: 61 3b 0a 20 20 20 20 69 6e 74 20 77 72 69 74 74 a;. int writt
2ef0: 65 6e 2c 20 65 72 72 3b 0a 20 20 20 20 69 6e 74 en, err;. int
2f00: 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 20 20 tlsConnect;..
2f10: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
2f20: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
2f30: 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 70 2c f("BIO_write(%p,
2f40: 20 25 64 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 %d)", (void *)
2f50: 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72 69 74 statePtr, toWrit
2f60: 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 42 75 e);. dprintBu
2f70: 66 66 65 72 28 62 75 66 2c 20 74 6f 57 72 69 74 ffer(buf, toWrit
2f80: 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 e);.. if (sta
2f90: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
2fa0: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 LS_TCL_CALLBACK)
2fb0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 44 6f 6e {..dprintf("Don
2fc0: 27 74 20 70 72 6f 63 65 73 73 20 6f 75 74 70 75 't process outpu
2fd0: 74 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b t while callback
2fe0: 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 22 29 3b s are running");
2ff0: 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a ..written = -1;.
3000: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
3010: 20 45 41 47 41 49 4e 3b 0a 09 72 65 74 75 72 6e EAGAIN;..return
3020: 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 (-1);. }..
3030: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e dprintf("Callin
3040: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e g Tls_WaitForCon
3050: 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c 73 43 nect");. tlsC
3060: 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 onnect = Tls_Wai
3070: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 tForConnect(stat
3080: 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 ePtr, errorCodeP
3090: 74 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 tr, 1);. if (
30a0: 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20 tlsConnect < 0)
30b0: 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 {..dprintf("Got
30c0: 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 an error waiting
30d0: 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 to connect (tls
30e0: 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 Connect = %i, *e
30f0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 rrorCodePtr = %i
3100: 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 )", tlsConnect,
3110: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a *errorCodePtr);.
3120: 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a ..written = -1;.
3130: 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 .if (*errorCodeP
3140: 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 tr == ECONNRESET
3150: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
3160: 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f 6e ("Got connection
3170: 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 20 2f reset");.. /
3180: 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 20 * Soft EOF */..
3190: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
31a0: 20 3d 20 30 3b 0a 09 20 20 20 20 77 72 69 74 74 = 0;.. writt
31b0: 65 6e 20 3d 20 30 3b 0a 09 7d 0a 09 72 65 74 75 en = 0;..}..retu
31c0: 72 6e 28 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 rn(written);.
31d0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f 57 72 }.. if (toWr
31e0: 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 72 ite == 0) {..dpr
31f0: 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69 74 65 intf("zero-write
3200: 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f 5f 66 ");..err = BIO_f
3210: 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e 62 lush(statePtr->b
3220: 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 3c io);...if (err <
3230: 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 = 0) {.. dpri
3240: 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 66 61 ntf("Flushing fa
3250: 69 6c 65 64 22 29 3b 0a 0a 09 20 20 20 20 2a 65 iled");... *e
3260: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 rrorCodePtr = EI
3270: 4f 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 O;.. written
3280: 3d 20 30 3b 0a 09 20 20 20 20 72 65 74 75 72 6e = 0;.. return
3290: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 77 72 69 74 74 (-1);..}...writt
32a0: 65 6e 20 3d 20 30 3b 0a 09 2a 65 72 72 6f 72 43 en = 0;..*errorC
32b0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 72 65 74 odePtr = 0;..ret
32c0: 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 urn(0);. }..
32d0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 /*. * We
32e0: 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 need to clear th
32f0: 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63 e SSL error stac
3300: 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65 k now because we
3310: 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68 sometimes reach
3320: 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e . * this fun
3330: 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f ction with lefto
3340: 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68 ver errors in th
3350: 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f e stack. If BIO
3360: 5f 77 72 69 74 65 0a 20 20 20 20 20 2a 20 72 65 _write. * re
3370: 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 turns -1 and int
3380: 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 ends EAGAIN, the
3390: 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 re is a leftover
33a0: 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 error, it will
33b0: 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e be. * miscon
33c0: 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 strued as an err
33d0: 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a or, not EAGAIN..
33e0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c *. * Al
33f0: 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 ternatively, we
3400: 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 may want to hand
3410: 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e le the <0 return
3420: 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 codes from.
3430: 20 2a 20 42 49 4f 5f 77 72 69 74 65 20 73 70 65 * BIO_write spe
3440: 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73 cially (as advis
3450: 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f ed in the RSA do
3460: 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 cs). TLS's lowe
3470: 72 20 6c 65 76 65 6c 0a 20 20 20 20 20 2a 20 42 r level. * B
3480: 49 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 IO functions pla
3490: 79 20 77 69 74 68 20 74 68 65 20 72 65 74 72 79 y with the retry
34a0: 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61 flags though, a
34b0: 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f nd this seems to
34c0: 0a 20 20 20 20 20 2a 20 77 6f 72 6b 20 63 6f 72 . * work cor
34d0: 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 rectly. Similar
34e0: 20 66 69 78 20 69 6e 20 54 6c 73 49 6e 70 75 74 fix in TlsInput
34f0: 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 Proc. - hobbs.
3500: 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c */. ERR_cl
3510: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 ear_error();.
3520: 20 77 72 69 74 74 65 6e 20 3d 20 42 49 4f 5f 77 written = BIO_w
3530: 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62 rite(statePtr->b
3540: 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69 74 65 io, buf, toWrite
3550: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
3560: 42 49 4f 5f 77 72 69 74 65 28 25 70 2c 20 25 64 BIO_write(%p, %d
3570: 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28 76 6f 69 ) -> [%d]", (voi
3580: 64 20 2a 29 20 73 74 61 74 65 50 74 72 2c 20 74 d *) statePtr, t
3590: 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 oWrite, written)
35a0: 3b 0a 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c ;.. err = SSL
35b0: 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 _get_error(state
35c0: 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 Ptr->ssl, writte
35d0: 6e 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 n);. switch (
35e0: 65 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53 4c err) {..case SSL
35f0: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 _ERROR_NONE:..
3600: 20 20 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20 if (written <
3610: 30 29 20 7b 0a 09 09 77 72 69 74 74 65 6e 20 3d 0) {...written =
3620: 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 0;.. }..
3630: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 4c break;..case SSL
3640: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 _ERROR_WANT_WRIT
3650: 45 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 E:.. dprintf(
3660: 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 "Got SSL_ERROR_W
3670: 41 4e 54 5f 57 52 49 54 45 2c 20 6d 61 70 70 69 ANT_WRITE, mappi
3680: 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e 22 ng it to EAGAIN"
3690: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f );.. *errorCo
36a0: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a dePtr = EAGAIN;.
36b0: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d . written = -
36c0: 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 1;.. break;..
36d0: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 case SSL_ERROR_W
36e0: 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 64 ANT_READ:.. d
36f0: 70 72 69 6e 74 66 28 22 20 77 72 69 74 65 20 52 printf(" write R
3700: 20 42 4c 4f 43 4b 22 29 3b 0a 09 20 20 20 20 62 BLOCK");.. b
3710: 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 4c 5f reak;..case SSL_
3720: 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f ERROR_WANT_X509_
3730: 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 64 70 72 LOOKUP:.. dpr
3740: 69 6e 74 66 28 22 20 77 72 69 74 65 20 58 20 42 intf(" write X B
3750: 4c 4f 43 4b 22 29 3b 0a 09 20 20 20 20 62 72 65 LOCK");.. bre
3760: 61 6b 3b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 ak;..case SSL_ER
3770: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a ROR_ZERO_RETURN:
3780: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 20 .. dprintf("
3790: 63 6c 6f 73 65 64 22 29 3b 0a 09 20 20 20 20 77 closed");.. w
37a0: 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 ritten = 0;..
37b0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
37c0: 20 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0;.. break;.
37d0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
37e0: 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 62 61 SYSCALL:.. ba
37f0: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 ckingError = ERR
3800: 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 _get_error();...
3810: 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 if (backingE
3820: 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 77 72 69 rror == 0 && wri
3830: 74 74 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 64 tten == 0) {...d
3840: 70 72 69 6e 74 66 28 22 45 4f 46 20 72 65 61 63 printf("EOF reac
3850: 68 65 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f hed")...*errorCo
3860: 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 77 72 69 dePtr = 0;...wri
3870: 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 7d tten = 0;.. }
3880: 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e else if (backin
3890: 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 77 gError == 0 && w
38a0: 72 69 74 74 65 6e 20 3d 3d 20 2d 31 29 20 7b 0a ritten == -1) {.
38b0: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 ..dprintf("I/O e
38c0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 rror occurred (e
38d0: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 rrno = %lu)", (u
38e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 nsigned long) Tc
38f0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 l_GetErrno());..
3900: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
3910: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
3920: 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b ...written = -1;
3930: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
3940: 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 .dprintf("I/O er
3950: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 61 ror occurred (ba
3960: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 ckingError = %lu
3970: 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 )", backingError
3980: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 );...*errorCodeP
3990: 74 72 20 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f tr = backingErro
39a0: 72 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d r;...written = -
39b0: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 1;.. }.. b
39c0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 4c 5f reak;..case SSL_
39d0: 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 ERROR_SSL:..
39e0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
39f0: 74 72 2c 20 54 43 4c 54 4c 53 5f 53 53 4c 5f 45 tr, TCLTLS_SSL_E
3a00: 52 52 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 RROR(statePtr->s
3a10: 73 6c 2c 20 77 72 69 74 74 65 6e 29 29 3b 0a 09 sl, written));..
3a20: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
3a30: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 r = ECONNABORTED
3a40: 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d ;.. written =
3a50: 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b -1;.. break;
3a60: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
3a70: 64 70 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e dprintf("unknown
3a80: 20 65 72 72 6f 72 3a 20 25 64 22 2c 20 65 72 72 error: %d", err
3a90: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 );.. break;.
3aa0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
3ab0: 66 28 22 4f 75 74 70 75 74 28 25 64 29 20 2d 3e f("Output(%d) ->
3ac0: 20 25 64 22 2c 20 74 6f 57 72 69 74 65 2c 20 77 %d", toWrite, w
3ad0: 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 72 65 74 ritten);. ret
3ae0: 75 72 6e 28 77 72 69 74 74 65 6e 29 3b 0a 7d 0a urn(written);.}.
3af0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3b40: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 TlsGetOptionProc
3b50: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 47 65 74 --. *. * Get
3b60: 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61 6c 75 s an option valu
3b70: 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b e for a SSL sock
3b80: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
3b90: 2c 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69 73 , or a. * lis
3ba0: 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 t of all options
3bb0: 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 and their value
3bc0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
3bd0: 3a 0a 20 2a 20 20 20 20 41 20 73 74 61 6e 64 61 :. * A standa
3be0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 54 rd Tcl result. T
3bf0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 he value of the
3c00: 73 70 65 63 69 66 69 65 64 20 6f 70 74 69 6f 6e specified option
3c10: 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69 73 74 or a. * list
3c20: 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 of all options
3c30: 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 and their values
3c40: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 is returned in
3c50: 74 68 65 0a 20 2a 20 20 20 20 73 75 70 70 6c 69 the. * suppli
3c60: 65 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 ed DString.. *.
3c70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3c80: 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 * None.. *.
3c90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cd0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
3ce0: 69 6e 74 0a 54 6c 73 47 65 74 4f 70 74 69 6f 6e int.TlsGetOption
3cf0: 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a Proc(. void *
3d00: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a instanceData,./*
3d10: 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a Socket state. *
3d20: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 /. Tcl_Interp
3d30: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f *interp,../* Fo
3d40: 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 r errors - can b
3d50: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 e NULL. */. c
3d60: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f onst char *optio
3d70: 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f nName,./* Name o
3d80: 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20 f the option to
3d90: 72 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c retrieve the val
3da0: 75 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 ue for, or.....
3db0: 2a 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c * NULL to get al
3dc0: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 l options and th
3dd0: 65 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 eir values. */.
3de0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a Tcl_DString *
3df0: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 optionValue)./*
3e00: 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 Where to store t
3e10: 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 he computed valu
3e20: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 e initialized by
3e30: 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 caller. */.{.
3e40: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
3e50: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e r = (State *) in
3e60: 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 stanceData;..
3e70: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 Tcl_Channel dow
3e80: 6e 43 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 nChan = Tls_GetP
3e90: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 arent(statePtr,
3ea0: 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 TLS_TCL_FASTPATH
3eb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 );. Tcl_Drive
3ec0: 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a rGetOptionProc *
3ed0: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a getOptionProc;..
3ee0: 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f getOptionPro
3ef0: 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 c = Tcl_ChannelG
3f00: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c etOptionProc(Tcl
3f10: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
3f20: 64 6f 77 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 downChan));.
3f30: 69 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f if (getOptionPro
3f40: 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 c != NULL) {..re
3f50: 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e turn (*getOption
3f60: 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 Proc)(Tcl_GetCha
3f70: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
3f80: 28 64 6f 77 6e 43 68 61 6e 29 2c 20 69 6e 74 65 (downChan), inte
3f90: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 rp, optionName,
3fa0: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 optionValue);.
3fb0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 } else if (opt
3fc0: 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 ionName == (char
3fd0: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 *) NULL) {../*..
3fe0: 20 2a 20 52 65 71 75 65 73 74 20 69 73 20 71 75 * Request is qu
3ff0: 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 ery for all opti
4000: 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e ons, this is ok.
4010: 0a 09 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 .. */..return TC
4020: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 L_OK;. }.
4030: 2f 2a 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73 /*. * Reques
4040: 74 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 t for a specific
4050: 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 option has to f
4060: 61 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 ail, we don't ha
4070: 76 65 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a ve any.. */.
4080: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
4090: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d RROR;.}../*. *--
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40e0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 61 74 63 68 -. *. * TlsWatch
40f0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 Proc --. *. *
4100: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 Initialize the
4110: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 notifier to watc
4120: 68 20 54 63 6c 5f 46 69 6c 65 73 20 66 72 6f 6d h Tcl_Files from
4130: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 this channel..
4140: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
4150: 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 None.. *. *
4160: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4170: 20 20 20 20 53 65 74 73 20 75 70 20 74 68 65 20 Sets up the
4180: 6e 6f 74 69 66 69 65 72 20 73 6f 20 74 68 61 74 notifier so that
4190: 20 61 20 66 75 74 75 72 65 20 65 76 65 6e 74 20 a future event
41a0: 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 on the channel.
41b0: 2a 20 20 20 20 77 69 6c 6c 20 62 65 20 73 65 65 * will be see
41c0: 6e 20 62 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d n by Tcl.. *. *-
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 2d 2d ----------------
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4210: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 --. */..static v
4220: 6f 69 64 0a 54 6c 73 57 61 74 63 68 50 72 6f 63 oid.TlsWatchProc
4230: 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 (. void *inst
4240: 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 anceData, /*
4250: 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 65 The socket state
4260: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 73 . */. int mas
4270: 6b 29 09 09 09 2f 2a 20 45 76 65 6e 74 73 20 6f k).../* Events o
4280: 66 20 69 6e 74 65 72 65 73 74 3b 20 61 6e 20 4f f interest; an O
4290: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e R-ed combination
42a0: 20 6f 66 0a 09 09 09 09 20 2a 20 54 43 4c 5f 52 of..... * TCL_R
42b0: 45 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 EADABLE, TCL_WRI
42c0: 54 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 TABLE and TCL_EX
42d0: 43 45 50 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 CEPTION. */.{.
42e0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 Tcl_Channel
42f0: 20 20 64 6f 77 6e 43 68 61 6e 3b 0a 20 20 20 20 downChan;.
4300: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
4310: 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 = (State *) inst
4320: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 anceData;.. d
4330: 70 72 69 6e 74 66 28 22 54 6c 73 57 61 74 63 68 printf("TlsWatch
4340: 50 72 6f 63 28 30 78 25 78 29 22 2c 20 6d 61 73 Proc(0x%x)", mas
4350: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 k);.. /* Pret
4360: 65 6e 64 20 74 6f 20 62 65 20 64 65 61 64 20 61 end to be dead a
4370: 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 76 65 s long as the ve
4380: 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 rify callback is
4390: 20 72 75 6e 6e 69 6e 67 2e 0a 20 20 20 20 20 2a running.. *
43a0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 61 74 20 Otherwise that
43b0: 63 61 6c 6c 62 61 63 6b 20 63 6f 75 6c 64 20 62 callback could b
43c0: 65 20 69 6e 76 6f 6b 65 64 20 72 65 63 75 72 73 e invoked recurs
43d0: 69 76 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 ively. */. if
43e0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 (statePtr->flag
43f0: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c s & TLS_TCL_CALL
4400: 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 BACK) {..dprintf
4410: 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e ("Callback is on
4420: 2d 67 6f 69 6e 67 2c 20 64 6f 69 6e 67 20 6e 6f -going, doing no
4430: 74 68 69 6e 67 22 29 3b 0a 09 72 65 74 75 72 6e thing");..return
4440: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
4450: 69 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 intFlags(statePt
4460: 72 29 3b 0a 0a 20 20 20 20 64 6f 77 6e 43 68 61 r);.. downCha
4470: 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e n = Tls_GetParen
4480: 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f t(statePtr, TLS_
4490: 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 0a TCL_FASTPATH);..
44a0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
44b0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
44c0: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c L_HANDSHAKE_FAIL
44d0: 45 44 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ED) {..dprintf("
44e0: 41 73 6b 65 64 20 74 6f 20 77 61 74 63 68 20 61 Asked to watch a
44f0: 20 73 6f 63 6b 65 74 20 77 69 74 68 20 61 20 66 socket with a f
4500: 61 69 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 20 ailed handshake
4510: 2d 2d 20 6e 6f 74 68 69 6e 67 20 63 61 6e 20 68 -- nothing can h
4520: 61 70 70 65 6e 20 68 65 72 65 22 29 3b 0a 09 64 appen here");..d
4530: 70 72 69 6e 74 66 28 22 55 6e 72 65 67 69 73 74 printf("Unregist
4540: 65 72 69 6e 67 20 69 6e 74 65 72 65 73 74 20 69 ering interest i
4550: 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e n the lower chan
4560: 6e 65 6c 22 29 3b 0a 0a 09 28 54 63 6c 5f 47 65 nel");...(Tcl_Ge
4570: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 tChannelType(dow
4580: 6e 43 68 61 6e 29 29 2d 3e 77 61 74 63 68 50 72 nChan))->watchPr
4590: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 oc(Tcl_GetChanne
45a0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f lInstanceData(do
45b0: 77 6e 43 68 61 6e 29 2c 20 30 29 3b 0a 09 73 74 wnChan), 0);..st
45c0: 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 atePtr->watchMas
45d0: 6b 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 3b 0a k = 0;..return;.
45e0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 }.. state
45f0: 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d Ptr->watchMask =
4600: 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e mask;.. /* N
4610: 6f 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 o channel handle
4620: 72 73 20 61 6e 79 20 6d 6f 72 65 2e 20 57 65 20 rs any more. We
4630: 77 69 6c 6c 20 62 65 20 6e 6f 74 69 66 69 65 64 will be notified
4640: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 automatically.
4650: 20 20 20 20 2a 20 61 62 6f 75 74 20 65 76 65 6e * about even
4660: 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 ts on the channe
4670: 6c 20 62 65 6c 6f 77 20 76 69 61 20 61 20 63 61 l below via a ca
4680: 6c 6c 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 2a ll to our. *
4690: 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 'TransformNotif
46a0: 79 50 72 6f 63 27 2e 20 42 75 74 20 77 65 20 68 yProc'. But we h
46b0: 61 76 65 20 74 6f 20 70 61 73 73 20 74 68 65 20 ave to pass the
46c0: 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20 6e 6f interest down no
46d0: 77 2e 0a 20 20 20 20 20 2a 20 57 65 20 61 72 65 w.. * We are
46e0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64 20 allowed to add
46f0: 61 64 64 69 74 69 6f 6e 61 6c 20 27 69 6e 74 65 additional 'inte
4700: 72 65 73 74 27 20 74 6f 20 74 68 65 20 6d 61 73 rest' to the mas
4710: 6b 20 69 66 20 77 65 20 77 61 6e 74 0a 20 20 20 k if we want.
4720: 20 20 2a 20 74 6f 2e 20 42 75 74 20 74 68 69 73 * to. But this
4730: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 transformation
4740: 68 61 73 20 6e 6f 20 73 75 63 68 20 69 6e 74 65 has no such inte
4750: 72 65 73 74 2e 20 49 74 20 6a 75 73 74 20 70 61 rest. It just pa
4760: 73 73 65 73 0a 20 20 20 20 20 2a 20 74 68 65 20 sses. * the
4770: 72 65 71 75 65 73 74 20 64 6f 77 6e 2c 20 75 6e request down, un
4780: 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f changed.. */
4790: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
47a0: 67 69 73 74 65 72 69 6e 67 20 6f 75 72 20 69 6e gistering our in
47b0: 74 65 72 65 73 74 20 69 6e 20 74 68 65 20 6c 6f terest in the lo
47c0: 77 65 72 20 63 68 61 6e 6e 65 6c 20 28 63 68 61 wer channel (cha
47d0: 6e 3d 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 n=%p)", (void *)
47e0: 20 64 6f 77 6e 43 68 61 6e 29 3b 0a 20 20 20 20 downChan);.
47f0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
4800: 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 0a 09 ype(downChan))..
4810: 20 20 20 20 2d 3e 77 61 74 63 68 50 72 6f 63 28 ->watchProc(
4820: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
4830: 73 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 stanceData(downC
4840: 68 61 6e 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 han), mask);..
4850: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6e 61 /*. * Mana
4860: 67 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 69 6e gement of the in
4870: 74 65 72 6e 61 6c 20 74 69 6d 65 72 2e 0a 20 20 ternal timer..
4880: 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 */. if (st
4890: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d atePtr->timer !=
48a0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
48b0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 64 70 72 69 6e ) NULL) {..dprin
48c0: 74 66 28 22 41 20 74 69 6d 65 72 20 77 61 73 20 tf("A timer was
48d0: 66 6f 75 6e 64 2c 20 64 65 6c 65 74 69 6e 67 20 found, deleting
48e0: 69 74 22 29 3b 0a 09 54 63 6c 5f 44 65 6c 65 74 it");..Tcl_Delet
48f0: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
4900: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
4910: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
4920: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b = (Tcl_TimerTok
4930: 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a en) NULL;. }.
4940: 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 . if ((mask &
4950: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 TCL_READABLE) &
4960: 26 0a 09 28 28 54 63 6c 5f 49 6e 70 75 74 42 75 &..((Tcl_InputBu
4970: 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d ffered(statePtr-
4980: 3e 73 65 6c 66 29 20 3e 20 30 29 20 7c 7c 20 28 >self) > 0) || (
4990: 42 49 4f 5f 63 74 72 6c 5f 70 65 6e 64 69 6e 67 BIO_ctrl_pending
49a0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 (statePtr->bio)
49b0: 3e 20 30 29 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a > 0))) {../*.. *
49c0: 20 54 68 65 72 65 20 69 73 20 69 6e 74 65 72 65 There is intere
49d0: 73 74 20 69 6e 20 72 65 61 64 61 62 6c 65 20 65 st in readable e
49e0: 76 65 6e 74 73 20 61 6e 64 20 77 65 20 61 63 74 vents and we act
49f0: 75 61 6c 6c 79 20 68 61 76 65 0a 09 20 2a 20 64 ually have.. * d
4a00: 61 74 61 20 77 61 69 74 69 6e 67 2c 20 73 6f 20 ata waiting, so
4a10: 67 65 6e 65 72 61 74 65 20 61 20 74 69 6d 65 72 generate a timer
4a20: 20 74 6f 20 66 6c 75 73 68 20 74 68 61 74 2e 0a to flush that..
4a30: 09 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 43 . */..dprintf("C
4a40: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 69 reating a new ti
4a50: 6d 65 72 20 73 69 6e 63 65 20 64 61 74 61 20 61 mer since data a
4a60: 70 70 65 61 72 73 20 74 6f 20 62 65 20 77 61 69 ppears to be wai
4a70: 74 69 6e 67 22 29 3b 0a 09 73 74 61 74 65 50 74 ting");..statePt
4a80: 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 r->timer = Tcl_C
4a90: 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 reateTimerHandle
4aa0: 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c r(TLS_TCL_DELAY,
4ab0: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c TlsChannelHandl
4ac0: 65 72 54 69 6d 65 72 2c 20 73 74 61 74 65 50 74 erTimer, statePt
4ad0: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a r);. }.}../*.
4ae0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b20: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 -----. *. * TlsG
4b30: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a etHandleProc --.
4b40: 20 2a 0a 20 2a 20 20 20 20 43 61 6c 6c 65 64 20 *. * Called
4b50: 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e from Tcl_GetChan
4b60: 6e 65 6c 46 69 6c 65 20 74 6f 20 72 65 74 72 69 nelFile to retri
4b70: 65 76 65 20 6f 2f 73 20 66 69 6c 65 20 68 61 6e eve o/s file han
4b80: 64 6c 65 72 0a 20 2a 20 20 20 20 66 72 6f 6d 20 dler. * from
4b90: 74 68 65 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 the SSL socket b
4ba0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a ased channel.. *
4bb0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 . * Results:. *
4bc0: 20 20 20 54 68 65 20 61 70 70 72 6f 70 72 69 61 The appropria
4bd0: 74 65 20 54 63 6c 5f 46 69 6c 65 20 68 61 6e 64 te Tcl_File hand
4be0: 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f le or NULL if no
4bf0: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ne.. *. * Side e
4c00: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f ffects:. * No
4c10: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
4c60: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 47 .static int TlsG
4c70: 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 0a 20 20 etHandleProc(.
4c80: 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 void *instance
4c90: 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b Data, /* Sock
4ca0: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 et state. */.
4cb0: 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 09 int direction,.
4cc0: 09 2f 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 ./* TCL_READABLE
4cd0: 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 or TCL_WRITABLE
4ce0: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 2a 68 */. void **h
4cf0: 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e andlePtr)./* Han
4d00: 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 dle associated w
4d10: 69 74 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 ith the channel
4d20: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
4d30: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
4d40: 65 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 e *)instanceData
4d50: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 ;.. return(Tc
4d60: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 l_GetChannelHand
4d70: 6c 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 le(Tls_GetParent
4d80: 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 (statePtr, TLS_T
4d90: 43 4c 5f 46 41 53 54 50 41 54 48 29 2c 20 64 69 CL_FASTPATH), di
4da0: 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 rection, handleP
4db0: 74 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d tr));.}../*. *--
4dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e00: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 -. *. * TlsNotif
4e10: 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 yProc --. *. *
4e20: 20 20 48 61 6e 64 6c 65 72 20 63 61 6c 6c 65 64 Handler called
4e30: 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 by Tcl to infor
4e40: 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 m us of activity
4e50: 0a 20 2a 20 20 20 20 6f 6e 20 74 68 65 20 75 6e . * on the un
4e60: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
4e70: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4e80: 0a 20 2a 20 20 20 20 54 79 70 65 20 6f 66 20 65 . * Type of e
4e90: 76 65 6e 74 20 6f 72 20 30 20 69 66 20 66 61 69 vent or 0 if fai
4ea0: 6c 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 led. *. * Side e
4eb0: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4d 61 ffects:. * Ma
4ec0: 79 20 70 72 6f 63 65 73 73 20 74 68 65 20 69 6e y process the in
4ed0: 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 62 79 20 coming event by
4ee0: 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d 2d itself.. *. *---
4ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f30: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
4f40: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 28 0a TlsNotifyProc(.
4f50: 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e void *instan
4f60: 63 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f ceData, /* So
4f70: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 cket state. */.
4f80: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f int mask).../
4f90: 2a 20 74 79 70 65 20 6f 66 20 65 76 65 6e 74 20 * type of event
4fa0: 74 68 61 74 20 6f 63 63 75 72 72 65 64 3a 0a 09 that occurred:..
4fb0: 09 09 09 20 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 ... * OR-ed comb
4fc0: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 ination of TCL_R
4fd0: 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 EADABLE or TCL_W
4fe0: 52 49 54 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 RITABLE */.{.
4ff0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
5000: 20 3d 20 28 53 74 61 74 65 20 2a 29 69 6e 73 74 = (State *)inst
5010: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e anceData;. in
5020: 74 20 65 72 72 6f 72 43 6f 64 65 3b 0a 0a 20 20 t errorCode;..
5030: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20 65 /*. * An e
5040: 76 65 6e 74 20 6f 63 63 75 72 72 65 64 20 69 6e vent occurred in
5050: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
5060: 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a 20 channel. This.
5070: 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 * transforma
5080: 74 69 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f tion doesn't pro
5090: 63 65 73 73 20 73 75 63 68 20 65 76 65 6e 74 73 cess such events
50a0: 20 74 68 75 73 20 72 65 74 75 72 6e 73 20 74 68 thus returns th
50b0: 65 0a 20 20 20 20 20 2a 20 69 6e 63 6f 6d 69 6e e. * incomin
50c0: 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e 67 65 64 g mask unchanged
50d0: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 .. */. if
50e0: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
50f0: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
5100: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f oken) NULL) {../
5110: 2a 0a 09 20 2a 20 44 65 6c 65 74 65 20 61 6e 20 *.. * Delete an
5120: 65 78 69 73 74 69 6e 67 20 74 69 6d 65 72 2e 20 existing timer.
5130: 49 74 20 77 61 73 20 6e 6f 74 20 66 69 72 65 64 It was not fired
5140: 2c 20 79 65 74 20 77 65 20 61 72 65 0a 09 20 2a , yet we are.. *
5150: 20 68 65 72 65 2c 20 73 6f 20 74 68 65 20 63 68 here, so the ch
5160: 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65 annel below gene
5170: 72 61 74 65 64 20 73 75 63 68 20 61 6e 20 65 76 rated such an ev
5180: 65 6e 74 20 61 6e 64 20 77 65 0a 09 20 2a 20 64 ent and we.. * d
5190: 6f 6e 27 74 20 68 61 76 65 20 74 6f 2e 20 54 68 on't have to. Th
51a0: 65 20 72 65 6e 65 77 61 6c 20 6f 66 20 74 68 65 e renewal of the
51b0: 20 69 6e 74 65 72 65 73 74 20 61 66 74 65 72 20 interest after
51c0: 74 68 65 0a 09 20 2a 20 65 78 65 63 75 74 69 6f the.. * executio
51d0: 6e 20 6f 66 20 63 68 61 6e 6e 65 6c 20 68 61 6e n of channel han
51e0: 64 6c 65 72 73 20 77 69 6c 6c 20 65 76 65 6e 74 dlers will event
51f0: 75 61 6c 6c 79 20 63 61 75 73 65 20 75 73 20 74 ually cause us t
5200: 6f 0a 09 20 2a 20 72 65 63 72 65 61 74 65 20 74 o.. * recreate t
5210: 68 65 20 74 69 6d 65 72 20 28 69 6e 20 57 61 74 he timer (in Wat
5220: 63 68 50 72 6f 63 29 2e 0a 09 20 2a 2f 0a 09 54 chProc)... */..T
5230: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
5240: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
5250: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
5260: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
5270: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
5280: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
5290: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
52a0: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 & TLS_TCL_CALLB
52b0: 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 ACK) {..dprintf(
52c0: 22 52 65 74 75 72 6e 69 6e 67 20 30 20 64 75 65 "Returning 0 due
52d0: 20 74 6f 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a to callback");.
52e0: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d .return 0;. }
52f0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
5300: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 alling Tls_WaitF
5310: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 orConnect");.
5320: 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a errorCode = 0;.
5330: 20 20 20 20 69 66 20 28 54 6c 73 5f 57 61 69 74 if (Tls_Wait
5340: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
5350: 50 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c Ptr, &errorCode,
5360: 20 31 29 20 3c 20 30 29 20 7b 0a 09 69 66 20 28 1) < 0) {..if (
5370: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 errorCode == EAG
5380: 41 49 4e 29 20 7b 0a 09 20 20 20 20 64 70 72 69 AIN) {.. dpri
5390: 6e 74 66 28 22 41 73 79 6e 63 20 66 6c 61 67 20 ntf("Async flag
53a0: 63 6f 75 6c 64 20 62 65 20 73 65 74 20 28 64 69 could be set (di
53b0: 64 6e 27 74 20 63 68 65 63 6b 29 20 61 6e 64 20 dn't check) and
53c0: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 errorCode == EAG
53d0: 41 49 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67 20 AIN: Returning
53e0: 30 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 0");... retur
53f0: 6e 20 30 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 n 0;..}...dprint
5400: 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f f("Tls_WaitForCo
5410: 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 20 61 nnect returned a
5420: 6e 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 7d n error");. }
5430: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
5440: 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 6d 61 eturning %i", ma
5450: 73 6b 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e sk);.. return
5460: 28 6d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a (mask);.}../*. *
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 ------*. *. *
54b0: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c TlsChannelHandl
54c0: 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a erTimer --. *. *
54d0: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5500: 2d 2d 2d 2d 2a 0a 20 2a 20 20 20 20 43 61 6c 6c ----*. * Call
5510: 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 ed by the notifi
5520: 65 72 20 28 2d 3e 20 74 69 6d 65 72 29 20 74 6f er (-> timer) to
5530: 20 66 6c 75 73 68 20 6f 75 74 0a 20 2a 20 20 20 flush out. *
5540: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 information wai
5550: 74 69 6e 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 ting in channel
5560: 62 75 66 66 65 72 73 2e 0a 20 2a 20 20 20 20 2d buffers.. * -
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
55a0: 0a 20 2a 0a 20 2a 20 20 20 20 53 69 64 65 20 65 . *. * Side e
55b0: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 20 20 ffects:. *
55c0: 20 20 41 73 20 6f 66 20 27 54 6c 73 43 68 61 6e As of 'TlsChan
55d0: 6e 65 6c 48 61 6e 64 6c 65 72 27 2e 0a 20 2a 0a nelHandler'.. *.
55e0: 20 2a 20 20 20 20 52 65 73 75 6c 74 3a 0a 20 2a * Result:. *
55f0: 20 20 20 20 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a None.. *
5600: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
5640: 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 68 tatic void TlsCh
5650: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 annelHandlerTime
5660: 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 r(void *clientDa
5670: 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 ta) {. State
5680: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5690: 74 65 20 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b te *)clientData;
56a0: 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 . int mask =
56b0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
56c0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
56d0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
56e0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
56f0: 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 n) NULL;.. if
5700: 20 28 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 (BIO_wpending(s
5710: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
5720: 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e ..dprintf("[chan
5730: 3d 25 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c =%p] BIO writabl
5740: 65 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 e", statePtr->se
5750: 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 lf);...mask |= T
5760: 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 CL_WRITABLE;.
5770: 20 7d 0a 0a 20 20 20 20 69 66 20 28 42 49 4f 5f }.. if (BIO_
5780: 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 pending(statePtr
5790: 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70 72 69 6e ->bio)) {..dprin
57a0: 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49 tf("[chan=%p] BI
57b0: 4f 20 72 65 61 64 61 62 6c 65 22 2c 20 73 74 61 O readable", sta
57c0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 tePtr->self);...
57d0: 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 mask |= TCL_READ
57e0: 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ABLE;. }..
57f0: 20 64 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79 dprintf("Notify
5800: 69 6e 67 20 6f 75 72 73 65 6c 76 65 73 22 29 3b ing ourselves");
5810: 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 . Tcl_NotifyC
5820: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d hannel(statePtr-
5830: 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 0a 20 >self, mask);..
5840: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
5850: 72 6e 69 6e 67 22 29 3b 0a 0a 20 20 20 20 72 65 rning");.. re
5860: 74 75 72 6e 3b 0a 7d 0a 0a 54 63 6c 5f 43 68 61 turn;.}..Tcl_Cha
5870: 6e 6e 65 6c 20 54 6c 73 5f 47 65 74 50 61 72 65 nnel Tls_GetPare
5880: 6e 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 nt(State *stateP
5890: 74 72 2c 20 69 6e 74 20 6d 61 73 6b 46 6c 61 67 tr, int maskFlag
58a0: 73 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 s) {. dprintf
58b0: 28 22 52 65 71 75 65 73 74 65 64 20 74 6f 20 67 ("Requested to g
58c0: 65 74 20 70 61 72 65 6e 74 20 6f 66 20 63 68 61 et parent of cha
58d0: 6e 6e 65 6c 20 25 70 22 2c 20 73 74 61 74 65 50 nnel %p", stateP
58e0: 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 20 20 20 20 tr->self);..
58f0: 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 if ((statePtr->f
5900: 6c 61 67 73 20 26 20 7e 6d 61 73 6b 46 6c 61 67 lags & ~maskFlag
5910: 73 29 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41 53 s) & TLS_TCL_FAS
5920: 54 50 41 54 48 29 20 7b 0a 09 64 70 72 69 6e 74 TPATH) {..dprint
5930: 66 28 22 41 73 6b 65 64 20 74 6f 20 67 65 74 20 f("Asked to get
5940: 74 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e the parent chann
5950: 65 6c 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 el while we are
5960: 75 73 69 6e 67 20 46 61 73 74 50 61 74 68 20 2d using FastPath -
5970: 2d 20 72 65 74 75 72 6e 69 6e 67 20 4e 55 4c 4c - returning NULL
5980: 22 29 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c ");..return(NULL
5990: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
59a0: 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 6b urn Tcl_GetStack
59b0: 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 edChannel(stateP
59c0: 74 72 2d 3e 73 65 6c 66 29 3b 0a 7d 0a 0a 2f 2a tr->self);.}../*
59d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
59e0: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
5a20: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a _ChannelType --.
5a30: 20 2a 0a 20 2a 20 20 20 20 52 65 74 75 72 6e 20 *. * Return
5a40: 74 68 65 20 63 6f 72 72 65 63 74 20 54 4c 53 20 the correct TLS
5a50: 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 20 69 channel driver i
5a60: 6e 66 6f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nfo. *. * Result
5a70: 73 3a 0a 20 2a 20 20 20 20 54 68 65 20 63 6f 72 s:. * The cor
5a80: 72 65 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 rect channel dri
5a90: 76 65 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 ver for the curr
5aa0: 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 ent version of T
5ab0: 63 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 cl.. *. * Side e
5ac0: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f ffects:. * No
5ad0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
5b20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 .static const Tc
5b30: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c l_ChannelType tl
5b40: 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b sChannelType = {
5b50: 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a . "tls",.../*
5b60: 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 Type name */.
5b70: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 TCL_CHANNEL_VE
5b80: 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 RSION_5,./* v5 c
5b90: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c hannel */. Tl
5ba0: 73 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 sCloseProc,../*
5bb0: 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 Close proc */.
5bc0: 20 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09 TlsInputProc,.
5bd0: 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a ./* Input proc *
5be0: 2f 0a 20 20 20 20 54 6c 73 4f 75 74 70 75 74 50 /. TlsOutputP
5bf0: 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 roc,../* Output
5c00: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 30 2c 09 09 proc */. 0,..
5c10: 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f ./* Seek proc */
5c20: 0a 20 20 20 20 30 2c 09 09 2f 2a 20 53 65 74 20 . 0,../* Set
5c30: 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 option proc */.
5c40: 20 20 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 TlsGetOptionP
5c50: 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 6f 70 74 roc,../* Get opt
5c60: 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 ion proc */.
5c70: 54 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 09 2f TlsWatchProc,../
5c80: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 * Initialize not
5c90: 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 54 6c 73 ifier */. Tls
5ca0: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 09 GetHandleProc,..
5cb0: 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 /* Get OS handle
5cc0: 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c s out of channel
5cd0: 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 */. TlsClose
5ce0: 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 2Proc,../* close
5cf0: 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 2proc */. Tls
5d00: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 BlockModeProc,..
5d10: 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f /* Set blocking/
5d20: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 nonblocking mode
5d30: 2a 2f 0a 20 20 20 20 30 2c 09 09 09 2f 2a 20 46 */. 0,.../* F
5d40: 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20 lush proc */.
5d50: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 2c 09 TlsNotifyProc,.
5d60: 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20 ./* Handling of
5d70: 65 76 65 6e 74 73 20 62 75 62 62 6c 69 6e 67 20 events bubbling
5d80: 75 70 20 2a 2f 0a 20 20 20 20 30 2c 09 09 09 2f up */. 0,.../
5d90: 2a 20 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63 * Wide seek proc
5da0: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 */. NULL,...
5db0: 2f 2a 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e /* Thread action
5dc0: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f */. NULL.../
5dd0: 2a 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b * Truncate */.};
5de0: 0a 0a 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e ..const Tcl_Chan
5df0: 6e 65 6c 54 79 70 65 20 2a 54 6c 73 5f 43 68 61 nelType *Tls_Cha
5e00: 6e 6e 65 6c 54 79 70 65 28 76 6f 69 64 29 20 7b nnelType(void) {
5e10: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 74 6c 73 . return &tls
5e20: 43 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d 0a ChannelType;.}.