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 24 48 65 61 64 65 ons. *. * $Heade
0070: 72 3a 20 2f 68 6f 6d 65 2f 72 6b 65 65 6e 65 2f r: /home/rkeene/
0080: 74 6d 70 2f 63 76 73 32 66 6f 73 73 69 6c 2f 2e tmp/cvs2fossil/.
0090: 2e 2f 74 63 6c 74 6c 73 2f 74 6c 73 2f 74 6c 73 ./tcltls/tls/tls
00a0: 2f 74 6c 73 49 4f 2e 63 2c 76 20 31 2e 31 39 20 /tlsIO.c,v 1.19
00b0: 32 30 31 35 2f 30 36 2f 30 36 20 30 39 3a 30 37 2015/06/06 09:07
00c0: 3a 30 38 20 61 70 6e 61 64 6b 61 72 6e 69 20 45 :08 apnadkarni E
00d0: 78 70 20 24 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 xp $. *. * TLS (
00e0: 61 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c aka SSL) Channel
00f0: 20 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 - can be layere
0100: 64 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 d on any bi-dire
0110: 63 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 ctional. * Tcl_C
0120: 68 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 hannel (Note: Re
0130: 71 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 quires Trf Core
0140: 50 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 Patch). *. * Thi
0150: 73 20 77 61 73 20 62 75 69 6c 74 20 66 72 6f 6d s was built from
0160: 20 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75 scratch based u
0170: 70 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 pon observation
0180: 6f 66 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 of OpenSSL 0.9.2
0190: 42 0a 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e B. *. * Addition
01a0: 20 63 72 65 64 69 74 20 69 73 20 64 75 65 20 66 credit is due f
01b0: 6f 72 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 or Andreas Kupri
01c0: 65 73 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 es (a.kupries@we
01d0: 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a stend.com), for.
01e0: 20 2a 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 * providing the
01f0: 20 54 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e Tcl_ReplaceChan
0200: 6e 65 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e nel mechanism an
0210: 64 20 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c d working closel
0220: 79 20 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 y with me. * to
0230: 65 6e 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 enhance it to su
0240: 70 70 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 pport full filee
0250: 76 65 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a vent semantics..
0260: 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 *. * Also work
0270: 64 6f 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c done by the foll
0280: 6f 77 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 ow people provid
0290: 65 64 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 ed the impetus t
02a0: 6f 20 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 o do this "right
02b0: 22 3a 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f ":. *.tclSSL (Co
02c0: 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 lin McCormack, S
02d0: 68 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 hared Technology
02e0: 29 0a 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 ). *.SSLtcl (Pet
02f0: 65 72 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a er Antman). *. *
0300: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 /..#include "tls
0310: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 46 6f Int.h"../*. * Fo
0320: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f rward declaratio
0330: 6e 73 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 ns. */..static i
0340: 6e 74 09 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 nt.TlsBlockModeP
0350: 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 roc _ANSI_ARGS_(
0360: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
0370: 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 6e 74 anceData,....int
0380: 20 6d 6f 64 65 29 29 3b 0a 73 74 61 74 69 63 20 mode));.static
0390: 69 6e 74 09 54 6c 73 43 6c 6f 73 65 50 72 6f 63 int.TlsCloseProc
03a0: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 _ANSI_ARGS_ ((C
03b0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
03c0: 63 65 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 ceData,....Tcl_I
03d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 29 3b nterp *interp));
03e0: 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 49 .static int.TlsI
03f0: 6e 70 75 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41 nputProc _ANSI_A
0400: 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 RGS_((ClientData
0410: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 instanceData,..
0420: 09 09 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 ..char *buf, int
0430: 20 62 75 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 bufSize, int *e
0440: 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 73 rrorCodePtr));.s
0450: 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4f 75 74 tatic int.TlsOut
0460: 70 75 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 putProc _ANSI_AR
0470: 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 GS_((ClientData
0480: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 instanceData,...
0490: 09 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66 .CONST char *buf
04a0: 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 , int toWrite, i
04b0: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 nt *errorCodePtr
04c0: 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 54 ));.static int.T
04d0: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 lsGetOptionProc
04e0: 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c _ANSI_ARGS_ ((Cl
04f0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
0500: 65 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e eData,....Tcl_In
0510: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 43 4f terp *interp, CO
0520: 4e 53 54 38 34 20 63 68 61 72 20 2a 6f 70 74 69 NST84 char *opti
0530: 6f 6e 4e 61 6d 65 2c 0a 09 09 09 54 63 6c 5f 44 onName,....Tcl_D
0540: 53 74 72 69 6e 67 20 2a 64 73 50 74 72 29 29 3b String *dsPtr));
0550: 0a 73 74 61 74 69 63 20 76 6f 69 64 09 54 6c 73 .static void.Tls
0560: 57 61 74 63 68 50 72 6f 63 20 5f 41 4e 53 49 5f WatchProc _ANSI_
0570: 41 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 ARGS_((ClientDat
0580: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 a instanceData,
0590: 69 6e 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 int mask));.stat
05a0: 69 63 20 69 6e 74 09 54 6c 73 47 65 74 48 61 6e ic int.TlsGetHan
05b0: 64 6c 65 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 dleProc _ANSI_AR
05c0: 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 GS_ ((ClientData
05d0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 instanceData,..
05e0: 09 09 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c ..int direction,
05f0: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e ClientData *han
0600: 64 6c 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63 dlePtr));.static
0610: 20 69 6e 74 09 54 6c 73 4e 6f 74 69 66 79 50 72 int.TlsNotifyPr
0620: 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 oc _ANSI_ARGS_ (
0630: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
0640: 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 6e 74 anceData,....int
0650: 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 mask));.static
0660: 76 6f 69 64 09 54 6c 73 43 68 61 6e 6e 65 6c 48 void.TlsChannelH
0670: 61 6e 64 6c 65 72 20 5f 41 4e 53 49 5f 41 52 47 andler _ANSI_ARG
0680: 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 S_ ((ClientData
0690: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 69 clientData,....i
06a0: 6e 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 nt mask));.stati
06b0: 63 20 76 6f 69 64 09 54 6c 73 43 68 61 6e 6e 65 c void.TlsChanne
06c0: 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 5f 41 lHandlerTimer _A
06d0: 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 NSI_ARGS_ ((Clie
06e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
06f0: 61 29 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 a));../*. * This
0700: 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63 72 structure descr
0710: 69 62 65 73 20 74 68 65 20 63 68 61 6e 6e 65 6c ibes the channel
0720: 20 74 79 70 65 20 73 74 72 75 63 74 75 72 65 20 type structure
0730: 66 6f 72 20 54 43 50 20 73 6f 63 6b 65 74 0a 20 for TCP socket.
0740: 2a 20 62 61 73 65 64 20 49 4f 2e 20 20 54 68 65 * based IO. The
0750: 73 65 20 61 72 65 20 77 68 61 74 20 74 68 65 20 se are what the
0760: 73 74 72 75 63 74 75 72 65 73 20 73 68 6f 75 6c structures shoul
0770: 64 20 6c 6f 6f 6b 20 6c 69 6b 65 2c 20 62 75 74 d look like, but
0780: 20 77 65 0a 20 2a 20 68 61 76 65 20 74 6f 20 62 we. * have to b
0790: 75 69 6c 64 20 74 68 65 6d 20 75 70 20 61 74 20 uild them up at
07a0: 72 75 6e 74 69 6d 65 20 74 6f 20 62 65 20 63 6f runtime to be co
07b0: 72 72 65 63 74 20 64 65 70 65 6e 64 69 6e 67 20 rrect depending
07c0: 6f 6e 20 77 68 65 74 68 65 72 0a 20 2a 20 77 65 on whether. * we
07d0: 20 61 72 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f are loaded into
07e0: 20 61 6e 20 38 2e 32 2e 30 2d 38 2e 33 2e 31 20 an 8.2.0-8.3.1
07f0: 6f 72 20 38 2e 33 2e 32 2b 20 54 63 6c 20 69 6e or 8.3.2+ Tcl in
0800: 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 2f 0a 23 terpreter.. */.#
0810: 69 66 64 65 66 20 54 4c 53 5f 53 54 41 54 49 43 ifdef TLS_STATIC
0820: 5f 53 54 52 55 43 54 55 52 45 53 5f 4e 4f 54 5f _STRUCTURES_NOT_
0830: 55 53 45 44 0a 73 74 61 74 69 63 20 54 63 6c 5f USED.static Tcl_
0840: 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c 73 43 ChannelType tlsC
0850: 68 61 6e 6e 65 6c 54 79 70 65 32 20 3d 20 7b 0a hannelType2 = {.
0860: 20 20 20 20 22 74 6c 73 22 2c 09 09 2f 2a 20 54 "tls",../* T
0870: 79 70 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 ype name. */.
0880: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 TCL_CHANNEL_VER
0890: 53 49 4f 4e 5f 32 2c 09 2f 2a 20 41 20 76 32 20 SION_2,./* A v2
08a0: 63 68 61 6e 6e 65 6c 20 28 38 2e 33 2e 32 2b 29 channel (8.3.2+)
08b0: 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 */. TlsClose
08c0: 50 72 6f 63 2c 09 2f 2a 20 43 6c 6f 73 65 20 70 Proc,./* Close p
08d0: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 49 roc. */. TlsI
08e0: 6e 70 75 74 50 72 6f 63 2c 09 2f 2a 20 49 6e 70 nputProc,./* Inp
08f0: 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 ut proc. */.
0900: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2c 09 2f TlsOutputProc,./
0910: 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 2e 20 2a * Output proc. *
0920: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 /. NULL,../*
0930: 53 65 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 Seek proc. */.
0940: 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 NULL,../* Set
0950: 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a option proc. */.
0960: 20 20 20 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e TlsGetOption
0970: 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 Proc,./* Get opt
0980: 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 ion proc. */.
0990: 20 54 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 2f TlsWatchProc,./
09a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 * Initialize not
09b0: 69 66 69 65 72 2e 20 2a 2f 0a 20 20 20 20 54 6c ifier. */. Tl
09c0: 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 sGetHandleProc,.
09d0: 2f 2a 20 47 65 74 20 66 69 6c 65 20 68 61 6e 64 /* Get file hand
09e0: 6c 65 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 le out of channe
09f0: 6c 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 l. */. NULL,.
0a00: 09 2f 2a 20 43 6c 6f 73 65 32 50 72 6f 63 2e 20 ./* Close2Proc.
0a10: 2a 2f 0a 20 20 20 20 54 6c 73 42 6c 6f 63 6b 4d */. TlsBlockM
0a20: 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 odeProc,./* Set
0a30: 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 blocking/nonbloc
0a40: 6b 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 king mode.*/.
0a50: 20 4e 55 4c 4c 2c 09 09 2f 2a 20 46 6c 75 73 68 NULL,../* Flush
0a60: 50 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 Proc. */. Tls
0a70: 4e 6f 74 69 66 79 50 72 6f 63 2c 09 2f 2a 20 68 NotifyProc,./* h
0a80: 61 6e 64 6c 65 72 50 72 6f 63 2e 20 2a 2f 0a 7d andlerProc. */.}
0a90: 3b 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 ;..static Tcl_Ch
0aa0: 61 6e 6e 65 6c 54 79 70 65 20 74 6c 73 43 68 61 annelType tlsCha
0ab0: 6e 6e 65 6c 54 79 70 65 31 20 3d 20 7b 0a 20 20 nnelType1 = {.
0ac0: 20 20 22 74 6c 73 22 2c 09 09 2f 2a 20 54 79 70 "tls",../* Typ
0ad0: 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 e name. */. T
0ae0: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c lsBlockModeProc,
0af0: 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 ./* Set blocking
0b00: 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 /nonblocking mod
0b10: 65 2e 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 e.*/. TlsClos
0b20: 65 50 72 6f 63 2c 09 2f 2a 20 43 6c 6f 73 65 20 eProc,./* Close
0b30: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 proc. */. Tls
0b40: 49 6e 70 75 74 50 72 6f 63 2c 09 2f 2a 20 49 6e InputProc,./* In
0b50: 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 put proc. */.
0b60: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2c 09 TlsOutputProc,.
0b70: 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 2e 20 /* Output proc.
0b80: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a */. NULL,../*
0b90: 20 53 65 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a 20 Seek proc. */.
0ba0: 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 74 NULL,../* Set
0bb0: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f option proc. */
0bc0: 0a 20 20 20 20 54 6c 73 47 65 74 4f 70 74 69 6f . TlsGetOptio
0bd0: 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 nProc,./* Get op
0be0: 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 tion proc. */.
0bf0: 20 20 54 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 TlsWatchProc,.
0c00: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f /* Initialize no
0c10: 74 69 66 69 65 72 2e 20 2a 2f 0a 20 20 20 20 54 tifier. */. T
0c20: 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c lsGetHandleProc,
0c30: 09 2f 2a 20 47 65 74 20 66 69 6c 65 20 68 61 6e ./* Get file han
0c40: 64 6c 65 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e dle out of chann
0c50: 65 6c 2e 20 2a 2f 0a 7d 3b 0a 23 65 6c 73 65 0a el. */.};.#else.
0c60: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e static Tcl_Chann
0c70: 65 6c 54 79 70 65 20 2a 74 6c 73 43 68 61 6e 6e elType *tlsChann
0c80: 65 6c 54 79 70 65 20 3d 20 4e 55 4c 4c 3b 0a 23 elType = NULL;.#
0c90: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d endif../*. *----
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0ce0: 20 2a 0a 20 2a 20 54 6c 73 5f 43 68 61 6e 6e 65 *. * Tls_Channe
0cf0: 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 lType --. *. *.R
0d00: 65 74 75 72 6e 20 74 68 65 20 63 6f 72 72 65 63 eturn the correc
0d10: 74 20 54 4c 53 20 63 68 61 6e 6e 65 6c 20 64 72 t TLS channel dr
0d20: 69 76 65 72 20 69 6e 66 6f 0a 20 2a 0a 20 2a 20 iver info. *. *
0d30: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 Results:. *.The
0d40: 63 6f 72 72 65 63 74 20 63 68 61 6e 6e 65 6c 20 correct channel
0d50: 64 72 69 76 65 72 20 66 6f 72 20 74 68 65 20 63 driver for the c
0d60: 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f urrent version o
0d70: 66 20 54 63 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 f Tcl.. *. * Sid
0d80: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
0d90: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
0de0: 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 .Tcl_ChannelType
0df0: 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 *Tls_ChannelTyp
0e00: 65 28 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 e().{. /*.
0e10: 20 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 * Initialize t
0e20: 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 20 he channel type
0e30: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 20 if necessary.
0e40: 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6c 73 */. if (tls
0e50: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 3d 20 4e ChannelType == N
0e60: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 41 ULL) {../*.. * A
0e70: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 6e llocation of a n
0e80: 65 77 20 63 68 61 6e 6e 65 6c 74 79 70 65 20 73 ew channeltype s
0e90: 74 72 75 63 74 75 72 65 20 69 73 20 6e 6f 74 20 tructure is not
0ea0: 65 61 73 79 2c 20 62 65 63 61 75 73 65 20 6f 66 easy, because of
0eb0: 0a 09 20 2a 20 74 68 65 20 76 61 72 69 6f 75 73 .. * the various
0ec0: 20 76 65 72 73 6f 6e 20 6f 66 20 74 68 65 20 63 verson of the c
0ed0: 6f 72 65 20 61 6e 64 20 73 75 62 73 65 71 75 65 ore and subseque
0ee0: 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 nt changes to th
0ef0: 65 0a 09 20 2a 20 73 74 72 75 63 74 75 72 65 2e e.. * structure.
0f00: 20 54 68 65 20 6d 61 69 6e 20 63 68 61 6c 6c 65 The main challe
0f10: 6e 67 65 20 69 73 20 74 6f 20 61 6c 6c 6f 63 61 nge is to alloca
0f20: 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 te enough memory
0f30: 20 66 6f 72 0a 09 20 2a 20 6f 64 65 72 6e 20 76 for.. * odern v
0f40: 65 72 73 69 6f 6e 73 20 65 76 65 6e 20 69 66 20 ersions even if
0f50: 74 68 69 73 20 65 78 74 79 65 6e 73 69 6f 6e 20 this extyension
0f60: 69 73 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 is compiled agai
0f70: 6e 73 74 20 6f 6e 65 0a 09 20 2a 20 6f 66 20 74 nst one.. * of t
0f80: 68 65 20 6f 6c 64 65 72 20 76 61 72 69 61 6e 74 he older variant
0f90: 21 0a 09 20 2a 0a 09 20 2a 20 28 31 29 20 56 65 !.. *.. * (1) Ve
0fa0: 72 73 69 6f 6e 73 20 62 65 66 6f 72 65 20 73 74 rsions before st
0fb0: 75 62 73 20 28 38 2e 30 2e 78 29 20 61 72 65 20 ubs (8.0.x) are
0fc0: 73 69 6d 70 6c 65 2c 20 62 65 63 61 75 73 65 20 simple, because
0fd0: 74 68 65 79 20 61 72 65 0a 09 20 2a 20 20 20 20 they are.. *
0fe0: 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 6c 79 20 supported only
0ff0: 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e if the extension
1000: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 is compiled aga
1010: 69 6e 73 74 20 65 78 61 63 74 6c 79 0a 09 20 2a inst exactly.. *
1020: 20 20 20 20 20 74 68 61 74 20 76 65 72 73 69 6f that versio
1030: 6e 20 6f 66 20 74 68 65 20 63 6f 72 65 2e 0a 09 n of the core...
1040: 20 2a 0a 09 20 2a 20 28 32 29 20 57 69 74 68 20 *.. * (2) With
1050: 73 74 75 62 73 20 77 65 20 6a 75 73 74 20 64 65 stubs we just de
1060: 74 65 72 6d 69 6e 65 20 74 68 65 20 64 69 66 66 termine the diff
1070: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 erence between t
1080: 68 65 20 6f 6c 64 65 72 0a 09 20 2a 20 20 20 20 he older.. *
1090: 20 61 6e 64 20 6d 6f 64 65 72 6e 20 76 61 72 69 and modern vari
10a0: 61 6e 74 20 61 6e 64 20 6f 76 65 72 61 6c 6c 6f ant and overallo
10b0: 63 61 74 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 cate accordingly
10c0: 20 69 66 20 63 6f 6d 70 69 6c 65 64 0a 09 20 2a if compiled.. *
10d0: 20 20 20 20 20 61 67 61 69 6e 73 74 20 61 6e 20 against an
10e0: 6f 6c 64 65 72 20 76 61 72 69 61 6e 74 2e 0a 09 older variant...
10f0: 20 2a 2f 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69 */...unsigned i
1100: 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 nt size = sizeof
1110: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 (Tcl_ChannelType
1120: 29 3b 20 2f 2a 20 42 61 73 65 20 73 69 7a 65 20 ); /* Base size
1130: 2a 2f 0a 0a 09 2f 2a 0a 09 20 2a 20 53 69 7a 65 */.../*.. * Size
1140: 20 6f 66 20 61 20 70 72 6f 63 65 64 75 72 65 20 of a procedure
1150: 70 6f 69 6e 74 65 72 2e 20 57 65 20 61 73 73 75 pointer. We assu
1160: 6d 65 20 74 68 61 74 20 61 6c 6c 20 70 72 6f 63 me that all proc
1170: 65 64 75 72 65 0a 09 20 2a 20 70 6f 69 6e 74 65 edure.. * pointe
1180: 72 73 20 61 72 65 20 6f 66 20 74 68 65 20 73 61 rs are of the sa
1190: 6d 65 20 73 69 7a 65 2c 20 72 65 67 61 72 64 6c me size, regardl
11a0: 65 73 73 20 6f 66 20 65 78 61 63 74 20 74 79 70 ess of exact typ
11b0: 65 0a 09 20 2a 20 28 61 72 67 75 6d 65 6e 74 73 e.. * (arguments
11c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 76 61 6c 75 and return valu
11d0: 65 73 29 2e 0a 09 20 2a 0a 09 20 2a 20 38 2e 32 es)... *.. * 8.2
11e0: 2e 20 20 20 46 69 72 73 74 20 76 65 72 73 69 6f . First versio
11f0: 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6c 6f n containing clo
1200: 73 65 32 70 72 6f 63 2e 20 42 61 73 65 6c 69 6e se2proc. Baselin
1210: 65 2e 0a 09 20 2a 20 38 2e 33 2e 32 20 20 54 68 e... * 8.3.2 Th
1220: 72 65 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 ree additional v
1230: 65 63 74 6f 72 73 2e 20 4d 6f 76 65 64 20 62 6c ectors. Moved bl
1240: 6f 63 6b 4d 6f 64 65 2c 20 6e 65 77 20 66 6c 75 ockMode, new flu
1250: 73 68 2d 20 61 6e 64 0a 09 20 2a 20 20 20 20 20 sh- and.. *
1260: 20 20 20 68 61 6e 64 6c 65 72 50 72 6f 63 27 73 handlerProc's
1270: 2e 0a 09 20 2a 0a 09 20 2a 20 3d 3e 20 43 6f 6d ... *.. * => Com
1280: 70 69 6c 61 74 69 6f 6e 20 61 67 61 69 6e 73 74 pilation against
1290: 20 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e earlier version
12a0: 20 68 61 73 20 74 6f 20 6f 76 65 72 61 6c 6c 6f has to overallo
12b0: 63 61 74 65 20 74 68 72 65 65 0a 09 20 2a 20 20 cate three.. *
12c0: 20 20 70 72 6f 63 65 64 75 72 65 20 70 6f 69 6e procedure poin
12d0: 74 65 72 73 2e 0a 09 20 2a 2f 0a 0a 23 69 66 64 ters... */..#ifd
12e0: 65 66 20 45 4d 55 4c 41 54 45 5f 43 48 41 4e 4e ef EMULATE_CHANN
12f0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 09 73 69 EL_VERSION_2..si
1300: 7a 65 20 2b 3d 20 33 20 2a 20 70 72 6f 63 50 74 ze += 3 * procPt
1310: 72 53 69 7a 65 3b 0a 23 65 6e 64 69 66 0a 0a 09 rSize;.#endif...
1320: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d tlsChannelType =
1330: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 (Tcl_ChannelTyp
1340: 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a e *) ckalloc(siz
1350: 65 29 3b 0a 09 6d 65 6d 73 65 74 28 28 56 4f 49 e);..memset((VOI
1360: 44 20 2a 29 20 74 6c 73 43 68 61 6e 6e 65 6c 54 D *) tlsChannelT
1370: 79 70 65 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 0a ype, 0, size);..
1380: 09 2f 2a 0a 09 20 2a 20 43 6f 6d 6d 6f 6e 20 65 ./*.. * Common e
1390: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 lements of the s
13a0: 74 72 75 63 74 75 72 65 20 28 6e 6f 20 63 68 61 tructure (no cha
13b0: 6e 67 65 73 20 69 6e 20 6c 6f 63 61 74 69 6f 6e nges in location
13c0: 20 6f 72 20 6e 61 6d 65 29 0a 09 20 2a 20 63 6c or name).. * cl
13d0: 6f 73 65 32 50 72 6f 63 2c 20 73 65 65 6b 50 72 ose2Proc, seekPr
13e0: 6f 63 2c 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f oc, setOptionPro
13f0: 63 20 73 74 61 79 20 4e 55 4c 4c 2e 0a 09 20 2a c stay NULL... *
1400: 2f 0a 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 /...tlsChannelTy
1410: 70 65 2d 3e 74 79 70 65 4e 61 6d 65 09 3d 20 22 pe->typeName.= "
1420: 74 6c 73 22 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 tls";..tlsChanne
1430: 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 50 72 6f 63 lType->closeProc
1440: 09 3d 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 3b .= TlsCloseProc;
1450: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 ..tlsChannelType
1460: 2d 3e 69 6e 70 75 74 50 72 6f 63 09 3d 20 54 6c ->inputProc.= Tl
1470: 73 49 6e 70 75 74 50 72 6f 63 3b 0a 09 74 6c 73 sInputProc;..tls
1480: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 6f 75 74 ChannelType->out
1490: 70 75 74 50 72 6f 63 09 3d 20 54 6c 73 4f 75 74 putProc.= TlsOut
14a0: 70 75 74 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 putProc;..tlsCha
14b0: 6e 6e 65 6c 54 79 70 65 2d 3e 67 65 74 4f 70 74 nnelType->getOpt
14c0: 69 6f 6e 50 72 6f 63 09 3d 20 54 6c 73 47 65 74 ionProc.= TlsGet
14d0: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 09 74 6c 73 OptionProc;..tls
14e0: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 77 61 74 ChannelType->wat
14f0: 63 68 50 72 6f 63 09 3d 20 54 6c 73 57 61 74 63 chProc.= TlsWatc
1500: 68 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e hProc;..tlsChann
1510: 65 6c 54 79 70 65 2d 3e 67 65 74 48 61 6e 64 6c elType->getHandl
1520: 65 50 72 6f 63 09 3d 20 54 6c 73 47 65 74 48 61 eProc.= TlsGetHa
1530: 6e 64 6c 65 50 72 6f 63 3b 0a 0a 09 2f 2a 0a 09 ndleProc;.../*..
1540: 20 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 * blockModeProc
1550: 20 69 73 20 61 20 74 77 69 73 74 65 72 2e 20 20 is a twister.
1560: 57 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 We have to make
1570: 73 6f 6d 65 20 72 75 6e 74 69 6d 65 2d 63 68 6f some runtime-cho
1580: 69 63 65 73 2c 0a 09 20 2a 20 64 65 70 65 6e 64 ices,.. * depend
1590: 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 73 69 ing on the versi
15a0: 6f 6e 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 61 on we compiled a
15b0: 67 61 69 6e 73 74 2e 0a 09 20 2a 2f 0a 0a 23 69 gainst... */..#i
15c0: 66 64 65 66 20 45 4d 55 4c 41 54 45 5f 43 48 41 fdef EMULATE_CHA
15d0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 09 NNEL_VERSION_2..
15e0: 2f 2a 0a 09 20 2a 20 57 65 20 61 72 65 20 63 6f /*.. * We are co
15f0: 6d 70 69 6c 69 6e 67 20 61 67 61 69 6e 73 74 20 mpiling against
1600: 61 6e 20 38 2e 33 2e 31 2d 20 63 6f 72 65 2e 20 an 8.3.1- core.
1610: 20 57 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 We have to crea
1620: 74 65 20 73 6f 6d 65 0a 09 20 2a 20 64 65 66 69 te some.. * defi
1630: 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 nitions for the
1640: 6e 65 77 20 65 6c 65 6d 65 6e 74 73 20 61 73 20 new elements as
1650: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 64 6f 65 the compiler doe
1660: 73 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 65 6d 0a s not know them.
1670: 09 20 2a 20 62 79 20 6e 61 6d 65 2e 0a 09 20 2a . * by name... *
1680: 2f 0a 0a 09 69 66 20 28 63 68 61 6e 6e 65 6c 54 /...if (channelT
1690: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c ypeVersion == TL
16a0: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f S_CHANNEL_VERSIO
16b0: 4e 5f 31 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 N_1) {.. /*..
16c0: 20 20 20 20 20 2a 20 54 68 65 20 27 76 65 72 73 * The 'vers
16d0: 69 6f 6e 27 20 65 6c 65 6d 65 6e 74 20 6f 66 20 ion' element of
16e0: 38 2e 33 2e 32 20 69 73 20 69 6e 20 74 68 65 20 8.3.2 is in the
16f0: 74 68 65 20 70 6c 61 63 65 20 6f 66 20 74 68 65 the place of the
1700: 0a 09 20 20 20 20 20 2a 20 62 6c 6f 63 6b 4d 6f .. * blockMo
1710: 64 65 50 72 6f 63 2e 20 46 6f 72 20 38 2e 32 2e deProc. For 8.2.
1720: 30 2d 38 2e 33 2e 31 20 77 65 20 68 61 76 65 20 0-8.3.1 we have
1730: 74 6f 20 73 65 74 20 6f 75 72 20 62 6c 6f 63 6b to set our block
1740: 4d 6f 64 65 50 72 6f 63 0a 09 20 20 20 20 20 2a ModeProc.. *
1750: 20 69 6e 74 6f 20 74 68 69 73 20 70 6c 61 63 65 into this place
1760: 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 ... */..
1770: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e tlsChannelType->
1780: 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 3d 20 blockModeProc =
1790: 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 TlsBlockModeProc
17a0: 3b 0a 09 7d 20 65 6c 73 65 20 2f 2a 20 63 68 61 ;..} else /* cha
17b0: 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 nnelTypeVersion
17c0: 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 == TLS_CHANNEL_V
17d0: 45 52 53 49 4f 4e 5f 32 20 2a 2f 20 7b 0a 09 20 ERSION_2 */ {..
17e0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 46 6f /*.. * Fo
17f0: 72 20 74 68 65 20 38 2e 33 2e 32 20 63 6f 72 65 r the 8.3.2 core
1800: 20 77 65 20 70 72 65 73 65 6e 74 20 6f 75 72 73 we present ours
1810: 65 6c 76 65 73 20 61 73 20 61 20 76 65 72 73 69 elves as a versi
1820: 6f 6e 20 32 0a 09 20 20 20 20 20 2a 20 64 72 69 on 2.. * dri
1830: 76 65 72 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 ver. This means
1840: 61 20 73 70 65 63 69 61 6c 20 76 61 6c 75 65 20 a special value
1850: 69 6e 20 76 65 72 73 69 6f 6e 20 28 65 78 0a 09 in version (ex..
1860: 20 20 20 20 20 2a 20 62 6c 6f 63 6b 4d 6f 64 65 * blockMode
1870: 50 72 6f 63 29 2c 20 62 6c 6f 63 6b 4d 6f 64 65 Proc), blockMode
1880: 50 72 6f 63 20 69 6e 20 61 20 64 69 66 66 65 72 Proc in a differ
1890: 65 6e 74 20 70 6c 61 63 65 20 61 6e 64 20 6f 66 ent place and of
18a0: 0a 09 20 20 20 20 20 2a 20 63 6f 75 72 73 65 20 .. * course
18b0: 75 73 61 67 65 20 6f 66 20 74 68 65 20 68 61 6e usage of the han
18c0: 64 6c 65 72 50 72 6f 63 2e 20 20 54 68 65 20 6c dlerProc. The l
18d0: 61 73 74 20 74 77 6f 20 68 61 76 65 20 74 6f 0a ast two have to.
18e0: 09 20 20 20 20 20 2a 20 72 65 66 65 72 65 6e 63 . * referenc
18f0: 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 20 ed with pointer
1900: 6d 61 67 69 63 20 62 65 63 61 75 73 65 20 74 68 magic because th
1910: 65 79 20 61 72 65 6e 27 74 20 64 65 66 69 6e 65 ey aren't define
1920: 64 0a 09 20 20 20 20 20 2a 20 6f 74 68 65 72 77 d.. * otherw
1930: 69 73 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 ise... */...
1940: 20 20 20 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 tlsChannelTy
1950: 70 65 2d 3e 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f pe->blockModePro
1960: 63 20 3d 0a 09 09 28 54 63 6c 5f 44 72 69 76 65 c =...(Tcl_Drive
1970: 72 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2a 29 rBlockModeProc*)
1980: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 TLS_CHANNEL_VER
1990: 53 49 4f 4e 5f 32 3b 0a 09 20 20 20 20 28 2a 28 SION_2;.. (*(
19a0: 28 54 63 6c 5f 44 72 69 76 65 72 42 6c 6f 63 6b (Tcl_DriverBlock
19b0: 4d 6f 64 65 50 72 6f 63 2a 2a 29 28 26 28 74 6c ModeProc**)(&(tl
19c0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 63 6c sChannelType->cl
19d0: 6f 73 65 32 50 72 6f 63 29 2b 31 29 29 29 0a 09 ose2Proc)+1)))..
19e0: 09 3d 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 .= TlsBlockModeP
19f0: 72 6f 63 3b 0a 09 20 20 20 20 28 2a 28 28 54 6c roc;.. (*((Tl
1a00: 73 44 72 69 76 65 72 48 61 6e 64 6c 65 72 50 72 sDriverHandlerPr
1a10: 6f 63 2a 2a 29 28 26 28 74 6c 73 43 68 61 6e 6e oc**)(&(tlsChann
1a20: 65 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 32 50 72 elType->close2Pr
1a30: 6f 63 29 2b 33 29 29 29 0a 09 09 3d 20 54 6c 73 oc)+3)))...= Tls
1a40: 4e 6f 74 69 66 79 50 72 6f 63 3b 0a 09 7d 0a 23 NotifyProc;..}.#
1a50: 65 6c 73 65 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6d else../*.. * Com
1a60: 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 38 2e piled against 8.
1a70: 33 2e 32 2b 2e 20 44 69 72 65 63 74 20 61 63 63 3.2+. Direct acc
1a80: 65 73 73 20 74 6f 20 61 6c 6c 20 65 6c 65 6d 65 ess to all eleme
1a90: 6e 74 73 20 70 6f 73 73 69 62 6c 65 2e 20 55 73 nts possible. Us
1aa0: 65 0a 09 20 2a 20 63 68 61 6e 6e 65 6c 54 79 70 e.. * channelTyp
1ab0: 65 56 65 72 73 69 6f 6e 20 69 6e 66 6f 72 6d 61 eVersion informa
1ac0: 74 69 6f 6e 20 74 6f 20 73 65 6c 65 63 74 20 74 tion to select t
1ad0: 68 65 20 76 61 6c 75 65 73 20 74 6f 20 75 73 65 he values to use
1ae0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 63 68 61 ... */...if (cha
1af0: 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 nnelTypeVersion
1b00: 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 == TLS_CHANNEL_V
1b10: 45 52 53 49 4f 4e 5f 31 29 20 7b 0a 09 20 20 20 ERSION_1) {..
1b20: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20 /*.. * The
1b30: 27 76 65 72 73 69 6f 6e 27 20 65 6c 65 6d 65 6e 'version' elemen
1b40: 74 20 6f 66 20 38 2e 33 2e 32 20 69 73 20 69 6e t of 8.3.2 is in
1b50: 20 74 68 65 20 74 68 65 20 70 6c 61 63 65 20 6f the the place o
1b60: 66 20 74 68 65 0a 09 20 20 20 20 20 2a 20 62 6c f the.. * bl
1b70: 6f 63 6b 4d 6f 64 65 50 72 6f 63 2e 20 46 6f 72 ockModeProc. For
1b80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 the original pa
1b90: 74 63 68 20 69 6e 20 38 2e 31 2e 78 20 61 6e 64 tch in 8.1.x and
1ba0: 20 74 68 65 20 66 69 72 73 74 6c 79 0a 09 20 20 the firstly..
1bb0: 20 20 20 2a 20 69 6e 63 6c 75 64 65 64 20 28 38 * included (8
1bc0: 2e 32 29 20 77 65 20 68 61 76 65 20 74 6f 20 73 .2) we have to s
1bd0: 65 74 20 6f 75 72 20 62 6c 6f 63 6b 4d 6f 64 65 et our blockMode
1be0: 50 72 6f 63 20 69 6e 74 6f 20 74 68 69 73 0a 09 Proc into this..
1bf0: 20 20 20 20 20 2a 20 70 6c 61 63 65 2e 0a 09 20 * place...
1c00: 20 20 20 20 2a 2f 0a 09 20 20 20 20 74 6c 73 43 */.. tlsC
1c10: 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 76 65 72 73 hannelType->vers
1c20: 69 6f 6e 20 3d 20 28 54 63 6c 5f 43 68 61 6e 6e ion = (Tcl_Chann
1c30: 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 29 54 6c elTypeVersion)Tl
1c40: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a sBlockModeProc;.
1c50: 09 7d 20 65 6c 73 65 20 2f 2a 20 63 68 61 6e 6e .} else /* chann
1c60: 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d elTypeVersion ==
1c70: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 TLS_CHANNEL_VER
1c80: 53 49 4f 4e 5f 32 20 2a 2f 20 7b 0a 09 20 20 20 SION_2 */ {..
1c90: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 46 6f 72 20 /*.. * For
1ca0: 74 68 65 20 38 2e 33 2e 32 20 63 6f 72 65 20 77 the 8.3.2 core w
1cb0: 65 20 70 72 65 73 65 6e 74 20 6f 75 72 73 65 6c e present oursel
1cc0: 76 65 73 20 61 73 20 61 20 76 65 72 73 69 6f 6e ves as a version
1cd0: 20 32 0a 09 20 20 20 20 20 2a 20 64 72 69 76 65 2.. * drive
1ce0: 72 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 r. This means a
1cf0: 73 70 65 63 69 61 6c 20 76 61 6c 75 65 20 69 6e special value in
1d00: 20 76 65 72 73 69 6f 6e 20 28 65 78 0a 09 20 20 version (ex..
1d10: 20 20 20 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 * blockModePr
1d20: 6f 63 29 2c 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 oc), blockModePr
1d30: 6f 63 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e oc in a differen
1d40: 74 20 70 6c 61 63 65 20 61 6e 64 20 6f 66 0a 09 t place and of..
1d50: 20 20 20 20 20 2a 20 63 6f 75 72 73 65 20 75 73 * course us
1d60: 61 67 65 20 6f 66 20 74 68 65 20 68 61 6e 64 6c age of the handl
1d70: 65 72 50 72 6f 63 2e 0a 09 20 20 20 20 20 2a 2f erProc... */
1d80: 0a 0a 09 20 20 20 20 74 6c 73 43 68 61 6e 6e 65 ... tlsChanne
1d90: 6c 54 79 70 65 2d 3e 76 65 72 73 69 6f 6e 20 20 lType->version
1da0: 20 20 20 20 20 3d 20 54 43 4c 5f 43 48 41 4e 4e = TCL_CHANN
1db0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 3b 0a 09 20 EL_VERSION_2;..
1dc0: 20 20 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 tlsChannelTyp
1dd0: 65 2d 3e 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 e->blockModeProc
1de0: 20 3d 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 = TlsBlockModeP
1df0: 72 6f 63 3b 0a 09 20 20 20 20 74 6c 73 43 68 61 roc;.. tlsCha
1e00: 6e 6e 65 6c 54 79 70 65 2d 3e 68 61 6e 64 6c 65 nnelType->handle
1e10: 72 50 72 6f 63 20 20 20 3d 20 54 6c 73 4e 6f 74 rProc = TlsNot
1e20: 69 66 79 50 72 6f 63 3b 0a 09 7d 0a 23 65 6e 64 ifyProc;..}.#end
1e30: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 if. }. ret
1e40: 75 72 6e 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 urn tlsChannelTy
1e50: 70 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d pe;.}.../*. *---
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ea0: 0a 20 2a 0a 20 2a 20 54 6c 73 42 6c 6f 63 6b 4d . *. * TlsBlockM
1eb0: 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a odeProc --. *. *
1ec0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
1ed0: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 is invoked by th
1ee0: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 e generic IO lev
1ef0: 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 73 el. * to s
1f00: 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 et blocking and
1f10: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 nonblocking mode
1f20: 73 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a s. * Results:. *
1f30: 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c .0 if successful
1f40: 2c 20 65 72 72 6e 6f 20 77 68 65 6e 20 66 61 69 , errno when fai
1f50: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 led.. *. * Side
1f60: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
1f70: 20 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 6f the device into
1f80: 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e blocking or non
1f90: 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 blocking mode..
1fa0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
1ff0: 74 69 63 20 69 6e 74 0a 54 6c 73 42 6c 6f 63 6b tic int.TlsBlock
2000: 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 ModeProc(ClientD
2010: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 ata instanceData
2020: 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 ,./* Socket stat
2030: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 e. */.
2040: 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 29 int mode)
2050: 09 09 09 2f 2a 20 54 68 65 20 6d 6f 64 65 20 74 .../* The mode t
2060: 6f 20 73 65 74 2e 20 43 61 6e 20 62 65 20 6f 6e o set. Can be on
2070: 65 20 6f 66 0a 09 09 09 09 09 09 2a 20 54 43 4c e of.......* TCL
2080: 5f 4d 4f 44 45 5f 42 4c 4f 43 4b 49 4e 47 20 6f _MODE_BLOCKING o
2090: 72 0a 09 09 09 09 09 09 2a 20 54 43 4c 5f 4d 4f r.......* TCL_MO
20a0: 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 2e 20 DE_NONBLOCKING.
20b0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
20c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
20d0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
20e0: 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 a;.. if (mode
20f0: 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e == TCL_MODE_NON
2100: 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 BLOCKING) {..sta
2110: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
2120: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 TLS_TCL_ASYNC;.
2130: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 } else {..sta
2140: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 tePtr->flags &=
2150: 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 ~(TLS_TCL_ASYNC)
2160: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
2170: 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 channelTypeVersi
2180: 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 on == TLS_CHANNE
2190: 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 L_VERSION_2) {..
21a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 20 return 0;. }
21b0: 65 6c 73 65 20 7b 0a 09 72 65 74 75 72 6e 20 54 else {..return T
21c0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
21d0: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 69 6e ion(statePtr->in
21e0: 74 65 72 70 2c 20 54 6c 73 5f 47 65 74 50 61 72 terp, Tls_GetPar
21f0: 65 6e 74 28 73 74 61 74 65 50 74 72 29 2c 0a 09 ent(statePtr),..
2200: 09 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 28 6d ."-blocking", (m
2210: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f ode == TCL_MODE_
2220: 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 3f 20 22 NONBLOCKING) ? "
2230: 30 22 20 3a 20 22 31 22 29 3b 0a 20 20 20 20 7d 0" : "1");. }
2240: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2290: 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 . * TlsCloseProc
22a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
22b0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
22c0: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 ked by the gener
22d0: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 ic IO level to p
22e0: 65 72 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 erform. *.channe
22f0: 6c 2d 74 79 70 65 2d 73 70 65 63 69 66 69 63 20 l-type-specific
2300: 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 61 20 53 cleanup when a S
2310: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 SL socket based
2320: 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c channel. *.is cl
2330: 6f 73 65 64 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 osed.. *. *.Note
2340: 3a 20 77 65 20 6c 65 61 76 65 20 74 68 65 20 75 : we leave the u
2350: 6e 64 65 72 6c 79 69 6e 67 20 73 6f 63 6b 65 74 nderlying socket
2360: 20 61 6c 6f 6e 65 2c 20 69 73 20 74 68 69 73 20 alone, is this
2370: 72 69 67 68 74 3f 0a 20 2a 0a 20 2a 20 52 65 73 right?. *. * Res
2380: 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 ults:. *.0 if su
2390: 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 76 61 ccessful, the va
23a0: 6c 75 65 20 6f 66 20 54 63 6c 5f 47 65 74 45 72 lue of Tcl_GetEr
23b0: 72 6e 6f 28 29 20 69 66 20 66 61 69 6c 65 64 2e rno() if failed.
23c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
23d0: 63 74 73 3a 0a 20 2a 09 43 6c 6f 73 65 73 20 74 cts:. *.Closes t
23e0: 68 65 20 73 6f 63 6b 65 74 20 6f 66 20 74 68 65 he socket of the
23f0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2440: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
2450: 74 0a 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 43 t.TlsCloseProc(C
2460: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
2470: 63 65 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 ceData,./* The s
2480: 6f 63 6b 65 74 20 74 6f 20 63 6c 6f 73 65 2e 20 ocket to close.
2490: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 */.
24a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
24b0: 72 70 29 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 rp)./* For error
24c0: 20 72 65 70 6f 72 74 69 6e 67 20 2d 20 75 6e 75 reporting - unu
24d0: 73 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 sed. */.{. St
24e0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
24f0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
2500: 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ceData;.. dpr
2510: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e 54 intf(stderr,"\nT
2520: 6c 73 43 6c 6f 73 65 50 72 6f 63 28 30 78 25 78 lsCloseProc(0x%x
2530: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e )", (unsigned in
2540: 74 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 t) statePtr);..
2550: 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 if (channelTy
2560: 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 peVersion == TLS
2570: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e _CHANNEL_VERSION
2580: 5f 31 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 _1) {../*.. * Re
2590: 6d 6f 76 65 20 65 76 65 6e 74 20 68 61 6e 64 6c move event handl
25a0: 65 72 20 74 6f 20 75 6e 64 65 72 6c 79 69 6e 67 er to underlying
25b0: 20 63 68 61 6e 6e 65 6c 2c 20 74 68 69 73 20 63 channel, this c
25c0: 6f 75 6c 64 0a 09 20 2a 20 62 65 20 62 65 63 61 ould.. * be beca
25d0: 75 73 65 20 77 65 20 61 72 65 20 63 6c 6f 73 69 use we are closi
25e0: 6e 67 20 66 6f 72 20 72 65 61 6c 2c 20 6f 72 20 ng for real, or
25f0: 62 65 69 6e 67 20 22 75 6e 73 74 61 63 6b 65 64 being "unstacked
2600: 22 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 65 "... */...Tcl_De
2610: 6c 65 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64 6c leteChannelHandl
2620: 65 72 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 er(Tls_GetParent
2630: 28 73 74 61 74 65 50 74 72 29 2c 0a 09 09 54 6c (statePtr),...Tl
2640: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 2c sChannelHandler,
2650: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 (ClientData) st
2660: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a atePtr);. }..
2670: 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 Tls_Clean(st
2680: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c atePtr);. Tcl
2690: 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 28 _EventuallyFree(
26a0: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74 (ClientData)stat
26b0: 65 50 74 72 2c 20 54 6c 73 5f 46 72 65 65 29 3b ePtr, Tls_Free);
26c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
26d0: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2720: 0a 20 2a 0a 20 2a 20 54 6c 73 49 6e 70 75 74 50 . *. * TlsInputP
2730: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
2740: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
2750: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 nvoked by the ge
2760: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 neric IO level.
2770: 2a 20 20 20 20 20 20 20 74 6f 20 72 65 61 64 20 * to read
2780: 69 6e 70 75 74 20 66 72 6f 6d 20 61 20 53 53 4c input from a SSL
2790: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 socket based ch
27a0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 annel.. *. * Res
27b0: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 75 6d ults:. *.The num
27c0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 ber of bytes rea
27d0: 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 72 d is returned or
27e0: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 41 6e -1 on error. An
27f0: 20 6f 75 74 70 75 74 0a 20 2a 09 61 72 67 75 6d output. *.argum
2800: 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 ent contains the
2810: 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 POSIX error cod
2820: 65 20 6f 6e 20 65 72 72 6f 72 2c 20 6f 72 20 7a e on error, or z
2830: 65 72 6f 20 69 66 20 6e 6f 0a 20 2a 09 65 72 72 ero if no. *.err
2840: 6f 72 20 6f 63 63 75 72 72 65 64 2e 0a 20 2a 0a or occurred.. *.
2850: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
2860: 0a 20 2a 09 52 65 61 64 73 20 69 6e 70 75 74 20 . *.Reads input
2870: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 64 from the input d
2880: 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 evice of the cha
2890: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
28e0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 */..static int.T
28f0: 6c 73 49 6e 70 75 74 50 72 6f 63 28 43 6c 69 65 lsInputProc(Clie
2900: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
2910: 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 ata,./* Socket s
2920: 74 61 74 65 2e 20 2a 2f 0a 09 63 68 61 72 20 2a tate. */..char *
2930: 62 75 66 2c 09 09 09 2f 2a 20 57 68 65 72 65 20 buf,.../* Where
2940: 74 6f 20 73 74 6f 72 65 20 64 61 74 61 20 72 65 to store data re
2950: 61 64 2e 20 2a 2f 0a 09 69 6e 74 20 62 75 66 53 ad. */..int bufS
2960: 69 7a 65 2c 09 09 09 2f 2a 20 48 6f 77 20 6d 75 ize,.../* How mu
2970: 63 68 20 73 70 61 63 65 20 69 73 20 61 76 61 69 ch space is avai
2980: 6c 61 62 6c 65 0a 09 09 09 09 09 20 2a 20 69 6e lable...... * in
2990: 20 74 68 65 20 62 75 66 66 65 72 3f 20 2a 2f 0a the buffer? */.
29a0: 09 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 .int *errorCodeP
29b0: 74 72 29 09 09 2f 2a 20 57 68 65 72 65 20 74 6f tr)../* Where to
29c0: 20 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f 64 store error cod
29d0: 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 e. */.{. Stat
29e0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
29f0: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 tate *) instance
2a00: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 Data;. int by
2a10: 74 65 73 52 65 61 64 3b 09 09 09 2f 2a 20 48 6f tesRead;.../* Ho
2a20: 77 20 6d 61 6e 79 20 62 79 74 65 73 20 77 65 72 w many bytes wer
2a30: 65 20 72 65 61 64 3f 20 2a 2f 0a 0a 20 20 20 20 e read? */..
2a40: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
2a50: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
2a60: 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 72 65 stderr,"\nBIO_re
2a70: 61 64 28 25 64 29 22 2c 20 62 75 66 53 69 7a 65 ad(%d)", bufSize
2a80: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
2a90: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c ePtr->flags & TL
2aa0: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 S_TCL_CALLBACK)
2ab0: 7b 0a 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 {. /* don'
2ac0: 74 20 70 72 6f 63 65 73 73 20 61 6e 79 20 62 79 t process any by
2ad0: 74 65 73 20 77 68 69 6c 65 20 76 65 72 69 66 79 tes while verify
2ae0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e callback is run
2af0: 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 62 ning */. b
2b00: 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 20 20 ytesRead = 0;.
2b10: 20 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b goto input;
2b20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
2b30: 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e !SSL_is_init_fin
2b40: 69 73 68 65 64 28 73 74 61 74 65 50 74 72 2d 3e ished(statePtr->
2b50: 73 73 6c 29 29 20 7b 0a 09 62 79 74 65 73 52 65 ssl)) {..bytesRe
2b60: 61 64 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 ad = Tls_WaitFor
2b70: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 Connect(statePtr
2b80: 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b , errorCodePtr);
2b90: 0a 09 69 66 20 28 62 79 74 65 73 52 65 61 64 20 ..if (bytesRead
2ba0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 <= 0) {.. if
2bb0: 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d (*errorCodePtr =
2bc0: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a = ECONNRESET) {.
2bd0: 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f ../* Soft EOF */
2be0: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
2bf0: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 = 0;...bytesRea
2c00: 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 d = 0;.. }..
2c10: 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 09 goto input;..
2c20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. }. if (
2c30: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2c40: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 & TLS_TCL_INIT)
2c50: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 {..statePtr->fla
2c60: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
2c70: 49 4e 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 INIT);. }.
2c80: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 /*. * We ne
2c90: 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 ed to clear the
2ca0: 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 SSL error stack
2cb0: 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65 20 73 now because we s
2cc0: 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20 ometimes reach.
2cd0: 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74 * this funct
2ce0: 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65 ion with leftove
2cf0: 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 r errors in the
2d00: 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 72 stack. If BIO_r
2d10: 65 61 64 0a 20 20 20 20 20 2a 20 72 65 74 75 72 ead. * retur
2d20: 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 ns -1 and intend
2d30: 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 s EAGAIN, there
2d40: 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 is a leftover er
2d50: 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a ror, it will be.
2d60: 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 * misconstr
2d70: 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c ued as an error,
2d80: 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 not EAGAIN..
2d90: 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 *. * Alter
2da0: 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 natively, we may
2db0: 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 want to handle
2dc0: 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f the <0 return co
2dd0: 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 des from. *
2de0: 42 49 4f 5f 72 65 61 64 20 73 70 65 63 69 61 6c BIO_read special
2df0: 6c 79 20 28 61 73 20 61 64 76 69 73 65 64 20 69 ly (as advised i
2e00: 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e n the RSA docs).
2e10: 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 TLS's lower le
2e20: 76 65 6c 20 42 49 4f 0a 20 20 20 20 20 2a 20 66 vel BIO. * f
2e30: 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 unctions play wi
2e40: 74 68 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 th the retry fla
2e50: 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 gs though, and t
2e60: 68 69 73 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 his seems to wor
2e70: 6b 0a 20 20 20 20 20 2a 20 63 6f 72 72 65 63 74 k. * correct
2e80: 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 ly. Similar fix
2e90: 20 69 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 6f in TlsOutputPro
2ea0: 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 c. - hobbs.
2eb0: 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 */. ERR_clear
2ec0: 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 62 79 _error();. by
2ed0: 74 65 73 52 65 61 64 20 3d 20 42 49 4f 5f 72 65 tesRead = BIO_re
2ee0: 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ad(statePtr->bio
2ef0: 2c 20 62 75 66 2c 20 62 75 66 53 69 7a 65 29 3b , buf, bufSize);
2f00: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
2f10: 65 72 72 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 20 err,"\nBIO_read
2f20: 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52 65 61 -> %d", bytesRea
2f30: 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 62 79 74 d);.. if (byt
2f40: 65 73 52 65 61 64 20 3c 20 30 29 20 7b 0a 09 69 esRead < 0) {..i
2f50: 6e 74 20 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 nt err = SSL_get
2f60: 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d _error(statePtr-
2f70: 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 29 >ssl, bytesRead)
2f80: 3b 0a 0a 09 69 66 20 28 65 72 72 20 3d 3d 20 53 ;...if (err == S
2f90: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 29 20 7b 0a SL_ERROR_SSL) {.
2fa0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
2fb0: 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 52 tatePtr, SSL_ERR
2fc0: 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c OR(statePtr->ssl
2fd0: 2c 20 62 79 74 65 73 52 65 61 64 29 29 3b 0a 09 , bytesRead));..
2fe0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
2ff0: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 r = ECONNABORTED
3000: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 42 49 ;..} else if (BI
3010: 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 O_should_retry(s
3020: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
3030: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 .. dprintf(st
3040: 64 65 72 72 2c 22 52 45 21 20 22 29 3b 0a 09 20 derr,"RE! ");..
3050: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
3060: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 7d 20 65 6c = EAGAIN;..} el
3070: 73 65 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f 72 se {.. *error
3080: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 CodePtr = Tcl_Ge
3090: 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20 69 tErrno();.. i
30a0: 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 f (*errorCodePtr
30b0: 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 == ECONNRESET)
30c0: 7b 0a 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 {.../* Soft EOF
30d0: 2a 2f 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 */...*errorCodeP
30e0: 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 tr = 0;...bytesR
30f0: 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a ead = 0;.. }.
3100: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 70 .}. }. inp
3110: 75 74 3a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ut:. dprintf(
3120: 73 74 64 65 72 72 2c 20 22 5c 6e 49 6e 70 75 74 stderr, "\nInput
3130: 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 64 5d 22 (%d) -> %d [%d]"
3140: 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 74 65 73 , bufSize, bytes
3150: 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 6f 64 65 Read, *errorCode
3160: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
3170: 20 62 79 74 65 73 52 65 61 64 3b 0a 7d 0a 0c 0a bytesRead;.}...
3180: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
31d0: 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a lsOutputProc --.
31e0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
31f0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
3200: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
3210: 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 O level. *
3220: 20 74 6f 20 77 72 69 74 65 20 6f 75 74 70 75 74 to write output
3230: 20 74 6f 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 to a SSL socket
3240: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a based channel..
3250: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
3260: 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 *.The number of
3270: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 69 73 bytes written is
3280: 20 72 65 74 75 72 6e 65 64 2e 20 41 6e 20 6f 75 returned. An ou
3290: 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 69 73 tput argument is
32a0: 0a 20 2a 09 73 65 74 20 74 6f 20 61 20 50 4f 53 . *.set to a POS
32b0: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 IX error code if
32c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 an error occurr
32d0: 65 64 2c 20 6f 72 20 7a 65 72 6f 2e 0a 20 2a 0a ed, or zero.. *.
32e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
32f0: 0a 20 2a 09 57 72 69 74 65 73 20 6f 75 74 70 75 . *.Writes outpu
3300: 74 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20 t on the output
3310: 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 device of the ch
3320: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3370: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
3380: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 28 43 6c TlsOutputProc(Cl
3390: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
33a0: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 eData,./* Socket
33b0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 state. */.
33c0: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 20 63 CONST c
33d0: 68 61 72 20 2a 62 75 66 2c 09 09 2f 2a 20 54 68 har *buf,../* Th
33e0: 65 20 64 61 74 61 20 62 75 66 66 65 72 2e 20 2a e data buffer. *
33f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 /.
3400: 69 6e 74 20 74 6f 57 72 69 74 65 2c 09 09 2f 2a int toWrite,../*
3410: 20 48 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 How many bytes
3420: 74 6f 20 77 72 69 74 65 3f 20 2a 2f 0a 20 20 20 to write? */.
3430: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a int *
3440: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 2f 2a errorCodePtr)./*
3450: 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 Where to store
3460: 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 7b error code. */.{
3470: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
3480: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
3490: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 instanceData;.
34a0: 20 20 20 69 6e 74 20 77 72 69 74 74 65 6e 2c 20 int written,
34b0: 65 72 72 3b 0a 0a 20 20 20 20 2a 65 72 72 6f 72 err;.. *error
34c0: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 CodePtr = 0;..
34d0: 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 dprintf(stderr
34e0: 2c 22 5c 6e 42 49 4f 5f 77 72 69 74 65 28 30 78 ,"\nBIO_write(0x
34f0: 25 78 2c 20 25 64 29 22 2c 20 28 75 6e 73 69 67 %x, %d)", (unsig
3500: 6e 65 64 20 69 6e 74 29 20 73 74 61 74 65 50 74 ned int) statePt
3510: 72 2c 20 74 6f 57 72 69 74 65 29 3b 0a 0a 20 20 r, toWrite);..
3520: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
3530: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
3540: 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 20 20 20 20 CALLBACK) {.
3550: 20 20 20 2f 2a 20 64 6f 6e 27 74 20 70 72 6f 63 /* don't proc
3560: 65 73 73 20 61 6e 79 20 62 79 74 65 73 20 77 68 ess any bytes wh
3570: 69 6c 65 20 76 65 72 69 66 79 20 63 61 6c 6c 62 ile verify callb
3580: 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 20 2a ack is running *
3590: 2f 0a 20 20 20 20 20 20 20 77 72 69 74 74 65 6e /. written
35a0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 2a 65 = -1;. *e
35b0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 rrorCodePtr = EA
35c0: 47 41 49 4e 3b 0a 20 20 20 20 20 20 20 67 6f 74 GAIN;. got
35d0: 6f 20 6f 75 74 70 75 74 3b 0a 20 20 20 20 7d 0a o output;. }.
35e0: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73 . if (!SSL_is
35f0: 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 _init_finished(s
3600: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b tatePtr->ssl)) {
3610: 0a 09 77 72 69 74 74 65 6e 20 3d 20 54 6c 73 5f ..written = Tls_
3620: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 WaitForConnect(s
3630: 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f tatePtr, errorCo
3640: 64 65 50 74 72 29 3b 0a 09 69 66 20 28 77 72 69 dePtr);..if (wri
3650: 74 74 65 6e 20 3c 3d 20 30 29 20 7b 0a 09 20 20 tten <= 0) {..
3660: 20 20 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 09 goto output;..
3670: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. }. if (
3680: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
3690: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 & TLS_TCL_INIT)
36a0: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 {..statePtr->fla
36b0: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
36c0: 49 4e 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 INIT);. }.
36d0: 20 69 66 20 28 74 6f 57 72 69 74 65 20 3d 3d 20 if (toWrite ==
36e0: 30 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 73 74 0) {..dprintf(st
36f0: 64 65 72 72 2c 20 22 7a 65 72 6f 2d 77 72 69 74 derr, "zero-writ
3700: 65 5c 6e 22 29 3b 0a 09 42 49 4f 5f 66 6c 75 73 e\n");..BIO_flus
3710: 68 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 h(statePtr->bio)
3720: 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a ;..written = 0;.
3730: 09 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 20 20 .goto output;.
3740: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 } else {../*..
3750: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c * We need to cl
3760: 65 61 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f ear the SSL erro
3770: 72 20 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 r stack now beca
3780: 75 73 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 use we sometimes
3790: 20 72 65 61 63 68 0a 09 20 2a 20 74 68 69 73 20 reach.. * this
37a0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 function with le
37b0: 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e ftover errors in
37c0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 the stack. If
37d0: 42 49 4f 5f 77 72 69 74 65 0a 09 20 2a 20 72 65 BIO_write.. * re
37e0: 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 turns -1 and int
37f0: 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 ends EAGAIN, the
3800: 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 re is a leftover
3810: 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 error, it will
3820: 62 65 0a 09 20 2a 20 6d 69 73 63 6f 6e 73 74 72 be.. * misconstr
3830: 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c ued as an error,
3840: 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 09 20 2a not EAGAIN... *
3850: 0a 09 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 .. * Alternative
3860: 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e 74 20 ly, we may want
3870: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 3c 30 to handle the <0
3880: 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 66 72 return codes fr
3890: 6f 6d 0a 09 20 2a 20 42 49 4f 5f 77 72 69 74 65 om.. * BIO_write
38a0: 20 73 70 65 63 69 61 6c 6c 79 20 28 61 73 20 61 specially (as a
38b0: 64 76 69 73 65 64 20 69 6e 20 74 68 65 20 52 53 dvised in the RS
38c0: 41 20 64 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 A docs). TLS's
38d0: 6c 6f 77 65 72 20 6c 65 76 65 6c 0a 09 20 2a 20 lower level.. *
38e0: 42 49 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c BIO functions pl
38f0: 61 79 20 77 69 74 68 20 74 68 65 20 72 65 74 72 ay with the retr
3900: 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 y flags though,
3910: 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 and this seems t
3920: 6f 0a 09 20 2a 20 77 6f 72 6b 20 63 6f 72 72 65 o.. * work corre
3930: 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 ctly. Similar f
3940: 69 78 20 69 6e 20 54 6c 73 49 6e 70 75 74 50 72 ix in TlsInputPr
3950: 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 09 20 2a 2f oc. - hobbs.. */
3960: 0a 09 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ..ERR_clear_erro
3970: 72 28 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 r();..written =
3980: 42 49 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50 BIO_write(stateP
3990: 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f tr->bio, buf, to
39a0: 57 72 69 74 65 29 3b 0a 09 64 70 72 69 6e 74 66 Write);..dprintf
39b0: 28 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 77 (stderr,"\nBIO_w
39c0: 72 69 74 65 28 30 78 25 78 2c 20 25 64 29 20 2d rite(0x%x, %d) -
39d0: 3e 20 5b 25 64 5d 22 2c 0a 09 09 28 75 6e 73 69 > [%d]",...(unsi
39e0: 67 6e 65 64 20 69 6e 74 29 20 73 74 61 74 65 50 gned int) stateP
39f0: 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 tr, toWrite, wri
3a00: 74 74 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 tten);. }.
3a10: 20 69 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 if (written <=
3a20: 30 29 20 7b 0a 09 73 77 69 74 63 68 20 28 28 65 0) {..switch ((e
3a30: 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 rr = SSL_get_err
3a40: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c or(statePtr->ssl
3a50: 2c 20 77 72 69 74 74 65 6e 29 29 29 20 7b 0a 09 , written))) {..
3a60: 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52 52 case SSL_ERR
3a70: 4f 52 5f 4e 4f 4e 45 3a 0a 09 09 69 66 20 28 77 OR_NONE:...if (w
3a80: 72 69 74 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09 ritten < 0) {...
3a90: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b written = 0;
3aa0: 0a 09 09 7d 0a 09 09 62 72 65 61 6b 3b 0a 09 20 ...}...break;..
3ab0: 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52 52 4f case SSL_ERRO
3ac0: 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 09 R_WANT_WRITE:...
3ad0: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
3ae0: 20 77 72 69 74 65 20 57 20 42 4c 4f 43 4b 22 29 write W BLOCK")
3af0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ;...break;..
3b00: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 case SSL_ERROR_W
3b10: 41 4e 54 5f 52 45 41 44 3a 0a 09 09 64 70 72 69 ANT_READ:...dpri
3b20: 6e 74 66 28 73 74 64 65 72 72 2c 22 20 77 72 69 ntf(stderr," wri
3b30: 74 65 20 52 20 42 4c 4f 43 4b 22 29 3b 0a 09 09 te R BLOCK");...
3b40: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 break;.. case
3b50: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
3b60: 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 09 64 X509_LOOKUP:...d
3b70: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 printf(stderr,"
3b80: 77 72 69 74 65 20 58 20 42 4c 4f 43 4b 22 29 3b write X BLOCK");
3b90: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 ...break;.. c
3ba0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
3bb0: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 09 64 70 72 RO_RETURN:...dpr
3bc0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 63 6c intf(stderr," cl
3bd0: 6f 73 65 64 5c 6e 22 29 3b 0a 09 09 77 72 69 74 osed\n");...writ
3be0: 74 65 6e 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b ten = 0;...break
3bf0: 3b 0a 09 20 20 20 20 63 61 73 65 20 53 53 4c 5f ;.. case SSL_
3c00: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 ERROR_SYSCALL:..
3c10: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
3c20: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
3c30: 0a 09 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 ...dprintf(stder
3c40: 72 2c 22 20 5b 25 64 5d 20 73 79 73 63 61 6c 6c r," [%d] syscall
3c50: 20 65 72 72 72 3a 20 25 64 22 2c 0a 09 09 09 77 errr: %d",....w
3c60: 72 69 74 74 65 6e 2c 20 2a 65 72 72 6f 72 43 6f ritten, *errorCo
3c70: 64 65 50 74 72 29 3b 0a 09 09 77 72 69 74 74 65 dePtr);...writte
3c80: 6e 20 3d 20 2d 31 3b 0a 09 09 62 72 65 61 6b 3b n = -1;...break;
3c90: 0a 09 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 .. case SSL_E
3ca0: 52 52 4f 52 5f 53 53 4c 3a 0a 09 09 54 6c 73 5f RROR_SSL:...Tls_
3cb0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
3cc0: 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 65 50 SSL_ERROR(stateP
3cd0: 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 6e tr->ssl, written
3ce0: 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 ));...*errorCode
3cf0: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 Ptr = ECONNABORT
3d00: 45 44 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 ED;...written =
3d10: 2d 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 -1;...break;..
3d20: 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 64 70 72 default:...dpr
3d30: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 75 6e intf(stderr," un
3d40: 6b 6e 6f 77 6e 20 65 72 72 3a 20 25 64 5c 6e 22 known err: %d\n"
3d50: 2c 20 65 72 72 29 3b 0a 09 09 62 72 65 61 6b 3b , err);...break;
3d60: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 ..}. }. ou
3d70: 74 70 75 74 3a 0a 20 20 20 20 64 70 72 69 6e 74 tput:. dprint
3d80: 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 4f 75 74 f(stderr, "\nOut
3d90: 70 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 put(%d) -> %d",
3da0: 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e toWrite, written
3db0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 72 );. return wr
3dc0: 69 74 74 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a itten;.}.../*. *
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e10: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 ---. *. * TlsGet
3e20: 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a OptionProc --. *
3e30: 0a 20 2a 09 43 6f 6d 70 75 74 65 73 20 61 6e 20 . *.Computes an
3e40: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 option value for
3e50: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
3e60: 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 sed channel, or
3e70: 61 0a 20 2a 09 6c 69 73 74 20 6f 66 20 61 6c 6c a. *.list of all
3e80: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 options and the
3e90: 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a ir values.. *. *
3ea0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
3eb0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
3ec0: 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 lt. The value of
3ed0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f the specified o
3ee0: 70 74 69 6f 6e 20 6f 72 20 61 0a 20 2a 09 6c 69 ption or a. *.li
3ef0: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e st of all option
3f00: 73 20 61 6e 64 09 74 68 65 69 72 20 76 61 6c 75 s and.their valu
3f10: 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 es is returned i
3f20: 6e 20 74 68 65 0a 20 2a 09 73 75 70 70 6c 69 65 n the. *.supplie
3f30: 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a d DString.. *. *
3f40: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
3f50: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fa0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
3fb0: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 TlsGetOptionProc
3fc0: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
3fd0: 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 anceData,./* Soc
3fe0: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 09 54 ket state. */..T
3ff0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4000: 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 p,../* For error
4010: 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e s - can be NULL.
4020: 20 2a 2f 0a 09 43 4f 4e 53 54 38 34 20 63 68 61 */..CONST84 cha
4030: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f r *optionName,./
4040: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 * Name of the op
4050: 74 69 6f 6e 20 74 6f 0a 09 09 09 09 09 20 2a 20 tion to...... *
4060: 72 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c retrieve the val
4070: 75 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 09 ue for, or......
4080: 20 2a 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 * NULL to get a
4090: 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 0a 09 ll options and..
40a0: 09 09 09 09 20 2a 20 74 68 65 69 72 20 76 61 6c .... * their val
40b0: 75 65 73 2e 20 2a 2f 0a 09 54 63 6c 5f 44 53 74 ues. */..Tcl_DSt
40c0: 72 69 6e 67 20 2a 64 73 50 74 72 29 09 09 2f 2a ring *dsPtr)../*
40d0: 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 Where to store
40e0: 74 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c the computed val
40f0: 75 65 0a 09 09 09 09 09 20 2a 20 69 6e 69 74 69 ue...... * initi
4100: 61 6c 69 7a 65 64 20 62 79 20 63 61 6c 6c 65 72 alized by caller
4110: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 . */.{. State
4120: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
4130: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
4140: 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 63 68 ata;.. if (ch
4150: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e annelTypeVersion
4160: 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f == TLS_CHANNEL_
4170: 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 54 63 VERSION_2) {..Tc
4180: 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 6e 43 68 l_Channel downCh
4190: 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 an = Tls_GetPare
41a0: 6e 74 28 73 74 61 74 65 50 74 72 29 3b 0a 09 54 nt(statePtr);..T
41b0: 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 cl_DriverGetOpti
41c0: 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f onProc *getOptio
41d0: 6e 50 72 6f 63 3b 0a 0a 09 67 65 74 4f 70 74 69 nProc;...getOpti
41e0: 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 onProc = Tcl_Cha
41f0: 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f nnelGetOptionPro
4200: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c c(Tcl_GetChannel
4210: 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b Type(downChan));
4220: 0a 09 69 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 ..if (getOptionP
4230: 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 roc != NULL) {..
4240: 20 20 20 20 72 65 74 75 72 6e 20 28 2a 67 65 74 return (*get
4250: 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f OptionProc)(Tcl_
4260: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
4270: 63 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 ceData(downChan)
4280: 2c 0a 09 09 20 20 20 20 69 6e 74 65 72 70 2c 20 ,... interp,
4290: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 64 73 50 74 optionName, dsPt
42a0: 72 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 r);..} else if (
42b0: 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 optionName == (c
42c0: 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 har*) NULL) {..
42d0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 52 65 /*.. * Re
42e0: 71 75 65 73 74 20 69 73 20 71 75 65 72 79 20 66 quest is query f
42f0: 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 or all options,
4300: 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09 20 20 20 this is ok...
4310: 20 20 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 6e */.. return
4320: 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 09 2f 2a 0a TCL_OK;..}../*.
4330: 09 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 . * Request for
4340: 61 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f a specific optio
4350: 6e 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 n has to fail, w
4360: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 e don't have any
4370: 2e 0a 09 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 ... */..return T
4380: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 CL_ERROR;. }
4390: 65 6c 73 65 20 7b 0a 09 73 69 7a 65 5f 74 20 6c else {..size_t l
43a0: 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 70 en = 0;...if (op
43b0: 74 69 6f 6e 4e 61 6d 65 20 21 3d 20 28 63 68 61 tionName != (cha
43c0: 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 r *) NULL) {..
43d0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f len = strlen(o
43e0: 70 74 69 6f 6e 4e 61 6d 65 29 3b 0a 09 7d 0a 23 ptionName);..}.#
43f0: 69 66 20 30 0a 09 69 66 20 28 28 6c 65 6e 20 3d if 0..if ((len =
4400: 3d 20 30 29 20 7c 7c 20 28 28 6c 65 6e 20 3e 20 = 0) || ((len >
4410: 31 29 20 26 26 20 28 6f 70 74 69 6f 6e 4e 61 6d 1) && (optionNam
4420: 65 5b 31 5d 20 3d 3d 20 27 63 27 29 20 26 26 0a e[1] == 'c') &&.
4430: 09 09 28 73 74 72 6e 63 6d 70 28 6f 70 74 69 6f ..(strncmp(optio
4440: 6e 4e 61 6d 65 2c 20 22 2d 63 69 70 68 65 72 22 nName, "-cipher"
4450: 2c 20 6c 65 6e 29 20 3d 3d 20 30 29 29 29 20 7b , len) == 0))) {
4460: 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d .. if (len ==
4470: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 0) {...Tcl_DStr
4480: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ingAppendElement
4490: 28 64 73 50 74 72 2c 20 22 2d 63 69 70 68 65 72 (dsPtr, "-cipher
44a0: 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ");.. }..
44b0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e Tcl_DStringAppen
44c0: 64 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 dElement(dsPtr,
44d0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 SSL_get_cipher(s
44e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a tatePtr->ssl));.
44f0: 09 20 20 20 20 69 66 20 28 6c 65 6e 29 20 7b 0a . if (len) {.
4500: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b ..return TCL_OK;
4510: 0a 09 20 20 20 20 7d 0a 09 7d 0a 23 65 6e 64 69 .. }..}.#endi
4520: 66 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b f..return TCL_OK
4530: 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 ;. }.}.../*.
4540: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4580: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 61 ----. *. * TlsWa
4590: 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a tchProc --. *. *
45a0: 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 .Initialize the
45b0: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 notifier to watc
45c0: 68 20 54 63 6c 5f 46 69 6c 65 73 20 66 72 6f 6d h Tcl_Files from
45d0: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 this channel..
45e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
45f0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 .None.. *. * Sid
4600: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 e effects:. *.Se
4610: 74 73 20 75 70 20 74 68 65 20 6e 6f 74 69 66 69 ts up the notifi
4620: 65 72 20 73 6f 20 74 68 61 74 20 61 20 66 75 74 er so that a fut
4630: 75 72 65 20 65 76 65 6e 74 20 6f 6e 20 74 68 65 ure event on the
4640: 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 77 69 6c 6c channel. *.will
4650: 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c 2e be seen by Tcl.
4660: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
46b0: 74 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 57 61 tatic void.TlsWa
46c0: 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 tchProc(ClientDa
46d0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c ta instanceData,
46e0: 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 73 ./* The socket s
46f0: 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 tate. */.
4700: 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 int mask).
4710: 09 09 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 ../* Events of i
4720: 6e 74 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 nterest; an OR-e
4730: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d.
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4750: 20 20 20 20 20 20 20 20 20 20 20 2a 20 63 6f 6d * com
4760: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f bination of TCL_
4770: 52 45 41 44 41 42 4c 45 2c 0a 20 20 20 20 20 20 READABLE,.
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
47a0: 20 20 20 2a 20 54 43 4c 5f 57 52 49 54 41 42 4c * TCL_WRITABL
47b0: 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 E and TCL_EXCEPT
47c0: 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 ION. */.{. St
47d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
47e0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
47f0: 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ceData;.. dpr
4800: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54 6c intf(stderr, "Tl
4810: 73 57 61 74 63 68 50 72 6f 63 28 30 78 25 78 29 sWatchProc(0x%x)
4820: 5c 6e 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 \n", mask);..
4830: 20 2f 2a 20 50 72 65 74 65 6e 64 20 74 6f 20 62 /* Pretend to b
4840: 65 20 64 65 61 64 20 61 73 20 6c 6f 6e 67 20 61 e dead as long a
4850: 73 20 74 68 65 20 76 65 72 69 66 79 20 63 61 6c s the verify cal
4860: 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 lback is running
4870: 2e 20 0a 20 20 20 20 20 2a 20 4f 74 68 65 72 77 . . * Otherw
4880: 69 73 65 20 74 68 61 74 20 63 61 6c 6c 62 61 63 ise that callbac
4890: 6b 20 63 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b k could be invok
48a0: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 ed recursively.
48b0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
48c0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
48d0: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b _TCL_CALLBACK) {
48e0: 20 72 65 74 75 72 6e 3b 20 7d 0a 0a 20 20 20 20 return; }..
48f0: 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 if (channelTypeV
4900: 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 ersion == TLS_CH
4910: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 ANNEL_VERSION_2)
4920: 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 {..Tcl_Channel
4930: 20 20 20 20 64 6f 77 6e 43 68 61 6e 3b 0a 0a 09 downChan;...
4940: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d statePtr->watchM
4950: 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 09 2f 2a ask = mask;.../*
4960: 20 4e 6f 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 No channel hand
4970: 6c 65 72 73 20 61 6e 79 20 6d 6f 72 65 2e 20 57 lers any more. W
4980: 65 20 77 69 6c 6c 20 62 65 20 6e 6f 74 69 66 69 e will be notifi
4990: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 ed automatically
49a0: 0a 09 20 2a 20 61 62 6f 75 74 20 65 76 65 6e 74 .. * about event
49b0: 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c s on the channel
49c0: 20 62 65 6c 6f 77 20 76 69 61 20 61 20 63 61 6c below via a cal
49d0: 6c 20 74 6f 20 6f 75 72 0a 09 20 2a 20 27 54 72 l to our.. * 'Tr
49e0: 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 79 50 72 6f ansformNotifyPro
49f0: 63 27 2e 20 42 75 74 20 77 65 20 68 61 76 65 20 c'. But we have
4a00: 74 6f 20 70 61 73 73 20 74 68 65 20 69 6e 74 65 to pass the inte
4a10: 72 65 73 74 20 64 6f 77 6e 20 6e 6f 77 2e 0a 09 rest down now...
4a20: 20 2a 20 57 65 20 61 72 65 20 61 6c 6c 6f 77 65 * We are allowe
4a30: 64 20 74 6f 20 61 64 64 20 61 64 64 69 74 69 6f d to add additio
4a40: 6e 61 6c 20 27 69 6e 74 65 72 65 73 74 27 20 74 nal 'interest' t
4a50: 6f 20 74 68 65 20 6d 61 73 6b 20 69 66 20 77 65 o the mask if we
4a60: 20 77 61 6e 74 0a 09 20 2a 20 74 6f 2e 20 42 75 want.. * to. Bu
4a70: 74 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72 6d t this transform
4a80: 61 74 69 6f 6e 20 68 61 73 20 6e 6f 20 73 75 63 ation has no suc
4a90: 68 20 69 6e 74 65 72 65 73 74 2e 20 49 74 20 6a h interest. It j
4aa0: 75 73 74 20 70 61 73 73 65 73 0a 09 20 2a 20 74 ust passes.. * t
4ab0: 68 65 20 72 65 71 75 65 73 74 20 64 6f 77 6e 2c he request down,
4ac0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 09 20 2a 2f unchanged... */
4ad0: 0a 0a 09 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c ...downChan = Tl
4ae0: 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 s_GetParent(stat
4af0: 65 50 74 72 29 3b 0a 0a 09 28 54 63 6c 5f 47 65 ePtr);...(Tcl_Ge
4b00: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 tChannelType(dow
4b10: 6e 43 68 61 6e 29 29 0a 09 20 20 20 20 2d 3e 77 nChan)).. ->w
4b20: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 atchProc(Tcl_Get
4b30: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
4b40: 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 6d ata(downChan), m
4b50: 61 73 6b 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4d ask);.../*.. * M
4b60: 61 6e 61 67 65 6d 65 6e 74 20 6f 66 20 74 68 65 anagement of the
4b70: 20 69 6e 74 65 72 6e 61 6c 20 74 69 6d 65 72 2e internal timer.
4b80: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 73 74 61 74 .. */...if (stat
4b90: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
4ba0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
4bb0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
4bc0: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
4bd0: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
4be0: 6d 65 72 29 3b 0a 09 20 20 20 20 73 74 61 74 65 mer);.. state
4bf0: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 Ptr->timer = (Tc
4c00: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
4c10: 4c 4c 3b 0a 09 7d 0a 09 69 66 20 28 28 6d 61 73 LL;..}..if ((mas
4c20: 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 k & TCL_READABLE
4c30: 29 20 26 26 20 54 63 6c 5f 49 6e 70 75 74 42 75 ) && Tcl_InputBu
4c40: 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d ffered(statePtr-
4c50: 3e 73 65 6c 66 29 20 3e 20 30 29 20 7b 0a 09 20 >self) > 0) {..
4c60: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 /*.. * Th
4c70: 65 72 65 20 69 73 20 69 6e 74 65 72 65 73 74 20 ere is interest
4c80: 69 6e 20 72 65 61 64 61 62 6c 65 20 65 76 65 6e in readable even
4c90: 74 73 20 61 6e 64 20 77 65 20 61 63 74 75 61 6c ts and we actual
4ca0: 6c 79 20 68 61 76 65 0a 09 20 20 20 20 20 2a 20 ly have.. *
4cb0: 64 61 74 61 20 77 61 69 74 69 6e 67 2c 20 73 6f data waiting, so
4cc0: 20 67 65 6e 65 72 61 74 65 20 61 20 74 69 6d 65 generate a time
4cd0: 72 20 74 6f 20 66 6c 75 73 68 20 74 68 61 74 2e r to flush that.
4ce0: 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 73 .. */.. s
4cf0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
4d00: 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 Tcl_CreateTimer
4d10: 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f Handler(TLS_TCL_
4d20: 44 45 4c 41 59 2c 0a 09 09 20 20 20 20 54 6c 73 DELAY,... Tls
4d30: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 ChannelHandlerTi
4d40: 6d 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 mer, (ClientData
4d50: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a ) statePtr);..}.
4d60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
4d70: 20 28 6d 61 73 6b 20 3d 3d 20 73 74 61 74 65 50 (mask == stateP
4d80: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29 0a 09 tr->watchMask)..
4d90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 09 69 66 return;...if
4da0: 20 28 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 (statePtr->watc
4db0: 68 4d 61 73 6b 29 20 7b 0a 09 20 20 20 20 2f 2a hMask) {.. /*
4dc0: 0a 09 20 20 20 20 20 2a 20 52 65 6d 6f 76 65 20 .. * Remove
4dd0: 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 20 74 6f event handler to
4de0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e underlying chan
4df0: 6e 65 6c 2c 20 74 68 69 73 20 63 6f 75 6c 64 0a nel, this could.
4e00: 09 20 20 20 20 20 2a 20 62 65 20 62 65 63 61 75 . * be becau
4e10: 73 65 20 77 65 20 61 72 65 20 63 6c 6f 73 69 6e se we are closin
4e20: 67 20 66 6f 72 20 72 65 61 6c 2c 20 6f 72 20 62 g for real, or b
4e30: 65 69 6e 67 20 22 75 6e 73 74 61 63 6b 65 64 22 eing "unstacked"
4e40: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 ... */...
4e50: 20 54 63 6c 5f 44 65 6c 65 74 65 43 68 61 6e 6e Tcl_DeleteChann
4e60: 65 6c 48 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 elHandler(Tls_Ge
4e70: 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 tParent(statePtr
4e80: 29 2c 0a 09 09 20 20 20 20 54 6c 73 43 68 61 6e ),... TlsChan
4e90: 6e 65 6c 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 nelHandler, (Cli
4ea0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
4eb0: 72 29 3b 0a 09 7d 0a 09 73 74 61 74 65 50 74 72 r);..}..statePtr
4ec0: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 ->watchMask = ma
4ed0: 73 6b 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 sk;..if (statePt
4ee0: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29 20 7b 0a r->watchMask) {.
4ef0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
4f00: 53 65 74 75 70 20 61 63 74 69 76 65 20 6d 6f 6e Setup active mon
4f10: 69 74 6f 72 20 66 6f 72 20 65 76 65 6e 74 73 20 itor for events
4f20: 6f 6e 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 68 on underlying Ch
4f30: 61 6e 6e 65 6c 2e 0a 09 20 20 20 20 20 2a 2f 0a annel... */.
4f40: 0a 09 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
4f50: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 ChannelHandler(T
4f60: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 ls_GetParent(sta
4f70: 74 65 50 74 72 29 2c 0a 09 09 20 20 20 20 73 74 tePtr),... st
4f80: 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 atePtr->watchMas
4f90: 6b 2c 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e k, TlsChannelHan
4fa0: 64 6c 65 72 2c 0a 09 09 20 20 20 20 28 43 6c 69 dler,... (Cli
4fb0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
4fc0: 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0c r);..}. }.}..
4fd0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
4fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
5020: 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 TlsGetHandleProc
5030: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
5040: 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 from Tcl_GetCha
5050: 6e 6e 65 6c 46 69 6c 65 20 74 6f 20 72 65 74 72 nnelFile to retr
5060: 69 65 76 65 20 6f 2f 73 20 66 69 6c 65 20 68 61 ieve o/s file ha
5070: 6e 64 6c 65 72 0a 20 2a 09 66 72 6f 6d 20 74 68 ndler. *.from th
5080: 65 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 e SSL socket bas
5090: 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 ed channel.. *.
50a0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 * Results:. *.Th
50b0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 54 63 e appropriate Tc
50c0: 6c 5f 46 69 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 l_File or NULL i
50d0: 66 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 0a f not present. .
50e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
50f0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
5100: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5140: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
5150: 20 69 6e 74 0a 54 6c 73 47 65 74 48 61 6e 64 6c int.TlsGetHandl
5160: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 eProc(ClientData
5170: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f instanceData,./
5180: 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 * The socket sta
5190: 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 te. */.
51a0: 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 72 65 int dire
51b0: 63 74 69 6f 6e 2c 09 09 2f 2a 20 57 68 69 63 68 ction,../* Which
51c0: 20 54 63 6c 5f 46 69 6c 65 20 74 6f 20 72 65 74 Tcl_File to ret
51d0: 72 69 65 76 65 3f 20 2a 2f 0a 20 20 20 20 20 20 rieve? */.
51e0: 20 20 20 20 20 20 20 20 20 20 20 43 6c 69 65 6e Clien
51f0: 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 tData *handlePtr
5200: 29 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 )./* Where to st
5210: 6f 72 65 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 ore the handle.
5220: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 */.{. State
5230: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5240: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 te *) instanceDa
5250: 74 61 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 ta;.. return
5260: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 Tcl_GetChannelHa
5270: 6e 64 6c 65 28 54 6c 73 5f 47 65 74 50 61 72 65 ndle(Tls_GetPare
5280: 6e 74 28 73 74 61 74 65 50 74 72 29 2c 20 64 69 nt(statePtr), di
5290: 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 rection, handleP
52a0: 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d tr);.}.../*. *--
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52f0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 -. *. * TlsNotif
5300: 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 48 yProc --. *. *.H
5310: 61 6e 64 6c 65 72 20 63 61 6c 6c 65 64 20 62 79 andler called by
5320: 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 Tcl to inform u
5330: 73 20 6f 66 20 61 63 74 69 76 69 74 79 0a 20 2a s of activity. *
5340: 09 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 .on the underlyi
5350: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 ng channel.. *.
5360: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
5370: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ne.. *. * Side e
5380: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 70 ffects:. *.May p
5390: 72 6f 63 65 73 73 20 74 68 65 20 69 6e 63 6f 6d rocess the incom
53a0: 69 6e 67 20 65 76 65 6e 74 20 62 79 20 69 74 73 ing event by its
53b0: 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d elf.. *. *------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5400: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c /..static int.Tl
5410: 73 4e 6f 74 69 66 79 50 72 6f 63 28 69 6e 73 74 sNotifyProc(inst
5420: 61 6e 63 65 44 61 74 61 2c 20 6d 61 73 6b 29 0a anceData, mask).
5430: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 09 20 ClientData.
5440: 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 20 instanceData;
5450: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 /* The state of
5460: 74 68 65 20 6e 6f 74 69 66 69 65 64 20 74 72 61 the notified tra
5470: 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 nsformation */.
5480: 20 20 20 69 6e 74 09 09 20 20 20 6d 61 73 6b 3b int.. mask;
5490: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 /* The ma
54a0: 73 6b 20 6f 66 20 6f 63 63 75 72 69 6e 67 20 65 sk of occuring e
54b0: 76 65 6e 74 73 20 2a 2f 0a 7b 0a 20 20 20 20 53 vents */.{. S
54c0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
54d0: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
54e0: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a nceData;.. /*
54f0: 0a 20 20 20 20 20 2a 20 41 6e 20 65 76 65 6e 74 . * An event
5500: 20 6f 63 63 75 72 65 64 20 69 6e 20 74 68 65 20 occured in the
5510: 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e underlying chann
5520: 65 6c 2e 20 20 54 68 69 73 0a 20 20 20 20 20 2a el. This. *
5530: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 transformation
5540: 64 6f 65 73 6e 27 74 20 70 72 6f 63 65 73 73 20 doesn't process
5550: 73 75 63 68 20 65 76 65 6e 74 73 20 74 68 75 73 such events thus
5560: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 20 20 20 returns the.
5570: 20 20 2a 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 * incoming mas
5580: 6b 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 k unchanged..
5590: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 74 */.. if (st
55a0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d atePtr->timer !=
55b0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
55c0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 ) NULL) {../*..
55d0: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 78 69 73 * Delete an exis
55e0: 74 69 6e 67 20 74 69 6d 65 72 2e 20 49 74 20 77 ting timer. It w
55f0: 61 73 20 6e 6f 74 20 66 69 72 65 64 2c 20 79 65 as not fired, ye
5600: 74 20 77 65 20 61 72 65 0a 09 20 2a 20 68 65 72 t we are.. * her
5610: 65 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 6e 65 e, so the channe
5620: 6c 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 l below generate
5630: 64 20 73 75 63 68 20 61 6e 20 65 76 65 6e 74 20 d such an event
5640: 61 6e 64 20 77 65 0a 09 20 2a 20 64 6f 6e 27 74 and we.. * don't
5650: 20 68 61 76 65 20 74 6f 2e 20 54 68 65 20 72 65 have to. The re
5660: 6e 65 77 61 6c 20 6f 66 20 74 68 65 20 69 6e 74 newal of the int
5670: 65 72 65 73 74 20 61 66 74 65 72 20 74 68 65 0a erest after the.
5680: 09 20 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 . * execution of
5690: 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 channel handler
56a0: 73 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c s will eventuall
56b0: 79 20 63 61 75 73 65 20 75 73 20 74 6f 0a 09 20 y cause us to..
56c0: 2a 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74 * recreate the t
56d0: 69 6d 65 72 20 28 69 6e 20 57 61 74 63 68 50 72 imer (in WatchPr
56e0: 6f 63 29 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f oc)... */...Tcl_
56f0: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c DeleteTimerHandl
5700: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d er(statePtr->tim
5710: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e er);..statePtr->
5720: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d timer = (Tcl_Tim
5730: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 erToken) NULL;.
5740: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
5750: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
5760: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b TLS_TCL_CALLBACK
5770: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 ) {..return 0;.
5780: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
5790: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
57a0: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 0a 09 20 20 TLS_TCL_INIT..
57b0: 20 20 26 26 20 21 53 53 4c 5f 69 73 5f 69 6e 69 && !SSL_is_ini
57c0: 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74 65 t_finished(state
57d0: 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 69 6e Ptr->ssl)) {..in
57e0: 74 20 65 72 72 6f 72 43 6f 64 65 3b 0a 09 69 66 t errorCode;..if
57f0: 20 28 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e (Tls_WaitForCon
5800: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 nect(statePtr, &
5810: 65 72 72 6f 72 43 6f 64 65 29 20 3c 3d 20 30 0a errorCode) <= 0.
5820: 09 09 26 26 20 65 72 72 6f 72 43 6f 64 65 20 3d ..&& errorCode =
5830: 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 20 20 20 = EAGAIN) {..
5840: 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 return 0;..}.
5850: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 }.. return
5860: 6d 61 73 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d mask;.}.../*. *-
5870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58a0: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 -----*. *. *
58b0: 20 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 TlsChannelHand
58c0: 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 ler --. *. *
58d0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5900: 2d 2d 2a 0a 20 2a 20 20 20 20 20 20 48 61 6e 64 --*. * Hand
5910: 6c 65 72 20 63 61 6c 6c 65 64 20 62 79 20 54 63 ler called by Tc
5920: 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
5930: 0a 20 2a 20 20 20 20 20 20 54 63 6c 5f 43 72 65 . * Tcl_Cre
5940: 61 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 ateChannelHandle
5950: 72 20 2d 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 r - to inform us
5960: 20 6f 66 20 61 63 74 69 76 69 74 79 0a 20 2a 20 of activity. *
5970: 20 20 20 20 20 6f 6e 20 74 68 65 20 75 6e 64 65 on the unde
5980: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a rlying channel..
5990: 20 2a 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d * --------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 --------*. *. *
59d0: 20 20 20 20 20 53 69 64 65 65 66 66 65 63 74 73 Sideeffects
59e0: 3a 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 :. *
59f0: 20 20 4d 61 79 20 67 65 6e 65 72 61 74 65 20 73 May generate s
5a00: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 ubsequent calls
5a10: 74 6f 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 to. *
5a20: 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 Tcl_NotifyCha
5a30: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 nnel.. *. *
5a40: 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 Result:. *
5a50: 20 20 20 20 20 20 20 20 20 4e 6f 6e 65 2e 0a 20 None..
5a60: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
5aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 .static void.Tls
5ab0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 28 ChannelHandler (
5ac0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 6d 61 73 6b clientData, mask
5ad0: 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 ). ClientData
5ae0: 20 20 20 20 20 63 6c 69 65 6e 74 44 61 74 61 3b clientData;
5af0: 0a 20 20 20 20 69 6e 74 20 20 20 20 20 20 20 20 . int
5b00: 20 20 20 20 6d 61 73 6b 3b 0a 7b 0a 20 20 20 20 mask;.{.
5b10: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
5b20: 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6c 69 65 = (State *) clie
5b30: 6e 74 44 61 74 61 3b 0a 0a 64 70 72 69 6e 74 66 ntData;..dprintf
5b40: 28 73 74 64 65 72 72 2c 20 22 48 41 4e 44 4c 45 (stderr, "HANDLE
5b50: 52 28 30 78 25 78 29 5c 6e 22 2c 20 6d 61 73 6b R(0x%x)\n", mask
5b60: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
5b70: 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 rve( (ClientData
5b80: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 )statePtr);..
5b90: 20 69 66 20 28 6d 61 73 6b 20 26 20 54 43 4c 5f if (mask & TCL_
5ba0: 52 45 41 44 41 42 4c 45 29 20 7b 0a 09 42 49 4f READABLE) {..BIO
5bb0: 5f 73 65 74 5f 66 6c 61 67 73 28 73 74 61 74 65 _set_flags(state
5bc0: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f Ptr->p_bio, BIO_
5bd0: 46 4c 41 47 53 5f 52 45 41 44 29 3b 0a 20 20 20 FLAGS_READ);.
5be0: 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f 63 } else {..BIO_c
5bf0: 6c 65 61 72 5f 66 6c 61 67 73 28 73 74 61 74 65 lear_flags(state
5c00: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f Ptr->p_bio, BIO_
5c10: 46 4c 41 47 53 5f 52 45 41 44 29 3b 0a 20 20 20 FLAGS_READ);.
5c20: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 61 73 6b }.. if (mask
5c30: 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 & TCL_WRITABLE)
5c40: 20 7b 0a 09 42 49 4f 5f 73 65 74 5f 66 6c 61 67 {..BIO_set_flag
5c50: 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 s(statePtr->p_bi
5c60: 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 57 52 49 o, BIO_FLAGS_WRI
5c70: 54 45 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 TE);. } else
5c80: 7b 0a 09 42 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 {..BIO_clear_fla
5c90: 67 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 gs(statePtr->p_b
5ca0: 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 57 52 io, BIO_FLAGS_WR
5cb0: 49 54 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ITE);. }..
5cc0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 69 mask = 0;. i
5cd0: 66 20 28 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 f (BIO_wpending(
5ce0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 statePtr->bio))
5cf0: 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 {..mask |= TCL_W
5d00: 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 20 RITABLE;. }.
5d10: 20 20 20 69 66 20 28 42 49 4f 5f 70 65 6e 64 69 if (BIO_pendi
5d20: 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ng(statePtr->bio
5d30: 29 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 )) {..mask |= TC
5d40: 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20 20 20 L_READABLE;.
5d50: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
5d60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4e The following N
5d70: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 20 63 61 6c otifyChannel cal
5d80: 6c 73 20 73 65 65 6d 73 20 74 6f 20 62 65 20 69 ls seems to be i
5d90: 6d 70 6f 72 74 61 6e 74 2c 20 62 75 74 0a 20 20 mportant, but.
5da0: 20 20 20 2a 20 77 65 20 64 6f 6e 27 74 20 6b 6e * we don't kn
5db0: 6f 77 20 77 68 79 2e 20 20 49 74 20 6c 6f 6f 6b ow why. It look
5dc0: 73 20 6c 69 6b 65 20 69 66 20 74 68 65 20 6d 61 s like if the ma
5dd0: 73 6b 20 69 73 20 65 76 65 72 20 6e 6f 6e 2d 7a sk is ever non-z
5de0: 65 72 6f 0a 20 20 20 20 20 2a 20 74 68 61 74 20 ero. * that
5df0: 69 74 20 77 69 6c 6c 20 65 6e 74 65 72 20 61 6e it will enter an
5e00: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 2e 0a infinite loop..
5e10: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 4e 6f *. * No
5e20: 74 69 66 79 20 74 68 65 20 75 70 70 65 72 20 63 tify the upper c
5e30: 68 61 6e 6e 65 6c 20 6f 66 20 74 68 65 20 63 75 hannel of the cu
5e40: 72 72 65 6e 74 20 42 49 4f 20 73 74 61 74 65 20 rrent BIO state
5e50: 73 6f 20 74 68 65 20 65 76 65 6e 74 0a 20 20 20 so the event.
5e60: 20 20 2a 20 63 6f 6e 74 69 6e 75 65 73 20 74 6f * continues to
5e70: 20 70 72 6f 70 61 67 61 74 65 20 75 70 20 74 68 propagate up th
5e80: 65 20 63 68 61 69 6e 2e 0a 20 20 20 20 20 2a 0a e chain.. *.
5e90: 20 20 20 20 20 2a 20 73 74 61 6e 74 6f 6e 3a 20 * stanton:
5ea0: 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 It looks like th
5eb0: 69 73 20 63 6f 75 6c 64 20 72 65 73 75 6c 74 20 is could result
5ec0: 69 6e 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c in an infinite l
5ed0: 6f 6f 70 20 69 66 0a 20 20 20 20 20 2a 20 74 68 oop if. * th
5ee0: 65 20 75 70 70 65 72 20 63 68 61 6e 6e 65 6c 20 e upper channel
5ef0: 64 6f 65 73 6e 27 74 20 63 61 75 73 65 20 43 68 doesn't cause Ch
5f00: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 74 6f 20 annelHandler to
5f10: 62 65 20 72 65 6d 6f 76 65 64 0a 20 20 20 20 20 be removed.
5f20: 2a 20 62 65 66 6f 72 65 20 54 63 6c 5f 4e 6f 74 * before Tcl_Not
5f30: 69 66 79 43 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 ifyChannel calls
5f40: 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 channel handler
5f50: 73 20 6f 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 s on the lower c
5f60: 68 61 6e 6e 65 6c 2e 0a 20 20 20 20 20 2a 2f 0a hannel.. */.
5f70: 20 20 20 20 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 . Tcl_Not
5f80: 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 ifyChannel(state
5f90: 50 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 Ptr->self, mask)
5fa0: 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 73 ;. . if (s
5fb0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 tatePtr->timer !
5fc0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
5fd0: 6e 29 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 n)NULL) {..Tcl_D
5fe0: 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 eleteTimerHandle
5ff0: 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 r(statePtr->time
6000: 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 r);..statePtr->t
6010: 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 imer = (Tcl_Time
6020: 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b 0a 20 20 20 rToken)NULL;.
6030: 20 7d 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b }. if ((mask
6040: 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 & TCL_READABLE)
6050: 20 26 26 20 54 63 6c 5f 49 6e 70 75 74 42 75 66 && Tcl_InputBuf
6060: 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e fered(statePtr->
6070: 73 65 6c 66 29 20 3e 20 30 29 20 7b 0a 09 2f 2a self) > 0) {../*
6080: 0a 09 20 2a 20 44 61 74 61 20 69 73 20 77 61 69 .. * Data is wai
6090: 74 69 6e 67 2c 20 66 6c 75 73 68 20 69 74 20 6f ting, flush it o
60a0: 75 74 20 69 6e 20 73 68 6f 72 74 20 74 69 6d 65 ut in short time
60b0: 0a 09 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d .. */..statePtr-
60c0: 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 >timer = Tcl_Cre
60d0: 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 ateTimerHandler(
60e0: 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c 0a 09 TLS_TCL_DELAY,..
60f0: 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c .TlsChannelHandl
6100: 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 65 6e 74 erTimer, (Client
6110: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
6120: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 . }. Tcl_R
6130: 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 elease( (ClientD
6140: 61 74 61 29 73 74 61 74 65 50 74 72 29 3b 0a 7d ata)statePtr);.}
6150: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
6190: 20 2a 0a 20 2a 09 54 6c 73 43 68 61 6e 6e 65 6c *. *.TlsChannel
61a0: 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 2d 2d 0a HandlerTimer --.
61b0: 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
61c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61e0: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 43 61 6c 6c 65 ------*. *.Calle
61f0: 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 d by the notifie
6200: 72 20 28 2d 3e 20 74 69 6d 65 72 29 20 74 6f 20 r (-> timer) to
6210: 66 6c 75 73 68 20 6f 75 74 0a 20 2a 09 69 6e 66 flush out. *.inf
6220: 6f 72 6d 61 74 69 6f 6e 20 77 61 69 74 69 6e 67 ormation waiting
6230: 20 69 6e 20 63 68 61 6e 6e 65 6c 20 62 75 66 66 in channel buff
6240: 65 72 73 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d ers.. *.--------
6250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6270: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
6280: 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 09 Sideeffects:. *.
6290: 09 41 73 20 6f 66 20 27 54 6c 73 43 68 61 6e 6e .As of 'TlsChann
62a0: 65 6c 48 61 6e 64 6c 65 72 27 2e 0a 20 2a 0a 20 elHandler'.. *.
62b0: 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f *.Result:. *..No
62c0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
62d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
6300: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 . */..static voi
6310: 64 0a 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 d.TlsChannelHand
6320: 6c 65 72 54 69 6d 65 72 20 28 63 6c 69 65 6e 74 lerTimer (client
6330: 44 61 74 61 29 0a 43 6c 69 65 6e 74 44 61 74 61 Data).ClientData
6340: 20 63 6c 69 65 6e 74 44 61 74 61 3b 20 2f 2a 20 clientData; /*
6350: 54 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 74 Transformation t
6360: 6f 20 71 75 65 72 79 20 2a 2f 0a 7b 0a 20 20 20 o query */.{.
6370: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
6380: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6c 69 = (State *) cli
6390: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 entData;. int
63a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 mask = 0;..
63b0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
63c0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
63d0: 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 n) NULL;.. if
63e0: 20 28 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 (BIO_wpending(s
63f0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
6400: 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 ..mask |= TCL_WR
6410: 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 ITABLE;. }.
6420: 20 20 69 66 20 28 42 49 4f 5f 70 65 6e 64 69 6e if (BIO_pendin
6430: 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 g(statePtr->bio)
6440: 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c ) {..mask |= TCL
6450: 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20 20 20 7d _READABLE;. }
6460: 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 . Tcl_NotifyC
6470: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d hannel(statePtr-
6480: 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 7d 0a >self, mask);.}.
6490: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
64d0: 2a 0a 20 2a 09 54 6c 73 5f 57 61 69 74 46 6f 72 *. *.Tls_WaitFor
64e0: 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a 20 2a Connect --. *. *
64f0: 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a .Sideeffects:. *
6500: 09 09 49 73 73 75 65 73 20 53 53 4c 5f 61 63 63 ..Issues SSL_acc
6510: 65 70 74 20 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 ept or SSL_conne
6520: 63 74 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a ct. *. *.Result:
6530: 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a . *..None.. *. *
6540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6570: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 69 6e 74 0a ------*. */.int.
6580: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
6590: 63 74 28 20 73 74 61 74 65 50 74 72 2c 20 65 72 ct( statePtr, er
65a0: 72 6f 72 43 6f 64 65 50 74 72 29 0a 20 20 20 20 rorCodePtr).
65b0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
65c0: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 . int *errorC
65d0: 6f 64 65 50 74 72 3b 09 09 2f 2a 20 57 68 65 72 odePtr;../* Wher
65e0: 65 20 74 6f 20 73 74 6f 72 65 20 65 72 72 6f 72 e to store error
65f0: 20 63 6f 64 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 code. */.{.
6600: 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 20 64 70 int err;.. dp
6610: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e rintf(stderr,"\n
6620: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 30 WaitForConnect(0
6630: 78 25 78 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 x%x)", (unsigned
6640: 20 69 6e 74 29 20 73 74 61 74 65 50 74 72 29 3b int) statePtr);
6650: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
6660: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
6670: 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 TCL_HANDSHAKE_FA
6680: 49 4c 45 44 29 20 7b 0a 20 20 20 20 20 20 20 20 ILED) {.
6690: 2f 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 57 65 /*. * We
66a0: 20 63 68 6f 6f 73 65 20 45 43 4f 4e 4e 52 45 53 choose ECONNRES
66b0: 45 54 20 6f 76 65 72 20 45 43 4f 4e 4e 41 42 4f ET over ECONNABO
66c0: 52 54 45 44 20 68 65 72 65 20 62 65 63 61 75 73 RTED here becaus
66d0: 65 20 73 6f 6d 65 20 73 65 72 76 65 72 0a 20 20 e some server.
66e0: 20 20 20 20 20 20 20 2a 20 73 69 64 65 20 63 6f * side co
66f0: 64 65 2c 20 6f 6e 20 74 68 65 20 77 69 6b 69 20 de, on the wiki
6700: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 65 74 for example, set
6710: 73 20 75 70 20 61 20 72 65 61 64 20 68 61 6e 64 s up a read hand
6720: 6c 65 72 20 74 68 61 74 0a 20 20 20 20 20 20 20 ler that.
6730: 20 20 2a 20 64 6f 65 73 20 61 20 72 65 61 64 20 * does a read
6740: 61 6e 64 20 69 66 20 65 6f 66 20 63 6c 6f 73 65 and if eof close
6750: 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 54 s the channel. T
6760: 68 65 72 65 20 69 73 20 6e 6f 20 63 61 74 63 68 here is no catch
6770: 2f 74 72 79 0a 20 20 20 20 20 20 20 20 20 2a 20 /try. *
6780: 61 72 6f 75 6e 64 20 74 68 65 20 72 65 61 64 73 around the reads
6790: 20 73 6f 20 65 78 63 65 70 74 69 6f 6e 73 20 77 so exceptions w
67a0: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 70 6f ill result in po
67b0: 74 65 6e 74 69 61 6c 6c 79 20 6d 61 6e 79 0a 20 tentially many.
67c0: 20 20 20 20 20 20 20 20 2a 20 64 61 6e 67 6c 69 * dangli
67d0: 6e 67 20 63 68 61 6e 6e 65 6c 73 20 68 61 6e 67 ng channels hang
67e0: 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 ing around that
67f0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e should have been
6800: 20 63 6c 6f 73 65 64 2e 0a 20 20 20 20 20 20 20 closed..
6810: 20 20 2a 20 28 42 61 63 6b 67 72 6f 75 6e 3a 20 * (Backgroun:
6820: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 20 6d 61 70 ECONNABORTED map
6830: 73 20 74 6f 20 61 20 54 63 6c 20 65 78 63 65 70 s to a Tcl excep
6840: 74 69 6f 6e 20 61 6e 64 20 0a 20 20 20 20 20 20 tion and .
6850: 20 20 20 2a 20 45 43 4f 4e 4e 52 45 53 45 54 20 * ECONNRESET
6860: 6d 61 70 73 20 74 6f 20 67 72 61 63 65 66 75 6c maps to graceful
6870: 20 45 4f 46 29 2e 0a 20 20 20 20 20 20 20 20 20 EOF)..
6880: 2a 2f 0a 20 20 20 20 20 20 20 20 2a 65 72 72 6f */. *erro
6890: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
68a0: 52 45 53 45 54 3b 0a 20 20 20 20 20 20 20 20 72 RESET;. r
68b0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a eturn -1;. }.
68c0: 0a 20 20 20 20 66 6f 72 20 28 3b 3b 29 20 7b 0a . for (;;) {.
68d0: 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 ./* Not initiali
68e0: 7a 65 64 20 79 65 74 21 20 2a 2f 0a 09 69 66 20 zed yet! */..if
68f0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
6900: 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 & TLS_TCL_SERVE
6910: 52 29 20 7b 0a 09 20 20 20 20 65 72 72 20 3d 20 R) {.. err =
6920: 53 53 4c 5f 61 63 63 65 70 74 28 73 74 61 74 65 SSL_accept(state
6930: 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 20 65 6c Ptr->ssl);..} el
6940: 73 65 20 7b 0a 09 20 20 20 20 65 72 72 20 3d 20 se {.. err =
6950: 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 73 74 61 74 SSL_connect(stat
6960: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 09 ePtr->ssl);..}..
6970: 2f 2a 53 53 4c 5f 77 72 69 74 65 28 73 74 61 74 /*SSL_write(stat
6980: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 63 68 61 72 ePtr->ssl, (char
6990: 2a 29 26 65 72 72 2c 20 30 29 3b 09 48 41 43 4b *)&err, 0);.HACK
69a0: 21 21 21 20 2a 2f 0a 09 69 66 20 28 65 72 72 20 !!! */..if (err
69b0: 3e 20 30 29 20 7b 0a 09 20 20 20 20 42 49 4f 5f > 0) {.. BIO_
69c0: 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e flush(statePtr->
69d0: 62 69 6f 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 65 bio);..}...if (e
69e0: 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 rr <= 0) {..
69f0: 69 6e 74 20 72 63 20 3d 20 53 53 4c 5f 67 65 74 int rc = SSL_get
6a00: 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d _error(statePtr-
6a10: 3e 73 73 6c 2c 20 65 72 72 29 3b 0a 0a 09 20 20 >ssl, err);...
6a20: 20 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f if (rc == SSL_
6a30: 45 52 52 4f 52 5f 53 53 4c 29 20 7b 0a 09 09 54 ERROR_SSL) {...T
6a40: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
6a50: 72 2c 0a 09 09 09 28 63 68 61 72 20 2a 29 45 52 r,....(char *)ER
6a60: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 R_reason_error_s
6a70: 74 72 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 tring(ERR_get_er
6a80: 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 20 20 20 ror()));.
6a90: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 50 74 statePt
6aa0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
6ab0: 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 TCL_HANDSHAKE_FA
6ac0: 49 4c 45 44 3b 0a 09 09 2a 65 72 72 6f 72 43 6f ILED;...*errorCo
6ad0: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f dePtr = ECONNABO
6ae0: 52 54 45 44 3b 0a 09 09 72 65 74 75 72 6e 20 2d RTED;...return -
6af0: 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 1;.. } else i
6b00: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 f (BIO_should_re
6b10: 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 try(statePtr->bi
6b20: 6f 29 29 20 7b 0a 09 09 69 66 20 28 73 74 61 74 o)) {...if (stat
6b30: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c ePtr->flags & TL
6b40: 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 S_TCL_ASYNC) {..
6b50: 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
6b60: 65 72 72 2c 22 45 21 20 22 29 3b 0a 09 09 20 20 err,"E! ");...
6b70: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
6b80: 3d 20 45 41 47 41 49 4e 3b 0a 09 09 20 20 20 20 = EAGAIN;...
6b90: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 20 65 return -1;...} e
6ba0: 6c 73 65 20 7b 0a 09 09 20 20 20 20 63 6f 6e 74 lse {... cont
6bb0: 69 6e 75 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d inue;...}.. }
6bc0: 20 65 6c 73 65 20 69 66 20 28 65 72 72 20 3d 3d else if (err ==
6bd0: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 0) {.
6be0: 20 20 20 20 20 20 69 66 20 28 54 63 6c 5f 45 6f if (Tcl_Eo
6bf0: 66 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 f(statePtr->self
6c00: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 )) {.
6c10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
6c20: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 0;.
6c30: 20 20 20 7d 0a 09 09 64 70 72 69 6e 74 66 28 73 }...dprintf(s
6c40: 74 64 65 72 72 2c 22 43 52 21 20 22 29 3b 0a 09 tderr,"CR! ");..
6c50: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
6c60: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 72 ECONNRESET;...r
6c70: 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d eturn -1;.. }
6c80: 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
6c90: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
6ca0: 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 09 TCL_SERVER) {...
6cb0: 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 err = SSL_get_ve
6cc0: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
6cd0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 09 69 66 ePtr->ssl);...if
6ce0: 20 28 65 72 72 20 21 3d 20 58 35 30 39 5f 56 5f (err != X509_V_
6cf0: 4f 4b 29 20 7b 0a 09 09 20 20 20 20 54 6c 73 5f OK) {... Tls_
6d00: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 0a Error(statePtr,.
6d10: 09 09 09 20 20 20 20 28 63 68 61 72 20 2a 29 58 ... (char *)X
6d20: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
6d30: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 error_string(err
6d40: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ));.
6d50: 20 20 20 20 20 20 20 20 73 74 61 74 65 50 74 72 statePtr
6d60: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
6d70: 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 CL_HANDSHAKE_FAI
6d80: 4c 45 44 3b 0a 09 09 20 20 20 20 2a 65 72 72 6f LED;... *erro
6d90: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
6da0: 41 42 4f 52 54 45 44 3b 0a 09 09 20 20 20 20 72 ABORTED;... r
6db0: 65 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 0a 09 20 eturn -1;...}..
6dc0: 20 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 }.. *error
6dd0: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 CodePtr = Tcl_Ge
6de0: 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20 64 tErrno();.. d
6df0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 printf(stderr,"E
6e00: 52 52 28 25 64 2c 20 25 64 29 20 22 2c 20 72 63 RR(%d, %d) ", rc
6e10: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 , *errorCodePtr)
6e20: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 ;.. return -1
6e30: 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 73 74 ;..}..dprintf(st
6e40: 64 65 72 72 2c 22 52 30 21 20 22 29 3b 0a 09 72 derr,"R0! ");..r
6e50: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 7d eturn 1;. }.}
6e60: 0a 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 0a 54 6c ..Tcl_Channel.Tl
6e70: 73 5f 47 65 74 50 61 72 65 6e 74 28 20 73 74 61 s_GetParent( sta
6e80: 74 65 50 74 72 20 29 0a 20 20 20 20 53 74 61 74 tePtr ). Stat
6e90: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 7b 0a 20 e *statePtr;.{.
6ea0: 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 if (channelTy
6eb0: 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 peVersion == TLS
6ec0: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e _CHANNEL_VERSION
6ed0: 5f 32 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 63 _2) {..return Tc
6ee0: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e l_GetStackedChan
6ef0: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 nel(statePtr->se
6f00: 6c 66 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 lf);. } else
6f10: 7b 0a 09 2f 2a 20 54 68 65 20 72 65 61 73 6f 6e {../* The reason
6f20: 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 65 6e for the existen
6f30: 63 65 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 ce of this proce
6f40: 64 75 72 65 20 69 73 0a 09 20 2a 20 74 68 65 20 dure is.. * the
6f50: 66 61 63 74 20 74 68 61 74 20 73 74 61 63 6b 69 fact that stacki
6f60: 6e 67 20 61 20 74 72 61 6e 73 66 6f 72 6d 20 6f ng a transform o
6f70: 76 65 72 20 61 6e 6f 74 68 65 72 0a 09 20 2a 20 ver another.. *
6f80: 74 72 61 6e 73 66 6f 72 6d 20 77 69 6c 6c 20 6c transform will l
6f90: 65 61 76 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 eave our interna
6fa0: 6c 20 70 6f 69 6e 74 65 72 20 75 6e 63 68 61 6e l pointer unchan
6fb0: 67 65 64 2c 0a 09 20 2a 20 61 6e 64 20 74 68 75 ged,.. * and thu
6fc0: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 s pointing to th
6fd0: 65 20 6e 65 77 20 74 72 61 6e 73 66 6f 72 6d 2c e new transform,
6fe0: 20 61 6e 64 20 6e 6f 74 20 74 68 65 0a 09 20 2a and not the.. *
6ff0: 20 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 Channel structu
7000: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 re containing th
7010: 65 20 73 61 76 65 64 20 73 74 61 74 65 20 6f 66 e saved state of
7020: 20 74 68 69 73 0a 09 20 2a 20 74 72 61 6e 73 66 this.. * transf
7030: 6f 72 6d 2e 20 54 68 69 73 20 69 73 20 74 68 65 orm. This is the
7040: 20 70 72 69 63 65 20 74 6f 20 70 61 79 20 66 6f price to pay fo
7050: 72 20 6c 65 61 76 69 6e 67 0a 09 20 2a 20 54 63 r leaving.. * Tc
7060: 6c 5f 43 68 61 6e 6e 65 6c 20 72 65 66 65 72 65 l_Channel refere
7070: 6e 63 65 73 20 69 6e 74 61 63 74 2e 20 54 68 65 nces intact. The
7080: 20 6f 6e 6c 79 20 6f 74 68 65 72 20 73 6f 6c 75 only other solu
7090: 74 69 6f 6e 0a 09 20 2a 20 69 73 20 61 6e 20 65 tion.. * is an e
70a0: 78 74 65 6e 73 69 6f 6e 20 6f 66 20 54 63 6c 5f xtension of Tcl_
70b0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 77 69 74 68 ChannelType with
70c0: 20 61 6e 6f 74 68 65 72 20 64 72 69 76 65 72 0a another driver.
70d0: 09 20 2a 20 70 72 6f 63 65 64 75 72 65 20 74 6f . * procedure to
70e0: 20 6e 6f 74 69 66 79 20 61 20 43 68 61 6e 6e 65 notify a Channe
70f0: 6c 20 61 62 6f 75 74 20 74 68 65 20 28 75 6e 29 l about the (un)
7100: 73 74 61 63 6b 69 6e 67 2e 0a 09 20 2a 0a 09 20 stacking... *..
7110: 2a 20 49 74 20 77 61 6c 6b 73 20 74 68 65 20 63 * It walks the c
7120: 68 61 69 6e 20 6f 66 20 43 68 61 6e 6e 65 6c 20 hain of Channel
7130: 73 74 72 75 63 74 75 72 65 73 20 75 6e 74 69 6c structures until
7140: 20 69 74 0a 09 20 2a 20 66 69 6e 64 73 20 74 68 it.. * finds th
7150: 65 20 6f 6e 65 20 70 6f 69 6e 74 69 6e 67 20 68 e one pointing h
7160: 61 76 69 6e 67 20 27 63 74 72 6c 27 20 61 73 20 aving 'ctrl' as
7170: 69 6e 73 74 61 6e 63 65 44 61 74 61 0a 09 20 2a instanceData.. *
7180: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e and then return
7190: 73 20 74 68 65 20 73 75 70 65 72 63 65 64 69 6e s the supercedin
71a0: 67 20 63 68 61 6e 6e 65 6c 20 74 6f 20 74 68 61 g channel to tha
71b0: 74 2e 20 28 41 4b 29 0a 09 20 2a 2f 0a 0a 09 54 t. (AK).. */...T
71c0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 20 cl_Channel self
71d0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 = statePtr->self
71e0: 3b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 6e ;..Tcl_Channel n
71f0: 65 78 74 3b 0a 0a 09 77 68 69 6c 65 20 28 28 43 ext;...while ((C
7200: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
7210: 50 74 72 20 21 3d 20 54 63 6c 5f 47 65 74 43 68 Ptr != Tcl_GetCh
7220: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
7230: 61 20 28 73 65 6c 66 29 29 20 7b 0a 09 20 20 20 a (self)) {..
7240: 20 6e 65 78 74 20 3d 20 54 63 6c 5f 47 65 74 53 next = Tcl_GetS
7250: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 20 28 73 tackedChannel (s
7260: 65 6c 66 29 3b 0a 09 20 20 20 20 69 66 20 28 6e elf);.. if (n
7270: 65 78 74 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e ext == (Tcl_Chan
7280: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f nel) NULL) {.../
7290: 2a 20 30 39 2f 32 34 2f 31 39 39 39 20 55 6e 73 * 09/24/1999 Uns
72a0: 74 61 63 6b 69 6e 67 20 62 75 67 2c 0a 09 09 20 tacking bug,...
72b0: 2a 20 66 6f 75 6e 64 20 62 79 20 4d 61 74 74 20 * found by Matt
72c0: 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 73 65 6e Newman <matt@sen
72d0: 73 75 73 2e 6f 72 67 3e 2e 0a 09 09 20 2a 0a 09 sus.org>.... *..
72e0: 09 20 2a 20 57 65 20 77 65 72 65 20 75 6e 61 62 . * We were unab
72f0: 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 63 le to find the c
7300: 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 hannel structure
7310: 20 66 6f 72 20 74 68 69 73 0a 09 09 20 2a 20 74 for this... * t
7320: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e ransformation in
7330: 20 74 68 65 20 63 68 61 69 6e 20 6f 66 20 73 74 the chain of st
7340: 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2e 20 54 acked channel. T
7350: 68 69 73 0a 09 09 20 2a 20 6d 65 61 6e 73 20 74 his... * means t
7360: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 hat we are curre
7370: 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 72 6f 63 ntly in the proc
7380: 65 73 73 20 6f 66 20 75 6e 73 74 61 63 6b 69 6e ess of unstackin
7390: 67 0a 09 09 20 2a 20 69 74 20 2a 61 6e 64 2a 20 g... * it *and*
73a0: 74 68 65 72 65 20 77 65 72 65 20 73 6f 6d 65 20 there were some
73b0: 62 79 74 65 73 20 77 61 69 74 69 6e 67 20 77 68 bytes waiting wh
73c0: 69 63 68 20 61 72 65 20 6e 6f 77 0a 09 09 20 2a ich are now... *
73d0: 20 66 6c 75 73 68 65 64 2e 20 49 6e 20 74 68 69 flushed. In thi
73e0: 73 20 73 69 74 75 61 74 69 6f 6e 20 74 68 65 20 s situation the
73f0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 pointer to the c
7400: 68 61 6e 6e 65 6c 0a 09 09 20 2a 20 69 74 73 65 hannel... * itse
7410: 6c 66 20 61 6c 72 65 61 64 79 20 72 65 66 65 72 lf already refer
7420: 73 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 s to the parent
7430: 63 68 61 6e 6e 65 6c 20 77 65 20 68 61 76 65 20 channel we have
7440: 74 6f 0a 09 09 20 2a 20 77 72 69 74 65 20 74 68 to... * write th
7450: 65 20 62 79 74 65 73 20 69 6e 74 6f 2c 20 73 6f e bytes into, so
7460: 20 77 65 20 72 65 74 75 72 6e 20 74 68 61 74 2e we return that.
7470: 0a 09 09 20 2a 2f 0a 09 09 72 65 74 75 72 6e 20 ... */...return
7480: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a statePtr->self;.
7490: 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 6c 66 . }.. self
74a0: 20 3d 20 6e 65 78 74 3b 0a 09 7d 0a 0a 09 72 65 = next;..}...re
74b0: 74 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 turn Tcl_GetStac
74c0: 6b 65 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c 66 kedChannel (self
74d0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a );. }.}.