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: 0a 20 2a 20 24 48 65 61 64 65 72 3a 20 2f 68 6f . * $Header: /ho
0050: 6d 65 2f 72 6b 65 65 6e 65 2f 74 6d 70 2f 63 76 me/rkeene/tmp/cv
0060: 73 32 66 6f 73 73 69 6c 2f 2e 2e 2f 74 63 6c 74 s2fossil/../tclt
0070: 6c 73 2f 74 6c 73 2f 74 6c 73 2f 74 6c 73 49 4f ls/tls/tls/tlsIO
0080: 2e 63 2c 76 20 31 2e 33 20 32 30 30 30 2f 30 35 .c,v 1.3 2000/05
0090: 2f 33 31 20 32 31 3a 32 34 3a 32 34 20 77 65 6c /31 21:24:24 wel
00a0: 63 68 20 45 78 70 20 24 0a 20 2a 0a 20 2a 20 54 ch Exp $. *. * T
00b0: 4c 53 20 28 61 6b 61 20 53 53 4c 29 20 43 68 61 LS (aka SSL) Cha
00c0: 6e 6e 65 6c 20 2d 20 63 61 6e 20 62 65 20 6c 61 nnel - can be la
00d0: 79 65 72 65 64 20 6f 6e 20 61 6e 79 20 62 69 2d yered on any bi-
00e0: 64 69 72 65 63 74 69 6f 6e 61 6c 0a 20 2a 20 54 directional. * T
00f0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 28 4e 6f 74 65 cl_Channel (Note
0100: 3a 20 52 65 71 75 69 72 65 73 20 54 72 66 20 43 : Requires Trf C
0110: 6f 72 65 20 50 61 74 63 68 29 0a 20 2a 0a 20 2a ore Patch). *. *
0120: 20 54 68 69 73 20 77 61 73 20 62 75 69 6c 74 20 This was built
0130: 66 72 6f 6d 20 73 63 72 61 74 63 68 20 62 61 73 from scratch bas
0140: 65 64 20 75 70 6f 6e 20 6f 62 73 65 72 76 61 74 ed upon observat
0150: 69 6f 6e 20 6f 66 20 4f 70 65 6e 53 53 4c 20 30 ion of OpenSSL 0
0160: 2e 39 2e 32 42 0a 20 2a 0a 20 2a 20 41 64 64 69 .9.2B. *. * Addi
0170: 74 69 6f 6e 20 63 72 65 64 69 74 20 69 73 20 64 tion credit is d
0180: 75 65 20 66 6f 72 20 41 6e 64 72 65 61 73 20 4b ue for Andreas K
0190: 75 70 72 69 65 73 20 28 61 2e 6b 75 70 72 69 65 upries (a.kuprie
01a0: 73 40 77 65 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 s@westend.com),
01b0: 66 6f 72 0a 20 2a 20 70 72 6f 76 69 64 69 6e 67 for. * providing
01c0: 20 74 68 65 20 54 63 6c 5f 52 65 70 6c 61 63 65 the Tcl_Replace
01d0: 43 68 61 6e 6e 65 6c 20 6d 65 63 68 61 6e 69 73 Channel mechanis
01e0: 6d 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 63 6c m and working cl
01f0: 6f 73 65 6c 79 20 77 69 74 68 20 6d 65 0a 20 2a osely with me. *
0200: 20 74 6f 20 65 6e 68 61 6e 63 65 20 69 74 20 74 to enhance it t
0210: 6f 20 73 75 70 70 6f 72 74 20 66 75 6c 6c 20 66 o support full f
0220: 69 6c 65 65 76 65 6e 74 20 73 65 6d 61 6e 74 69 ileevent semanti
0230: 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 cs.. *. * Also w
0240: 6f 72 6b 20 64 6f 6e 65 20 62 79 20 74 68 65 20 ork done by the
0250: 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 20 70 72 follow people pr
0260: 6f 76 69 64 65 64 20 74 68 65 20 69 6d 70 65 74 ovided the impet
0270: 75 73 20 74 6f 20 64 6f 20 74 68 69 73 20 22 72 us to do this "r
0280: 69 67 68 74 22 3a 0a 20 2a 09 74 63 6c 53 53 4c ight":. *.tclSSL
0290: 20 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 (Colin McCormac
02a0: 6b 2c 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f k, Shared Techno
02b0: 6c 6f 67 79 29 0a 20 2a 09 53 53 4c 74 63 6c 20 logy). *.SSLtcl
02c0: 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a 20 (Peter Antman).
02d0: 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 *. */..#include
02e0: 22 74 6c 73 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 20 "tlsInt.h"../*.
02f0: 2a 20 45 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 * External funct
0300: 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 ions. */../*. *
0310: 4c 6f 63 61 6c 20 44 65 66 69 6e 65 73 0a 20 2a Local Defines. *
0320: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0330: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0340: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 42 6c /..static int.Bl
0350: 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 5f 41 4e 53 ockModeProc _ANS
0360: 49 5f 41 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 I_ARGS_((ClientD
0370: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 ata instanceData
0380: 2c 20 69 6e 74 20 6d 6f 64 65 29 29 3b 0a 73 74 , int mode));.st
0390: 61 74 69 63 20 69 6e 74 09 43 6c 6f 73 65 50 72 atic int.ClosePr
03a0: 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 oc _ANSI_ARGS_ (
03b0: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
03c0: 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e anceData, Tcl_In
03d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 29 3b 0a terp *interp));.
03e0: 73 74 61 74 69 63 20 69 6e 74 09 49 6e 70 75 74 static int.Input
03f0: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f Proc _ANSI_ARGS_
0400: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ((ClientData ins
0410: 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 20 20 tanceData,....
0420: 20 20 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 4f 75 74 70 75 74 tatic int.Output
0460: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f Proc _ANSI_ARGS_
0470: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ((ClientData ins
0480: 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 20 20 tanceData,....
0490: 20 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 char *buf, int
04a0: 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 toWrite, int *e
04b0: 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 73 rrorCodePtr));.s
04c0: 74 61 74 69 63 20 69 6e 74 09 47 65 74 4f 70 74 tatic int.GetOpt
04d0: 69 6f 6e 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 ionProc _ANSI_AR
04e0: 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 GS_ ((ClientData
04f0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 instanceData,..
0500: 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 .. Tcl_Interp
0510: 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72 20 2a *interp, char *
0520: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 54 63 6c 5f optionName, Tcl_
0530: 44 53 74 72 69 6e 67 20 2a 64 73 50 74 72 29 29 DString *dsPtr))
0540: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 57 61 ;.static void.Wa
0550: 74 63 68 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 tchProc _ANSI_AR
0560: 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 GS_((ClientData
0570: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
0580: 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 t mask));.static
0590: 20 69 6e 74 09 47 65 74 48 61 6e 64 6c 65 50 72 int.GetHandlePr
05a0: 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 oc _ANSI_ARGS_ (
05b0: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
05c0: 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 20 20 20 anceData,....
05d0: 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 int direction,
05e0: 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 ClientData *hand
05f0: 6c 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 lePtr));.static
0600: 76 6f 69 64 09 43 68 61 6e 6e 65 6c 48 61 6e 64 void.ChannelHand
0610: 6c 65 72 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 ler _ANSI_ARGS_
0620: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ((ClientData cli
0630: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 entData, int mas
0640: 6b 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 k));.static void
0650: 09 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 .ChannelHandlerT
0660: 69 6d 65 72 20 5f 41 4e 53 49 5f 41 52 47 53 5f imer _ANSI_ARGS_
0670: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c ((ClientData cl
0680: 69 65 6e 74 44 61 74 61 29 29 3b 0a 0a 2f 2a 0a ientData));../*.
0690: 20 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72 * This structur
06a0: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 e describes the
06b0: 63 68 61 6e 6e 65 6c 20 74 79 70 65 20 73 74 72 channel type str
06c0: 75 63 74 75 72 65 20 66 6f 72 20 54 43 50 20 73 ucture for TCP s
06d0: 6f 63 6b 65 74 0a 20 2a 20 62 61 73 65 64 20 49 ocket. * based I
06e0: 4f 3a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 O:. */..static T
06f0: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 cl_ChannelType t
0700: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 lsChannelType =
0710: 7b 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 2f 2a {. "tls",../*
0720: 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 Type name. */.
0730: 20 20 20 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 BlockModeProc
0740: 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e ,./* Set blockin
0750: 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f g/nonblocking mo
0760: 64 65 2e 2a 2f 0a 20 20 20 20 43 6c 6f 73 65 50 de.*/. CloseP
0770: 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 roc,../* Close p
0780: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 49 6e 70 75 roc. */. Inpu
0790: 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 tProc,../* Input
07a0: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4f 75 proc. */. Ou
07b0: 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 tputProc,../* Ou
07c0: 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 tput proc. */.
07d0: 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b NULL,../* Seek
07e0: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 proc. */. NU
07f0: 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 LL,../* Set opti
0800: 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 on proc. */.
0810: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f GetOptionProc,./
0820: 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f * Get option pro
0830: 63 2e 20 2a 2f 0a 20 20 20 20 57 61 74 63 68 50 c. */. WatchP
0840: 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c roc,../* Initial
0850: 69 7a 65 20 6e 6f 74 69 66 69 65 72 2e 20 2a 2f ize notifier. */
0860: 0a 20 20 20 20 47 65 74 48 61 6e 64 6c 65 50 72 . GetHandlePr
0870: 6f 63 2c 09 2f 2a 20 47 65 74 20 66 69 6c 65 20 oc,./* Get file
0880: 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 63 68 handle out of ch
0890: 61 6e 6e 65 6c 2e 20 2a 2f 0a 7d 3b 0a 0a 54 63 annel. */.};..Tc
08a0: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 54 l_ChannelType *T
08b0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
08c0: 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 74 .{. return &t
08d0: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d lsChannelType;.}
08e0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
0930: 2a 20 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 * BlockModeProc
0940: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
0950: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
0960: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
0970: 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 c IO level. *
0980: 20 20 20 20 74 6f 20 73 65 74 20 62 6c 6f 63 6b to set block
0990: 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b ing and nonblock
09a0: 69 6e 67 20 6d 6f 64 65 73 0a 20 2a 20 52 65 73 ing modes. * Res
09b0: 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 ults:. *.0 if su
09c0: 63 63 65 73 73 66 75 6c 2c 20 65 72 72 6e 6f 20 ccessful, errno
09d0: 77 68 65 6e 20 66 61 69 6c 65 64 2e 0a 20 2a 0a when failed.. *.
09e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
09f0: 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64 65 76 . *.Sets the dev
0a00: 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e ice into blockin
0a10: 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 g or nonblocking
0a20: 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d mode.. *. *----
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0a70: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
0a80: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c BlockModeProc(Cl
0a90: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
0aa0: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 eData,./* Socket
0ab0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 state. */.
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 int
0ad0: 6d 6f 64 65 29 09 09 09 2f 2a 20 54 68 65 20 6d mode).../* The m
0ae0: 6f 64 65 20 74 6f 20 73 65 74 2e 20 43 61 6e 20 ode to set. Can
0af0: 62 65 20 6f 6e 65 20 6f 66 0a 09 09 09 09 09 09 be one of.......
0b00: 2a 20 54 43 4c 5f 4d 4f 44 45 5f 42 4c 4f 43 4b * TCL_MODE_BLOCK
0b10: 49 4e 47 20 6f 72 0a 09 09 09 09 09 09 2a 20 54 ING or.......* T
0b20: 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b CL_MODE_NONBLOCK
0b30: 49 4e 47 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 ING. */.{. St
0b40: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
0b50: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
0b60: 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 ceData;.. if
0b70: 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 (mode == TCL_MOD
0b80: 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b E_NONBLOCKING) {
0b90: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
0ba0: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 s |= TLS_TCL_ASY
0bb0: 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b NC;. } else {
0bc0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
0bd0: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 s &= ~(TLS_TCL_A
0be0: 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 SYNC);. }.
0bf0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 53 65 74 43 return Tcl_SetC
0c00: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 73 74 61 hannelOption(sta
0c10: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 54 tePtr->interp, T
0c20: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 ls_GetParent(sta
0c30: 74 65 50 74 72 29 2c 0a 09 09 22 2d 62 6c 6f 63 tePtr),..."-bloc
0c40: 6b 69 6e 67 22 2c 20 28 6d 6f 64 65 20 3d 3d 20 king", (mode ==
0c50: 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 TCL_MODE_NONBLOC
0c60: 4b 49 4e 47 29 20 3f 20 22 30 22 20 3a 20 22 31 KING) ? "0" : "1
0c70: 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ");.}.../*. *---
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cc0: 0a 20 2a 0a 20 2a 20 43 6c 6f 73 65 50 72 6f 63 . *. * CloseProc
0cd0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
0ce0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
0cf0: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 ked by the gener
0d00: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 ic IO level to p
0d10: 65 72 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 erform. *.channe
0d20: 6c 2d 74 79 70 65 2d 73 70 65 63 69 66 69 63 20 l-type-specific
0d30: 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 61 20 53 cleanup when a S
0d40: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 SL socket based
0d50: 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c channel. *.is cl
0d60: 6f 73 65 64 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 osed.. *. *.Note
0d70: 3a 20 77 65 20 6c 65 61 76 65 20 74 68 65 20 75 : we leave the u
0d80: 6e 64 65 72 6c 79 69 6e 67 20 73 6f 63 6b 65 74 nderlying socket
0d90: 20 61 6c 6f 6e 65 2c 20 69 73 20 74 68 69 73 20 alone, is this
0da0: 72 69 67 68 74 3f 0a 20 2a 0a 20 2a 20 52 65 73 right?. *. * Res
0db0: 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 ults:. *.0 if su
0dc0: 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 76 61 ccessful, the va
0dd0: 6c 75 65 20 6f 66 20 54 63 6c 5f 47 65 74 45 72 lue of Tcl_GetEr
0de0: 72 6e 6f 28 29 20 69 66 20 66 61 69 6c 65 64 2e rno() if failed.
0df0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0e00: 63 74 73 3a 0a 20 2a 09 43 6c 6f 73 65 73 20 74 cts:. *.Closes t
0e10: 68 65 20 73 6f 63 6b 65 74 20 6f 66 20 74 68 65 he socket of the
0e20: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e70: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
0e80: 74 0a 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 t.CloseProc(Clie
0e90: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
0ea0: 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b ata,./* The sock
0eb0: 65 74 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a et to close. */.
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c Tcl
0ed0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
0ee0: 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 ./* For error re
0ef0: 70 6f 72 74 69 6e 67 20 2d 20 75 6e 75 73 65 64 porting - unused
0f00: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 . */.{. State
0f10: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
0f20: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
0f30: 61 74 61 3b 0a 23 69 66 20 54 43 4c 5f 4d 41 4a ata;.#if TCL_MAJ
0f40: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 20 OR_VERSION == 8
0f50: 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 && TCL_MINOR_VER
0f60: 53 49 4f 4e 20 3c 20 32 0a 20 20 20 20 54 63 6c SION < 2. Tcl
0f70: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 50 74 72 _Channel chanPtr
0f80: 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 = Tls_GetParent
0f90: 28 73 74 61 74 65 50 74 72 29 3b 0a 23 65 6c 73 (statePtr);.#els
0fa0: 65 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 e. Tcl_Channe
0fb0: 6c 20 63 68 61 6e 50 74 72 20 3d 20 73 74 61 74 l chanPtr = stat
0fc0: 65 50 74 72 2d 3e 73 65 6c 66 3b 20 2f 2a 20 27 ePtr->self; /* '
0fd0: 73 65 6c 66 27 20 61 6c 72 65 61 64 79 20 72 65 self' already re
0fe0: 66 65 72 73 20 74 6f 20 6f 75 72 20 70 61 72 65 fers to our pare
0ff0: 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 nt */.#endif..
1000: 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 dprintf(stderr
1010: 2c 22 5c 6e 43 6c 6f 73 65 50 72 6f 63 28 30 78 ,"\nCloseProc(0x
1020: 25 78 29 22 2c 20 73 74 61 74 65 50 74 72 29 3b %x)", statePtr);
1030: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 . /*. * R
1040: 65 6d 6f 76 65 20 65 76 65 6e 74 20 68 61 6e 64 emove event hand
1050: 6c 65 72 20 74 6f 20 74 68 65 20 63 68 61 6e 6e ler to the chann
1060: 65 6c 2c 20 74 68 69 73 20 63 6f 75 6c 64 0a 20 el, this could.
1070: 20 20 20 20 2a 20 62 65 20 62 65 63 61 75 73 65 * be because
1080: 20 77 65 20 61 72 65 20 63 6c 6f 73 69 6e 67 20 we are closing
1090: 66 6f 72 20 72 65 61 6c 2c 20 6f 72 20 62 65 69 for real, or bei
10a0: 6e 67 20 22 75 6e 73 74 61 63 6b 65 64 22 2e 0a ng "unstacked"..
10b0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c */.. Tcl
10c0: 5f 44 65 6c 65 74 65 43 68 61 6e 6e 65 6c 48 61 _DeleteChannelHa
10d0: 6e 64 6c 65 72 28 20 63 68 61 6e 50 74 72 2c 0a ndler( chanPtr,.
10e0: 09 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 2c .ChannelHandler,
10f0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 (ClientData) st
1100: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 atePtr);.. if
1110: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
1120: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
1130: 6f 6b 65 6e 29 4e 55 4c 4c 29 20 7b 0a 09 54 63 oken)NULL) {..Tc
1140: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e l_DeleteTimerHan
1150: 64 6c 65 72 20 28 73 74 61 74 65 50 74 72 2d 3e dler (statePtr->
1160: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
1170: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
1180: 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b TimerToken)NULL;
1190: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
11a0: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 28 20 EventuallyFree(
11b0: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74 (ClientData)stat
11c0: 65 50 74 72 2c 20 54 6c 73 5f 46 72 65 65 29 3b ePtr, Tls_Free);
11d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
11e0: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1230: 0a 20 2a 0a 20 2a 20 49 6e 70 75 74 50 72 6f 63 . *. * InputProc
1240: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
1250: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
1260: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 ked by the gener
1270: 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 ic IO level. *
1280: 20 20 20 20 20 74 6f 20 72 65 61 64 20 69 6e 70 to read inp
1290: 75 74 20 66 72 6f 6d 20 61 20 53 53 4c 20 73 6f ut from a SSL so
12a0: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
12b0: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 el.. *. * Result
12c0: 73 3a 0a 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 s:. *.The number
12d0: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 69 of bytes read i
12e0: 73 20 72 65 74 75 72 6e 65 64 20 6f 72 20 2d 31 s returned or -1
12f0: 20 6f 6e 20 65 72 72 6f 72 2e 20 41 6e 20 6f 75 on error. An ou
1300: 74 70 75 74 0a 20 2a 09 61 72 67 75 6d 65 6e 74 tput. *.argument
1310: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 4f contains the PO
1320: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 6f SIX error code o
1330: 6e 20 65 72 72 6f 72 2c 20 6f 72 20 7a 65 72 6f n error, or zero
1340: 20 69 66 20 6e 6f 0a 20 2a 09 65 72 72 6f 72 20 if no. *.error
1350: 6f 63 63 75 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 occurred.. *. *
1360: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
1370: 09 52 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f .Reads input fro
1380: 6d 20 74 68 65 20 69 6e 70 75 74 20 64 65 76 69 m the input devi
1390: 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 ce of the channe
13a0: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
13f0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6e 70 75 .static int.Inpu
1400: 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 tProc(ClientData
1410: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f instanceData,./
1420: 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 * Socket state.
1430: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 */.
1440: 63 68 61 72 20 2a 62 75 66 2c 09 09 09 2f 2a 20 char *buf,.../*
1450: 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 64 Where to store d
1460: 61 74 61 20 72 65 61 64 2e 20 2a 2f 0a 20 20 20 ata read. */.
1470: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 75 int bu
1480: 66 53 69 7a 65 2c 09 09 2f 2a 20 48 6f 77 20 6d fSize,../* How m
1490: 75 63 68 20 73 70 61 63 65 20 69 73 20 61 76 61 uch space is ava
14a0: 69 6c 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 ilable.
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14d0: 2a 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 3f * in the buffer?
14e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 */.
14f0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
1500: 74 72 29 09 09 2f 2a 20 57 68 65 72 65 20 74 6f tr)../* Where to
1510: 20 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f 64 store error cod
1520: 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 e. */.{. Stat
1530: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
1540: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 tate *) instance
1550: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 Data;. int by
1560: 74 65 73 52 65 61 64 3b 09 09 09 2f 2a 20 48 6f tesRead;.../* Ho
1570: 77 20 6d 61 6e 79 20 62 79 74 65 73 20 77 65 72 w many bytes wer
1580: 65 20 72 65 61 64 3f 20 2a 2f 0a 0a 20 20 20 20 e read? */..
1590: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
15a0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
15b0: 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 72 65 stderr,"\nBIO_re
15c0: 61 64 28 25 64 29 22 2c 20 62 75 66 53 69 7a 65 ad(%d)", bufSize
15d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 53 53 4c );.. if (!SSL
15e0: 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 _is_init_finishe
15f0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 d(statePtr->ssl)
1600: 29 20 7b 0a 09 62 79 74 65 73 52 65 61 64 20 3d ) {..bytesRead =
1610: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
1620: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 ect(statePtr, er
1630: 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 69 66 rorCodePtr);..if
1640: 20 28 62 79 74 65 73 52 65 61 64 20 3c 3d 20 30 (bytesRead <= 0
1650: 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 69 6e ) {.. goto in
1660: 70 75 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 put;..}. }.
1670: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1680: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
1690: 49 4e 49 54 29 20 7b 0a 09 73 74 61 74 65 50 74 INIT) {..statePt
16a0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
16b0: 53 5f 54 43 4c 5f 49 4e 49 54 29 3b 0a 20 20 20 S_TCL_INIT);.
16c0: 20 7d 0a 20 20 20 20 62 79 74 65 73 52 65 61 64 }. bytesRead
16d0: 20 3d 20 42 49 4f 5f 72 65 61 64 28 73 74 61 74 = BIO_read(stat
16e0: 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 ePtr->bio, buf,
16f0: 62 75 66 53 69 7a 65 29 3b 0a 20 20 20 20 64 70 bufSize);. dp
1700: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e rintf(stderr,"\n
1710: 42 49 4f 5f 72 65 61 64 20 2d 3e 20 25 64 22 2c BIO_read -> %d",
1720: 20 62 79 74 65 73 52 65 61 64 29 3b 0a 0a 20 20 bytesRead);..
1730: 20 20 69 66 20 28 62 79 74 65 73 52 65 61 64 20 if (bytesRead
1740: 3c 20 30 29 20 7b 0a 09 69 6e 74 20 65 72 72 20 < 0) {..int err
1750: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 = SSL_get_error(
1760: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 statePtr->ssl, b
1770: 79 74 65 73 52 65 61 64 29 3b 0a 0a 09 69 66 20 ytesRead);...if
1780: 28 65 72 72 20 3d 3d 20 53 53 4c 5f 45 52 52 4f (err == SSL_ERRO
1790: 52 5f 53 53 4c 29 20 7b 0a 09 20 20 20 20 54 6c R_SSL) {.. Tl
17a0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
17b0: 2c 20 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 , SSL_ERROR(stat
17c0: 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 ePtr->ssl, bytes
17d0: 52 65 61 64 29 29 3b 0a 09 20 20 20 20 2a 65 72 Read));.. *er
17e0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f rorCodePtr = ECO
17f0: 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 NNABORTED;..
1800: 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 09 7d 20 65 goto input;..} e
1810: 6c 73 65 20 69 66 20 28 42 49 4f 5f 73 68 6f 75 lse if (BIO_shou
1820: 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 ld_retry(statePt
1830: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 r->bio)) {..
1840: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
1850: 52 45 21 20 22 29 3b 0a 09 20 20 20 20 2a 65 72 RE! ");.. *er
1860: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
1870: 41 49 4e 3b 0a 09 20 20 20 20 67 6f 74 6f 20 69 AIN;.. goto i
1880: 6e 70 75 74 3b 0a 09 7d 0a 09 69 66 20 28 54 63 nput;..}..if (Tc
1890: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 20 3d 3d 20 l_GetErrno() ==
18a0: 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 20 ECONNRESET) {..
18b0: 20 20 20 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a /* Soft EOF *
18c0: 2f 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 /.. bytesRead
18d0: 20 3d 20 30 3b 0a 09 20 20 20 20 67 6f 74 6f 20 = 0;.. goto
18e0: 69 6e 70 75 74 3b 0a 09 7d 20 65 6c 73 65 20 7b input;..} else {
18f0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
1900: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 Ptr = Tcl_GetErr
1910: 6e 6f 28 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20 no();.. goto
1920: 69 6e 70 75 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a input;..}. }.
1930: 69 6e 70 75 74 3a 0a 20 20 20 20 64 70 72 69 6e input:. dprin
1940: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 49 6e tf(stderr, "\nIn
1950: 70 75 74 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 put(%d) -> %d [%
1960: 64 5d 22 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 d]", bufSize, by
1970: 74 65 73 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 tesRead, *errorC
1980: 6f 64 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 odePtr);. ret
1990: 75 72 6e 20 62 79 74 65 73 52 65 61 64 3b 0a 7d urn bytesRead;.}
19a0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
19f0: 2a 20 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a * OutputProc --.
1a00: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
1a10: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
1a20: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
1a30: 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 O level. *
1a40: 20 74 6f 20 77 72 69 74 65 20 6f 75 74 70 75 74 to write output
1a50: 20 74 6f 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 to a SSL socket
1a60: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a based channel..
1a70: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
1a80: 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 *.The number of
1a90: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 69 73 bytes written is
1aa0: 20 72 65 74 75 72 6e 65 64 2e 20 41 6e 20 6f 75 returned. An ou
1ab0: 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 69 73 tput argument is
1ac0: 0a 20 2a 09 73 65 74 20 74 6f 20 61 20 50 4f 53 . *.set to a POS
1ad0: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 IX error code if
1ae0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 an error occurr
1af0: 65 64 2c 20 6f 72 20 7a 65 72 6f 2e 0a 20 2a 0a ed, or zero.. *.
1b00: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
1b10: 0a 20 2a 09 57 72 69 74 65 73 20 6f 75 74 70 75 . *.Writes outpu
1b20: 74 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20 t on the output
1b30: 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 device of the ch
1b40: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1b90: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
1ba0: 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e OutputProc(Clien
1bb0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
1bc0: 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 ta,./* Socket st
1bd0: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 ate. */.
1be0: 20 20 20 20 20 20 63 68 61 72 20 2a 62 75 66 2c char *buf,
1bf0: 09 09 09 2f 2a 20 54 68 65 20 64 61 74 61 20 62 .../* The data b
1c00: 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 uffer. */.
1c10: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 57 72 int toWr
1c20: 69 74 65 2c 09 09 2f 2a 20 48 6f 77 20 6d 61 6e ite,../* How man
1c30: 79 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 y bytes to write
1c40: 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 ? */.
1c50: 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 int *errorCod
1c60: 65 50 74 72 29 09 2f 2a 20 57 68 65 72 65 20 74 ePtr)./* Where t
1c70: 6f 20 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f o store error co
1c80: 64 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 de. */.{. Sta
1c90: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
1ca0: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
1cb0: 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 eData;. int w
1cc0: 72 69 74 74 65 6e 2c 20 65 72 72 3b 0a 0a 20 20 ritten, err;..
1cd0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
1ce0: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
1cf0: 66 28 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f f(stderr,"\nBIO_
1d00: 77 72 69 74 65 28 25 64 29 22 2c 20 74 6f 57 72 write(%d)", toWr
1d10: 69 74 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 ite);.. if (!
1d20: 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 SSL_is_init_fini
1d30: 73 68 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 shed(statePtr->s
1d40: 73 6c 29 29 20 7b 0a 09 77 72 69 74 74 65 6e 20 sl)) {..written
1d50: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e = Tls_WaitForCon
1d60: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 nect(statePtr, e
1d70: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 69 rrorCodePtr);..i
1d80: 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 f (written <= 0)
1d90: 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 6f 75 74 {.. goto out
1da0: 70 75 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 put;..}. }.
1db0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1dc0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
1dd0: 49 4e 49 54 29 20 7b 0a 09 73 74 61 74 65 50 74 INIT) {..statePt
1de0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
1df0: 53 5f 54 43 4c 5f 49 4e 49 54 29 3b 0a 20 20 20 S_TCL_INIT);.
1e00: 20 7d 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69 }. if (toWri
1e10: 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 72 69 te == 0) {..dpri
1e20: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7a 65 72 ntf(stderr, "zer
1e30: 6f 2d 77 72 69 74 65 5c 6e 22 29 3b 0a 09 42 49 o-write\n");..BI
1e40: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 O_flush(statePtr
1e50: 2d 3e 62 69 6f 29 3b 0a 09 77 72 69 74 74 65 6e ->bio);..written
1e60: 20 3d 20 30 3b 0a 09 67 6f 74 6f 20 6f 75 74 70 = 0;..goto outp
1e70: 75 74 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ut;. } else {
1e80: 0a 09 77 72 69 74 74 65 6e 20 3d 20 42 49 4f 5f ..written = BIO_
1e90: 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e write(statePtr->
1ea0: 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69 74 bio, buf, toWrit
1eb0: 65 29 3b 0a 09 64 70 72 69 6e 74 66 28 73 74 64 e);..dprintf(std
1ec0: 65 72 72 2c 22 5c 6e 42 49 4f 5f 77 72 69 74 65 err,"\nBIO_write
1ed0: 28 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 74 (%d) -> [%d]", t
1ee0: 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 oWrite, written)
1ef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
1f00: 77 72 69 74 74 65 6e 20 3c 20 30 20 7c 7c 20 77 written < 0 || w
1f10: 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 ritten == 0) {..
1f20: 73 77 69 74 63 68 20 28 28 65 72 72 20 3d 20 53 switch ((err = S
1f30: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 SL_get_error(sta
1f40: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 tePtr->ssl, writ
1f50: 74 65 6e 29 29 29 20 7b 0a 09 63 61 73 65 20 53 ten))) {..case S
1f60: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 SL_ERROR_NONE:..
1f70: 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e 20 if (written
1f80: 3c 3d 20 30 29 20 7b 0a 09 09 77 72 69 74 74 65 <= 0) {...writte
1f90: 6e 20 3d 20 30 3b 0a 09 09 67 6f 74 6f 20 6f 75 n = 0;...goto ou
1fa0: 74 70 75 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 tput;.. }..
1fb0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 break;..case S
1fc0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 SL_ERROR_WANT_WR
1fd0: 49 54 45 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 ITE:.. dprint
1fe0: 66 28 73 74 64 65 72 72 2c 22 77 72 69 74 65 20 f(stderr,"write
1ff0: 57 20 42 4c 4f 43 4b 5c 6e 22 29 3b 0a 09 20 20 W BLOCK\n");..
2000: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 break;..case S
2010: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
2020: 41 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 AD:.. dprintf
2030: 28 73 74 64 65 72 72 2c 22 77 72 69 74 65 20 52 (stderr,"write R
2040: 20 42 4c 4f 43 4b 5c 6e 22 29 3b 0a 09 20 20 20 BLOCK\n");..
2050: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 break;..case SS
2060: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 L_ERROR_WANT_X50
2070: 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 64 9_LOOKUP:.. d
2080: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 77 printf(stderr,"w
2090: 72 69 74 65 20 58 20 42 4c 4f 43 4b 5c 6e 22 29 rite X BLOCK\n")
20a0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
20b0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
20c0: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 RO_RETURN:..
20d0: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
20e0: 63 6c 6f 73 65 64 5c 6e 22 29 3b 0a 09 20 20 20 closed\n");..
20f0: 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 written = 0;..
2100: 20 20 20 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a goto output;.
2110: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
2120: 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2a 65 SYSCALL:.. *e
2130: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 rrorCodePtr = Tc
2140: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 20 l_GetErrno();..
2150: 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 dprintf(stder
2160: 72 2c 22 5b 25 64 5d 20 73 79 73 63 61 6c 6c 20 r,"[%d] syscall
2170: 65 72 72 72 3a 20 25 64 5c 6e 22 2c 20 77 72 69 errr: %d\n", wri
2180: 74 74 65 6e 2c 20 54 63 6c 5f 47 65 74 45 72 72 tten, Tcl_GetErr
2190: 6e 6f 28 29 29 3b 0a 09 20 20 20 20 77 72 69 74 no());.. writ
21a0: 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 67 ten = -1;.. g
21b0: 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 09 63 61 73 oto output;..cas
21c0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a e SSL_ERROR_SSL:
21d0: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 .. Tls_Error(
21e0: 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 statePtr, SSL_ER
21f0: 52 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ROR(statePtr->ss
2200: 6c 2c 20 77 72 69 74 74 65 6e 29 29 3b 0a 09 20 l, written));..
2210: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
2220: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
2230: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 .. written =
2240: 2d 31 3b 0a 09 20 20 20 20 67 6f 74 6f 20 6f 75 -1;.. goto ou
2250: 74 70 75 74 3b 0a 09 64 65 66 61 75 6c 74 3a 0a tput;..default:.
2260: 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
2270: 65 72 72 2c 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 err,"unknown err
2280: 3a 20 25 64 5c 6e 22 2c 20 65 72 72 29 3b 0a 09 : %d\n", err);..
2290: 7d 0a 20 20 20 20 7d 0a 6f 75 74 70 75 74 3a 0a }. }.output:.
22a0: 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 dprintf(stde
22b0: 72 72 2c 20 22 5c 6e 4f 75 74 70 75 74 28 25 64 rr, "\nOutput(%d
22c0: 29 20 2d 3e 20 25 64 22 2c 20 74 6f 57 72 69 74 ) -> %d", toWrit
22d0: 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 e, written);.
22e0: 20 72 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b return written;
22f0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2340: 0a 20 2a 20 47 65 74 4f 70 74 69 6f 6e 50 72 6f . * GetOptionPro
2350: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 75 c --. *. *.Compu
2360: 74 65 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61 tes an option va
2370: 6c 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f lue for a SSL so
2380: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
2390: 65 6c 2c 20 6f 72 20 61 0a 20 2a 09 6c 69 73 74 el, or a. *.list
23a0: 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 of all options
23b0: 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 and their values
23c0: 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a 20 54 68 .. *. *.Note: Th
23d0: 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 65 64 is code is based
23e0: 20 6f 6e 20 63 6f 64 65 20 63 6f 6e 74 72 69 62 on code contrib
23f0: 75 74 65 64 20 62 79 20 4a 6f 68 6e 20 48 61 78 uted by John Hax
2400: 62 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 by.. *. * Result
2410: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
2420: 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 54 68 65 Tcl result. The
2430: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 70 value of the sp
2440: 65 63 69 66 69 65 64 20 6f 70 74 69 6f 6e 20 6f ecified option o
2450: 72 20 61 0a 20 2a 09 6c 69 73 74 20 6f 66 20 61 r a. *.list of a
2460: 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 09 74 ll options and.t
2470: 68 65 69 72 20 76 61 6c 75 65 73 20 69 73 20 72 heir values is r
2480: 65 74 75 72 6e 65 64 20 69 6e 20 74 68 65 0a 20 eturned in the.
2490: 2a 09 73 75 70 70 6c 69 65 64 20 44 53 74 72 69 *.supplied DStri
24a0: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
24b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
24c0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
2510: 61 74 69 63 20 69 6e 74 0a 47 65 74 4f 70 74 69 atic int.GetOpti
2520: 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 onProc(ClientDat
2530: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 a instanceData,.
2540: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e /* Socket state.
2550: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 */.
2560: 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 Tcl_Interp
2570: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 *interp,../* For
2580: 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 errors - can be
2590: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 NULL. */.
25a0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 char
25b0: 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 09 2f 2a *optionName,../*
25c0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 Name of the opt
25d0: 69 6f 6e 20 74 6f 0a 20 20 20 20 20 20 20 20 20 ion to.
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2600: 20 20 20 20 20 20 20 20 2a 20 72 65 74 72 69 65 * retrie
2610: 76 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 ve the value for
2620: 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 , or.
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2650: 20 20 20 20 20 20 2a 20 4e 55 4c 4c 20 74 6f 20 * NULL to
2660: 67 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 get all options
2670: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 and.
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26a0: 20 20 20 20 20 2a 20 74 68 65 69 72 20 76 61 6c * their val
26b0: 75 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 ues. */.
26c0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74 Tcl_DSt
26d0: 72 69 6e 67 20 2a 64 73 50 74 72 29 09 20 20 20 ring *dsPtr).
26e0: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 /* Where t
26f0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6d 70 o store the comp
2700: 75 74 65 64 20 76 61 6c 75 65 0a 20 20 20 20 20 uted value.
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 69 * i
2740: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 63 61 nitialized by ca
2750: 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 ller. */.{. S
2760: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
2770: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
2780: 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 73 69 7a nceData;. siz
2790: 65 5f 74 20 6c 65 6e 20 3d 20 30 3b 0a 0a 20 20 e_t len = 0;..
27a0: 20 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 if (optionName
27b0: 20 21 3d 20 28 63 68 61 72 20 2a 29 20 4e 55 4c != (char *) NUL
27c0: 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e L) {. len
27d0: 20 3d 20 73 74 72 6c 65 6e 28 6f 70 74 69 6f 6e = strlen(option
27e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 Name);. }.#if
27f0: 20 30 0a 20 20 20 20 69 66 20 28 28 6c 65 6e 20 0. if ((len
2800: 3d 3d 20 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 == 0) ||.
2810: 20 28 28 6c 65 6e 20 3e 20 31 29 20 26 26 20 28 ((len > 1) && (
2820: 6f 70 74 69 6f 6e 4e 61 6d 65 5b 31 5d 20 3d 3d optionName[1] ==
2830: 20 27 63 27 29 20 26 26 0a 20 20 20 20 20 20 20 'c') &&.
2840: 20 20 28 73 74 72 6e 63 6d 70 28 6f 70 74 69 6f (strncmp(optio
2850: 6e 4e 61 6d 65 2c 20 22 2d 63 69 70 68 65 72 22 nName, "-cipher"
2860: 2c 20 6c 65 6e 29 20 3d 3d 20 30 29 29 29 20 7b , len) == 0))) {
2870: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e . if (len
2880: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 == 0) {.
2890: 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 Tcl_DString
28a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 AppendElement(ds
28b0: 50 74 72 2c 20 22 2d 63 69 70 68 65 72 22 29 3b Ptr, "-cipher");
28c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
28d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 Tcl_DStringAp
28e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 50 74 pendElement(dsPt
28f0: 72 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r, SSL_get_ciphe
2900: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
2910: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c );. if (l
2920: 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 en) {.
2930: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
2940: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d . }. }
2950: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 .#endif. retu
2960: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
2970: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 57 61 -------. *. * Wa
29c0: 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a tchProc --. *. *
29d0: 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 .Initialize the
29e0: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 notifier to watc
29f0: 68 20 54 63 6c 5f 46 69 6c 65 73 20 66 72 6f 6d h Tcl_Files from
2a00: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 this channel..
2a10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
2a20: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 .None.. *. * Sid
2a30: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 e effects:. *.Se
2a40: 74 73 20 75 70 20 74 68 65 20 6e 6f 74 69 66 69 ts up the notifi
2a50: 65 72 20 73 6f 20 74 68 61 74 20 61 20 66 75 74 er so that a fut
2a60: 75 72 65 20 65 76 65 6e 74 20 6f 6e 20 74 68 65 ure event on the
2a70: 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 77 69 6c 6c channel. *.will
2a80: 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c 2e be seen by Tcl.
2a90: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
2ae0: 74 61 74 69 63 20 76 6f 69 64 0a 57 61 74 63 68 tatic void.Watch
2af0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
2b00: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a instanceData,./*
2b10: 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 The socket stat
2b20: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 e. */.
2b30: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f int mask).../
2b40: 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 * Events of inte
2b50: 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 0a 20 rest; an OR-ed.
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b80: 20 20 20 20 20 20 20 20 2a 20 63 6f 6d 62 69 6e * combin
2b90: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 ation of TCL_REA
2ba0: 44 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 DABLE,.
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2bd0: 2a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 * TCL_WRITABLE a
2be0: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e nd TCL_EXCEPTION
2bf0: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 . */.{. State
2c00: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
2c10: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
2c20: 61 74 61 3b 0a 23 69 66 20 54 43 4c 5f 4d 41 4a ata;.#if TCL_MAJ
2c30: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 20 OR_VERSION == 8
2c40: 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 && TCL_MINOR_VER
2c50: 53 49 4f 4e 20 3c 20 32 0a 20 20 20 20 54 63 6c SION < 2. Tcl
2c60: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 50 74 72 _Channel chanPtr
2c70: 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 = Tls_GetParent
2c80: 28 73 74 61 74 65 50 74 72 29 3b 0a 23 65 6c 73 (statePtr);.#els
2c90: 65 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 e. /*. *
2ca0: 57 65 20 73 65 74 20 75 70 20 74 68 65 20 63 68 We set up the ch
2cb0: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 20 6f 6e annel handler on
2cc0: 20 74 68 65 20 6d 61 69 6e 20 63 68 61 6e 6e 65 the main channe
2cd0: 6c 2c 20 6e 6f 74 20 74 68 65 0a 20 20 20 20 20 l, not the.
2ce0: 2a 20 68 69 64 64 65 6e 20 63 68 61 6e 6e 65 6c * hidden channel
2cf0: 2e 20 20 54 68 65 20 6d 61 69 6e 20 63 68 61 6e . The main chan
2d00: 6e 65 6c 20 67 65 74 73 20 6e 6f 74 69 66 69 65 nel gets notifie
2d10: 64 20 62 79 20 74 68 65 20 75 6e 64 65 72 6c 79 d by the underly
2d20: 69 6e 67 0a 20 20 20 20 20 2a 20 64 72 69 76 65 ing. * drive
2d30: 72 73 2c 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 rs, so we don't
2d40: 6e 65 65 64 20 74 6f 20 70 75 74 20 74 68 65 20 need to put the
2d50: 68 61 6e 64 6c 65 72 20 61 6e 79 77 68 65 72 65 handler anywhere
2d60: 20 65 6c 73 65 2e 0a 20 20 20 20 20 2a 20 41 6c else.. * Al
2d70: 73 6f 2c 20 62 65 63 61 75 73 65 20 6f 75 72 20 so, because our
2d80: 73 74 61 74 65 20 72 65 66 65 72 73 20 74 6f 20 state refers to
2d90: 74 68 65 20 6d 61 69 6e 20 63 68 61 6e 6e 65 6c the main channel
2da0: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 0a 20 20 20 , it is only.
2db0: 20 20 2a 20 73 61 66 65 20 74 6f 20 68 61 76 65 * safe to have
2dc0: 20 6f 75 72 20 68 61 6e 64 6c 65 72 20 72 65 67 our handler reg
2dd0: 69 73 74 65 72 65 64 20 6f 6e 20 74 68 61 74 20 istered on that
2de0: 73 61 6d 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 20 same channel..
2df0: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 */. Tcl_Ch
2e00: 61 6e 6e 65 6c 20 63 68 61 6e 50 74 72 20 3d 20 annel chanPtr =
2e10: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a statePtr->self;.
2e20: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 #endif.. if (
2e30: 6d 61 73 6b 20 3d 3d 20 73 74 61 74 65 50 74 72 mask == statePtr
2e40: 2d 3e 77 61 74 63 68 4d 61 73 6b 29 0a 09 72 65 ->watchMask)..re
2e50: 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 73 turn;.. if (s
2e60: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 tatePtr->watchMa
2e70: 73 6b 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 sk) {../*.. * Re
2e80: 6d 6f 76 65 20 65 76 65 6e 74 20 68 61 6e 64 6c move event handl
2e90: 65 72 20 74 6f 20 74 68 65 20 63 68 61 6e 6e 65 er to the channe
2ea0: 6c 2c 20 74 68 69 73 20 63 6f 75 6c 64 0a 09 20 l, this could..
2eb0: 2a 20 62 65 20 62 65 63 61 75 73 65 20 77 65 20 * be because we
2ec0: 61 72 65 20 63 6c 6f 73 69 6e 67 20 66 6f 72 20 are closing for
2ed0: 72 65 61 6c 2c 20 6f 72 20 62 65 69 6e 67 20 22 real, or being "
2ee0: 75 6e 73 74 61 63 6b 65 64 22 2e 0a 09 20 2a 2f unstacked"... */
2ef0: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 43 68 61 6e ..Tcl_DeleteChan
2f00: 6e 65 6c 48 61 6e 64 6c 65 72 28 20 63 68 61 6e nelHandler( chan
2f10: 50 74 72 2c 20 43 68 61 6e 6e 65 6c 48 61 6e 64 Ptr, ChannelHand
2f20: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 ler, (ClientData
2f30: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
2f40: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d }. statePtr-
2f50: 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 >watchMask = mas
2f60: 6b 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 k;. if (state
2f70: 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29 20 Ptr->watchMask)
2f80: 7b 0a 09 2f 2a 20 53 65 74 75 70 20 61 63 74 69 {../* Setup acti
2f90: 76 65 20 6d 6f 6e 69 74 6f 72 20 66 6f 72 20 65 ve monitor for e
2fa0: 76 65 6e 74 73 20 6f 6e 20 75 6e 64 65 72 6c 79 vents on underly
2fb0: 69 6e 67 20 43 68 61 6e 6e 65 6c 20 2a 2f 0a 09 ing Channel */..
2fc0: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 Tcl_CreateChanne
2fd0: 6c 48 61 6e 64 6c 65 72 28 20 63 68 61 6e 50 74 lHandler( chanPt
2fe0: 72 2c 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 r, statePtr->wat
2ff0: 63 68 4d 61 73 6b 2c 0a 09 09 09 09 43 68 61 6e chMask,.....Chan
3000: 6e 65 6c 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 nelHandler, (Cli
3010: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
3020: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a r);. }.}.../*
3030: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3070: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 ------. *. * Get
3080: 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a HandleProc --. *
3090: 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20 . *.Called from
30a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 46 69 Tcl_GetChannelFi
30b0: 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 6f le to retrieve o
30c0: 2f 73 20 66 69 6c 65 20 68 61 6e 64 6c 65 72 0a /s file handler.
30d0: 20 2a 09 66 72 6f 6d 20 74 68 65 20 53 53 4c 20 *.from the SSL
30e0: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
30f0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nnel.. *. * Resu
3100: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 70 70 72 lts:. *.The appr
3110: 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 opriate Tcl_File
3120: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 or NULL if not
3130: 70 72 65 73 65 6e 74 2e 20 0a 20 2a 0a 20 2a 20 present. . *. *
3140: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
3150: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
31a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 47 */.static int.G
31b0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69 etHandleProc(Cli
31c0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
31d0: 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 Data,./* The soc
31e0: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 ket state. */.
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 i
3200: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 09 09 2f nt direction,../
3210: 2a 20 57 68 69 63 68 20 54 63 6c 5f 46 69 6c 65 * Which Tcl_File
3220: 20 74 6f 20 72 65 74 72 69 65 76 65 3f 20 2a 2f to retrieve? */
3230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
3240: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 ClientData *ha
3250: 6e 64 6c 65 50 74 72 29 09 2f 2a 20 57 68 65 72 ndlePtr)./* Wher
3260: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 68 e to store the h
3270: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 7b 0a 20 20 20 andle. */.{.
3280: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
3290: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
32a0: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 tanceData;..
32b0: 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 return Tcl_GetCh
32c0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 28 54 6c 73 annelHandle (Tls
32d0: 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 _GetParent(state
32e0: 50 74 72 29 2c 20 64 69 72 65 63 74 69 6f 6e 2c Ptr), direction,
32f0: 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0c handlePtr);.}..
3300: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
3340: 0a 20 2a 20 20 20 20 20 20 43 68 61 6e 6e 65 6c . * Channel
3350: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a Handler --. *. *
3360: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3390: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 20 20 20 20 20 20 ------*. *
33a0: 48 61 6e 64 6c 65 72 20 63 61 6c 6c 65 64 20 62 Handler called b
33b0: 79 20 54 63 6c 20 61 73 20 61 20 72 65 73 75 6c y Tcl as a resul
33c0: 74 20 6f 66 0a 20 2a 20 20 20 20 20 20 54 63 6c t of. * Tcl
33d0: 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 48 61 _CreateChannelHa
33e0: 6e 64 6c 65 72 20 2d 20 74 6f 20 69 6e 66 6f 72 ndler - to infor
33f0: 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 m us of activity
3400: 0a 20 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 . * on the
3410: 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e underlying chann
3420: 65 6c 2e 0a 20 2a 20 20 20 20 20 20 2d 2d 2d 2d el.. * ----
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
3460: 0a 20 2a 20 20 20 20 20 20 53 69 64 65 65 66 66 . * Sideeff
3470: 65 63 74 73 3a 0a 20 2a 20 20 20 20 20 20 20 20 ects:. *
3480: 20 20 20 20 20 20 4d 61 79 20 67 65 6e 65 72 61 May genera
3490: 74 65 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 te subsequent ca
34a0: 6c 6c 73 20 74 6f 0a 20 2a 20 20 20 20 20 20 20 lls to. *
34b0: 20 20 20 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 Tcl_Notif
34c0: 79 43 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 yChannel.. *. *
34d0: 20 20 20 20 20 52 65 73 75 6c 74 3a 0a 20 2a 20 Result:. *
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 6e Non
34f0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
3530: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 */..static void
3540: 0a 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 .ChannelHandler
3550: 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 6d 61 73 (clientData, mas
3560: 6b 29 0a 43 6c 69 65 6e 74 44 61 74 61 20 20 20 k).ClientData
3570: 20 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 69 6e clientData;.in
3580: 74 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 t mas
3590: 6b 3b 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a k;.{. State *
35a0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
35b0: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
35c0: 0a 0a 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 ..dprintf(stderr
35d0: 2c 20 22 48 41 4e 44 4c 45 52 28 30 78 25 78 29 , "HANDLER(0x%x)
35e0: 5c 6e 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 \n", mask);.
35f0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 Tcl_Preserve( (C
3600: 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 lientData)stateP
3610: 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d 61 tr);.. if (ma
3620: 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c sk & TCL_READABL
3630: 45 29 20 7b 0a 09 42 49 4f 5f 73 65 74 5f 66 6c E) {..BIO_set_fl
3640: 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f ags(statePtr->p_
3650: 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 bio, BIO_FLAGS_R
3660: 45 41 44 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 EAD);. } else
3670: 20 7b 0a 09 42 49 4f 5f 63 6c 65 61 72 5f 66 6c {..BIO_clear_fl
3680: 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f ags(statePtr->p_
3690: 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 bio, BIO_FLAGS_R
36a0: 45 41 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 EAD);. }..
36b0: 20 69 66 20 28 6d 61 73 6b 20 26 20 54 43 4c 5f if (mask & TCL_
36c0: 57 52 49 54 41 42 4c 45 29 20 7b 0a 09 42 49 4f WRITABLE) {..BIO
36d0: 5f 73 65 74 5f 66 6c 61 67 73 28 73 74 61 74 65 _set_flags(state
36e0: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f Ptr->p_bio, BIO_
36f0: 46 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 20 FLAGS_WRITE);.
3700: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f } else {..BIO_
3710: 63 6c 65 61 72 5f 66 6c 61 67 73 28 73 74 61 74 clear_flags(stat
3720: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f ePtr->p_bio, BIO
3730: 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 _FLAGS_WRITE);.
3740: 20 20 20 7d 0a 0a 20 20 20 20 6d 61 73 6b 20 3d }.. mask =
3750: 20 30 3b 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 0;. if (BIO_
3760: 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 wpending(statePt
3770: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b r->bio)) {..mask
3780: 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 |= TCL_WRITABLE
3790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
37a0: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 BIO_pending(stat
37b0: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d ePtr->bio)) {..m
37c0: 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 ask |= TCL_READA
37d0: 42 4c 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 BLE;. }.#ifde
37e0: 66 20 6e 6f 74 64 65 66 0a 20 20 20 20 2f 2a 0a f notdef. /*.
37f0: 20 20 20 20 20 2a 20 54 63 6c 5f 4e 6f 74 69 66 * Tcl_Notif
3800: 79 43 68 61 6e 6e 65 6c 20 61 6c 72 65 61 64 79 yChannel already
3810: 20 72 75 6e 73 20 74 68 72 6f 75 67 68 20 74 68 runs through th
3820: 65 20 6c 69 73 74 20 6f 66 20 73 74 61 63 6b 65 e list of stacke
3830: 64 0a 20 20 20 20 20 2a 20 63 68 61 6e 6e 65 6c d. * channel
3840: 73 20 64 6f 69 6e 67 20 63 68 61 69 6e 65 64 20 s doing chained
3850: 6e 6f 74 69 66 69 63 61 74 69 6f 6e 73 2e 20 20 notifications.
3860: 4e 6f 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 No need to do th
3870: 69 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 is.. */.
3880: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
3890: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 l(statePtr->self
38a0: 2c 20 6d 61 73 6b 29 3b 0a 23 65 6e 64 69 66 0a , mask);.#endif.
38b0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
38c0: 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c r->timer != (Tcl
38d0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c _TimerToken)NULL
38e0: 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 ) {..Tcl_DeleteT
38f0: 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 imerHandler(stat
3900: 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 ePtr->timer);..s
3910: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
3920: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
3930: 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 )NULL;. }.
3940: 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c if ((mask & TCL
3950: 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 54 63 _READABLE) && Tc
3960: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 20 l_InputBuffered
3970: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
3980: 20 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 > 0) {../*.. *
3990: 44 61 74 61 20 69 73 20 77 61 69 74 69 6e 67 2c Data is waiting,
39a0: 20 66 6c 75 73 68 20 69 74 20 6f 75 74 20 69 6e flush it out in
39b0: 20 73 68 6f 72 74 20 74 69 6d 65 0a 09 20 2a 2f short time.. */
39c0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
39d0: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 r = Tcl_CreateTi
39e0: 6d 65 72 48 61 6e 64 6c 65 72 20 28 54 4c 53 5f merHandler (TLS_
39f0: 54 43 4c 5f 44 45 4c 41 59 2c 20 43 68 61 6e 6e TCL_DELAY, Chann
3a00: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 0a elHandlerTimer,.
3a10: 09 09 09 09 09 20 20 20 28 43 6c 69 65 6e 74 44 ..... (ClientD
3a20: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3a30: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 }. Tcl_Re
3a40: 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 lease( (ClientDa
3a50: 74 61 29 73 74 61 74 65 50 74 72 29 3b 0a 7d 0a ta)statePtr);.}.
3a60: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
3aa0: 2a 0a 20 2a 09 43 68 61 6e 6e 65 6c 48 61 6e 64 *. *.ChannelHand
3ab0: 6c 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 lerTimer --. *.
3ac0: 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
3ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3af0: 2d 2d 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 --*. *.Called by
3b00: 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d the notifier (-
3b10: 3e 20 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 > timer) to flus
3b20: 68 20 6f 75 74 0a 20 2a 09 69 6e 66 6f 72 6d 61 h out. *.informa
3b30: 74 69 6f 6e 20 77 61 69 74 69 6e 67 20 69 6e 20 tion waiting in
3b40: 63 68 61 6e 6e 65 6c 20 62 75 66 66 65 72 73 2e channel buffers.
3b50: 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b80: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
3b90: 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 effects:. *..As
3ba0: 6f 66 20 27 43 68 61 6e 6e 65 6c 48 61 6e 64 6c of 'ChannelHandl
3bb0: 65 72 27 2e 0a 20 2a 0a 20 2a 09 52 65 73 75 6c er'.. *. *.Resul
3bc0: 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a 0a t:. *..None.. *.
3bd0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 --------*. */..s
3c10: 74 61 74 69 63 20 76 6f 69 64 0a 43 68 61 6e 6e tatic void.Chann
3c20: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 28 elHandlerTimer (
3c30: 63 6c 69 65 6e 74 44 61 74 61 29 0a 43 6c 69 65 clientData).Clie
3c40: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
3c50: 61 3b 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 61 a; /* Transforma
3c60: 74 69 6f 6e 20 74 6f 20 71 75 65 72 79 20 2a 2f tion to query */
3c70: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 .{. State *st
3c80: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
3c90: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 *) clientData;.
3ca0: 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b int mask = 0;
3cb0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
3cc0: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d timer = (Tcl_Tim
3cd0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a erToken) NULL;..
3ce0: 20 20 20 20 69 66 20 28 42 49 4f 5f 77 70 65 6e if (BIO_wpen
3cf0: 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 ding(statePtr->b
3d00: 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 io)) {..mask |=
3d10: 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 TCL_WRITABLE;.
3d20: 20 20 7d 0a 20 20 20 20 69 66 20 28 42 49 4f 5f }. if (BIO_
3d30: 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 pending(statePtr
3d40: 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 ->bio)) {..mask
3d50: 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b |= TCL_READABLE;
3d60: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4e . }. Tcl_N
3d70: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 otifyChannel(sta
3d80: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 tePtr->self, mas
3d90: 6b 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d k);.}.../*. *---
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3dd0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 57 ---*. *. *.Tls_W
3de0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d 2d aitForConnect --
3df0: 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63 . *. *.Sideeffec
3e00: 74 73 3a 0a 20 2a 09 09 49 73 73 75 65 73 20 53 ts:. *..Issues S
3e10: 53 4c 5f 61 63 63 65 70 74 20 6f 72 20 53 53 4c SL_accept or SSL
3e20: 5f 63 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 09 52 _connect. *. *.R
3e30: 65 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e esult:. *..None.
3e40: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
3e80: 2f 0a 69 6e 74 0a 54 6c 73 5f 57 61 69 74 46 6f /.int.Tls_WaitFo
3e90: 72 43 6f 6e 6e 65 63 74 28 20 73 74 61 74 65 50 rConnect( stateP
3ea0: 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 tr, errorCodePtr
3eb0: 29 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 ). State *sta
3ec0: 74 65 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 2a tePtr;. int *
3ed0: 65 72 72 6f 72 43 6f 64 65 50 74 72 3b 09 09 2f errorCodePtr;../
3ee0: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 * Where to store
3ef0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a error code. */.
3f00: 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 0a {. int err;..
3f10: 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 dprintf(stde
3f20: 72 72 2c 22 5c 6e 57 61 69 74 46 6f 72 43 6f 6e rr,"\nWaitForCon
3f30: 6e 65 63 74 28 30 78 25 78 29 22 2c 20 73 74 61 nect(0x%x)", sta
3f40: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 66 6f 72 tePtr);.. for
3f50: 20 28 3b 3b 29 20 7b 0a 09 2f 2a 20 4e 6f 74 20 (;;) {../* Not
3f60: 69 6e 69 74 69 61 6c 69 7a 65 64 20 79 65 74 21 initialized yet!
3f70: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 */..if (statePt
3f80: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
3f90: 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 CL_SERVER) {..
3fa0: 20 20 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 65 err = SSL_acce
3fb0: 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c pt(statePtr->ssl
3fc0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
3fd0: 20 20 65 72 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e err = SSL_conn
3fe0: 65 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ect(statePtr->ss
3ff0: 6c 29 3b 0a 09 7d 0a 09 2f 2a 53 53 4c 5f 77 72 l);..}../*SSL_wr
4000: 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ite(statePtr->ss
4010: 6c 2c 20 28 63 68 61 72 2a 29 26 65 72 72 2c 20 l, (char*)&err,
4020: 30 29 3b 09 48 41 43 4b 21 21 21 20 2a 2f 0a 09 0);.HACK!!! */..
4030: 69 66 20 28 65 72 72 20 3e 20 30 29 0a 09 20 20 if (err > 0)..
4040: 20 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 BIO_flush(stat
4050: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 69 66 ePtr->bio);...if
4060: 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 (err <= 0) {..
4070: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 53 4c 5f int rc = SSL_
4080: 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 get_error(stateP
4090: 74 72 2d 3e 73 73 6c 2c 20 65 72 72 29 3b 0a 0a tr->ssl, err);..
40a0: 09 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 . if (rc == S
40b0: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 29 20 7b 0a SL_ERROR_SSL) {.
40c0: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 ..Tls_Error(stat
40d0: 65 50 74 72 2c 20 28 63 68 61 72 2a 29 45 52 52 ePtr, (char*)ERR
40e0: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 _reason_error_st
40f0: 72 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72 ring(ERR_get_err
4100: 6f 72 28 29 29 29 3b 0a 09 09 2a 65 72 72 6f 72 or()));...*error
4110: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 CodePtr = ECONNA
4120: 42 4f 52 54 45 44 3b 0a 09 09 72 65 74 75 72 6e BORTED;...return
4130: 20 2d 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 -1;.. } else
4140: 20 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f if (BIO_should_
4150: 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e retry(statePtr->
4160: 62 69 6f 29 29 20 7b 0a 09 09 69 66 20 28 73 74 bio)) {...if (st
4170: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
4180: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b TLS_TCL_ASYNC) {
4190: 0a 09 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 ... dprintf(s
41a0: 74 64 65 72 72 2c 22 45 21 20 22 29 3b 0a 09 09 tderr,"E! ");...
41b0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
41c0: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 09 20 20 r = EAGAIN;...
41d0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 09 7d return -1;...}
41e0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 63 6f else {... co
41f0: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 09 20 20 20 ntinue;...}..
4200: 20 7d 20 65 6c 73 65 20 69 66 20 28 65 72 72 20 } else if (err
4210: 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 == 0) {...dprint
4220: 66 28 73 74 64 65 72 72 2c 22 43 52 21 20 22 29 f(stderr,"CR! ")
4230: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 ;...*errorCodePt
4240: 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a r = ECONNRESET;.
4250: 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 ..return -1;..
4260: 20 20 7d 0a 09 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
4270: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
4280: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b LS_TCL_SERVER) {
4290: 0a 09 09 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 ...err = SSL_get
42a0: 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 _verify_result(s
42b0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
42c0: 09 69 66 20 28 65 72 72 20 21 3d 20 58 35 30 39 .if (err != X509
42d0: 5f 56 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 54 _V_OK) {... T
42e0: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
42f0: 72 2c 20 28 63 68 61 72 2a 29 58 35 30 39 5f 76 r, (char*)X509_v
4300: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
4310: 5f 73 74 72 69 6e 67 28 65 72 72 29 29 3b 0a 09 _string(err));..
4320: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
4330: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 tr = ECONNABORTE
4340: 44 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 D;... return
4350: 2d 31 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 -1;...}.. }..
4360: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
4370: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f r = Tcl_GetErrno
4380: 28 29 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ();.. dprintf
4390: 28 73 74 64 65 72 72 2c 22 45 52 52 28 25 64 2c (stderr,"ERR(%d,
43a0: 20 25 64 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 %d) ", rc, *err
43b0: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 orCodePtr);..
43c0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 return -1;..}..
43d0: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
43e0: 52 30 21 20 22 29 3b 0a 09 72 65 74 75 72 6e 20 R0! ");..return
43f0: 31 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 54 63 6c 5f 1;. }.}..Tcl_
4400: 43 68 61 6e 6e 65 6c 0a 54 6c 73 5f 47 65 74 50 Channel.Tls_GetP
4410: 61 72 65 6e 74 28 20 73 74 61 74 65 50 74 72 20 arent( statePtr
4420: 29 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 ). State *sta
4430: 74 65 50 74 72 3b 0a 7b 0a 23 69 66 20 54 43 4c tePtr;.{.#if TCL
4440: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d _MAJOR_VERSION =
4450: 3d 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 = 8 && TCL_MINOR
4460: 5f 56 45 52 53 49 4f 4e 20 3c 20 32 0a 20 20 20 _VERSION < 2.
4470: 20 72 65 74 75 72 6e 20 73 74 61 74 65 50 74 72 return statePtr
4480: 2d 3e 70 61 72 65 6e 74 3b 0a 23 65 6c 73 65 0a ->parent;.#else.
4490: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 73 6f /* The reaso
44a0: 6e 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 65 n for the existe
44b0: 6e 63 65 20 6f 66 20 74 68 69 73 20 70 72 6f 63 nce of this proc
44c0: 65 64 75 72 65 20 69 73 0a 20 20 20 20 20 2a 20 edure is. *
44d0: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 73 74 the fact that st
44e0: 61 63 6b 69 6e 67 20 61 20 74 72 61 6e 73 66 6f acking a transfo
44f0: 72 6d 20 6f 76 65 72 20 61 6e 6f 74 68 65 72 0a rm over another.
4500: 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d * transform
4510: 20 77 69 6c 6c 20 6c 65 61 76 65 20 6f 75 72 20 will leave our
4520: 69 6e 74 65 72 6e 61 6c 20 70 6f 69 6e 74 65 72 internal pointer
4530: 20 75 6e 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 unchanged,.
4540: 20 2a 20 61 6e 64 20 74 68 75 73 20 70 6f 69 6e * and thus poin
4550: 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 ting to the new
4560: 74 72 61 6e 73 66 6f 72 6d 2c 20 61 6e 64 20 6e transform, and n
4570: 6f 74 20 74 68 65 0a 20 20 20 20 20 2a 20 43 68 ot the. * Ch
4580: 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 annel structure
4590: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 containing the s
45a0: 61 76 65 64 20 73 74 61 74 65 20 6f 66 20 74 68 aved state of th
45b0: 69 73 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 66 is. * transf
45c0: 6f 72 6d 2e 20 54 68 69 73 20 69 73 20 74 68 65 orm. This is the
45d0: 20 70 72 69 63 65 20 74 6f 20 70 61 79 20 66 6f price to pay fo
45e0: 72 20 6c 65 61 76 69 6e 67 0a 20 20 20 20 20 2a r leaving. *
45f0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 72 65 66 Tcl_Channel ref
4600: 65 72 65 6e 63 65 73 20 69 6e 74 61 63 74 2e 20 erences intact.
4610: 54 68 65 20 6f 6e 6c 79 20 6f 74 68 65 72 20 73 The only other s
4620: 6f 6c 75 74 69 6f 6e 0a 20 20 20 20 20 2a 20 69 olution. * i
4630: 73 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6f s an extension o
4640: 66 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 f Tcl_ChannelTyp
4650: 65 20 77 69 74 68 20 61 6e 6f 74 68 65 72 20 64 e with another d
4660: 72 69 76 65 72 0a 20 20 20 20 20 2a 20 70 72 6f river. * pro
4670: 63 65 64 75 72 65 20 74 6f 20 6e 6f 74 69 66 79 cedure to notify
4680: 20 61 20 43 68 61 6e 6e 65 6c 20 61 62 6f 75 74 a Channel about
4690: 20 74 68 65 20 28 75 6e 29 73 74 61 63 6b 69 6e the (un)stackin
46a0: 67 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a g.. *. *
46b0: 20 49 74 20 77 61 6c 6b 73 20 74 68 65 20 63 68 It walks the ch
46c0: 61 69 6e 20 6f 66 20 43 68 61 6e 6e 65 6c 20 73 ain of Channel s
46d0: 74 72 75 63 74 75 72 65 73 20 75 6e 74 69 6c 20 tructures until
46e0: 69 74 0a 20 20 20 20 20 2a 20 66 69 6e 64 73 20 it. * finds
46f0: 74 68 65 20 6f 6e 65 20 70 6f 69 6e 74 69 6e 67 the one pointing
4700: 20 68 61 76 69 6e 67 20 27 63 74 72 6c 27 20 61 having 'ctrl' a
4710: 73 20 69 6e 73 74 61 6e 63 65 44 61 74 61 0a 20 s instanceData.
4720: 20 20 20 20 2a 20 61 6e 64 20 74 68 65 6e 20 72 * and then r
4730: 65 74 75 72 6e 73 20 74 68 65 20 73 75 70 65 72 eturns the super
4740: 63 65 64 69 6e 67 20 63 68 61 6e 6e 65 6c 20 74 ceding channel t
4750: 6f 20 74 68 61 74 2e 20 28 41 4b 29 0a 20 20 20 o that. (AK).
4760: 20 20 2a 2f 0a 20 0a 20 20 54 63 6c 5f 43 68 61 */. . Tcl_Cha
4770: 6e 6e 65 6c 20 73 65 6c 66 20 3d 20 73 74 61 74 nnel self = stat
4780: 65 50 74 72 2d 3e 73 65 6c 66 3b 0a 20 20 54 63 ePtr->self;. Tc
4790: 6c 5f 43 68 61 6e 6e 65 6c 20 6e 65 78 74 3b 0a l_Channel next;.
47a0: 0a 20 20 77 68 69 6c 65 20 28 28 43 6c 69 65 6e . while ((Clien
47b0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 20 tData) statePtr
47c0: 21 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 != Tcl_GetChanne
47d0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 20 28 73 lInstanceData (s
47e0: 65 6c 66 29 29 20 7b 0a 20 20 20 20 6e 65 78 74 elf)) {. next
47f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
4800: 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29 3b dChannel (self);
4810: 0a 20 20 20 20 69 66 20 28 6e 65 78 74 20 3d 3d . if (next ==
4820: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
4830: 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 ULL) {. /*
4840: 30 39 2f 32 34 2f 31 39 39 39 20 55 6e 73 74 61 09/24/1999 Unsta
4850: 63 6b 69 6e 67 20 62 75 67 2c 20 66 6f 75 6e 64 cking bug, found
4860: 20 62 79 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 by Matt Newman
4870: 3c 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f 72 67 <matt@sensus.org
4880: 3e 2e 0a 20 20 20 20 20 20 20 2a 0a 20 20 20 20 >.. *.
4890: 20 20 20 2a 20 57 65 20 77 65 72 65 20 75 6e 61 * We were una
48a0: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 ble to find the
48b0: 63 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 channel structur
48c0: 65 20 66 6f 72 20 74 68 69 73 0a 20 20 20 20 20 e for this.
48d0: 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 * transformati
48e0: 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 69 6e 20 on in the chain
48f0: 6f 66 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e of stacked chann
4900: 65 6c 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 el. This.
4910: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 * means that we
4920: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e are currently in
4930: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 the process of
4940: 75 6e 73 74 61 63 6b 69 6e 67 0a 20 20 20 20 20 unstacking.
4950: 20 20 2a 20 69 74 20 2a 61 6e 64 2a 20 74 68 65 * it *and* the
4960: 72 65 20 77 65 72 65 20 73 6f 6d 65 20 62 79 74 re were some byt
4970: 65 73 20 77 61 69 74 69 6e 67 20 77 68 69 63 68 es waiting which
4980: 20 61 72 65 20 6e 6f 77 0a 20 20 20 20 20 20 20 are now.
4990: 2a 20 66 6c 75 73 68 65 64 2e 20 49 6e 20 74 68 * flushed. In th
49a0: 69 73 20 73 69 74 75 61 74 69 6f 6e 20 74 68 65 is situation the
49b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 pointer to the
49c0: 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 20 20 2a channel. *
49d0: 20 69 74 73 65 6c 66 20 61 6c 72 65 61 64 79 20 itself already
49e0: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 70 61 refers to the pa
49f0: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 77 65 20 rent channel we
4a00: 68 61 76 65 20 74 6f 0a 20 20 20 20 20 20 20 2a have to. *
4a10: 20 77 72 69 74 65 20 74 68 65 20 62 79 74 65 73 write the bytes
4a20: 20 69 6e 74 6f 2c 20 73 6f 20 77 65 20 72 65 74 into, so we ret
4a30: 75 72 6e 20 74 68 61 74 2e 0a 20 20 20 20 20 20 urn that..
4a40: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e */. return
4a50: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b statePtr->self;
4a60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6c 66 20 . }. self
4a70: 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 = next;. }.. r
4a80: 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 eturn Tcl_GetSta
4a90: 63 6b 65 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c ckedChannel (sel
4aa0: 66 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a f);.#endif.}.