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 09 74 63 6c 53 53 4c 20 28 43 6f 6c :. *.tclSSL (Col
0250: 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 in McCormack, Sh
0260: 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 ared Technology)
0270: 0a 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65 . *.SSLtcl (Pete
0280: 72 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f r Antman). *. */
0290: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 ..#include "tlsI
02a0: 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 20 2a 20 46 6f nt.h".../*. * Fo
02b0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f rward declaratio
02c0: 6e 73 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e ns. */.static in
02d0: 74 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 t TlsBlockModeP
02e0: 72 6f 63 20 28 43 6c 69 65 6e 74 44 61 74 61 20 roc (ClientData
02f0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
0300: 74 20 6d 6f 64 65 29 3b 0a 23 69 66 20 54 43 4c t mode);.#if TCL
0310: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MAJOR_VERSION <
0320: 20 39 0a 73 74 61 74 69 63 20 69 6e 74 20 20 54 9.static int T
0330: 6c 73 43 6c 6f 73 65 50 72 6f 63 20 28 43 6c 69 lsCloseProc (Cli
0340: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
0350: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
0360: 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 *interp);.#else
0370: 0a 73 74 61 74 69 63 20 69 6e 74 20 20 54 6c 73 .static int Tls
0380: 43 6c 6f 73 65 32 50 72 6f 63 20 28 43 6c 69 65 Close2Proc (Clie
0390: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
03a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
03b0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 *interp, int fla
03c0: 67 73 29 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 gs);.#endif.stat
03d0: 69 63 20 69 6e 74 20 20 54 6c 73 49 6e 70 75 74 ic int TlsInput
03e0: 50 72 6f 63 20 28 43 6c 69 65 6e 74 44 61 74 61 Proc (ClientData
03f0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 63 instanceData, c
0400: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 har *buf, int bu
0410: 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f fSize, int *erro
0420: 72 43 6f 64 65 50 74 72 29 3b 0a 73 74 61 74 69 rCodePtr);.stati
0430: 63 20 69 6e 74 20 20 54 6c 73 4f 75 74 70 75 74 c int TlsOutput
0440: 50 72 6f 63 20 28 43 6c 69 65 6e 74 44 61 74 61 Proc (ClientData
0450: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 63 instanceData, c
0460: 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c 20 onst char *buf,
0470: 69 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 int toWrite, int
0480: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b *errorCodePtr);
0490: 0a 73 74 61 74 69 63 20 69 6e 74 20 20 54 6c 73 .static int Tls
04a0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 28 43 GetOptionProc (C
04b0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
04c0: 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ceData, Tcl_Inte
04d0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 rp *interp, cons
04e0: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 t char *optionNa
04f0: 6d 65 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 me, Tcl_DString
0500: 2a 64 73 50 74 72 29 3b 0a 73 74 61 74 69 63 20 *dsPtr);.static
0510: 76 6f 69 64 20 54 6c 73 57 61 74 63 68 50 72 6f void TlsWatchPro
0520: 63 20 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e c (ClientData in
0530: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 stanceData, int
0540: 6d 61 73 6b 29 3b 0a 73 74 61 74 69 63 20 69 6e mask);.static in
0550: 74 20 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 t TlsGetHandleP
0560: 72 6f 63 20 28 43 6c 69 65 6e 74 44 61 74 61 20 roc (ClientData
0570: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
0580: 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 t direction, Cli
0590: 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 entData *handleP
05a0: 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 tr);.static int
05b0: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 28 TlsNotifyProc (
05c0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 ClientData insta
05d0: 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 nceData, int mas
05e0: 6b 29 3b 0a 23 69 66 20 30 0a 73 74 61 74 69 63 k);.#if 0.static
05f0: 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e 65 6c void TlsChannel
0600: 48 61 6e 64 6c 65 72 20 28 43 6c 69 65 6e 74 44 Handler (ClientD
0610: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
0620: 69 6e 74 20 6d 61 73 6b 29 3b 0a 23 65 6e 64 69 int mask);.#endi
0630: 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 6c f.static void Tl
0640: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 sChannelHandlerT
0650: 69 6d 65 72 20 28 43 6c 69 65 6e 74 44 61 74 61 imer (ClientData
0660: 20 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 0a 2f clientData);../
0670: 2a 0a 20 2a 20 54 4c 53 20 43 68 61 6e 6e 65 6c *. * TLS Channel
0680: 20 54 79 70 65 0a 20 2a 2f 0a 73 74 61 74 69 63 Type. */.static
0690: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tcl_ChannelType
06a0: 20 2a 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 *tlsChannelType
06b0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 20 2a 2d = NULL;../*. *-
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0700: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 68 61 --. *. * Tls_Cha
0710: 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a 20 nnelType --. *.
0720: 2a 09 52 65 74 75 72 6e 20 74 68 65 20 63 6f 72 *.Return the cor
0730: 72 65 63 74 20 54 4c 53 20 63 68 61 6e 6e 65 6c rect TLS channel
0740: 20 64 72 69 76 65 72 20 69 6e 66 6f 0a 20 2a 0a driver info. *.
0750: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 * Results:. *.T
0760: 68 65 20 63 6f 72 72 65 63 74 20 63 68 61 6e 6e he correct chann
0770: 65 6c 20 64 72 69 76 65 72 20 66 6f 72 20 74 68 el driver for th
0780: 65 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f e current versio
0790: 6e 20 6f 66 20 54 63 6c 2e 0a 20 2a 0a 20 2a 20 n of Tcl.. *. *
07a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
07b0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0800: 20 2a 2f 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 */.Tcl_ChannelT
0810: 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c ype *Tls_Channel
0820: 54 79 70 65 28 76 6f 69 64 29 20 7b 0a 09 75 6e Type(void) {..un
0830: 73 69 67 6e 65 64 20 69 6e 74 20 73 69 7a 65 3b signed int size;
0840: 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 69 74 69 61 .../*.. * Initia
0850: 6c 69 7a 65 20 74 68 65 20 63 68 61 6e 6e 65 6c lize the channel
0860: 20 74 79 70 65 20 69 66 20 6e 65 63 65 73 73 61 type if necessa
0870: 72 79 0a 09 20 2a 2f 0a 09 69 66 20 28 74 6c 73 ry.. */..if (tls
0880: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 3d 20 4e ChannelType == N
0890: 55 4c 4c 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a ULL) {.../*... *
08a0: 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 Allocation of a
08b0: 20 6e 65 77 20 63 68 61 6e 6e 65 6c 74 79 70 65 new channeltype
08c0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6e 6f structure is no
08d0: 74 20 65 61 73 79 2c 20 62 65 63 61 75 73 65 20 t easy, because
08e0: 6f 66 0a 09 09 20 2a 20 74 68 65 20 76 61 72 69 of... * the vari
08f0: 6f 75 73 20 76 65 72 73 6f 6e 20 6f 66 20 74 68 ous verson of th
0900: 65 20 63 6f 72 65 20 61 6e 64 20 73 75 62 73 65 e core and subse
0910: 71 75 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f quent changes to
0920: 20 74 68 65 0a 09 09 20 2a 20 73 74 72 75 63 74 the... * struct
0930: 75 72 65 2e 20 54 68 65 20 6d 61 69 6e 20 63 68 ure. The main ch
0940: 61 6c 6c 65 6e 67 65 20 69 73 20 74 6f 20 61 6c allenge is to al
0950: 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 locate enough me
0960: 6d 6f 72 79 20 66 6f 72 0a 09 09 20 2a 20 6d 6f mory for... * mo
0970: 64 65 72 6e 20 76 65 72 73 69 6f 6e 73 20 65 76 dern versions ev
0980: 65 6e 20 69 66 20 74 68 69 73 20 65 78 74 73 65 en if this extse
0990: 6e 73 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 nsion is compile
09a0: 64 20 61 67 61 69 6e 73 74 20 6f 6e 65 0a 09 09 d against one...
09b0: 20 2a 20 6f 66 20 74 68 65 20 6f 6c 64 65 72 20 * of the older
09c0: 76 61 72 69 61 6e 74 21 0a 09 09 20 2a 0a 09 09 variant!... *...
09d0: 20 2a 20 28 31 29 20 56 65 72 73 69 6f 6e 73 20 * (1) Versions
09e0: 62 65 66 6f 72 65 20 73 74 75 62 73 20 28 38 2e before stubs (8.
09f0: 30 2e 78 29 20 61 72 65 20 73 69 6d 70 6c 65 2c 0.x) are simple,
0a00: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72 because they ar
0a10: 65 0a 09 09 20 2a 20 20 20 20 20 73 75 70 70 6f e... * suppo
0a20: 72 74 65 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 rted only if the
0a30: 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 6f extension is co
0a40: 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 65 mpiled against e
0a50: 78 61 63 74 6c 79 0a 09 09 20 2a 20 20 20 20 20 xactly... *
0a60: 74 68 61 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 that version of
0a70: 74 68 65 20 63 6f 72 65 2e 0a 09 09 20 2a 0a 09 the core.... *..
0a80: 09 20 2a 20 28 32 29 20 57 69 74 68 20 73 74 75 . * (2) With stu
0a90: 62 73 20 77 65 20 6a 75 73 74 20 64 65 74 65 72 bs we just deter
0aa0: 6d 69 6e 65 20 74 68 65 20 64 69 66 66 65 72 65 mine the differe
0ab0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 nce between the
0ac0: 6f 6c 64 65 72 0a 09 09 20 2a 20 20 20 20 20 61 older... * a
0ad0: 6e 64 20 6d 6f 64 65 72 6e 20 76 61 72 69 61 6e nd modern varian
0ae0: 74 20 61 6e 64 20 6f 76 65 72 61 6c 6c 6f 63 61 t and overalloca
0af0: 74 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 69 te accordingly i
0b00: 66 20 63 6f 6d 70 69 6c 65 64 0a 09 09 20 2a 20 f compiled... *
0b10: 20 20 20 20 61 67 61 69 6e 73 74 20 61 6e 20 6f against an o
0b20: 6c 64 65 72 20 76 61 72 69 61 6e 74 2e 0a 09 09 lder variant....
0b30: 20 2a 2f 0a 09 09 73 69 7a 65 20 3d 20 73 69 7a */...size = siz
0b40: 65 6f 66 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 eof(Tcl_ChannelT
0b50: 79 70 65 29 3b 20 2f 2a 20 42 61 73 65 20 73 69 ype); /* Base si
0b60: 7a 65 20 2a 2f 0a 0a 09 09 74 6c 73 43 68 61 6e ze */....tlsChan
0b70: 6e 65 6c 54 79 70 65 20 3d 20 28 54 63 6c 5f 43 nelType = (Tcl_C
0b80: 68 61 6e 6e 65 6c 54 79 70 65 20 2a 29 20 63 6b hannelType *) ck
0b90: 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 09 09 6d alloc(size);...m
0ba0: 65 6d 73 65 74 28 28 76 6f 69 64 20 2a 29 20 74 emset((void *) t
0bb0: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 30 lsChannelType, 0
0bc0: 2c 20 73 69 7a 65 29 3b 0a 0a 09 09 2f 2a 0a 09 , size);..../*..
0bd0: 09 20 2a 20 43 6f 6d 6d 6f 6e 20 65 6c 65 6d 65 . * Common eleme
0be0: 6e 74 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 nts of the struc
0bf0: 74 75 72 65 20 28 6e 6f 20 63 68 61 6e 67 65 73 ture (no changes
0c00: 20 69 6e 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 in location or
0c10: 6e 61 6d 65 29 0a 09 09 20 2a 20 63 6c 6f 73 65 name)... * close
0c20: 32 50 72 6f 63 2c 20 73 65 65 6b 50 72 6f 63 2c 2Proc, seekProc,
0c30: 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 73 setOptionProc s
0c40: 74 61 79 20 4e 55 4c 4c 2e 0a 09 09 20 2a 2f 0a tay NULL.... */.
0c50: 0a 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 ...tlsChannelTyp
0c60: 65 2d 3e 74 79 70 65 4e 61 6d 65 09 3d 20 22 74 e->typeName.= "t
0c70: 6c 73 22 3b 0a 23 69 66 20 54 43 4c 5f 4d 41 4a ls";.#if TCL_MAJ
0c80: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 39 0a 09 OR_VERSION < 9..
0c90: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d .tlsChannelType-
0ca0: 3e 63 6c 6f 73 65 50 72 6f 63 09 3d 20 54 6c 73 >closeProc.= Tls
0cb0: 43 6c 6f 73 65 50 72 6f 63 3b 0a 23 65 6c 73 65 CloseProc;.#else
0cc0: 0a 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 ...tlsChannelTyp
0cd0: 65 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 09 3d 20 e->close2Proc.=
0ce0: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 3b 0a 23 TlsClose2Proc;.#
0cf0: 65 6e 64 69 66 0a 09 09 74 6c 73 43 68 61 6e 6e endif...tlsChann
0d00: 65 6c 54 79 70 65 2d 3e 69 6e 70 75 74 50 72 6f elType->inputPro
0d10: 63 09 3d 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 c.= TlsInputProc
0d20: 3b 0a 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 ;...tlsChannelTy
0d30: 70 65 2d 3e 6f 75 74 70 75 74 50 72 6f 63 09 3d pe->outputProc.=
0d40: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 3b 0a TlsOutputProc;.
0d50: 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 ..tlsChannelType
0d60: 2d 3e 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 09 ->getOptionProc.
0d70: 3d 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 = TlsGetOptionPr
0d80: 6f 63 3b 0a 09 09 74 6c 73 43 68 61 6e 6e 65 6c oc;...tlsChannel
0d90: 54 79 70 65 2d 3e 77 61 74 63 68 50 72 6f 63 09 Type->watchProc.
0da0: 3d 20 54 6c 73 57 61 74 63 68 50 72 6f 63 3b 0a = TlsWatchProc;.
0db0: 09 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 ..tlsChannelType
0dc0: 2d 3e 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 09 ->getHandleProc.
0dd0: 3d 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 = TlsGetHandlePr
0de0: 6f 63 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 43 oc;..../*... * C
0df0: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 ompiled against
0e00: 38 2e 33 2e 32 2b 2e 20 44 69 72 65 63 74 20 61 8.3.2+. Direct a
0e10: 63 63 65 73 73 20 74 6f 20 61 6c 6c 20 65 6c 65 ccess to all ele
0e20: 6d 65 6e 74 73 20 70 6f 73 73 69 62 6c 65 2e 20 ments possible.
0e30: 55 73 65 0a 09 09 20 2a 20 63 68 61 6e 6e 65 6c Use... * channel
0e40: 54 79 70 65 56 65 72 73 69 6f 6e 20 69 6e 66 6f TypeVersion info
0e50: 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 6c 65 63 rmation to selec
0e60: 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 t the values to
0e70: 75 73 65 2e 0a 09 09 20 2a 2f 0a 0a 09 09 2f 2a use.... */..../*
0e80: 0a 09 09 20 2a 20 46 6f 72 20 74 68 65 20 38 2e ... * For the 8.
0e90: 33 2e 32 20 63 6f 72 65 20 77 65 20 70 72 65 73 3.2 core we pres
0ea0: 65 6e 74 20 6f 75 72 73 65 6c 76 65 73 20 61 73 ent ourselves as
0eb0: 20 61 20 76 65 72 73 69 6f 6e 20 32 0a 09 09 20 a version 2...
0ec0: 2a 20 64 72 69 76 65 72 2e 20 54 68 69 73 20 6d * driver. This m
0ed0: 65 61 6e 73 20 61 20 73 70 65 63 69 61 6c 20 76 eans a special v
0ee0: 61 6c 75 65 20 69 6e 20 76 65 72 73 69 6f 6e 20 alue in version
0ef0: 28 65 78 0a 09 09 20 2a 20 62 6c 6f 63 6b 4d 6f (ex... * blockMo
0f00: 64 65 50 72 6f 63 29 2c 20 62 6c 6f 63 6b 4d 6f deProc), blockMo
0f10: 64 65 50 72 6f 63 20 69 6e 20 61 20 64 69 66 66 deProc in a diff
0f20: 65 72 65 6e 74 20 70 6c 61 63 65 20 61 6e 64 20 erent place and
0f30: 6f 66 0a 09 09 20 2a 20 63 6f 75 72 73 65 20 75 of... * course u
0f40: 73 61 67 65 20 6f 66 20 74 68 65 20 68 61 6e 64 sage of the hand
0f50: 6c 65 72 50 72 6f 63 2e 0a 09 09 20 2a 2f 0a 09 lerProc.... */..
0f60: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d .tlsChannelType-
0f70: 3e 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 3d >version =
0f80: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 TCL_CHANNEL_VER
0f90: 53 49 4f 4e 5f 35 3b 0a 09 09 74 6c 73 43 68 61 SION_5;...tlsCha
0fa0: 6e 6e 65 6c 54 79 70 65 2d 3e 62 6c 6f 63 6b 4d nnelType->blockM
0fb0: 6f 64 65 50 72 6f 63 20 3d 20 54 6c 73 42 6c 6f odeProc = TlsBlo
0fc0: 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a 09 09 74 6c ckModeProc;...tl
0fd0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 68 61 sChannelType->ha
0fe0: 6e 64 6c 65 72 50 72 6f 63 20 20 20 3d 20 54 6c ndlerProc = Tl
0ff0: 73 4e 6f 74 69 66 79 50 72 6f 63 3b 0a 09 7d 0a sNotifyProc;..}.
1000: 0a 09 72 65 74 75 72 6e 28 74 6c 73 43 68 61 6e ..return(tlsChan
1010: 6e 65 6c 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a nelType);.}../*.
1020: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1060: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 42 -----. *. * TlsB
1070: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a lockModeProc --.
1080: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
1090: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
10a0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
10b0: 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 O level. *
10c0: 20 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e 67 to set blocking
10d0: 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 and nonblocking
10e0: 20 6d 6f 64 65 73 0a 20 2a 20 52 65 73 75 6c 74 modes. * Result
10f0: 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 s:. *.0 if succe
1100: 73 73 66 75 6c 2c 20 65 72 72 6e 6f 20 77 68 65 ssful, errno whe
1110: 6e 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 n failed.. *. *
1120: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
1130: 09 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65 .Sets the device
1140: 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f into blocking o
1150: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f r nonblocking mo
1160: 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d de.. *. *-------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
11b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42 .static int TlsB
11c0: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 lockModeProc(Cli
11d0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
11e0: 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 Data, int mode)
11f0: 7b 0a 09 53 74 61 74 65 20 2a 73 74 61 74 65 50 {..State *stateP
1200: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 tr = (State *) i
1210: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 09 69 nstanceData;...i
1220: 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d f (mode == TCL_M
1230: 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 ODE_NONBLOCKING)
1240: 20 7b 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 66 {...statePtr->f
1250: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
1260: 41 53 59 4e 43 3b 0a 09 7d 20 65 6c 73 65 20 7b ASYNC;..} else {
1270: 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 ...statePtr->fla
1280: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
1290: 41 53 59 4e 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 ASYNC);..}...ret
12a0: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a urn(0);.}../*. *
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f ---. *. * TlsClo
1300: 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 seProc --. *. *.
1310: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
1320: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 s invoked by the
1330: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 generic IO leve
1340: 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 l to perform. *.
1350: 63 68 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 channel-type-spe
1360: 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 cific cleanup wh
1370: 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
1380: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
1390: 09 69 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20 .is closed.. *.
13a0: 2a 09 4e 6f 74 65 3a 20 77 65 20 6c 65 61 76 65 *.Note: we leave
13b0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
13c0: 73 6f 63 6b 65 74 20 61 6c 6f 6e 65 2c 20 69 73 socket alone, is
13d0: 20 74 68 69 73 20 72 69 67 68 74 3f 0a 20 2a 0a this right?. *.
13e0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 * Results:. *.0
13f0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 if successful,
1400: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 54 63 6c the value of Tcl
1410: 5f 47 65 74 45 72 72 6e 6f 28 29 20 69 66 20 66 _GetErrno() if f
1420: 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 ailed.. *. * Sid
1430: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6c e effects:. *.Cl
1440: 6f 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20 oses the socket
1450: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a of the channel..
1460: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
14b0: 74 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 tic int TlsClose
14c0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
14d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 instanceData, Tc
14e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
14f0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
1500: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
1510: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 *) instanceData
1520: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1530: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 25 70 29 TlsCloseProc(%p)
1540: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 ", (void *) stat
1550: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 6c 73 5f ePtr);.. Tls_
1560: 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b Clean(statePtr);
1570: 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 . Tcl_Eventua
1580: 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44 llyFree((ClientD
1590: 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c ata)statePtr, Tl
15a0: 73 5f 46 72 65 65 29 3b 0a 0a 20 20 20 20 64 70 s_Free);.. dp
15b0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
15c0: 20 54 43 4c 5f 4f 4b 22 29 3b 0a 0a 20 20 20 20 TCL_OK");..
15d0: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
15e0: 0a 20 20 20 20 2f 2a 20 49 6e 74 65 72 70 20 69 . /* Interp i
15f0: 73 20 75 6e 75 73 65 64 2e 20 2a 2f 0a 20 20 20 s unused. */.
1600: 20 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 interp = interp
1610: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 ;.}..static int
1620: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c TlsClose2Proc(Cl
1630: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
1640: 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 eData, Tcl_Inter
1650: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 p *interp, int f
1660: 6c 61 67 73 29 20 7b 0a 20 20 20 20 69 66 20 28 lags) {. if (
1670: 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c (flags & (TCL_CL
1680: 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 4c 4f OSE_READ|TCL_CLO
1690: 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 SE_WRITE)) == 0)
16a0: 20 7b 0a 09 53 74 61 74 65 20 2a 73 74 61 74 65 {..State *state
16b0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
16c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 09 instanceData;...
16d0: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 dprintf("TlsClos
16e0: 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f 69 eProc(%p)", (voi
16f0: 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a d *) statePtr);.
1700: 0a 09 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 ..Tls_Clean(stat
1710: 65 50 74 72 29 3b 0a 09 54 63 6c 5f 45 76 65 6e ePtr);..Tcl_Even
1720: 74 75 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 tuallyFree((Clie
1730: 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72 2c ntData)statePtr,
1740: 20 54 6c 73 5f 46 72 65 65 29 3b 0a 0a 09 64 70 Tls_Free);...dp
1750: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
1760: 20 54 43 4c 5f 4f 4b 22 29 3b 0a 0a 09 72 65 74 TCL_OK");...ret
1770: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 urn(TCL_OK);.
1780: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 74 65 72 }.. /* Inter
1790: 70 20 69 73 20 75 6e 75 73 65 64 2e 20 2a 2f 0a p is unused. */.
17a0: 20 20 20 20 69 6e 74 65 72 70 20 3d 20 69 6e 74 interp = int
17b0: 65 72 70 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d erp;.}../*. *---
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17f0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 57 ---*. *. *.Tls_W
1800: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d 2d aitForConnect --
1810: 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63 . *. *.Sideeffec
1820: 74 73 3a 0a 20 2a 09 09 49 73 73 75 65 73 20 53 ts:. *..Issues S
1830: 53 4c 5f 61 63 63 65 70 74 20 6f 72 20 53 53 4c SL_accept or SSL
1840: 5f 63 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 09 52 _connect. *. *.R
1850: 65 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e esult:. *..None.
1860: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
18a0: 2f 0a 69 6e 74 20 54 6c 73 5f 57 61 69 74 46 6f /.int Tls_WaitFo
18b0: 72 43 6f 6e 6e 65 63 74 28 53 74 61 74 65 20 2a rConnect(State *
18c0: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 2a 65 statePtr, int *e
18d0: 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 69 6e 74 rrorCodePtr, int
18e0: 20 68 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 handshakeFailur
18f0: 65 49 73 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a eIsPermanent) {.
1900: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 .unsigned long b
1910: 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 09 69 6e ackingError;..in
1920: 74 20 65 72 72 2c 20 72 63 3b 0a 09 69 6e 74 20 t err, rc;..int
1930: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 3b 0a bioShouldRetry;.
1940: 0a 09 64 70 72 69 6e 74 66 28 22 57 61 69 74 46 ..dprintf("WaitF
1950: 6f 72 43 6f 6e 6e 65 63 74 28 25 70 29 22 2c 20 orConnect(%p)",
1960: 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 (void *) statePt
1970: 72 29 3b 0a 09 64 70 72 69 6e 74 46 6c 61 67 73 r);..dprintFlags
1980: 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 09 69 66 (statePtr);...if
1990: 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c (!(statePtr->fl
19a0: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e ags & TLS_TCL_IN
19b0: 49 54 29 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 IT)) {...dprintf
19c0: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e ("Tls_WaitForCon
19d0: 6e 65 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20 61 nect called on a
19e0: 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a lready initializ
19f0: 65 64 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72 65 ed channel -- re
1a00: 74 75 72 6e 69 6e 67 20 77 69 74 68 20 69 6d 6d turning with imm
1a10: 65 64 69 61 74 65 20 73 75 63 63 65 73 73 22 29 ediate success")
1a20: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 ;...*errorCodePt
1a30: 72 20 3d 20 30 3b 0a 09 09 72 65 74 75 72 6e 28 r = 0;...return(
1a40: 30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61 0);..}...if (sta
1a50: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
1a60: 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 LS_TCL_HANDSHAKE
1a70: 5f 46 41 49 4c 45 44 29 20 7b 0a 09 09 2f 2a 0a _FAILED) {.../*.
1a80: 09 09 20 2a 20 44 69 66 66 65 72 65 6e 74 20 74 .. * Different t
1a90: 79 70 65 73 20 6f 66 20 6f 70 65 72 61 74 69 6f ypes of operatio
1aa0: 6e 73 20 68 61 76 65 20 64 69 66 66 65 72 65 6e ns have differen
1ab0: 74 20 72 65 71 75 69 72 65 6d 65 6e 74 73 0a 09 t requirements..
1ac0: 09 20 2a 20 53 53 4c 20 62 65 69 6e 67 20 65 73 . * SSL being es
1ad0: 74 61 62 6c 69 73 68 65 64 0a 09 09 20 2a 2f 0a tablished... */.
1ae0: 09 09 69 66 20 28 68 61 6e 64 73 68 61 6b 65 46 ..if (handshakeF
1af0: 61 69 6c 75 72 65 49 73 50 65 72 6d 61 6e 65 6e ailureIsPermanen
1b00: 74 29 20 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 t) {....dprintf(
1b10: 22 41 73 6b 65 64 20 74 6f 20 77 61 69 74 20 66 "Asked to wait f
1b20: 6f 72 20 61 20 54 4c 53 20 68 61 6e 64 73 68 61 or a TLS handsha
1b30: 6b 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 ke that has alre
1b40: 61 64 79 20 66 61 69 6c 65 64 2e 20 20 52 65 74 ady failed. Ret
1b50: 75 72 6e 69 6e 67 20 66 61 74 61 6c 20 65 72 72 urning fatal err
1b60: 6f 72 22 29 3b 0a 09 09 09 2a 65 72 72 6f 72 43 or");....*errorC
1b70: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 odePtr = ECONNAB
1b80: 4f 52 54 45 44 3b 0a 09 09 7d 20 65 6c 73 65 20 ORTED;...} else
1b90: 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 22 41 73 {....dprintf("As
1ba0: 6b 65 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20 ked to wait for
1bb0: 61 20 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 a TLS handshake
1bc0: 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 that has already
1bd0: 20 66 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e failed. Return
1be0: 69 6e 67 20 73 6f 66 74 20 65 72 72 6f 72 22 29 ing soft error")
1bf0: 3b 0a 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 ;....*errorCodeP
1c00: 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b tr = ECONNRESET;
1c10: 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 28 2d 31 ...}...return(-1
1c20: 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 3b 3b 29 );..}...for (;;)
1c30: 20 7b 0a 09 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 {.../* Not init
1c40: 69 61 6c 69 7a 65 64 20 79 65 74 21 20 2a 2f 0a ialized yet! */.
1c50: 09 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
1c60: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
1c70: 53 45 52 56 45 52 29 20 7b 0a 09 09 09 64 70 72 SERVER) {....dpr
1c80: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 intf("Calling SS
1c90: 4c 5f 61 63 63 65 70 74 28 29 22 29 3b 0a 0a 09 L_accept()");...
1ca0: 09 09 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 65 ..err = SSL_acce
1cb0: 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c pt(statePtr->ssl
1cc0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
1cd0: 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e .dprintf("Callin
1ce0: 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 29 22 g SSL_connect()"
1cf0: 29 3b 0a 0a 09 09 09 65 72 72 20 3d 20 53 53 4c );.....err = SSL
1d00: 5f 63 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 _connect(statePt
1d10: 72 2d 3e 73 73 6c 29 3b 0a 09 09 7d 0a 0a 09 09 r->ssl);...}....
1d20: 69 66 20 28 65 72 72 20 3e 20 30 29 20 7b 0a 09 if (err > 0) {..
1d30: 09 09 64 70 72 69 6e 74 66 28 22 54 68 61 74 20 ..dprintf("That
1d40: 73 65 65 6d 73 20 74 6f 20 68 61 76 65 20 67 6f seems to have go
1d50: 6e 65 20 6f 6b 61 79 22 29 3b 0a 0a 09 09 09 65 ne okay");.....e
1d60: 72 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73 rr = BIO_flush(s
1d70: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a tatePtr->bio);..
1d80: 09 09 09 69 66 20 28 65 72 72 20 3c 3d 20 30 29 ...if (err <= 0)
1d90: 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22 {.....dprintf("
1da0: 46 6c 75 73 68 69 6e 67 20 74 68 65 20 6c 6f 77 Flushing the low
1db0: 65 72 20 6c 61 79 65 72 73 20 66 61 69 6c 65 64 er layers failed
1dc0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 70 72 6f 62 , this will prob
1dd0: 61 62 6c 79 20 74 65 72 6d 69 6e 61 74 65 20 74 ably terminate t
1de0: 68 69 73 20 73 65 73 73 69 6f 6e 22 29 3b 0a 09 his session");..
1df0: 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 63 20 3d 20 ..}...}....rc =
1e00: 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 SSL_get_error(st
1e10: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65 72 72 atePtr->ssl, err
1e20: 29 3b 0a 0a 09 09 64 70 72 69 6e 74 66 28 22 47 );....dprintf("G
1e30: 6f 74 20 65 72 72 6f 72 3a 20 25 69 20 28 72 63 ot error: %i (rc
1e40: 20 3d 20 25 69 29 22 2c 20 65 72 72 2c 20 72 63 = %i)", err, rc
1e50: 29 3b 0a 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 );....bioShouldR
1e60: 65 74 72 79 20 3d 20 30 3b 0a 09 09 69 66 20 28 etry = 0;...if (
1e70: 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 09 09 69 err <= 0) {....i
1e80: 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 f (rc == SSL_ERR
1e90: 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 20 OR_WANT_CONNECT
1ea0: 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 || rc == SSL_ERR
1eb0: 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 20 7c OR_WANT_ACCEPT |
1ec0: 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f | rc == SSL_ERRO
1ed0: 52 5f 57 41 4e 54 5f 52 45 41 44 20 7c 7c 20 72 R_WANT_READ || r
1ee0: 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 c == SSL_ERROR_W
1ef0: 41 4e 54 5f 57 52 49 54 45 29 20 7b 0a 09 09 09 ANT_WRITE) {....
1f00: 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 .bioShouldRetry
1f10: 3d 20 31 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 = 1;....} else i
1f20: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 f (BIO_should_re
1f30: 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 try(statePtr->bi
1f40: 6f 29 29 20 7b 0a 09 09 09 09 62 69 6f 53 68 6f o)) {.....bioSho
1f50: 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 09 uldRetry = 1;...
1f60: 09 7d 20 65 6c 73 65 20 69 66 20 28 72 63 20 3d .} else if (rc =
1f70: 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 = SSL_ERROR_SYSC
1f80: 41 4c 4c 20 26 26 20 54 63 6c 5f 47 65 74 45 72 ALL && Tcl_GetEr
1f90: 72 6e 6f 28 29 20 3d 3d 20 45 41 47 41 49 4e 29 rno() == EAGAIN)
1fa0: 20 7b 0a 09 09 09 09 62 69 6f 53 68 6f 75 6c 64 {.....bioShould
1fb0: 52 65 74 72 79 20 3d 20 31 3b 0a 09 09 09 7d 0a Retry = 1;....}.
1fc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 66 ..} else {....if
1fd0: 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 (!SSL_is_init_f
1fe0: 69 6e 69 73 68 65 64 28 73 74 61 74 65 50 74 72 inished(statePtr
1ff0: 2d 3e 73 73 6c 29 29 20 7b 0a 09 09 09 09 62 69 ->ssl)) {.....bi
2000: 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 oShouldRetry = 1
2010: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 ;....}...}....if
2020: 20 28 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 (bioShouldRetry
2030: 29 20 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 22 ) {....dprintf("
2040: 54 68 65 20 49 2f 4f 20 64 69 64 20 6e 6f 74 20 The I/O did not
2050: 63 6f 6d 70 6c 65 74 65 20 2d 2d 20 62 75 74 20 complete -- but
2060: 77 65 20 73 68 6f 75 6c 64 20 74 72 79 20 69 74 we should try it
2070: 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09 09 69 66 again");.....if
2080: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 (statePtr->flag
2090: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e s & TLS_TCL_ASYN
20a0: 43 29 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 C) {.....dprintf
20b0: 28 22 52 65 74 75 72 6e 69 6e 67 20 45 41 47 41 ("Returning EAGA
20c0: 49 4e 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 IN so that it ca
20d0: 6e 20 62 65 20 72 65 74 72 69 65 64 20 6c 61 74 n be retried lat
20e0: 65 72 22 29 3b 0a 0a 09 09 09 09 2a 65 72 72 6f er");......*erro
20f0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 rCodePtr = EAGAI
2100: 4e 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d N;......return(-
2110: 31 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 1);....} else {.
2120: 09 09 09 09 64 70 72 69 6e 74 66 28 22 44 6f 69 ....dprintf("Doi
2130: 6e 67 20 73 6f 20 6e 6f 77 22 29 3b 0a 0a 09 09 ng so now");....
2140: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d ..continue;....}
2150: 0a 09 09 7d 0a 0a 09 09 64 70 72 69 6e 74 66 28 ...}....dprintf(
2160: 22 57 65 20 68 61 76 65 20 65 69 74 68 65 72 20 "We have either
2170: 63 6f 6d 70 6c 65 74 65 6c 79 20 65 73 74 61 62 completely estab
2180: 6c 69 73 68 65 64 20 74 68 65 20 73 65 73 73 69 lished the sessi
2190: 6f 6e 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 on or completely
21a0: 20 66 61 69 6c 65 64 20 69 74 20 2d 2d 20 74 68 failed it -- th
21b0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 6e ere is no more n
21c0: 65 65 64 20 74 6f 20 65 76 65 72 20 72 65 74 72 eed to ever retr
21d0: 79 20 69 74 20 74 68 6f 75 67 68 22 29 3b 0a 09 y it though");..
21e0: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 0a 09 2a 65 .break;..}....*e
21f0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 rrorCodePtr = EI
2200: 4e 56 41 4c 3b 0a 0a 09 73 77 69 74 63 68 20 28 NVAL;...switch (
2210: 72 63 29 20 7b 0a 09 09 63 61 73 65 20 53 53 4c rc) {...case SSL
2220: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 09 09 _ERROR_NONE:....
2230: 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f /* The connectio
2240: 6e 20 69 73 20 75 70 2c 20 77 65 20 61 72 65 20 n is up, we are
2250: 64 6f 6e 65 20 68 65 72 65 20 2a 2f 0a 09 09 09 done here */....
2260: 64 70 72 69 6e 74 66 28 22 54 68 65 20 63 6f 6e dprintf("The con
2270: 6e 65 63 74 69 6f 6e 20 69 73 20 75 70 22 29 3b nection is up");
2280: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 ....break;...cas
2290: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f e SSL_ERROR_ZERO
22a0: 5f 52 45 54 55 52 4e 3a 0a 09 09 09 64 70 72 69 _RETURN:....dpri
22b0: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 5a ntf("SSL_ERROR_Z
22c0: 45 52 4f 5f 52 45 54 55 52 4e 3a 20 43 6f 6e 6e ERO_RETURN: Conn
22d0: 65 63 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20 ect returned an
22e0: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 2e 2e invalid value...
22f0: 22 29 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 ")....return(-1)
2300: 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
2310: 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 09 09 62 OR_SYSCALL:....b
2320: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 ackingError = ER
2330: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a R_get_error();..
2340: 09 09 09 69 66 20 28 62 61 63 6b 69 6e 67 45 72 ...if (backingEr
2350: 72 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20 ror == 0 && err
2360: 3d 3d 20 30 29 20 7b 0a 09 09 09 09 64 70 72 69 == 0) {.....dpri
2370: 6e 74 66 28 22 45 4f 46 20 72 65 61 63 68 65 64 ntf("EOF reached
2380: 22 29 0a 09 09 09 09 2a 65 72 72 6f 72 43 6f 64 ").....*errorCod
2390: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 ePtr = ECONNRESE
23a0: 54 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 T;....} else if
23b0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d (backingError ==
23c0: 20 30 20 26 26 20 65 72 72 20 3d 3d 20 2d 31 29 0 && err == -1)
23d0: 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22 {.....dprintf("
23e0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 I/O error occure
23f0: 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 d (errno = %lu)"
2400: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
2410: 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 ) Tcl_GetErrno()
2420: 29 3b 0a 09 09 09 09 2a 65 72 72 6f 72 43 6f 64 );.....*errorCod
2430: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 ePtr = Tcl_GetEr
2440: 72 6e 6f 28 29 3b 0a 09 09 09 09 69 66 20 28 2a rno();.....if (*
2450: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 errorCodePtr ==
2460: 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 ECONNRESET) {...
2470: 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
2480: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
2490: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 .....}....} else
24a0: 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22 {.....dprintf("
24b0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 I/O error occure
24c0: 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 d (backingError
24d0: 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 = %lu)", backing
24e0: 45 72 72 6f 72 29 3b 0a 09 09 09 09 2a 65 72 72 Error);.....*err
24f0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 62 61 63 6b orCodePtr = back
2500: 69 6e 67 45 72 72 6f 72 3b 0a 09 09 09 09 69 66 ingError;.....if
2510: 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 (*errorCodePtr
2520: 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b == ECONNRESET) {
2530: 0a 09 09 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 ......*errorCode
2540: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 Ptr = ECONNABORT
2550: 45 44 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a ED;.....}....}..
2560: 09 09 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 ...statePtr->fla
2570: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 gs |= TLS_TCL_HA
2580: 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a NDSHAKE_FAILED;.
2590: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ....return(-1);.
25a0: 09 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 ..case SSL_ERROR
25b0: 5f 53 53 4c 3a 0a 09 09 09 64 70 72 69 6e 74 66 _SSL:....dprintf
25c0: 28 22 47 6f 74 20 70 65 72 6d 61 6e 65 6e 74 20 ("Got permanent
25d0: 66 61 74 61 6c 20 53 53 4c 20 65 72 72 6f 72 2c fatal SSL error,
25e0: 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d 65 64 69 aborting immedi
25f0: 61 74 65 6c 79 22 29 3b 0a 09 09 09 54 6c 73 5f ately");....Tls_
2600: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
2610: 28 63 68 61 72 20 2a 29 45 52 52 5f 72 65 61 73 (char *)ERR_reas
2620: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 on_error_string(
2630: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 ERR_get_error())
2640: 29 3b 0a 09 09 09 73 74 61 74 65 50 74 72 2d 3e );....statePtr->
2650: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c flags |= TLS_TCL
2660: 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 _HANDSHAKE_FAILE
2670: 44 3b 0a 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 D;....*errorCode
2680: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 Ptr = ECONNABORT
2690: 45 44 3b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 ED;....return(-1
26a0: 29 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52 );...case SSL_ER
26b0: 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 ROR_WANT_CONNECT
26c0: 3a 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52 52 :...case SSL_ERR
26d0: 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 3a 0a OR_WANT_ACCEPT:.
26e0: 09 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 ..case SSL_ERROR
26f0: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 _WANT_X509_LOOKU
2700: 50 3a 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 P:...default:...
2710: 09 64 70 72 69 6e 74 66 28 22 57 65 20 67 6f 74 .dprintf("We got
2720: 20 61 20 63 6f 6e 66 75 73 69 6e 67 20 72 65 70 a confusing rep
2730: 6c 79 3a 20 25 69 22 2c 20 72 63 29 3b 0a 09 09 ly: %i", rc);...
2740: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
2750: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
2760: 0a 09 09 09 64 70 72 69 6e 74 66 28 22 45 52 52 ....dprintf("ERR
2770: 28 25 64 2c 20 25 64 29 20 22 2c 20 72 63 2c 20 (%d, %d) ", rc,
2780: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a *errorCodePtr);.
2790: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
27a0: 7d 0a 0a 23 69 66 20 30 0a 09 69 66 20 28 73 74 }..#if 0..if (st
27b0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
27c0: 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 TLS_TCL_SERVER)
27d0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 54 68 69 {...dprintf("Thi
27e0: 73 20 69 73 20 61 6e 20 54 4c 53 20 73 65 72 76 s is an TLS serv
27f0: 65 72 2c 20 63 68 65 63 6b 69 6e 67 20 74 68 65 er, checking the
2800: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
2810: 20 74 68 65 20 70 65 65 72 22 29 3b 0a 0a 09 09 the peer");....
2820: 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 err = SSL_get_ve
2830: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
2840: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 09 69 66 ePtr->ssl);...if
2850: 20 28 65 72 72 20 21 3d 20 58 35 30 39 5f 56 5f (err != X509_V_
2860: 4f 4b 29 20 7b 0a 09 09 09 64 70 72 69 6e 74 66 OK) {....dprintf
2870: 28 22 49 6e 76 61 6c 69 64 20 63 65 72 74 69 66 ("Invalid certif
2880: 69 63 61 74 65 2c 20 72 65 74 75 72 6e 69 6e 67 icate, returning
2890: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a in failure");..
28a0: 09 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ...Tls_Error(sta
28b0: 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29 58 tePtr, (char *)X
28c0: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
28d0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 error_string(err
28e0: 29 29 3b 0a 09 09 09 73 74 61 74 65 50 74 72 2d ));....statePtr-
28f0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
2900: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c L_HANDSHAKE_FAIL
2910: 45 44 3b 0a 09 09 09 2a 65 72 72 6f 72 43 6f 64 ED;....*errorCod
2920: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 ePtr = ECONNABOR
2930: 54 45 44 3b 0a 09 09 09 72 65 74 75 72 6e 28 2d TED;....return(-
2940: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 23 65 6e 64 69 1);...}..}.#endi
2950: 66 0a 0a 09 64 70 72 69 6e 74 66 28 22 52 65 6d f...dprintf("Rem
2960: 6f 76 69 6e 67 20 74 68 65 20 5c 22 54 4c 53 5f oving the \"TLS_
2970: 54 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67 20 TCL_INIT\" flag
2980: 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 63 6f since we have co
2990: 6d 70 6c 65 74 65 64 20 74 68 65 20 68 61 6e 64 mpleted the hand
29a0: 73 68 61 6b 65 22 29 3b 0a 09 73 74 61 74 65 50 shake");..stateP
29b0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 4c tr->flags &= ~TL
29c0: 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a 09 64 70 S_TCL_INIT;...dp
29d0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
29e0: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 09 in success");..
29f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
2a00: 30 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 0;...return(0);.
2a10: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
2a60: 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d * TlsInputProc -
2a70: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
2a80: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
2a90: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 d by the generic
2aa0: 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 IO level. *
2ab0: 20 20 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 to read input
2ac0: 20 66 72 6f 6d 20 61 20 53 53 4c 20 73 6f 63 6b from a SSL sock
2ad0: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
2ae0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
2af0: 0a 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f . *.The number o
2b00: 66 20 62 79 74 65 73 20 72 65 61 64 20 69 73 20 f bytes read is
2b10: 72 65 74 75 72 6e 65 64 20 6f 72 20 2d 31 20 6f returned or -1 o
2b20: 6e 20 65 72 72 6f 72 2e 20 41 6e 20 6f 75 74 70 n error. An outp
2b30: 75 74 0a 20 2a 09 61 72 67 75 6d 65 6e 74 20 63 ut. *.argument c
2b40: 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 4f 53 49 ontains the POSI
2b50: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 X error code on
2b60: 65 72 72 6f 72 2c 20 6f 72 20 7a 65 72 6f 20 69 error, or zero i
2b70: 66 20 6e 6f 0a 20 2a 09 65 72 72 6f 72 20 6f 63 f no. *.error oc
2b80: 63 75 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 curred.. *. * Si
2b90: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 de effects:. *.R
2ba0: 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f 6d 20 eads input from
2bb0: 74 68 65 20 69 6e 70 75 74 20 64 65 76 69 63 65 the input device
2bc0: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e of the channel.
2bd0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
2c20: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 49 6e 70 tatic int TlsInp
2c30: 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 utProc(ClientDat
2c40: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 a instanceData,
2c50: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 char *buf, int b
2c60: 75 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 ufSize, int *err
2c70: 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 09 75 6e orCodePtr) {..un
2c80: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b signed long back
2c90: 69 6e 67 45 72 72 6f 72 3b 0a 09 53 74 61 74 65 ingError;..State
2ca0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
2cb0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
2cc0: 61 74 61 3b 0a 09 69 6e 74 20 62 79 74 65 73 52 ata;..int bytesR
2cd0: 65 61 64 3b 0a 09 69 6e 74 20 74 6c 73 43 6f 6e ead;..int tlsCon
2ce0: 6e 65 63 74 3b 0a 09 69 6e 74 20 65 72 72 3b 0a nect;..int err;.
2cf0: 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
2d00: 3d 20 30 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 = 0;...dprintf("
2d10: 42 49 4f 5f 72 65 61 64 28 25 64 29 22 2c 20 62 BIO_read(%d)", b
2d20: 75 66 53 69 7a 65 29 3b 0a 0a 09 69 66 20 28 73 ufSize);...if (s
2d30: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
2d40: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 TLS_TCL_CALLBAC
2d50: 4b 29 20 7b 0a 09 09 2f 2a 20 64 6f 6e 27 74 20 K) {.../* don't
2d60: 70 72 6f 63 65 73 73 20 61 6e 79 20 62 79 74 65 process any byte
2d70: 73 20 77 68 69 6c 65 20 76 65 72 69 66 79 20 63 s while verify c
2d80: 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 allback is runni
2d90: 6e 67 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 ng */...dprintf(
2da0: 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e "Callback is run
2db0: 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 20 30 20 ning, reading 0
2dc0: 62 79 74 65 73 22 29 3b 0a 09 09 72 65 74 75 72 bytes");...retur
2dd0: 6e 28 30 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e n(0);..}...dprin
2de0: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f tf("Calling Tls_
2df0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 WaitForConnect")
2e00: 3b 0a 09 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 ;..tlsConnect =
2e10: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
2e20: 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 72 ct(statePtr, err
2e30: 6f 72 43 6f 64 65 50 74 72 2c 20 30 29 3b 0a 09 orCodePtr, 0);..
2e40: 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c if (tlsConnect <
2e50: 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 0) {...dprintf(
2e60: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 61 "Got an error wa
2e70: 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 iting to connect
2e80: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25 (tlsConnect = %
2e90: 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 i, *errorCodePtr
2ea0: 20 3d 20 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e = %i)", tlsConn
2eb0: 65 63 74 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 ect, *errorCodeP
2ec0: 74 72 29 3b 0a 0a 09 09 62 79 74 65 73 52 65 61 tr);....bytesRea
2ed0: 64 20 3d 20 2d 31 3b 0a 09 09 69 66 20 28 2a 65 d = -1;...if (*e
2ee0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 rrorCodePtr == E
2ef0: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 09 CONNRESET) {....
2f00: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e dprintf("Got con
2f10: 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b nection reset");
2f20: 0a 09 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 ..../* Soft EOF
2f30: 2a 2f 0a 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 */....*errorCode
2f40: 50 74 72 20 3d 20 30 3b 0a 09 09 09 62 79 74 65 Ptr = 0;....byte
2f50: 73 52 65 61 64 20 3d 20 30 3b 0a 09 09 7d 0a 0a sRead = 0;...}..
2f60: 09 09 72 65 74 75 72 6e 28 62 79 74 65 73 52 65 ..return(bytesRe
2f70: 61 64 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a ad);..}.../*.. *
2f80: 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 We need to clea
2f90: 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20 r the SSL error
2fa0: 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 stack now becaus
2fb0: 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 e we sometimes r
2fc0: 65 61 63 68 0a 09 20 2a 20 74 68 69 73 20 66 75 each.. * this fu
2fd0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 nction with left
2fe0: 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 over errors in t
2ff0: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 he stack. If BI
3000: 4f 5f 72 65 61 64 0a 09 20 2a 20 72 65 74 75 72 O_read.. * retur
3010: 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 ns -1 and intend
3020: 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 s EAGAIN, there
3030: 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 is a leftover er
3040: 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a ror, it will be.
3050: 09 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 . * misconstrued
3060: 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f as an error, no
3070: 74 20 45 41 47 41 49 4e 2e 0a 09 20 2a 0a 09 20 t EAGAIN... *..
3080: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c * Alternatively,
3090: 20 77 65 20 6d 61 79 20 77 61 6e 74 20 74 6f 20 we may want to
30a0: 68 61 6e 64 6c 65 20 74 68 65 20 3c 30 20 72 65 handle the <0 re
30b0: 74 75 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a turn codes from.
30c0: 09 20 2a 20 42 49 4f 5f 72 65 61 64 20 73 70 65 . * BIO_read spe
30d0: 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73 cially (as advis
30e0: 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f ed in the RSA do
30f0: 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 cs). TLS's lowe
3100: 72 20 6c 65 76 65 6c 20 42 49 4f 0a 09 20 2a 20 r level BIO.. *
3110: 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 functions play w
3120: 69 74 68 20 74 68 65 20 72 65 74 72 79 20 66 6c ith the retry fl
3130: 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 ags though, and
3140: 74 68 69 73 20 73 65 65 6d 73 20 74 6f 20 77 6f this seems to wo
3150: 72 6b 0a 09 20 2a 20 63 6f 72 72 65 63 74 6c 79 rk.. * correctly
3160: 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 . Similar fix i
3170: 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e n TlsOutputProc.
3180: 20 2d 20 68 6f 62 62 73 0a 09 20 2a 2f 0a 09 45 - hobbs.. */..E
3190: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
31a0: 3b 0a 09 62 79 74 65 73 52 65 61 64 20 3d 20 42 ;..bytesRead = B
31b0: 49 4f 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 IO_read(statePtr
31c0: 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 62 75 66 53 ->bio, buf, bufS
31d0: 69 7a 65 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 ize);..dprintf("
31e0: 42 49 4f 5f 72 65 61 64 20 2d 3e 20 25 64 22 2c BIO_read -> %d",
31f0: 20 62 79 74 65 73 52 65 61 64 29 3b 0a 0a 09 65 bytesRead);...e
3200: 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 rr = SSL_get_err
3210: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c or(statePtr->ssl
3220: 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a 0a 23 , bytesRead);..#
3230: 69 66 20 30 0a 09 69 66 20 28 62 79 74 65 73 52 if 0..if (bytesR
3240: 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 09 69 66 ead <= 0) {...if
3250: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 (BIO_should_ret
3260: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ry(statePtr->bio
3270: 29 29 20 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 )) {....dprintf(
3280: 22 49 2f 4f 20 66 61 69 6c 65 64 2c 20 77 69 6c "I/O failed, wil
3290: 6c 20 72 65 74 72 79 20 62 61 73 65 64 20 6f 6e l retry based on
32a0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 09 09 2a 65 EAGAIN");....*e
32b0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 rrorCodePtr = EA
32c0: 47 41 49 4e 3b 0a 09 09 7d 0a 09 7d 0a 23 65 6e GAIN;...}..}.#en
32d0: 64 69 66 0a 0a 09 73 77 69 74 63 68 20 28 65 72 dif...switch (er
32e0: 72 29 20 7b 0a 09 09 63 61 73 65 20 53 53 4c 5f r) {...case SSL_
32f0: 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 09 09 64 ERROR_NONE:....d
3300: 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c printBuffer(buf,
3310: 20 62 79 74 65 73 52 65 61 64 29 3b 0a 09 09 09 bytesRead);....
3320: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 53 break;...case SS
3330: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 09 09 L_ERROR_SSL:....
3340: 64 70 72 69 6e 74 66 28 22 53 53 4c 20 6e 65 67 dprintf("SSL neg
3350: 6f 74 69 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 otiation error,
3360: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 indicating that
3370: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 the connection h
3380: 61 73 20 62 65 65 6e 20 61 62 6f 72 74 65 64 22 as been aborted"
3390: 29 3b 0a 0a 09 09 09 54 6c 73 5f 45 72 72 6f 72 );.....Tls_Error
33a0: 28 73 74 61 74 65 50 74 72 2c 20 54 43 4c 54 4c (statePtr, TCLTL
33b0: 53 5f 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 S_SSL_ERROR(stat
33c0: 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 ePtr->ssl, bytes
33d0: 52 65 61 64 29 29 3b 0a 09 09 09 2a 65 72 72 6f Read));....*erro
33e0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
33f0: 41 42 4f 52 54 45 44 3b 0a 09 09 09 62 79 74 65 ABORTED;....byte
3400: 73 52 65 61 64 20 3d 20 2d 31 3b 0a 0a 09 09 09 sRead = -1;.....
3410: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 53 break;...case SS
3420: 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a L_ERROR_SYSCALL:
3430: 0a 09 09 09 62 61 63 6b 69 6e 67 45 72 72 6f 72 ....backingError
3440: 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 = ERR_get_error
3450: 28 29 3b 0a 0a 09 09 09 69 66 20 28 62 61 63 6b ();.....if (back
3460: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 ingError == 0 &&
3470: 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20 30 29 bytesRead == 0)
3480: 20 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22 {.....dprintf("
3490: 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 EOF reached")...
34a0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
34b0: 3d 20 30 3b 0a 09 09 09 09 62 79 74 65 73 52 65 = 0;.....bytesRe
34c0: 61 64 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 ad = 0;....} els
34d0: 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 e if (backingErr
34e0: 6f 72 20 3d 3d 20 30 20 26 26 20 62 79 74 65 73 or == 0 && bytes
34f0: 52 65 61 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 Read == -1) {...
3500: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 ..dprintf("I/O e
3510: 72 72 6f 72 20 6f 63 63 75 72 65 64 20 28 65 72 rror occured (er
3520: 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e rno = %lu)", (un
3530: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c signed long) Tcl
3540: 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09 _GetErrno());...
3550: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
3560: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 = Tcl_GetErrno()
3570: 3b 0a 09 09 09 09 62 79 74 65 73 52 65 61 64 20 ;.....bytesRead
3580: 3d 20 2d 31 3b 0a 09 09 09 7d 20 65 6c 73 65 20 = -1;....} else
3590: 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22 49 {.....dprintf("I
35a0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 /O error occured
35b0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d (backingError =
35c0: 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 %lu)", backingE
35d0: 72 72 6f 72 29 3b 0a 09 09 09 09 2a 65 72 72 6f rror);.....*erro
35e0: 72 43 6f 64 65 50 74 72 20 3d 20 62 61 63 6b 69 rCodePtr = backi
35f0: 6e 67 45 72 72 6f 72 3b 0a 09 09 09 09 62 79 74 ngError;.....byt
3600: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 09 esRead = -1;....
3610: 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 }.....break;...c
3620: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
3630: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 09 09 64 70 RO_RETURN:....dp
3640: 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 rintf("Got SSL_E
3650: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e RROR_ZERO_RETURN
3660: 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 , this means an
3670: 45 4f 46 20 68 61 73 20 62 65 65 6e 20 72 65 61 EOF has been rea
3680: 63 68 65 64 22 29 3b 0a 09 09 09 62 79 74 65 73 ched");....bytes
3690: 52 65 61 64 20 3d 20 30 3b 0a 09 09 09 2a 65 72 Read = 0;....*er
36a0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
36b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 ...break;...case
36c0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
36d0: 52 45 41 44 3a 0a 09 09 09 64 70 72 69 6e 74 66 READ:....dprintf
36e0: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f ("Got SSL_ERROR_
36f0: 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 WANT_READ, mappi
3700: 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 ng this to EAGAI
3710: 4e 22 29 3b 0a 09 09 09 62 79 74 65 73 52 65 61 N");....bytesRea
3720: 64 20 3d 20 2d 31 3b 0a 09 09 09 2a 65 72 72 6f d = -1;....*erro
3730: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 rCodePtr = EAGAI
3740: 4e 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 N;....break;...d
3750: 65 66 61 75 6c 74 3a 0a 09 09 09 64 70 72 69 6e efault:....dprin
3760: 74 66 28 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f tf("Unknown erro
3770: 72 20 28 65 72 72 20 3d 20 25 69 29 2c 20 6d 61 r (err = %i), ma
3780: 70 70 69 6e 67 20 74 6f 20 45 4f 46 22 2c 20 65 pping to EOF", e
3790: 72 72 29 3b 0a 09 09 09 2a 65 72 72 6f 72 43 6f rr);....*errorCo
37a0: 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 09 62 79 dePtr = 0;....by
37b0: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 09 09 tesRead = 0;....
37c0: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 64 70 72 69 break;..}...dpri
37d0: 6e 74 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d ntf("Input(%d) -
37e0: 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 > %d [%d]", bufS
37f0: 69 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20 ize, bytesRead,
3800: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a *errorCodePtr);.
3810: 09 72 65 74 75 72 6e 28 62 79 74 65 73 52 65 61 .return(bytesRea
3820: 64 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d d);.}../*. *----
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3870: 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70 75 74 50 *. * TlsOutputP
3880: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
3890: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
38a0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 nvoked by the ge
38b0: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 neric IO level.
38c0: 2a 20 20 20 20 20 20 20 74 6f 20 77 72 69 74 65 * to write
38d0: 20 6f 75 74 70 75 74 20 74 6f 20 61 20 53 53 4c output to a SSL
38e0: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 socket based ch
38f0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 annel.. *. * Res
3900: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 75 6d ults:. *.The num
3910: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 ber of bytes wri
3920: 74 74 65 6e 20 69 73 20 72 65 74 75 72 6e 65 64 tten is returned
3930: 2e 20 41 6e 20 6f 75 74 70 75 74 20 61 72 67 75 . An output argu
3940: 6d 65 6e 74 20 69 73 0a 20 2a 09 73 65 74 20 74 ment is. *.set t
3950: 6f 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 o a POSIX error
3960: 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 code if an error
3970: 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 7a 65 occurred, or ze
3980: 72 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ro.. *. * Side e
3990: 66 66 65 63 74 73 3a 0a 20 2a 09 57 72 69 74 65 ffects:. *.Write
39a0: 73 20 6f 75 74 70 75 74 20 6f 6e 20 74 68 65 20 s output on the
39b0: 6f 75 74 70 75 74 20 64 65 76 69 63 65 20 6f 66 output device of
39c0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a the channel.. *
39d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a10: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
3a20: 69 63 20 69 6e 74 20 54 6c 73 4f 75 74 70 75 74 ic int TlsOutput
3a30: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
3a40: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 63 6f instanceData, co
3a50: 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c 20 69 nst char *buf, i
3a60: 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 nt toWrite, int
3a70: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b *errorCodePtr) {
3a80: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
3a90: 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 09 53 backingError;..S
3aa0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
3ab0: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
3ac0: 6e 63 65 44 61 74 61 3b 0a 09 69 6e 74 20 77 72 nceData;..int wr
3ad0: 69 74 74 65 6e 2c 20 65 72 72 3b 0a 09 69 6e 74 itten, err;..int
3ae0: 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 09 2a tlsConnect;...*
3af0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 errorCodePtr = 0
3b00: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f ;...dprintf("BIO
3b10: 5f 77 72 69 74 65 28 25 70 2c 20 25 64 29 22 2c _write(%p, %d)",
3b20: 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 (void *) stateP
3b30: 74 72 2c 20 74 6f 57 72 69 74 65 29 3b 0a 09 64 tr, toWrite);..d
3b40: 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c printBuffer(buf,
3b50: 20 74 6f 57 72 69 74 65 29 3b 0a 0a 09 69 66 20 toWrite);...if
3b60: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
3b70: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 & TLS_TCL_CALLB
3b80: 41 43 4b 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 ACK) {...dprintf
3b90: 28 22 44 6f 6e 27 74 20 70 72 6f 63 65 73 73 20 ("Don't process
3ba0: 6f 75 74 70 75 74 20 77 68 69 6c 65 20 63 61 6c output while cal
3bb0: 6c 62 61 63 6b 73 20 61 72 65 20 72 75 6e 6e 69 lbacks are runni
3bc0: 6e 67 22 29 0a 09 09 77 72 69 74 74 65 6e 20 3d ng")...written =
3bd0: 20 2d 31 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 -1;...*errorCod
3be0: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 ePtr = EAGAIN;..
3bf0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a .return(-1);..}.
3c00: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 ..dprintf("Calli
3c10: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
3c20: 6e 6e 65 63 74 22 29 3b 0a 09 74 6c 73 43 6f 6e nnect");..tlsCon
3c30: 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 nect = Tls_WaitF
3c40: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 orConnect(stateP
3c50: 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 tr, errorCodePtr
3c60: 2c 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f , 1);..if (tlsCo
3c70: 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09 09 64 nnect < 0) {...d
3c80: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 printf("Got an e
3c90: 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f 20 rror waiting to
3ca0: 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e connect (tlsConn
3cb0: 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72 ect = %i, *error
3cc0: 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c 20 CodePtr = %i)",
3cd0: 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 tlsConnect, *err
3ce0: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a 09 09 77 orCodePtr);....w
3cf0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 69 ritten = -1;...i
3d00: 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 f (*errorCodePtr
3d10: 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 == ECONNRESET)
3d20: 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 22 47 6f {....dprintf("Go
3d30: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 73 t connection res
3d40: 65 74 22 29 3b 0a 09 09 09 2f 2a 20 53 6f 66 74 et");..../* Soft
3d50: 20 45 4f 46 20 2a 2f 0a 09 09 09 2a 65 72 72 6f EOF */....*erro
3d60: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 rCodePtr = 0;...
3d70: 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09 .written = 0;...
3d80: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 77 72 69 74 }....return(writ
3d90: 74 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 ten);..}...if (t
3da0: 6f 57 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 oWrite == 0) {..
3db0: 09 64 70 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 .dprintf("zero-w
3dc0: 72 69 74 65 22 29 3b 0a 09 09 65 72 72 20 3d 20 rite");...err =
3dd0: 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 BIO_flush(stateP
3de0: 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 09 69 66 20 tr->bio);....if
3df0: 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 09 09 (err <= 0) {....
3e00: 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e dprintf("Flushin
3e10: 67 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 09 09 g failed");.....
3e20: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3e30: 45 49 4f 3b 0a 09 09 09 77 72 69 74 74 65 6e 20 EIO;....written
3e40: 3d 20 30 3b 0a 09 09 09 72 65 74 75 72 6e 28 2d = 0;....return(-
3e50: 31 29 3b 0a 09 09 7d 0a 0a 09 09 77 72 69 74 74 1);...}....writt
3e60: 65 6e 20 3d 20 30 3b 0a 09 09 2a 65 72 72 6f 72 en = 0;...*error
3e70: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 72 CodePtr = 0;...r
3e80: 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 2f eturn(0);..}.../
3e90: 2a 0a 09 20 2a 20 57 65 20 6e 65 65 64 20 74 6f *.. * We need to
3ea0: 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65 clear the SSL e
3eb0: 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62 rror stack now b
3ec0: 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69 ecause we someti
3ed0: 6d 65 73 20 72 65 61 63 68 0a 09 20 2a 20 74 68 mes reach.. * th
3ee0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 is function with
3ef0: 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 73 leftover errors
3f00: 20 69 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 in the stack.
3f10: 49 66 20 42 49 4f 5f 77 72 69 74 65 0a 09 20 2a If BIO_write.. *
3f20: 20 72 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 returns -1 and
3f30: 69 6e 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 intends EAGAIN,
3f40: 74 68 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f there is a lefto
3f50: 76 65 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 ver error, it wi
3f60: 6c 6c 20 62 65 0a 09 20 2a 20 6d 69 73 63 6f 6e ll be.. * miscon
3f70: 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 strued as an err
3f80: 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a or, not EAGAIN..
3f90: 09 20 2a 0a 09 20 2a 20 41 6c 74 65 72 6e 61 74 . *.. * Alternat
3fa0: 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 ively, we may wa
3fb0: 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 nt to handle the
3fc0: 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 <0 return codes
3fd0: 20 66 72 6f 6d 0a 09 20 2a 20 42 49 4f 5f 77 72 from.. * BIO_wr
3fe0: 69 74 65 20 73 70 65 63 69 61 6c 6c 79 20 28 61 ite specially (a
3ff0: 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 68 65 s advised in the
4000: 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c 53 RSA docs). TLS
4010: 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 0a 09 's lower level..
4020: 20 2a 20 42 49 4f 20 66 75 6e 63 74 69 6f 6e 73 * BIO functions
4030: 20 70 6c 61 79 20 77 69 74 68 20 74 68 65 20 72 play with the r
4040: 65 74 72 79 20 66 6c 61 67 73 20 74 68 6f 75 67 etry flags thoug
4050: 68 2c 20 61 6e 64 20 74 68 69 73 20 73 65 65 6d h, and this seem
4060: 73 20 74 6f 0a 09 20 2a 20 77 6f 72 6b 20 63 6f s to.. * work co
4070: 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 rrectly. Simila
4080: 72 20 66 69 78 20 69 6e 20 54 6c 73 49 6e 70 75 r fix in TlsInpu
4090: 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 09 tProc. - hobbs..
40a0: 20 2a 2f 0a 09 45 52 52 5f 63 6c 65 61 72 5f 65 */..ERR_clear_e
40b0: 72 72 6f 72 28 29 3b 0a 09 77 72 69 74 74 65 6e rror();..written
40c0: 20 3d 20 42 49 4f 5f 77 72 69 74 65 28 73 74 61 = BIO_write(sta
40d0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c tePtr->bio, buf,
40e0: 20 74 6f 57 72 69 74 65 29 3b 0a 09 64 70 72 69 toWrite);..dpri
40f0: 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 ntf("BIO_write(%
4100: 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c p, %d) -> [%d]",
4110: 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 (void *) stateP
4120: 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 tr, toWrite, wri
4130: 74 74 65 6e 29 3b 0a 0a 09 65 72 72 20 3d 20 53 tten);...err = S
4140: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 SL_get_error(sta
4150: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 tePtr->ssl, writ
4160: 74 65 6e 29 3b 0a 09 73 77 69 74 63 68 20 28 65 ten);..switch (e
4170: 72 72 29 20 7b 0a 09 09 63 61 73 65 20 53 53 4c rr) {...case SSL
4180: 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 09 09 _ERROR_NONE:....
4190: 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20 30 29 if (written < 0)
41a0: 20 7b 0a 09 09 09 09 77 72 69 74 74 65 6e 20 3d {.....written =
41b0: 20 30 3b 0a 09 09 09 7d 0a 09 09 09 62 72 65 61 0;....}....brea
41c0: 6b 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52 k;...case SSL_ER
41d0: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a ROR_WANT_WRITE:.
41e0: 09 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 ...dprintf("Got
41f0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 SSL_ERROR_WANT_W
4200: 52 49 54 45 2c 20 6d 61 70 70 69 6e 67 20 69 74 RITE, mapping it
4210: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 09 to EAGAIN");...
4220: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
4230: 20 45 41 47 41 49 4e 3b 0a 09 09 09 77 72 69 74 EAGAIN;....writ
4240: 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 09 62 72 65 ten = -1;....bre
4250: 61 6b 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 ak;...case SSL_E
4260: 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a RROR_WANT_READ:.
4270: 09 09 09 64 70 72 69 6e 74 66 28 22 20 77 72 69 ...dprintf(" wri
4280: 74 65 20 52 20 42 4c 4f 43 4b 22 29 3b 0a 09 09 te R BLOCK");...
4290: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 .break;...case S
42a0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 SL_ERROR_WANT_X5
42b0: 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 09 09 64 70 09_LOOKUP:....dp
42c0: 72 69 6e 74 66 28 22 20 77 72 69 74 65 20 58 20 rintf(" write X
42d0: 42 4c 4f 43 4b 22 29 3b 0a 09 09 09 62 72 65 61 BLOCK");....brea
42e0: 6b 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 52 k;...case SSL_ER
42f0: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a ROR_ZERO_RETURN:
4300: 0a 09 09 09 64 70 72 69 6e 74 66 28 22 20 63 6c ....dprintf(" cl
4310: 6f 73 65 64 22 29 3b 0a 09 09 09 77 72 69 74 74 osed");....writt
4320: 65 6e 20 3d 20 30 3b 0a 09 09 09 2a 65 72 72 6f en = 0;....*erro
4330: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 rCodePtr = 0;...
4340: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 .break;...case S
4350: 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c SL_ERROR_SYSCALL
4360: 3a 0a 09 09 09 62 61 63 6b 69 6e 67 45 72 72 6f :....backingErro
4370: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f r = ERR_get_erro
4380: 72 28 29 3b 0a 0a 09 09 09 69 66 20 28 62 61 63 r();.....if (bac
4390: 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 kingError == 0 &
43a0: 26 20 77 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 & written == 0)
43b0: 7b 0a 09 09 09 09 64 70 72 69 6e 74 66 28 22 45 {.....dprintf("E
43c0: 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 09 OF reached")....
43d0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
43e0: 20 30 3b 0a 09 09 09 09 77 72 69 74 74 65 6e 20 0;.....written
43f0: 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 = 0;....} else i
4400: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 f (backingError
4410: 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e 20 == 0 && written
4420: 3d 3d 20 2d 31 29 20 7b 0a 09 09 09 09 64 70 72 == -1) {.....dpr
4430: 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 intf("I/O error
4440: 6f 63 63 75 72 65 64 20 28 65 72 72 6e 6f 20 3d occured (errno =
4450: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 %lu)", (unsigne
4460: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 d long) Tcl_GetE
4470: 72 72 6e 6f 28 29 29 3b 0a 09 09 09 09 2a 65 72 rrno());.....*er
4480: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c rorCodePtr = Tcl
4490: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 09 _GetErrno();....
44a0: 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 .written = -1;..
44b0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 64 ..} else {.....d
44c0: 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f printf("I/O erro
44d0: 72 20 6f 63 63 75 72 65 64 20 28 62 61 63 6b 69 r occured (backi
44e0: 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c ngError = %lu)",
44f0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a backingError);.
4500: 09 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 ....*errorCodePt
4510: 72 20 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 r = backingError
4520: 3b 0a 09 09 09 09 77 72 69 74 74 65 6e 20 3d 20 ;.....written =
4530: 2d 31 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 -1;....}.....bre
4540: 61 6b 3b 0a 09 09 63 61 73 65 20 53 53 4c 5f 45 ak;...case SSL_E
4550: 52 52 4f 52 5f 53 53 4c 3a 0a 09 09 09 54 6c 73 RROR_SSL:....Tls
4560: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
4570: 20 54 43 4c 54 4c 53 5f 53 53 4c 5f 45 52 52 4f TCLTLS_SSL_ERRO
4580: 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c R(statePtr->ssl,
4590: 20 77 72 69 74 74 65 6e 29 29 3b 0a 09 09 09 2a written));....*
45a0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
45b0: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 09 CONNABORTED;....
45c0: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 written = -1;...
45d0: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c .break;...defaul
45e0: 74 3a 0a 09 09 09 64 70 72 69 6e 74 66 28 22 20 t:....dprintf("
45f0: 75 6e 6b 6e 6f 77 6e 20 65 72 72 3a 20 25 64 22 unknown err: %d"
4600: 2c 20 65 72 72 29 3b 0a 09 09 09 62 72 65 61 6b , err);....break
4610: 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 ;..}...dprintf("
4620: 4f 75 74 70 75 74 28 25 64 29 20 2d 3e 20 25 64 Output(%d) -> %d
4630: 22 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 ", toWrite, writ
4640: 74 65 6e 29 3b 0a 09 72 65 74 75 72 6e 28 77 72 ten);..return(wr
4650: 69 74 74 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a itten);.}../*. *
4660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46a0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 ---. *. * TlsGet
46b0: 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a OptionProc --. *
46c0: 0a 20 2a 09 43 6f 6d 70 75 74 65 73 20 61 6e 20 . *.Computes an
46d0: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 option value for
46e0: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
46f0: 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 sed channel, or
4700: 61 0a 20 2a 09 6c 69 73 74 20 6f 66 20 61 6c 6c a. *.list of all
4710: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 options and the
4720: 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a ir values.. *. *
4730: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
4740: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
4750: 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 lt. The value of
4760: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f the specified o
4770: 70 74 69 6f 6e 20 6f 72 20 61 0a 20 2a 09 6c 69 ption or a. *.li
4780: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e st of all option
4790: 73 20 61 6e 64 09 74 68 65 69 72 20 76 61 6c 75 s and.their valu
47a0: 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 es is returned i
47b0: 6e 20 74 68 65 0a 20 2a 09 73 75 70 70 6c 69 65 n the. *.supplie
47c0: 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a d DString.. *. *
47d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
47e0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4830: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
4840: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 TlsGetOptionProc
4850: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
4860: 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 anceData,./* Soc
4870: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 09 54 ket state. */..T
4880: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4890: 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 p,../* For error
48a0: 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e s - can be NULL.
48b0: 20 2a 2f 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 */..const char
48c0: 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 09 2f 2a *optionName,../*
48d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 Name of the opt
48e0: 69 6f 6e 20 74 6f 0a 09 09 09 09 09 20 2a 20 72 ion to...... * r
48f0: 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 etrieve the valu
4900: 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 09 20 e for, or......
4910: 2a 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c * NULL to get al
4920: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 0a 09 09 l options and...
4930: 09 09 09 20 2a 20 74 68 65 69 72 20 76 61 6c 75 ... * their valu
4940: 65 73 2e 20 2a 2f 0a 09 54 63 6c 5f 44 53 74 72 es. */..Tcl_DStr
4950: 69 6e 67 20 2a 64 73 50 74 72 29 09 09 2f 2a 20 ing *dsPtr)../*
4960: 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 Where to store t
4970: 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 he computed valu
4980: 65 0a 09 09 09 09 09 20 2a 20 69 6e 69 74 69 61 e...... * initia
4990: 6c 69 7a 65 64 20 62 79 20 63 61 6c 6c 65 72 2e lized by caller.
49a0: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 */.{. State
49b0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
49c0: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 te *) instanceDa
49d0: 74 61 3b 0a 0a 20 20 20 54 63 6c 5f 43 68 61 6e ta;.. Tcl_Chan
49e0: 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 nel downChan = T
49f0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 ls_GetParent(sta
4a00: 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 tePtr, TLS_TCL_F
4a10: 41 53 54 50 41 54 48 29 3b 0a 20 20 20 54 63 6c ASTPATH);. Tcl
4a20: 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e _DriverGetOption
4a30: 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 Proc *getOptionP
4a40: 72 6f 63 3b 0a 0a 20 20 20 20 67 65 74 4f 70 74 roc;.. getOpt
4a50: 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 ionProc = Tcl_Ch
4a60: 61 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 annelGetOptionPr
4a70: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 oc(Tcl_GetChanne
4a80: 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 lType(downChan))
4a90: 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f 70 74 ;. if (getOpt
4aa0: 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 ionProc != NULL)
4ab0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
4ac0: 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f n (*getOptionPro
4ad0: 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 c)(Tcl_GetChanne
4ae0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f lInstanceData(do
4af0: 77 6e 43 68 61 6e 29 2c 20 69 6e 74 65 72 70 2c wnChan), interp,
4b00: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 64 73 50 optionName, dsP
4b10: 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 tr);. } else
4b20: 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d if (optionName =
4b30: 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 = (char*) NULL)
4b40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 {. /*.
4b50: 20 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 20 * Request
4b60: 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c is query for all
4b70: 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 options, this i
4b80: 73 20 6f 6b 2e 0a 20 20 20 20 20 20 20 20 20 2a s ok.. *
4b90: 2f 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 /. retur
4ba0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a n TCL_OK;. }.
4bb0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 /*. * Re
4bc0: 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65 63 quest for a spec
4bd0: 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 20 ific option has
4be0: 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27 to fail, we don'
4bf0: 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 20 20 t have any..
4c00: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 54 */. return T
4c10: 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a CL_ERROR;.}../*.
4c20: 20 2a 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 2d 2d 2d 2d ----------------
4c60: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 -----. *. * TlsW
4c70: 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 atchProc --. *.
4c80: 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 *.Initialize the
4c90: 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 notifier to wat
4ca0: 63 68 20 54 63 6c 5f 46 69 6c 65 73 20 66 72 6f ch Tcl_Files fro
4cb0: 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a m this channel..
4cc0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4cd0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 *.None.. *. * Si
4ce0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 de effects:. *.S
4cf0: 65 74 73 20 75 70 20 74 68 65 20 6e 6f 74 69 66 ets up the notif
4d00: 69 65 72 20 73 6f 20 74 68 61 74 20 61 20 66 75 ier so that a fu
4d10: 74 75 72 65 20 65 76 65 6e 74 20 6f 6e 20 74 68 ture event on th
4d20: 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 77 69 6c e channel. *.wil
4d30: 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c l be seen by Tcl
4d40: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
4d90: 73 74 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 57 static void.TlsW
4da0: 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44 atchProc(ClientD
4db0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 ata instanceData
4dc0: 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 ,./* The socket
4dd0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 state. */.
4de0: 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 int mask)
4df0: 09 09 09 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20 .../* Events of
4e00: 69 6e 74 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d interest; an OR-
4e10: 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ed.
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 63 6f * co
4e40: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c mbination of TCL
4e50: 5f 52 45 41 44 41 42 4c 45 2c 0a 20 20 20 20 20 _READABLE,.
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4e80: 20 20 20 20 2a 20 54 43 4c 5f 57 52 49 54 41 42 * TCL_WRITAB
4e90: 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 LE and TCL_EXCEP
4ea0: 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 TION. */.{. T
4eb0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64 cl_Channel d
4ec0: 6f 77 6e 43 68 61 6e 3b 0a 20 20 20 20 53 74 61 ownChan;. Sta
4ed0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
4ee0: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
4ef0: 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 eData;.. dpri
4f00: 6e 74 66 28 22 54 6c 73 57 61 74 63 68 50 72 6f ntf("TlsWatchPro
4f10: 63 28 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b c(0x%x)", mask);
4f20: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 .. /* Pretend
4f30: 20 74 6f 20 62 65 20 64 65 61 64 20 61 73 20 6c to be dead as l
4f40: 6f 6e 67 20 61 73 20 74 68 65 20 76 65 72 69 66 ong as the verif
4f50: 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 y callback is ru
4f60: 6e 6e 69 6e 67 2e 20 0a 20 20 20 20 20 2a 20 4f nning. . * O
4f70: 74 68 65 72 77 69 73 65 20 74 68 61 74 20 63 61 therwise that ca
4f80: 6c 6c 62 61 63 6b 20 63 6f 75 6c 64 20 62 65 20 llback could be
4f90: 69 6e 76 6f 6b 65 64 20 72 65 63 75 72 73 69 76 invoked recursiv
4fa0: 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 ely. */. if (
4fb0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
4fc0: 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 & TLS_TCL_CALLBA
4fd0: 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 64 70 CK) {. dp
4fe0: 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b 20 rintf("Callback
4ff0: 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20 64 6f 69 is on-going, doi
5000: 6e 67 20 6e 6f 74 68 69 6e 67 22 29 3b 0a 20 20 ng nothing");.
5010: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 return;.
5020: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 46 }.. dprintF
5030: 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 3b 0a lags(statePtr);.
5040: 0a 20 20 20 20 64 6f 77 6e 43 68 61 6e 20 3d 20 . downChan =
5050: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 Tls_GetParent(st
5060: 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f atePtr, TLS_TCL_
5070: 46 41 53 54 50 41 54 48 29 3b 0a 0a 20 20 20 20 FASTPATH);..
5080: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c if (statePtr->fl
5090: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 48 41 ags & TLS_TCL_HA
50a0: 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 29 20 NDSHAKE_FAILED)
50b0: 7b 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 {. dprint
50c0: 66 28 22 41 73 6b 65 64 20 74 6f 20 77 61 74 63 f("Asked to watc
50d0: 68 20 61 20 73 6f 63 6b 65 74 20 77 69 74 68 20 h a socket with
50e0: 61 20 66 61 69 6c 65 64 20 68 61 6e 64 73 68 61 a failed handsha
50f0: 6b 65 20 2d 2d 20 6e 6f 74 68 69 6e 67 20 63 61 ke -- nothing ca
5100: 6e 20 68 61 70 70 65 6e 20 68 65 72 65 22 29 3b n happen here");
5110: 0a 0a 09 64 70 72 69 6e 74 66 28 22 55 6e 72 65 ...dprintf("Unre
5120: 67 69 73 74 65 72 69 6e 67 20 69 6e 74 65 72 65 gistering intere
5130: 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 st in the lower
5140: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 28 54 63 6c channel");..(Tcl
5150: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
5160: 64 6f 77 6e 43 68 61 6e 29 29 2d 3e 77 61 74 63 downChan))->watc
5170: 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 hProc(Tcl_GetCha
5180: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
5190: 28 64 6f 77 6e 43 68 61 6e 29 2c 20 30 29 3b 0a (downChan), 0);.
51a0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 ..statePtr->watc
51b0: 68 4d 61 73 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 hMask = 0;..
51c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 return;.
51d0: 7d 0a 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 }...statePtr->wa
51e0: 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a tchMask = mask;.
51f0: 0a 09 2f 2a 20 4e 6f 20 63 68 61 6e 6e 65 6c 20 ../* No channel
5200: 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d 6f 72 handlers any mor
5210: 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20 6e 6f e. We will be no
5220: 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74 69 63 tified automatic
5230: 61 6c 6c 79 0a 09 20 2a 20 61 62 6f 75 74 20 65 ally.. * about e
5240: 76 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 vents on the cha
5250: 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69 61 20 61 nnel below via a
5260: 20 63 61 6c 6c 20 74 6f 20 6f 75 72 0a 09 20 2a call to our.. *
5270: 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 'TransformNotif
5280: 79 50 72 6f 63 27 2e 20 42 75 74 20 77 65 20 68 yProc'. But we h
5290: 61 76 65 20 74 6f 20 70 61 73 73 20 74 68 65 20 ave to pass the
52a0: 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20 6e 6f interest down no
52b0: 77 2e 0a 09 20 2a 20 57 65 20 61 72 65 20 61 6c w... * We are al
52c0: 6c 6f 77 65 64 20 74 6f 20 61 64 64 20 61 64 64 lowed to add add
52d0: 69 74 69 6f 6e 61 6c 20 27 69 6e 74 65 72 65 73 itional 'interes
52e0: 74 27 20 74 6f 20 74 68 65 20 6d 61 73 6b 20 69 t' to the mask i
52f0: 66 20 77 65 20 77 61 6e 74 0a 09 20 2a 20 74 6f f we want.. * to
5300: 2e 20 42 75 74 20 74 68 69 73 20 74 72 61 6e 73 . But this trans
5310: 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20 6e 6f formation has no
5320: 20 73 75 63 68 20 69 6e 74 65 72 65 73 74 2e 20 such interest.
5330: 49 74 20 6a 75 73 74 20 70 61 73 73 65 73 0a 09 It just passes..
5340: 20 2a 20 74 68 65 20 72 65 71 75 65 73 74 20 64 * the request d
5350: 6f 77 6e 2c 20 75 6e 63 68 61 6e 67 65 64 2e 0a own, unchanged..
5360: 09 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 64 . */... d
5370: 70 72 69 6e 74 66 28 22 52 65 67 69 73 74 65 72 printf("Register
5380: 69 6e 67 20 6f 75 72 20 69 6e 74 65 72 65 73 74 ing our interest
5390: 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68 in the lower ch
53a0: 61 6e 6e 65 6c 20 28 63 68 61 6e 3d 25 70 29 22 annel (chan=%p)"
53b0: 2c 20 28 76 6f 69 64 20 2a 29 20 64 6f 77 6e 43 , (void *) downC
53c0: 68 61 6e 29 3b 0a 09 28 54 63 6c 5f 47 65 74 43 han);..(Tcl_GetC
53d0: 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 hannelType(downC
53e0: 68 61 6e 29 29 0a 09 20 20 20 20 2d 3e 77 61 74 han)).. ->wat
53f0: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 chProc(Tcl_GetCh
5400: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
5410: 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 6d 61 73 a(downChan), mas
5420: 6b 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6e k);.../*.. * Man
5430: 61 67 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 69 agement of the i
5440: 6e 74 65 72 6e 61 6c 20 74 69 6d 65 72 2e 0a 09 nternal timer...
5450: 20 2a 2f 0a 0a 09 69 66 20 28 73 74 61 74 65 50 */...if (stateP
5460: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
5470: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
5480: 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 LL) {.
5490: 20 20 64 70 72 69 6e 74 66 28 22 41 20 74 69 6d dprintf("A tim
54a0: 65 72 20 77 61 73 20 66 6f 75 6e 64 2c 20 64 65 er was found, de
54b0: 6c 65 74 69 6e 67 20 69 74 22 29 3b 0a 09 20 20 leting it");..
54c0: 20 20 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 Tcl_DeleteTime
54d0: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
54e0: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 20 20 20 20 r->timer);..
54f0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
5500: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
5510: 6e 29 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 n) NULL;..}...if
5520: 20 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 (mask & TCL_REA
5530: 44 41 42 4c 45 29 20 7b 0a 09 09 69 66 20 28 54 DABLE) {...if (T
5540: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 cl_InputBuffered
5550: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
5560: 20 3e 20 30 20 7c 7c 20 42 49 4f 5f 63 74 72 6c > 0 || BIO_ctrl
5570: 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 _pending(statePt
5580: 72 2d 3e 62 69 6f 29 20 3e 20 30 29 20 7b 0a 09 r->bio) > 0) {..
5590: 09 09 2f 2a 0a 09 09 09 20 2a 20 54 68 65 72 65 ../*.... * There
55a0: 20 69 73 20 69 6e 74 65 72 65 73 74 20 69 6e 20 is interest in
55b0: 72 65 61 64 61 62 6c 65 20 65 76 65 6e 74 73 20 readable events
55c0: 61 6e 64 20 77 65 20 61 63 74 75 61 6c 6c 79 20 and we actually
55d0: 68 61 76 65 0a 09 09 09 20 2a 20 64 61 74 61 20 have.... * data
55e0: 77 61 69 74 69 6e 67 2c 20 73 6f 20 67 65 6e 65 waiting, so gene
55f0: 72 61 74 65 20 61 20 74 69 6d 65 72 20 74 6f 20 rate a timer to
5600: 66 6c 75 73 68 20 74 68 61 74 2e 0a 09 09 09 20 flush that.....
5610: 2a 2f 0a 09 09 09 64 70 72 69 6e 74 66 28 22 43 */....dprintf("C
5620: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 69 reating a new ti
5630: 6d 65 72 20 73 69 6e 63 65 20 64 61 74 61 20 61 mer since data a
5640: 70 70 65 61 72 73 20 74 6f 20 62 65 20 77 61 69 ppears to be wai
5650: 74 69 6e 67 22 29 3b 0a 09 09 09 73 74 61 74 65 ting");....state
5660: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c Ptr->timer = Tcl
5670: 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 _CreateTimerHand
5680: 6c 65 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 ler(TLS_TCL_DELA
5690: 59 2c 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e Y, TlsChannelHan
56a0: 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 65 dlerTimer, (Clie
56b0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
56c0: 29 3b 0a 09 09 7d 0a 09 7d 0a 7d 0a 0a 2f 2a 0a );...}..}.}../*.
56d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5710: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 -----. *. * TlsG
5720: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a etHandleProc --.
5730: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f *. *.Called fro
5740: 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c m Tcl_GetChannel
5750: 46 69 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 File to retrieve
5760: 20 6f 2f 73 20 66 69 6c 65 20 68 61 6e 64 6c 65 o/s file handle
5770: 72 0a 20 2a 09 66 72 6f 6d 20 74 68 65 20 53 53 r. *.from the SS
5780: 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
5790: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 hannel.. *. * Re
57a0: 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 70 sults:. *.The ap
57b0: 70 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69 propriate Tcl_Fi
57c0: 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f le or NULL if no
57d0: 74 20 70 72 65 73 65 6e 74 2e 20 0a 20 2a 0a 20 t present. . *.
57e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
57f0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5840: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
5850: 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f TlsGetHandlePro
5860: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
5870: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 64 tanceData, int d
5880: 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 irection, Client
5890: 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 Data *handlePtr)
58a0: 20 7b 0a 09 53 74 61 74 65 20 2a 73 74 61 74 65 {..State *state
58b0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
58c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 09 instanceData;...
58d0: 72 65 74 75 72 6e 28 54 63 6c 5f 47 65 74 43 68 return(Tcl_GetCh
58e0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 6c 73 5f annelHandle(Tls_
58f0: 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 GetParent(stateP
5900: 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 tr, TLS_TCL_FAST
5910: 50 41 54 48 29 2c 20 64 69 72 65 63 74 69 6f 6e PATH), direction
5920: 2c 20 68 61 6e 64 6c 65 50 74 72 29 29 3b 0a 7d , handlePtr));.}
5930: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
5980: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 2d TlsNotifyProc -
5990: 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20 -. *. *.Handler
59a0: 63 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 6f called by Tcl to
59b0: 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 inform us of ac
59c0: 74 69 76 69 74 79 0a 20 2a 09 6f 6e 20 74 68 65 tivity. *.on the
59d0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e underlying chan
59e0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c nel.. *. * Resul
59f0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
5a00: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5a10: 0a 20 2a 09 4d 61 79 20 70 72 6f 63 65 73 73 20 . *.May process
5a20: 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 65 76 65 the incoming eve
5a30: 6e 74 20 62 79 20 69 74 73 65 6c 66 2e 0a 20 2a nt by itself.. *
5a40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
5a90: 69 63 20 69 6e 74 20 54 6c 73 4e 6f 74 69 66 79 ic int TlsNotify
5aa0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
5ab0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
5ac0: 74 20 6d 61 73 6b 29 20 7b 0a 09 53 74 61 74 65 t mask) {..State
5ad0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
5ae0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
5af0: 61 74 61 3b 0a 09 69 6e 74 20 65 72 72 6f 72 43 ata;..int errorC
5b00: 6f 64 65 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 41 6e ode;.../*.. * An
5b10: 20 65 76 65 6e 74 20 6f 63 63 75 72 65 64 20 69 event occured i
5b20: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 n the underlying
5b30: 20 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a channel. This.
5b40: 09 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 . * transformati
5b50: 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f 63 65 on doesn't proce
5b60: 73 73 20 73 75 63 68 20 65 76 65 6e 74 73 20 74 ss such events t
5b70: 68 75 73 20 72 65 74 75 72 6e 73 20 74 68 65 0a hus returns the.
5b80: 09 20 2a 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 . * incoming mas
5b90: 6b 20 75 6e 63 68 61 6e 67 65 64 2e 0a 09 20 2a k unchanged... *
5ba0: 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d /..if (statePtr-
5bb0: 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
5bc0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
5bd0: 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 44 65 6c {.../*... * Del
5be0: 65 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 ete an existing
5bf0: 74 69 6d 65 72 2e 20 49 74 20 77 61 73 20 6e 6f timer. It was no
5c00: 74 20 66 69 72 65 64 2c 20 79 65 74 20 77 65 20 t fired, yet we
5c10: 61 72 65 0a 09 09 20 2a 20 68 65 72 65 2c 20 73 are... * here, s
5c20: 6f 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 o the channel be
5c30: 6c 6f 77 20 67 65 6e 65 72 61 74 65 64 20 73 75 low generated su
5c40: 63 68 20 61 6e 20 65 76 65 6e 74 20 61 6e 64 20 ch an event and
5c50: 77 65 0a 09 09 20 2a 20 64 6f 6e 27 74 20 68 61 we... * don't ha
5c60: 76 65 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 ve to. The renew
5c70: 61 6c 20 6f 66 20 74 68 65 20 69 6e 74 65 72 65 al of the intere
5c80: 73 74 20 61 66 74 65 72 20 74 68 65 0a 09 09 20 st after the...
5c90: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 * execution of c
5ca0: 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 hannel handlers
5cb0: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 will eventually
5cc0: 63 61 75 73 65 20 75 73 20 74 6f 0a 09 09 20 2a cause us to... *
5cd0: 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74 69 recreate the ti
5ce0: 6d 65 72 20 28 69 6e 20 57 61 74 63 68 50 72 6f mer (in WatchPro
5cf0: 63 29 2e 0a 09 09 20 2a 2f 0a 09 09 54 63 6c 5f c).... */...Tcl_
5d00: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c DeleteTimerHandl
5d10: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d er(statePtr->tim
5d20: 65 72 29 3b 0a 09 09 73 74 61 74 65 50 74 72 2d er);...statePtr-
5d30: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
5d40: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a merToken) NULL;.
5d50: 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 65 50 74 .}...if (statePt
5d60: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
5d70: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 CL_CALLBACK) {..
5d80: 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e .dprintf("Return
5d90: 69 6e 67 20 30 20 64 75 65 20 74 6f 20 63 61 6c ing 0 due to cal
5da0: 6c 62 61 63 6b 22 29 3b 0a 09 09 72 65 74 75 72 lback");...retur
5db0: 6e 20 30 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 n 0;..}...dprint
5dc0: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 f("Calling Tls_W
5dd0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b aitForConnect");
5de0: 0a 09 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b ..errorCode = 0;
5df0: 0a 0a 09 69 66 20 28 54 6c 73 5f 57 61 69 74 46 ...if (Tls_WaitF
5e00: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 orConnect(stateP
5e10: 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c 20 tr, &errorCode,
5e20: 31 29 20 3c 20 30 29 20 7b 0a 09 09 69 66 20 28 1) < 0) {...if (
5e30: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 errorCode == EAG
5e40: 41 49 4e 29 20 7b 0a 09 09 09 64 70 72 69 6e 74 AIN) {....dprint
5e50: 66 28 22 41 73 79 6e 63 20 66 6c 61 67 20 63 6f f("Async flag co
5e60: 75 6c 64 20 62 65 20 73 65 74 20 28 64 69 64 6e uld be set (didn
5e70: 27 74 20 63 68 65 63 6b 29 20 61 6e 64 20 65 72 't check) and er
5e80: 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 41 49 rorCode == EAGAI
5e90: 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67 20 30 22 N: Returning 0"
5ea0: 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 30 3b 0a );....return 0;.
5eb0: 09 09 7d 0a 09 09 64 70 72 69 6e 74 66 28 22 54 ..}...dprintf("T
5ec0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
5ed0: 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 t returned an er
5ee0: 72 6f 72 22 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 ror");..}...dpri
5ef0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 ntf("Returning %
5f00: 69 22 2c 20 6d 61 73 6b 29 3b 0a 0a 09 72 65 74 i", mask);...ret
5f10: 75 72 6e 28 6d 61 73 6b 29 3b 0a 7d 0a 0a 23 69 urn(mask);.}..#i
5f20: 66 20 30 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d f 0./*. *-------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
5f60: 0a 20 2a 0a 20 2a 20 20 20 20 20 20 54 6c 73 43 . *. * TlsC
5f70: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 2d hannelHandler --
5f80: 0a 20 2a 0a 20 2a 20 20 20 20 20 20 2d 2d 2d 2d . *. * ----
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
5fc0: 20 20 20 20 20 20 48 61 6e 64 6c 65 72 20 63 61 Handler ca
5fd0: 6c 6c 65 64 20 62 79 20 54 63 6c 20 61 73 20 61 lled by Tcl as a
5fe0: 20 72 65 73 75 6c 74 20 6f 66 0a 20 2a 20 20 20 result of. *
5ff0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 Tcl_CreateCha
6000: 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 20 74 6f nnelHandler - to
6010: 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 inform us of ac
6020: 74 69 76 69 74 79 0a 20 2a 20 20 20 20 20 20 6f tivity. * o
6030: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 n the underlying
6040: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20 20 20 channel.. *
6050: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6080: 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 53 --*. *. * S
6090: 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 ideeffects:. *
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 79 20 May
60b0: 67 65 6e 65 72 61 74 65 20 73 75 62 73 65 71 75 generate subsequ
60c0: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 20 2a 20 ent calls to. *
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c Tcl
60e0: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 2e 0a _NotifyChannel..
60f0: 20 2a 0a 20 2a 20 20 20 20 20 20 52 65 73 75 6c *. * Resul
6100: 74 3a 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 t:. *
6110: 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d None.. *. *--
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6150: 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74 69 ----*. */..stati
6160: 63 20 76 6f 69 64 0a 54 6c 73 43 68 61 6e 6e 65 c void.TlsChanne
6170: 6c 48 61 6e 64 6c 65 72 20 28 63 6c 69 65 6e 74 lHandler (client
6180: 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20 20 Data, mask).
6190: 43 6c 69 65 6e 74 44 61 74 61 20 20 20 20 20 63 ClientData c
61a0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 lientData;. i
61b0: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 nt ma
61c0: 73 6b 3b 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 sk;.{. State
61d0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
61e0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
61f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
6200: 48 41 4e 44 4c 45 52 28 30 78 25 78 29 22 2c 20 HANDLER(0x%x)",
6210: 6d 61 73 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 50 mask);. Tcl_P
6220: 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 reserve( (Client
6230: 44 61 74 61 29 73 74 61 74 65 50 74 72 29 3b 0a Data)statePtr);.
6240: 0a 20 20 20 20 69 66 20 28 6d 61 73 6b 20 26 20 . if (mask &
6250: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 7b 0a TCL_READABLE) {.
6260: 09 42 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 73 .BIO_set_flags(s
6270: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 tatePtr->p_bio,
6280: 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41 44 29 3b BIO_FLAGS_READ);
6290: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 . } else {..B
62a0: 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 73 28 73 IO_clear_flags(s
62b0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 tatePtr->p_bio,
62c0: 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41 44 29 3b BIO_FLAGS_READ);
62d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
62e0: 6d 61 73 6b 20 26 20 54 43 4c 5f 57 52 49 54 41 mask & TCL_WRITA
62f0: 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 65 74 5f BLE) {..BIO_set_
6300: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e flags(statePtr->
6310: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 p_bio, BIO_FLAGS
6320: 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 7d 20 65 _WRITE);. } e
6330: 6c 73 65 20 7b 0a 09 42 49 4f 5f 63 6c 65 61 72 lse {..BIO_clear
6340: 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d _flags(statePtr-
6350: 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 >p_bio, BIO_FLAG
6360: 53 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 7d 0a S_WRITE);. }.
6370: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 . mask = 0;.
6380: 20 20 20 69 66 20 28 42 49 4f 5f 77 70 65 6e 64 if (BIO_wpend
6390: 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ing(statePtr->bi
63a0: 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54 o)) {..mask |= T
63b0: 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 CL_WRITABLE;.
63c0: 20 7d 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 70 }. if (BIO_p
63d0: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d ending(statePtr-
63e0: 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c >bio)) {..mask |
63f0: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a = TCL_READABLE;.
6400: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
6410: 20 20 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 * The followi
6420: 6e 67 20 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c ng NotifyChannel
6430: 20 63 61 6c 6c 73 20 73 65 65 6d 73 20 74 6f 20 calls seems to
6440: 62 65 20 69 6d 70 6f 72 74 61 6e 74 2c 20 62 75 be important, bu
6450: 74 0a 20 20 20 20 20 2a 20 77 65 20 64 6f 6e 27 t. * we don'
6460: 74 20 6b 6e 6f 77 20 77 68 79 2e 20 20 49 74 20 t know why. It
6470: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 69 66 20 74 68 looks like if th
6480: 65 20 6d 61 73 6b 20 69 73 20 65 76 65 72 20 6e e mask is ever n
6490: 6f 6e 2d 7a 65 72 6f 0a 20 20 20 20 20 2a 20 74 on-zero. * t
64a0: 68 61 74 20 69 74 20 77 69 6c 6c 20 65 6e 74 65 hat it will ente
64b0: 72 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f r an infinite lo
64c0: 6f 70 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 op.. *.
64d0: 2a 20 4e 6f 74 69 66 79 20 74 68 65 20 75 70 70 * Notify the upp
64e0: 65 72 20 63 68 61 6e 6e 65 6c 20 6f 66 20 74 68 er channel of th
64f0: 65 20 63 75 72 72 65 6e 74 20 42 49 4f 20 73 74 e current BIO st
6500: 61 74 65 20 73 6f 20 74 68 65 20 65 76 65 6e 74 ate so the event
6510: 0a 20 20 20 20 20 2a 20 63 6f 6e 74 69 6e 75 65 . * continue
6520: 73 20 74 6f 20 70 72 6f 70 61 67 61 74 65 20 75 s to propagate u
6530: 70 20 74 68 65 20 63 68 61 69 6e 2e 0a 20 20 20 p the chain..
6540: 20 20 2a 0a 20 20 20 20 20 2a 20 73 74 61 6e 74 *. * stant
6550: 6f 6e 3a 20 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b on: It looks lik
6560: 65 20 74 68 69 73 20 63 6f 75 6c 64 20 72 65 73 e this could res
6570: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 66 69 6e 69 ult in an infini
6580: 74 65 20 6c 6f 6f 70 20 69 66 0a 20 20 20 20 20 te loop if.
6590: 2a 20 74 68 65 20 75 70 70 65 72 20 63 68 61 6e * the upper chan
65a0: 6e 65 6c 20 64 6f 65 73 6e 27 74 20 63 61 75 73 nel doesn't caus
65b0: 65 20 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 e ChannelHandler
65c0: 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 0a 20 to be removed.
65d0: 20 20 20 20 2a 20 62 65 66 6f 72 65 20 54 63 6c * before Tcl
65e0: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 20 63 _NotifyChannel c
65f0: 61 6c 6c 73 20 63 68 61 6e 6e 65 6c 20 68 61 6e alls channel han
6600: 64 6c 65 72 73 20 6f 6e 20 74 68 65 20 6c 6f 77 dlers on the low
6610: 65 72 20 63 68 61 6e 6e 65 6c 2e 0a 20 20 20 20 er channel..
6620: 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 54 63 6c */. . Tcl
6630: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 _NotifyChannel(s
6640: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 6d tatePtr->self, m
6650: 61 73 6b 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 ask);. . i
6660: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
6670: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
6680: 54 6f 6b 65 6e 29 4e 55 4c 4c 29 20 7b 0a 09 54 Token)NULL) {..T
6690: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
66a0: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
66b0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
66c0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
66d0: 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b TimerToken)NULL;
66e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
66f0: 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 mask & TCL_READA
6700: 42 4c 45 29 20 26 26 20 54 63 6c 5f 49 6e 70 75 BLE) && Tcl_Inpu
6710: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 tBuffered(stateP
6720: 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20 7b tr->self) > 0) {
6730: 0a 09 2f 2a 0a 09 20 2a 20 44 61 74 61 20 69 73 ../*.. * Data is
6740: 20 77 61 69 74 69 6e 67 2c 20 66 6c 75 73 68 20 waiting, flush
6750: 69 74 20 6f 75 74 20 69 6e 20 73 68 6f 72 74 20 it out in short
6760: 74 69 6d 65 0a 09 20 2a 2f 0a 09 73 74 61 74 65 time.. */..state
6770: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c Ptr->timer = Tcl
6780: 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 _CreateTimerHand
6790: 6c 65 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 ler(TLS_TCL_DELA
67a0: 59 2c 0a 09 09 54 6c 73 43 68 61 6e 6e 65 6c 48 Y,...TlsChannelH
67b0: 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 6c andlerTimer, (Cl
67c0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
67d0: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 tr);. }. T
67e0: 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 cl_Release( (Cli
67f0: 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72 entData)statePtr
6800: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a );.}.#endif../*.
6810: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6840: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
6850: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 TlsChannelHandle
6860: 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 rTimer --. *. *.
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68a0: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 *. *.Called by t
68b0: 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d 3e 20 he notifier (->
68c0: 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 68 20 timer) to flush
68d0: 6f 75 74 0a 20 2a 09 69 6e 66 6f 72 6d 61 74 69 out. *.informati
68e0: 6f 6e 20 77 61 69 74 69 6e 67 20 69 6e 20 63 68 on waiting in ch
68f0: 61 6e 6e 65 6c 20 62 75 66 66 65 72 73 2e 0a 20 annel buffers..
6900: 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6930: 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 --*. *. *.Sideef
6940: 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 fects:. *..As of
6950: 20 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 'TlsChannelHand
6960: 6c 65 72 27 2e 0a 20 2a 0a 20 2a 09 52 65 73 75 ler'.. *. *.Resu
6970: 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a lt:. *..None.. *
6980: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a ---------*. */..
69c0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 static void TlsC
69d0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d hannelHandlerTim
69e0: 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c er(ClientData cl
69f0: 69 65 6e 74 44 61 74 61 29 20 7b 0a 09 53 74 61 ientData) {..Sta
6a00: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
6a10: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
6a20: 61 74 61 3b 0a 09 69 6e 74 20 6d 61 73 6b 20 3d ata;..int mask =
6a30: 20 30 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 0;...dprintf("C
6a40: 61 6c 6c 65 64 22 29 3b 0a 0a 09 73 74 61 74 65 alled");...state
6a50: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 Ptr->timer = (Tc
6a60: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
6a70: 4c 4c 3b 0a 0a 09 69 66 20 28 42 49 4f 5f 77 70 LL;...if (BIO_wp
6a80: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d ending(statePtr-
6a90: 3e 62 69 6f 29 29 20 7b 0a 09 09 64 70 72 69 6e >bio)) {...dprin
6aa0: 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49 tf("[chan=%p] BI
6ab0: 4f 20 77 72 69 74 61 62 6c 65 22 2c 20 73 74 61 O writable", sta
6ac0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 tePtr->self);...
6ad0: 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 .mask |= TCL_WRI
6ae0: 54 41 42 4c 45 3b 0a 09 7d 0a 0a 09 69 66 20 28 TABLE;..}...if (
6af0: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 BIO_pending(stat
6b00: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 ePtr->bio)) {...
6b10: 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 dprintf("[chan=%
6b20: 70 5d 20 42 49 4f 20 72 65 61 64 61 62 6c 65 22 p] BIO readable"
6b30: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
6b40: 29 3b 0a 0a 09 09 6d 61 73 6b 20 7c 3d 20 54 43 );....mask |= TC
6b50: 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 7d 0a 0a L_READABLE;..}..
6b60: 09 64 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79 .dprintf("Notify
6b70: 69 6e 67 20 6f 75 72 73 65 6c 76 65 73 22 29 3b ing ourselves");
6b80: 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e ..Tcl_NotifyChan
6b90: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 nel(statePtr->se
6ba0: 6c 66 2c 20 6d 61 73 6b 29 3b 0a 0a 09 64 70 72 lf, mask);...dpr
6bb0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 intf("Returning"
6bc0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a );...return;.}..
6bd0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 54 6c 73 5f Tcl_Channel Tls_
6be0: 47 65 74 50 61 72 65 6e 74 28 53 74 61 74 65 20 GetParent(State
6bf0: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 6d *statePtr, int m
6c00: 61 73 6b 46 6c 61 67 73 29 20 7b 0a 09 64 70 72 askFlags) {..dpr
6c10: 69 6e 74 66 28 22 52 65 71 75 65 73 74 65 64 20 intf("Requested
6c20: 74 6f 20 67 65 74 20 70 61 72 65 6e 74 20 6f 66 to get parent of
6c30: 20 63 68 61 6e 6e 65 6c 20 25 70 22 2c 20 73 74 channel %p", st
6c40: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a atePtr->self);..
6c50: 09 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e .if ((statePtr->
6c60: 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 46 6c 61 flags & ~maskFla
6c70: 67 73 29 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41 gs) & TLS_TCL_FA
6c80: 53 54 50 41 54 48 29 20 7b 0a 09 09 64 70 72 69 STPATH) {...dpri
6c90: 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 67 65 ntf("Asked to ge
6ca0: 74 20 74 68 65 20 70 61 72 65 6e 74 20 63 68 61 t the parent cha
6cb0: 6e 6e 65 6c 20 77 68 69 6c 65 20 77 65 20 61 72 nnel while we ar
6cc0: 65 20 75 73 69 6e 67 20 46 61 73 74 50 61 74 68 e using FastPath
6cd0: 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 4e 55 -- returning NU
6ce0: 4c 4c 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 4e LL");...return(N
6cf0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 ULL);..}...retur
6d00: 6e 28 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 n(Tcl_GetStacked
6d10: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 Channel(statePtr
6d20: 2d 3e 73 65 6c 66 29 29 3b 0a 7d 0a ->self));.}.