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 37 2e 32 2e 31 20 32 30 30 .c,v 1.7.2.1 200
0090: 30 2f 30 37 2f 31 31 20 30 34 3a 35 38 3a 34 36 0/07/11 04:58:46
00a0: 20 68 6f 62 62 73 20 45 78 70 20 24 0a 20 2a 0a hobbs Exp $. *.
00b0: 20 2a 20 54 4c 53 20 28 61 6b 61 20 53 53 4c 29 * TLS (aka SSL)
00c0: 20 43 68 61 6e 6e 65 6c 20 2d 20 63 61 6e 20 62 Channel - can b
00d0: 65 20 6c 61 79 65 72 65 64 20 6f 6e 20 61 6e 79 e layered on any
00e0: 20 62 69 2d 64 69 72 65 63 74 69 6f 6e 61 6c 0a bi-directional.
00f0: 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 28 * Tcl_Channel (
0100: 4e 6f 74 65 3a 20 52 65 71 75 69 72 65 73 20 54 Note: Requires T
0110: 72 66 20 43 6f 72 65 20 50 61 74 63 68 29 0a 20 rf Core Patch).
0120: 2a 0a 20 2a 20 54 68 69 73 20 77 61 73 20 62 75 *. * This was bu
0130: 69 6c 74 20 66 72 6f 6d 20 73 63 72 61 74 63 68 ilt from scratch
0140: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
0150: 72 76 61 74 69 6f 6e 20 6f 66 20 4f 70 65 6e 53 rvation of OpenS
0160: 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a 20 2a 20 SL 0.9.2B. *. *
0170: 41 64 64 69 74 69 6f 6e 20 63 72 65 64 69 74 20 Addition credit
0180: 69 73 20 64 75 65 20 66 6f 72 20 41 6e 64 72 65 is due for Andre
0190: 61 73 20 4b 75 70 72 69 65 73 20 28 61 2e 6b 75 as Kupries (a.ku
01a0: 70 72 69 65 73 40 77 65 73 74 65 6e 64 2e 63 6f pries@westend.co
01b0: 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 69 m), for. * provi
01c0: 64 69 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 70 ding the Tcl_Rep
01d0: 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 68 laceChannel mech
01e0: 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 6e anism and workin
01f0: 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 6d g closely with m
0200: 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 20 e. * to enhance
0210: 69 74 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75 it to support fu
0220: 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 73 65 6d ll fileevent sem
0230: 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c antics.. *. * Al
0240: 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 20 so work done by
0250: 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c the follow peopl
0260: 65 20 70 72 6f 76 69 64 65 64 20 74 68 65 20 69 e provided the i
0270: 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 74 68 69 mpetus to do thi
0280: 73 20 22 72 69 67 68 74 22 3a 0a 20 2a 09 74 63 s "right":. *.tc
0290: 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d 63 43 6f lSSL (Colin McCo
02a0: 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 20 54 65 rmack, Shared Te
02b0: 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 53 53 4c chnology). *.SSL
02c0: 74 63 6c 20 28 50 65 74 65 72 20 41 6e 74 6d 61 tcl (Peter Antma
02d0: 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c n). *. */..#incl
02e0: 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 0a ude "tlsInt.h"..
02f0: 2f 2a 0a 20 2a 20 45 78 74 65 72 6e 61 6c 20 66 /*. * External f
0300: 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a unctions. */../*
0310: 0a 20 2a 20 4c 6f 63 61 6c 20 44 65 66 69 6e 65 . * Local Define
0320: 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 s. */../*. * For
0330: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e ward declaration
0340: 73 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e s. */..static in
0350: 74 09 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 t.BlockModeProc
0360: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c 69 _ANSI_ARGS_((Cli
0370: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
0380: 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 29 Data, int mode))
0390: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 43 6c 6f ;.static int.Clo
03a0: 73 65 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 seProc _ANSI_ARG
03b0: 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 S_ ((ClientData
03c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 instanceData, Tc
03d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
03e0: 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 49 ));.static int.I
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 20 20 20 20 63 68 61 72 20 2a 62 75 66 2c .. char *buf,
0430: 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 20 69 6e int bufSize, in
0440: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 t *errorCodePtr)
0450: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 4f 75 );.static int.Ou
0460: 74 70 75 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41 tputProc _ANSI_A
0470: 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 RGS_((ClientData
0480: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 instanceData,..
0490: 09 09 20 20 20 20 63 68 61 72 20 2a 62 75 66 2c .. char *buf,
04a0: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e int toWrite, in
04b0: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 t *errorCodePtr)
04c0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 47 65 );.static int.Ge
04d0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 5f 41 4e 53 tOptionProc _ANS
04e0: 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 I_ARGS_ ((Client
04f0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
0500: 61 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 49 6e a,.... Tcl_In
0510: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 terp *interp, ch
0520: 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 ar *optionName,
0530: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 Tcl_DString *dsP
0540: 74 72 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 tr));.static voi
0550: 64 09 57 61 74 63 68 50 72 6f 63 20 5f 41 4e 53 d.WatchProc _ANS
0560: 49 5f 41 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 I_ARGS_((ClientD
0570: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 ata instanceData
0580: 2c 20 69 6e 74 20 6d 61 73 6b 29 29 3b 0a 73 74 , int mask));.st
0590: 61 74 69 63 20 69 6e 74 09 47 65 74 48 61 6e 64 atic int.GetHand
05a0: 6c 65 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 leProc _ANSI_ARG
05b0: 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 S_ ((ClientData
05c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 instanceData,...
05d0: 09 20 20 20 20 69 6e 74 20 64 69 72 65 63 74 69 . int directi
05e0: 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a on, ClientData *
05f0: 68 61 6e 64 6c 65 50 74 72 29 29 3b 0a 73 74 61 handlePtr));.sta
0600: 74 69 63 20 76 6f 69 64 09 43 68 61 6e 6e 65 6c tic void.Channel
0610: 48 61 6e 64 6c 65 72 20 5f 41 4e 53 49 5f 41 52 Handler _ANSI_AR
0620: 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 GS_ ((ClientData
0630: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 clientData, int
0640: 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 mask));.static
0650: 76 6f 69 64 09 43 68 61 6e 6e 65 6c 48 61 6e 64 void.ChannelHand
0660: 6c 65 72 54 69 6d 65 72 20 5f 41 4e 53 49 5f 41 lerTimer _ANSI_A
0670: 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 RGS_ ((ClientDat
0680: 61 20 63 6c 69 65 6e 74 44 61 74 61 29 29 3b 0a a clientData));.
0690: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75 ./*. * This stru
06a0: 63 74 75 72 65 20 64 65 73 63 72 69 62 65 73 20 cture describes
06b0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 the channel type
06c0: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 54 structure for T
06d0: 43 50 20 73 6f 63 6b 65 74 0a 20 2a 20 62 61 73 CP socket. * bas
06e0: 65 64 20 49 4f 3a 0a 20 2a 2f 0a 23 69 66 64 65 ed IO:. */.#ifde
06f0: 66 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 f TCL_CHANNEL_VE
0700: 52 53 49 4f 4e 5f 32 0a 73 74 61 74 69 63 20 54 RSION_2.static T
0710: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 cl_ChannelType t
0720: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 lsChannelType =
0730: 7b 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 2f 2a {. "tls",../*
0740: 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 Type name. */.
0750: 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 TCL_CHANNEL_V
0760: 45 52 53 49 4f 4e 5f 32 2c 09 2f 2a 20 41 20 4e ERSION_2,./* A N
0770: 47 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 G channel */.
0780: 20 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 CloseProc,../*
0790: 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a 2f 0a 20 Close proc. */.
07a0: 20 20 20 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f InputProc,../
07b0: 2a 20 49 6e 70 75 74 20 70 72 6f 63 2e 20 2a 2f * Input proc. */
07c0: 0a 20 20 20 20 4f 75 74 70 75 74 50 72 6f 63 2c . OutputProc,
07d0: 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 ../* Output proc
07e0: 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 . */. NULL,..
07f0: 2f 2a 20 53 65 65 6b 20 70 72 6f 63 2e 20 2a 2f /* Seek proc. */
0800: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 . NULL,../* S
0810: 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20 et option proc.
0820: 2a 2f 0a 20 20 20 20 47 65 74 4f 70 74 69 6f 6e */. GetOption
0830: 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 Proc,./* Get opt
0840: 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 ion proc. */.
0850: 20 57 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 WatchProc,../*
0860: 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 Initialize notif
0870: 69 65 72 2e 20 2a 2f 0a 20 20 20 20 47 65 74 48 ier. */. GetH
0880: 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 andleProc,./* Ge
0890: 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f 75 t file handle ou
08a0: 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f t of channel. */
08b0: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 43 . NULL,../* C
08c0: 6c 6f 73 65 32 50 72 6f 63 2e 20 2a 2f 0a 20 20 lose2Proc. */.
08d0: 20 20 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c BlockModeProc,
08e0: 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 ./* Set blocking
08f0: 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 /nonblocking mod
0900: 65 2e 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 e.*/. NULL,..
0910: 2f 2a 20 46 6c 75 73 68 50 72 6f 63 2e 20 2a 2f /* FlushProc. */
0920: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 68 . NULL,../* h
0930: 61 6e 64 6c 65 72 50 72 6f 63 2e 20 2a 2f 0a 7d andlerProc. */.}
0940: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 54 ;.#else.static T
0950: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 cl_ChannelType t
0960: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 lsChannelType =
0970: 7b 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 2f 2a {. "tls",../*
0980: 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 Type name. */.
0990: 20 20 20 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 BlockModeProc
09a0: 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e ,./* Set blockin
09b0: 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f g/nonblocking mo
09c0: 64 65 2e 2a 2f 0a 20 20 20 20 43 6c 6f 73 65 50 de.*/. CloseP
09d0: 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 roc,../* Close p
09e0: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 49 6e 70 75 roc. */. Inpu
09f0: 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 tProc,../* Input
0a00: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4f 75 proc. */. Ou
0a10: 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 tputProc,../* Ou
0a20: 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 tput proc. */.
0a30: 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b NULL,../* Seek
0a40: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 proc. */. NU
0a50: 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 LL,../* Set opti
0a60: 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 on proc. */.
0a70: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f GetOptionProc,./
0a80: 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f * Get option pro
0a90: 63 2e 20 2a 2f 0a 20 20 20 20 57 61 74 63 68 50 c. */. WatchP
0aa0: 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c roc,../* Initial
0ab0: 69 7a 65 20 6e 6f 74 69 66 69 65 72 2e 20 2a 2f ize notifier. */
0ac0: 0a 20 20 20 20 47 65 74 48 61 6e 64 6c 65 50 72 . GetHandlePr
0ad0: 6f 63 2c 09 2f 2a 20 47 65 74 20 66 69 6c 65 20 oc,./* Get file
0ae0: 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 63 68 handle out of ch
0af0: 61 6e 6e 65 6c 2e 20 2a 2f 0a 7d 3b 0a 23 65 6e annel. */.};.#en
0b00: 64 69 66 0a 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c dif..Tcl_Channel
0b10: 54 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 Type *Tls_Channe
0b20: 6c 54 79 70 65 28 29 0a 7b 0a 20 20 20 20 72 65 lType().{. re
0b30: 74 75 72 6e 20 26 74 6c 73 43 68 61 6e 6e 65 6c turn &tlsChannel
0b40: 54 79 70 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Type;.}.../*. *-
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b90: 2d 2d 0a 20 2a 0a 20 2a 20 42 6c 6f 63 6b 4d 6f --. *. * BlockMo
0ba0: 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 deProc --. *. *.
0bb0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
0bc0: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 s invoked by the
0bd0: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 generic IO leve
0be0: 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 73 65 l. * to se
0bf0: 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e t blocking and n
0c00: 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 onblocking modes
0c10: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
0c20: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0 if successful,
0c30: 20 65 72 72 6e 6f 20 77 68 65 6e 20 66 61 69 6c errno when fail
0c40: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ed.. *. * Side e
0c50: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
0c60: 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20 the device into
0c70: 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 blocking or nonb
0c80: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a locking mode.. *
0c90: 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cd0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
0ce0: 69 63 20 69 6e 74 0a 42 6c 6f 63 6b 4d 6f 64 65 ic int.BlockMode
0cf0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
0d00: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a instanceData,./*
0d10: 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a Socket state. *
0d20: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 /.
0d30: 20 20 20 69 6e 74 20 6d 6f 64 65 29 09 09 09 2f int mode).../
0d40: 2a 20 54 68 65 20 6d 6f 64 65 20 74 6f 20 73 65 * The mode to se
0d50: 74 2e 20 43 61 6e 20 62 65 20 6f 6e 65 20 6f 66 t. Can be one of
0d60: 0a 09 09 09 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 .......* TCL_MOD
0d70: 45 5f 42 4c 4f 43 4b 49 4e 47 20 6f 72 0a 09 09 E_BLOCKING or...
0d80: 09 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 5f 4e ....* TCL_MODE_N
0d90: 4f 4e 42 4c 4f 43 4b 49 4e 47 2e 20 2a 2f 0a 7b ONBLOCKING. */.{
0da0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
0db0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
0dc0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a instanceData;..
0dd0: 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 if (mode ==
0de0: 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 TCL_MODE_NONBLOC
0df0: 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 KING) {..statePt
0e00: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
0e10: 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d TCL_ASYNC;. }
0e20: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 else {..statePt
0e30: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
0e40: 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 S_TCL_ASYNC);.
0e50: 20 20 7d 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 }.#ifdef TCL_C
0e60: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 HANNEL_VERSION_2
0e70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 . return 0;.#
0e80: 65 6c 73 65 0a 20 20 20 20 72 65 74 75 72 6e 20 else. return
0e90: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
0ea0: 74 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 69 tion(statePtr->i
0eb0: 6e 74 65 72 70 2c 20 54 6c 73 5f 47 65 74 50 61 nterp, Tls_GetPa
0ec0: 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 2c 0a rent(statePtr),.
0ed0: 09 09 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 28 .."-blocking", (
0ee0: 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 mode == TCL_MODE
0ef0: 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 3f 20 _NONBLOCKING) ?
0f00: 22 30 22 20 3a 20 22 31 22 29 3b 0a 23 65 6e 64 "0" : "1");.#end
0f10: 69 66 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d if.}.../*. *----
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0f60: 20 2a 0a 20 2a 20 43 6c 6f 73 65 50 72 6f 63 20 *. * CloseProc
0f70: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
0f80: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
0f90: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
0fa0: 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 c IO level to pe
0fb0: 72 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c rform. *.channel
0fc0: 2d 74 79 70 65 2d 73 70 65 63 69 66 69 63 20 63 -type-specific c
0fd0: 6c 65 61 6e 75 70 20 77 68 65 6e 20 61 20 53 53 leanup when a SS
0fe0: 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
0ff0: 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
1000: 73 65 64 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a sed.. *. *.Note:
1010: 20 77 65 20 6c 65 61 76 65 20 74 68 65 20 75 6e we leave the un
1020: 64 65 72 6c 79 69 6e 67 20 73 6f 63 6b 65 74 20 derlying socket
1030: 61 6c 6f 6e 65 2c 20 69 73 20 74 68 69 73 20 72 alone, is this r
1040: 69 67 68 74 3f 0a 20 2a 0a 20 2a 20 52 65 73 75 ight?. *. * Resu
1050: 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 lts:. *.0 if suc
1060: 63 65 73 73 66 75 6c 2c 20 74 68 65 20 76 61 6c cessful, the val
1070: 75 65 20 6f 66 20 54 63 6c 5f 47 65 74 45 72 72 ue of Tcl_GetErr
1080: 6e 6f 28 29 20 69 66 20 66 61 69 6c 65 64 2e 0a no() if failed..
1090: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
10a0: 74 73 3a 0a 20 2a 09 43 6c 6f 73 65 73 20 74 68 ts:. *.Closes th
10b0: 65 20 73 6f 63 6b 65 74 20 6f 66 20 74 68 65 20 e socket of the
10c0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
10d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1110: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
1120: 0a 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e .CloseProc(Clien
1130: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
1140: 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 ta,./* The socke
1150: 74 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 20 t to close. */.
1160: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f Tcl_
1170: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 09 Interp *interp).
1180: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70 /* For error rep
1190: 6f 72 74 69 6e 67 20 2d 20 75 6e 75 73 65 64 2e orting - unused.
11a0: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 */.{. State
11b0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
11c0: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 te *) instanceDa
11d0: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ta;.. dprintf
11e0: 28 73 74 64 65 72 72 2c 22 5c 6e 43 6c 6f 73 65 (stderr,"\nClose
11f0: 50 72 6f 63 28 30 78 25 78 29 22 2c 20 73 74 61 Proc(0x%x)", sta
1200: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a tePtr);.. /*.
1210: 20 20 20 20 20 2a 20 52 65 6d 6f 76 65 20 65 76 * Remove ev
1220: 65 6e 74 20 68 61 6e 64 6c 65 72 20 74 6f 20 75 ent handler to u
1230: 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 nderlying channe
1240: 6c 2c 20 74 68 69 73 20 63 6f 75 6c 64 0a 20 20 l, this could.
1250: 20 20 20 2a 20 62 65 20 62 65 63 61 75 73 65 20 * be because
1260: 77 65 20 61 72 65 20 63 6c 6f 73 69 6e 67 20 66 we are closing f
1270: 6f 72 20 72 65 61 6c 2c 20 6f 72 20 62 65 69 6e or real, or bein
1280: 67 20 22 75 6e 73 74 61 63 6b 65 64 22 2e 0a 20 g "unstacked"..
1290: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f */.. Tcl_
12a0: 44 65 6c 65 74 65 43 68 61 6e 6e 65 6c 48 61 6e DeleteChannelHan
12b0: 64 6c 65 72 28 54 6c 73 5f 47 65 74 50 61 72 65 dler(Tls_GetPare
12c0: 6e 74 28 73 74 61 74 65 50 74 72 29 2c 0a 09 43 nt(statePtr),..C
12d0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 2c 20 28 hannelHandler, (
12e0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
12f0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
1300: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
1310: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
1320: 65 6e 29 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f en)NULL) {..Tcl_
1330: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c DeleteTimerHandl
1340: 65 72 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 er (statePtr->ti
1350: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
1360: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
1370: 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b 0a 20 merToken)NULL;.
1380: 20 20 20 7d 0a 0a 20 20 20 20 54 6c 73 5f 43 6c }.. Tls_Cl
1390: 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 ean(statePtr);.
13a0: 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c Tcl_Eventuall
13b0: 79 46 72 65 65 28 20 28 43 6c 69 65 6e 74 44 61 yFree( (ClientDa
13c0: 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c 73 ta)statePtr, Tls
13d0: 5f 46 72 65 65 29 3b 0a 20 20 20 20 72 65 74 75 _Free);. retu
13e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
13f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e -------. *. * In
1440: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a putProc --. *. *
1450: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
1460: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 is invoked by th
1470: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 e generic IO lev
1480: 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 72 el. * to r
1490: 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 ead input from a
14a0: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
14b0: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a d channel.. *. *
14c0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 Results:. *.The
14d0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
14e0: 20 72 65 61 64 20 69 73 20 72 65 74 75 72 6e 65 read is returne
14f0: 64 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 d or -1 on error
1500: 2e 20 41 6e 20 6f 75 74 70 75 74 0a 20 2a 09 61 . An output. *.a
1510: 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 rgument contains
1520: 20 74 68 65 20 50 4f 53 49 58 20 65 72 72 6f 72 the POSIX error
1530: 20 63 6f 64 65 20 6f 6e 20 65 72 72 6f 72 2c 20 code on error,
1540: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a 20 2a or zero if no. *
1550: 09 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2e .error occurred.
1560: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
1570: 63 74 73 3a 0a 20 2a 09 52 65 61 64 73 20 69 6e cts:. *.Reads in
1580: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 put from the inp
1590: 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 68 65 ut device of the
15a0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
1600: 6e 74 0a 49 6e 70 75 74 50 72 6f 63 28 43 6c 69 nt.InputProc(Cli
1610: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
1620: 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 Data,./* Socket
1630: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 state. */.
1640: 20 20 20 20 20 20 20 63 68 61 72 20 2a 62 75 66 char *buf
1650: 2c 09 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 ,.../* Where to
1660: 73 74 6f 72 65 20 64 61 74 61 20 72 65 61 64 2e store data read.
1670: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 */.
1680: 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 09 09 2f int bufSize,../
1690: 2a 20 48 6f 77 20 6d 75 63 68 20 73 70 61 63 65 * How much space
16a0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 20 20 is available.
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16d0: 20 20 20 20 20 20 20 2a 20 69 6e 20 74 68 65 20 * in the
16e0: 62 75 66 66 65 72 3f 20 2a 2f 0a 20 20 20 20 20 buffer? */.
16f0: 20 20 20 20 20 20 20 20 69 6e 74 20 2a 65 72 72 int *err
1700: 6f 72 43 6f 64 65 50 74 72 29 09 09 2f 2a 20 57 orCodePtr)../* W
1710: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 65 72 here to store er
1720: 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 7b 0a 20 ror code. */.{.
1730: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
1740: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 tr = (State *) i
1750: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 nstanceData;.
1760: 20 69 6e 74 20 62 79 74 65 73 52 65 61 64 3b 09 int bytesRead;.
1770: 09 09 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 62 79 ../* How many by
1780: 74 65 73 20 77 65 72 65 20 72 65 61 64 3f 20 2a tes were read? *
1790: 2f 0a 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 /.. *errorCod
17a0: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 ePtr = 0;.. d
17b0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c printf(stderr,"\
17c0: 6e 42 49 4f 5f 72 65 61 64 28 25 64 29 22 2c 20 nBIO_read(%d)",
17d0: 62 75 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 bufSize);.. i
17e0: 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f f (!SSL_is_init_
17f0: 66 69 6e 69 73 68 65 64 28 73 74 61 74 65 50 74 finished(statePt
1800: 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 62 79 74 65 r->ssl)) {..byte
1810: 73 52 65 61 64 20 3d 20 54 6c 73 5f 57 61 69 74 sRead = Tls_Wait
1820: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
1830: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 Ptr, errorCodePt
1840: 72 29 3b 0a 09 69 66 20 28 62 79 74 65 73 52 65 r);..if (bytesRe
1850: 61 64 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 ad <= 0) {..
1860: 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 09 7d 0a 20 goto input;..}.
1870: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
1880: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
1890: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 LS_TCL_INIT) {..
18a0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
18b0: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 49 4e 49 &= ~(TLS_TCL_INI
18c0: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 79 T);. }. by
18d0: 74 65 73 52 65 61 64 20 3d 20 42 49 4f 5f 72 65 tesRead = BIO_re
18e0: 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ad(statePtr->bio
18f0: 2c 20 62 75 66 2c 20 62 75 66 53 69 7a 65 29 3b , buf, bufSize);
1900: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
1910: 65 72 72 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 20 err,"\nBIO_read
1920: 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52 65 61 -> %d", bytesRea
1930: 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 62 79 74 d);.. if (byt
1940: 65 73 52 65 61 64 20 3c 20 30 29 20 7b 0a 09 69 esRead < 0) {..i
1950: 6e 74 20 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 nt err = SSL_get
1960: 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d _error(statePtr-
1970: 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 29 >ssl, bytesRead)
1980: 3b 0a 0a 09 69 66 20 28 65 72 72 20 3d 3d 20 53 ;...if (err == S
1990: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 29 20 7b 0a SL_ERROR_SSL) {.
19a0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
19b0: 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 52 tatePtr, SSL_ERR
19c0: 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c OR(statePtr->ssl
19d0: 2c 20 62 79 74 65 73 52 65 61 64 29 29 3b 0a 09 , bytesRead));..
19e0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
19f0: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 r = ECONNABORTED
1a00: 3b 0a 09 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 ;.. goto inpu
1a10: 74 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 42 t;..} else if (B
1a20: 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 IO_should_retry(
1a30: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 statePtr->bio))
1a40: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 {.. dprintf(s
1a50: 74 64 65 72 72 2c 22 52 45 21 20 22 29 3b 0a 09 tderr,"RE! ");..
1a60: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
1a70: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 r = EAGAIN;..
1a80: 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 09 7d 0a goto input;..}.
1a90: 09 69 66 20 28 54 63 6c 5f 47 65 74 45 72 72 6e .if (Tcl_GetErrn
1aa0: 6f 28 29 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 o() == ECONNRESE
1ab0: 54 29 20 7b 0a 09 20 20 20 20 2f 2a 20 53 6f 66 T) {.. /* Sof
1ac0: 74 20 45 4f 46 20 2a 2f 0a 09 20 20 20 20 62 79 t EOF */.. by
1ad0: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 tesRead = 0;..
1ae0: 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 09 7d goto input;..}
1af0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 65 72 else {.. *er
1b00: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c rorCodePtr = Tcl
1b10: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 _GetErrno();..
1b20: 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 09 7d goto input;..}
1b30: 0a 20 20 20 20 7d 0a 69 6e 70 75 74 3a 0a 20 20 . }.input:.
1b40: 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 dprintf(stderr
1b50: 2c 20 22 5c 6e 49 6e 70 75 74 28 25 64 29 20 2d , "\nInput(%d) -
1b60: 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 > %d [%d]", bufS
1b70: 69 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20 ize, bytesRead,
1b80: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a *errorCodePtr);.
1b90: 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 return bytes
1ba0: 52 65 61 64 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Read;.}.../*. *-
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bf0: 2d 2d 0a 20 2a 0a 20 2a 20 4f 75 74 70 75 74 50 --. *. * OutputP
1c00: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
1c10: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
1c20: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 nvoked by the ge
1c30: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 neric IO level.
1c40: 2a 20 20 20 20 20 20 20 74 6f 20 77 72 69 74 65 * to write
1c50: 20 6f 75 74 70 75 74 20 74 6f 20 61 20 53 53 4c output to a SSL
1c60: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 socket based ch
1c70: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 annel.. *. * Res
1c80: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 75 6d ults:. *.The num
1c90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 ber of bytes wri
1ca0: 74 74 65 6e 20 69 73 20 72 65 74 75 72 6e 65 64 tten is returned
1cb0: 2e 20 41 6e 20 6f 75 74 70 75 74 20 61 72 67 75 . An output argu
1cc0: 6d 65 6e 74 20 69 73 0a 20 2a 09 73 65 74 20 74 ment is. *.set t
1cd0: 6f 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 o a POSIX error
1ce0: 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 code if an error
1cf0: 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 7a 65 occurred, or ze
1d00: 72 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ro.. *. * Side e
1d10: 66 66 65 63 74 73 3a 0a 20 2a 09 57 72 69 74 65 ffects:. *.Write
1d20: 73 20 6f 75 74 70 75 74 20 6f 6e 20 74 68 65 20 s output on the
1d30: 6f 75 74 70 75 74 20 64 65 76 69 63 65 20 6f 66 output device of
1d40: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a the channel.. *
1d50: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d90: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
1da0: 69 63 20 69 6e 74 0a 4f 75 74 70 75 74 50 72 6f ic int.OutputPro
1db0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
1dc0: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f tanceData,./* So
1dd0: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 cket state. */.
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 cha
1df0: 72 20 2a 62 75 66 2c 09 09 09 2f 2a 20 54 68 65 r *buf,.../* The
1e00: 20 64 61 74 61 20 62 75 66 66 65 72 2e 20 2a 2f data buffer. */
1e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 . i
1e20: 6e 74 20 74 6f 57 72 69 74 65 2c 09 09 2f 2a 20 nt toWrite,../*
1e30: 48 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 74 How many bytes t
1e40: 6f 20 77 72 69 74 65 3f 20 2a 2f 0a 20 20 20 20 o write? */.
1e50: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 65 int *e
1e60: 72 72 6f 72 43 6f 64 65 50 74 72 29 09 2f 2a 20 rrorCodePtr)./*
1e70: 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 65 Where to store e
1e80: 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 7b 0a rror code. */.{.
1e90: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
1ea0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
1eb0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 instanceData;.
1ec0: 20 20 69 6e 74 20 77 72 69 74 74 65 6e 2c 20 65 int written, e
1ed0: 72 72 3b 0a 0a 20 20 20 20 2a 65 72 72 6f 72 43 rr;.. *errorC
1ee0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 odePtr = 0;..
1ef0: 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c dprintf(stderr,
1f00: 22 5c 6e 42 49 4f 5f 77 72 69 74 65 28 25 64 29 "\nBIO_write(%d)
1f10: 22 2c 20 74 6f 57 72 69 74 65 29 3b 0a 0a 20 20 ", toWrite);..
1f20: 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e if (!SSL_is_in
1f30: 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74 it_finished(stat
1f40: 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 77 ePtr->ssl)) {..w
1f50: 72 69 74 74 65 6e 20 3d 20 54 6c 73 5f 57 61 69 ritten = Tls_Wai
1f60: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 tForConnect(stat
1f70: 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 ePtr, errorCodeP
1f80: 74 72 29 3b 0a 09 69 66 20 28 77 72 69 74 74 65 tr);..if (writte
1f90: 6e 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 67 n <= 0) {.. g
1fa0: 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 09 7d 0a 20 oto output;..}.
1fb0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
1fc0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
1fd0: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 LS_TCL_INIT) {..
1fe0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
1ff0: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 49 4e 49 &= ~(TLS_TCL_INI
2000: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 T);. }. if
2010: 20 28 74 6f 57 72 69 74 65 20 3d 3d 20 30 29 20 (toWrite == 0)
2020: 7b 0a 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 {..dprintf(stder
2030: 72 2c 20 22 7a 65 72 6f 2d 77 72 69 74 65 5c 6e r, "zero-write\n
2040: 22 29 3b 0a 09 42 49 4f 5f 66 6c 75 73 68 28 73 ");..BIO_flush(s
2050: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 tatePtr->bio);..
2060: 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 67 6f written = 0;..go
2070: 74 6f 20 6f 75 74 70 75 74 3b 0a 20 20 20 20 7d to output;. }
2080: 20 65 6c 73 65 20 7b 0a 09 77 72 69 74 74 65 6e else {..written
2090: 20 3d 20 42 49 4f 5f 77 72 69 74 65 28 73 74 61 = BIO_write(sta
20a0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c tePtr->bio, buf,
20b0: 20 74 6f 57 72 69 74 65 29 3b 0a 09 64 70 72 69 toWrite);..dpri
20c0: 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e 42 49 ntf(stderr,"\nBI
20d0: 4f 5f 77 72 69 74 65 28 25 64 29 20 2d 3e 20 5b O_write(%d) -> [
20e0: 25 64 5d 22 2c 20 74 6f 57 72 69 74 65 2c 20 77 %d]", toWrite, w
20f0: 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 ritten);. }.
2100: 20 20 20 69 66 20 28 77 72 69 74 74 65 6e 20 3c if (written <
2110: 20 30 20 7c 7c 20 77 72 69 74 74 65 6e 20 3d 3d 0 || written ==
2120: 20 30 29 20 7b 0a 09 73 77 69 74 63 68 20 28 28 0) {..switch ((
2130: 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 err = SSL_get_er
2140: 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ror(statePtr->ss
2150: 6c 2c 20 77 72 69 74 74 65 6e 29 29 29 20 7b 0a l, written))) {.
2160: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
2170: 4e 4f 4e 45 3a 0a 09 20 20 20 20 69 66 20 28 77 NONE:.. if (w
2180: 72 69 74 74 65 6e 20 3c 3d 20 30 29 20 7b 0a 09 ritten <= 0) {..
2190: 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09 .written = 0;...
21a0: 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 09 20 20 goto output;..
21b0: 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a }.. break;.
21c0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
21d0: 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 WANT_WRITE:..
21e0: 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c dprintf(stderr,
21f0: 22 77 72 69 74 65 20 57 20 42 4c 4f 43 4b 5c 6e "write W BLOCK\n
2200: 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ");.. break;.
2210: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
2220: 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 WANT_READ:..
2230: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
2240: 77 72 69 74 65 20 52 20 42 4c 4f 43 4b 5c 6e 22 write R BLOCK\n"
2250: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 );.. break;..
2260: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 case SSL_ERROR_W
2270: 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a ANT_X509_LOOKUP:
2280: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 .. dprintf(st
2290: 64 65 72 72 2c 22 77 72 69 74 65 20 58 20 42 4c derr,"write X BL
22a0: 4f 43 4b 5c 6e 22 29 3b 0a 09 20 20 20 20 62 72 OCK\n");.. br
22b0: 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 4c 5f 45 eak;..case SSL_E
22c0: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e RROR_ZERO_RETURN
22d0: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 :.. dprintf(s
22e0: 74 64 65 72 72 2c 22 63 6c 6f 73 65 64 5c 6e 22 tderr,"closed\n"
22f0: 29 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 );.. written
2300: 3d 20 30 3b 0a 09 20 20 20 20 67 6f 74 6f 20 6f = 0;.. goto o
2310: 75 74 70 75 74 3b 0a 09 63 61 73 65 20 53 53 4c utput;..case SSL
2320: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a _ERROR_SYSCALL:.
2330: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
2340: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e tr = Tcl_GetErrn
2350: 6f 28 29 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 o();.. dprint
2360: 66 28 73 74 64 65 72 72 2c 22 5b 25 64 5d 20 73 f(stderr,"[%d] s
2370: 79 73 63 61 6c 6c 20 65 72 72 72 3a 20 25 64 5c yscall errr: %d\
2380: 6e 22 2c 20 77 72 69 74 74 65 6e 2c 20 54 63 6c n", written, Tcl
2390: 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 20 _GetErrno());..
23a0: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b written = -1;
23b0: 0a 09 20 20 20 20 67 6f 74 6f 20 6f 75 74 70 75 .. goto outpu
23c0: 74 3b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 t;..case SSL_ERR
23d0: 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 54 6c 73 OR_SSL:.. Tls
23e0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
23f0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 65 SSL_ERROR(state
2400: 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 Ptr->ssl, writte
2410: 6e 29 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 n));.. *error
2420: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 CodePtr = ECONNA
2430: 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 77 72 69 BORTED;.. wri
2440: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 tten = -1;..
2450: 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 09 64 65 goto output;..de
2460: 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 69 fault:.. dpri
2470: 6e 74 66 28 73 74 64 65 72 72 2c 22 75 6e 6b 6e ntf(stderr,"unkn
2480: 6f 77 6e 20 65 72 72 3a 20 25 64 5c 6e 22 2c 20 own err: %d\n",
2490: 65 72 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 6f err);..}. }.o
24a0: 75 74 70 75 74 3a 0a 20 20 20 20 64 70 72 69 6e utput:. dprin
24b0: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 4f 75 tf(stderr, "\nOu
24c0: 74 70 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c tput(%d) -> %d",
24d0: 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 toWrite, writte
24e0: 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 n);. return w
24f0: 72 69 74 74 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ritten;.}.../*.
2500: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2540: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 4f 70 ----. *. * GetOp
2550: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 tionProc --. *.
2560: 2a 09 43 6f 6d 70 75 74 65 73 20 61 6e 20 6f 70 *.Computes an op
2570: 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 tion value for a
2580: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
2590: 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a d channel, or a.
25a0: 20 2a 09 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f *.list of all o
25b0: 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 ptions and their
25c0: 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a 09 4e values.. *. *.N
25d0: 6f 74 65 3a 20 54 68 69 73 20 63 6f 64 65 20 69 ote: This code i
25e0: 73 20 62 61 73 65 64 20 6f 6e 20 63 6f 64 65 20 s based on code
25f0: 63 6f 6e 74 72 69 62 75 74 65 64 20 62 79 20 4a contributed by J
2600: 6f 68 6e 20 48 61 78 62 79 2e 0a 20 2a 0a 20 2a ohn Haxby.. *. *
2610: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
2620: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
2630: 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 lt. The value of
2640: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f the specified o
2650: 70 74 69 6f 6e 20 6f 72 20 61 0a 20 2a 09 6c 69 ption or a. *.li
2660: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e st of all option
2670: 73 20 61 6e 64 09 74 68 65 69 72 20 76 61 6c 75 s and.their valu
2680: 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 es is returned i
2690: 6e 20 74 68 65 0a 20 2a 09 73 75 70 70 6c 69 65 n the. *.supplie
26a0: 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a d DString.. *. *
26b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
26c0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
2720: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c GetOptionProc(Cl
2730: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
2740: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 eData,./* Socket
2750: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 state. */.
2760: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f Tcl_
2770: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 Interp *interp,.
2780: 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d ./* For errors -
2790: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f can be NULL. */
27a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
27b0: 20 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 char *optionNa
27c0: 6d 65 2c 09 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 me,../* Name of
27d0: 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 0a 20 20 the option to.
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a *
2810: 20 72 65 74 72 69 65 76 65 20 74 68 65 20 76 61 retrieve the va
2820: 6c 75 65 20 66 6f 72 2c 20 6f 72 0a 20 20 20 20 lue for, or.
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 4e * N
2860: 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f ULL to get all o
2870: 70 74 69 6f 6e 73 20 61 6e 64 0a 20 20 20 20 20 ptions and.
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 74 68 * th
28b0: 65 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 eir values. */.
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28d0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 Tcl_DString *dsP
28e0: 74 72 29 09 20 20 20 20 20 20 20 20 20 2f 2a 20 tr). /*
28f0: 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 Where to store t
2900: 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 he computed valu
2910: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e.
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2940: 20 20 20 20 2a 20 69 6e 69 74 69 61 6c 69 7a 65 * initialize
2950: 64 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a d by caller. */.
2960: 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 48 41 {.#ifdef TCL_CHA
2970: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 20 NNEL_VERSION_2.
2980: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
2990: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 tr = (State *) i
29a0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 nstanceData;.
29b0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 Tcl_Channel dow
29c0: 6e 43 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 nChan = Tls_GetP
29d0: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 3b arent(statePtr);
29e0: 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 . Tcl_DriverG
29f0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 etOptionProc *ge
2a00: 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 tOptionProc;..
2a10: 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 getOptionProc
2a20: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 = Tcl_ChannelGet
2a30: 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 OptionProc(Tcl_G
2a40: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f etChannelType(do
2a50: 77 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 69 66 wnChan));. if
2a60: 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 (getOptionProc
2a70: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 != NULL) {..retu
2a80: 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 rn (*getOptionPr
2a90: 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e oc)(Tcl_GetChann
2aa0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 elInstanceData(d
2ab0: 6f 77 6e 43 68 61 6e 29 2c 0a 09 09 69 6e 74 65 ownChan),...inte
2ac0: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 rp, optionName,
2ad0: 64 73 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c dsPtr);. } el
2ae0: 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d se if (optionNam
2af0: 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c e == (char*) NUL
2b00: 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 L) {../*.. * Req
2b10: 75 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f uest is query fo
2b20: 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 r all options, t
2b30: 68 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a his is ok... */.
2b40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a .return TCL_OK;.
2b50: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 }. /*.
2b60: 20 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 * Request for
2b70: 61 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f a specific optio
2b80: 6e 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 n has to fail, w
2b90: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 e don't have any
2ba0: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 .. */. re
2bb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
2bc0: 23 65 6c 73 65 0a 20 20 20 20 53 74 61 74 65 20 #else. State
2bd0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
2be0: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 te *) instanceDa
2bf0: 74 61 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c ta;. size_t l
2c00: 65 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 en = 0;.. if
2c10: 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 21 3d 20 28 (optionName != (
2c20: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a char *) NULL) {.
2c30: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 len = st
2c40: 72 6c 65 6e 28 6f 70 74 69 6f 6e 4e 61 6d 65 29 rlen(optionName)
2c50: 3b 0a 20 20 20 20 7d 0a 23 69 66 20 30 0a 20 20 ;. }.#if 0.
2c60: 20 20 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30 29 if ((len == 0)
2c70: 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 28 6c 65 ||. ((le
2c80: 6e 20 3e 20 31 29 20 26 26 20 28 6f 70 74 69 6f n > 1) && (optio
2c90: 6e 4e 61 6d 65 5b 31 5d 20 3d 3d 20 27 63 27 29 nName[1] == 'c')
2ca0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 28 73 74 &&. (st
2cb0: 72 6e 63 6d 70 28 6f 70 74 69 6f 6e 4e 61 6d 65 rncmp(optionName
2cc0: 2c 20 22 2d 63 69 70 68 65 72 22 2c 20 6c 65 6e , "-cipher", len
2cd0: 29 20 3d 3d 20 30 29 29 29 20 7b 0a 20 20 20 20 ) == 0))) {.
2ce0: 20 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30 if (len == 0
2cf0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ) {.
2d00: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e Tcl_DStringAppen
2d10: 64 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 dElement(dsPtr,
2d20: 22 2d 63 69 70 68 65 72 22 29 3b 0a 20 20 20 20 "-cipher");.
2d30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 }. Tc
2d40: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 l_DStringAppendE
2d50: 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 53 53 lement(dsPtr, SS
2d60: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 L_get_cipher(sta
2d70: 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 20 20 tePtr->ssl));.
2d80: 20 20 20 20 20 20 69 66 20 28 6c 65 6e 29 20 7b if (len) {
2d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 . ret
2da0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 urn TCL_OK;.
2db0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 }. }.#end
2dc0: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 if. return TC
2dd0: 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0c L_OK;.#endif.}..
2de0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2e30: 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a WatchProc --. *.
2e40: 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 *.Initialize th
2e50: 65 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 e notifier to wa
2e60: 74 63 68 20 54 63 6c 5f 46 69 6c 65 73 20 66 72 tch Tcl_Files fr
2e70: 6f 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e om this channel.
2e80: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
2e90: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 *.None.. *. * S
2ea0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
2eb0: 53 65 74 73 20 75 70 20 74 68 65 20 6e 6f 74 69 Sets up the noti
2ec0: 66 69 65 72 20 73 6f 20 74 68 61 74 20 61 20 66 fier so that a f
2ed0: 75 74 75 72 65 20 65 76 65 6e 74 20 6f 6e 20 74 uture event on t
2ee0: 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 77 69 he channel. *.wi
2ef0: 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 ll be seen by Tc
2f00: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
2f50: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 57 61 74 .static void.Wat
2f60: 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 chProc(ClientDat
2f70: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 a instanceData,.
2f80: 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 /* The socket st
2f90: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 ate. */.
2fa0: 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 int mask)..
2fb0: 09 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e ./* Events of in
2fc0: 74 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 terest; an OR-ed
2fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ff0: 20 20 20 20 20 20 20 20 20 20 2a 20 63 6f 6d 62 * comb
3000: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 ination of TCL_R
3010: 45 41 44 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 EADABLE,.
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3040: 20 20 2a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 * TCL_WRITABLE
3050: 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 and TCL_EXCEPTI
3060: 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 ON. */.{. Sta
3070: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
3080: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
3090: 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 eData;.. if (
30a0: 6d 61 73 6b 20 3d 3d 20 73 74 61 74 65 50 74 72 mask == statePtr
30b0: 2d 3e 77 61 74 63 68 4d 61 73 6b 29 0a 09 72 65 ->watchMask)..re
30c0: 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 73 turn;.. if (s
30d0: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 tatePtr->watchMa
30e0: 73 6b 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 sk) {../*.. * Re
30f0: 6d 6f 76 65 20 65 76 65 6e 74 20 68 61 6e 64 6c move event handl
3100: 65 72 20 74 6f 20 75 6e 64 65 72 6c 79 69 6e 67 er to underlying
3110: 20 63 68 61 6e 6e 65 6c 2c 20 74 68 69 73 20 63 channel, this c
3120: 6f 75 6c 64 0a 09 20 2a 20 62 65 20 62 65 63 61 ould.. * be beca
3130: 75 73 65 20 77 65 20 61 72 65 20 63 6c 6f 73 69 use we are closi
3140: 6e 67 20 66 6f 72 20 72 65 61 6c 2c 20 6f 72 20 ng for real, or
3150: 62 65 69 6e 67 20 22 75 6e 73 74 61 63 6b 65 64 being "unstacked
3160: 22 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 65 "... */...Tcl_De
3170: 6c 65 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64 6c leteChannelHandl
3180: 65 72 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 er(Tls_GetParent
3190: 28 73 74 61 74 65 50 74 72 29 2c 0a 09 09 43 68 (statePtr),...Ch
31a0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 2c 20 28 43 annelHandler, (C
31b0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
31c0: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Ptr);. }.
31d0: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d statePtr->watchM
31e0: 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 ask = mask;.
31f0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 77 61 if (statePtr->wa
3200: 74 63 68 4d 61 73 6b 29 20 7b 0a 09 2f 2a 0a 09 tchMask) {../*..
3210: 20 2a 20 53 65 74 75 70 20 61 63 74 69 76 65 20 * Setup active
3220: 6d 6f 6e 69 74 6f 72 20 66 6f 72 20 65 76 65 6e monitor for even
3230: 74 73 20 6f 6e 20 75 6e 64 65 72 6c 79 69 6e 67 ts on underlying
3240: 20 43 68 61 6e 6e 65 6c 2e 0a 09 20 2a 2f 0a 0a Channel... */..
3250: 09 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e .Tcl_CreateChann
3260: 65 6c 48 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 elHandler(Tls_Ge
3270: 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 tParent(statePtr
3280: 29 2c 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 77 ),...statePtr->w
3290: 61 74 63 68 4d 61 73 6b 2c 20 43 68 61 6e 6e 65 atchMask, Channe
32a0: 6c 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65 6e lHandler, (Clien
32b0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
32c0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 ;. }.}.../*.
32d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3310: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 48 61 ----. *. * GetHa
3320: 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 ndleProc --. *.
3330: 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 *.Called from Tc
3340: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 46 69 6c 65 l_GetChannelFile
3350: 20 74 6f 20 72 65 74 72 69 65 76 65 20 6f 2f 73 to retrieve o/s
3360: 20 66 69 6c 65 20 68 61 6e 64 6c 65 72 0a 20 2a file handler. *
3370: 09 66 72 6f 6d 20 74 68 65 20 53 53 4c 20 73 6f .from the SSL so
3380: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
3390: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 el.. *. * Result
33a0: 73 3a 0a 20 2a 09 54 68 65 20 61 70 70 72 6f 70 s:. *.The approp
33b0: 72 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 20 6f riate Tcl_File o
33c0: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 70 72 r NULL if not pr
33d0: 65 73 65 6e 74 2e 20 0a 20 2a 0a 20 2a 20 53 69 esent. . *. * Si
33e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
33f0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 47 65 74 /.static int.Get
3450: 48 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e HandleProc(Clien
3460: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
3470: 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 ta,./* The socke
3480: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 t state. */.
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 int
34a0: 20 64 69 72 65 63 74 69 6f 6e 2c 09 09 2f 2a 20 direction,../*
34b0: 57 68 69 63 68 20 54 63 6c 5f 46 69 6c 65 20 74 Which Tcl_File t
34c0: 6f 20 72 65 74 72 69 65 76 65 3f 20 2a 2f 0a 20 o retrieve? */.
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
34e0: 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 ClientData *hand
34f0: 6c 65 50 74 72 29 09 2f 2a 20 57 68 65 72 65 20 lePtr)./* Where
3500: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 68 61 6e to store the han
3510: 64 6c 65 2e 20 20 2a 2f 0a 7b 0a 20 20 20 20 53 dle. */.{. S
3520: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
3530: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
3540: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 72 65 nceData;.. re
3550: 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e turn Tcl_GetChan
3560: 6e 65 6c 48 61 6e 64 6c 65 20 28 54 6c 73 5f 47 nelHandle (Tls_G
3570: 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 etParent(statePt
3580: 72 29 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 r), direction, h
3590: 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0c 0a 2f andlePtr);.}.../
35a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
35e0: 2a 20 20 20 20 20 20 43 68 61 6e 6e 65 6c 48 61 * ChannelHa
35f0: 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 20 20 ndler --. *. *
3600: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2a 0a 20 2a 20 20 20 20 20 20 48 61 ----*. * Ha
3640: 6e 64 6c 65 72 20 63 61 6c 6c 65 64 20 62 79 20 ndler called by
3650: 54 63 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 Tcl as a result
3660: 6f 66 0a 20 2a 20 20 20 20 20 20 54 63 6c 5f 43 of. * Tcl_C
3670: 72 65 61 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64 reateChannelHand
3680: 6c 65 72 20 2d 20 74 6f 20 69 6e 66 6f 72 6d 20 ler - to inform
3690: 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 0a 20 us of activity.
36a0: 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 75 6e * on the un
36b0: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
36c0: 2e 0a 20 2a 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d .. * ------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
3700: 2a 20 20 20 20 20 20 53 69 64 65 65 66 66 65 63 * Sideeffec
3710: 74 73 3a 0a 20 2a 20 20 20 20 20 20 20 20 20 20 ts:. *
3720: 20 20 20 20 4d 61 79 20 67 65 6e 65 72 61 74 65 May generate
3730: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c subsequent call
3740: 73 20 74 6f 0a 20 2a 20 20 20 20 20 20 20 20 20 s to. *
3750: 20 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 Tcl_NotifyC
3760: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 20 20 hannel.. *. *
3770: 20 20 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 Result:. *
3780: 20 20 20 20 20 20 20 20 20 20 20 4e 6f 6e 65 2e None.
3790: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
37d0: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 43 /..static void.C
37e0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 28 63 hannelHandler (c
37f0: 6c 69 65 6e 74 44 61 74 61 2c 20 6d 61 73 6b 29 lientData, mask)
3800: 0a 43 6c 69 65 6e 74 44 61 74 61 20 20 20 20 20 .ClientData
3810: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 69 6e 74 20 clientData;.int
3820: 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 3b mask;
3830: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 .{. State *st
3840: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
3850: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a *) clientData;..
3860: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 dprintf(stderr,
3870: 22 48 41 4e 44 4c 45 52 28 30 78 25 78 29 5c 6e "HANDLER(0x%x)\n
3880: 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 54 63 ", mask);. Tc
3890: 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 l_Preserve( (Cli
38a0: 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72 entData)statePtr
38b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d 61 73 6b );.. if (mask
38c0: 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 & TCL_READABLE)
38d0: 20 7b 0a 09 42 49 4f 5f 73 65 74 5f 66 6c 61 67 {..BIO_set_flag
38e0: 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 s(statePtr->p_bi
38f0: 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41 o, BIO_FLAGS_REA
3900: 44 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b D);. } else {
3910: 0a 09 42 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 ..BIO_clear_flag
3920: 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 s(statePtr->p_bi
3930: 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41 o, BIO_FLAGS_REA
3940: 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 D);. }.. i
3950: 66 20 28 6d 61 73 6b 20 26 20 54 43 4c 5f 57 52 f (mask & TCL_WR
3960: 49 54 41 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 ITABLE) {..BIO_s
3970: 65 74 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 et_flags(statePt
3980: 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c r->p_bio, BIO_FL
3990: 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 AGS_WRITE);.
39a0: 7d 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f 63 6c } else {..BIO_cl
39b0: 65 61 72 5f 66 6c 61 67 73 28 73 74 61 74 65 50 ear_flags(stateP
39c0: 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 tr->p_bio, BIO_F
39d0: 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 20 20 LAGS_WRITE);.
39e0: 20 7d 0a 0a 20 20 20 20 6d 61 73 6b 20 3d 20 30 }.. mask = 0
39f0: 3b 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 77 70 ;. if (BIO_wp
3a00: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d ending(statePtr-
3a10: 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c >bio)) {..mask |
3a20: 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a = TCL_WRITABLE;.
3a30: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 42 49 }. if (BI
3a40: 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 O_pending(stateP
3a50: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 tr->bio)) {..mas
3a60: 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c k |= TCL_READABL
3a70: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a E;. }.. /*
3a80: 0a 20 20 20 20 20 2a 20 54 68 65 20 66 6f 6c 6c . * The foll
3a90: 6f 77 69 6e 67 20 4e 6f 74 69 66 79 43 68 61 6e owing NotifyChan
3aa0: 6e 65 6c 20 63 61 6c 6c 73 20 73 65 65 6d 73 20 nel calls seems
3ab0: 74 6f 20 62 65 20 69 6d 70 6f 72 74 61 6e 74 2c to be important,
3ac0: 20 62 75 74 0a 20 20 20 20 20 2a 20 77 65 20 64 but. * we d
3ad0: 6f 6e 27 74 20 6b 6e 6f 77 20 77 68 79 2e 20 20 on't know why.
3ae0: 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 69 66 It looks like if
3af0: 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 76 65 the mask is eve
3b00: 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 20 20 20 20 20 r non-zero.
3b10: 2a 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 65 * that it will e
3b20: 6e 74 65 72 20 61 6e 20 69 6e 66 69 6e 69 74 65 nter an infinite
3b30: 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 2a 0a 20 20 loop.. *.
3b40: 20 20 20 2a 20 4e 6f 74 69 66 79 20 74 68 65 20 * Notify the
3b50: 75 70 70 65 72 20 63 68 61 6e 6e 65 6c 20 6f 66 upper channel of
3b60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 42 49 4f the current BIO
3b70: 20 73 74 61 74 65 20 73 6f 20 74 68 65 20 65 76 state so the ev
3b80: 65 6e 74 0a 20 20 20 20 20 2a 20 63 6f 6e 74 69 ent. * conti
3b90: 6e 75 65 73 20 74 6f 20 70 72 6f 70 61 67 61 74 nues to propagat
3ba0: 65 20 75 70 20 74 68 65 20 63 68 61 69 6e 2e 0a e up the chain..
3bb0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 73 74 *. * st
3bc0: 61 6e 74 6f 6e 3a 20 49 74 20 6c 6f 6f 6b 73 20 anton: It looks
3bd0: 6c 69 6b 65 20 74 68 69 73 20 63 6f 75 6c 64 20 like this could
3be0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 66 result in an inf
3bf0: 69 6e 69 74 65 20 6c 6f 6f 70 20 69 66 0a 20 20 inite loop if.
3c00: 20 20 20 2a 20 74 68 65 20 75 70 70 65 72 20 63 * the upper c
3c10: 68 61 6e 6e 65 6c 20 64 6f 65 73 6e 27 74 20 63 hannel doesn't c
3c20: 61 75 73 65 20 43 68 61 6e 6e 65 6c 48 61 6e 64 ause ChannelHand
3c30: 6c 65 72 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 ler to be remove
3c40: 64 0a 20 20 20 20 20 2a 20 62 65 66 6f 72 65 20 d. * before
3c50: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
3c60: 6c 20 63 61 6c 6c 73 20 63 68 61 6e 6e 65 6c 20 l calls channel
3c70: 68 61 6e 64 6c 65 72 73 20 6f 6e 20 74 68 65 20 handlers on the
3c80: 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 2e 0a 20 lower channel..
3c90: 20 20 20 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 */. .
3ca0: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
3cb0: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 l(statePtr->self
3cc0: 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 0a 20 20 , mask);. .
3cd0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
3ce0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
3cf0: 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 29 20 7b merToken)NULL) {
3d00: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
3d10: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
3d20: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
3d30: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 ePtr->timer = (T
3d40: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 cl_TimerToken)NU
3d50: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
3d60: 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 ((mask & TCL_RE
3d70: 41 44 41 42 4c 45 29 20 26 26 20 54 63 6c 5f 49 ADABLE) && Tcl_I
3d80: 6e 70 75 74 42 75 66 66 65 72 65 64 20 28 73 74 nputBuffered (st
3d90: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 atePtr->self) >
3da0: 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 61 74 0) {../*.. * Dat
3db0: 61 20 69 73 20 77 61 69 74 69 6e 67 2c 20 66 6c a is waiting, fl
3dc0: 75 73 68 20 69 74 20 6f 75 74 20 69 6e 20 73 68 ush it out in sh
3dd0: 6f 72 74 20 74 69 6d 65 0a 09 20 2a 2f 0a 09 73 ort time.. */..s
3de0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
3df0: 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 Tcl_CreateTimer
3e00: 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f Handler(TLS_TCL_
3e10: 44 45 4c 41 59 2c 0a 09 09 43 68 61 6e 6e 65 6c DELAY,...Channel
3e20: 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 HandlerTimer, (C
3e30: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
3e40: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Ptr);. }.
3e50: 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c Tcl_Release( (Cl
3e60: 69 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 ientData)statePt
3e70: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d r);.}.../*. *---
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 43 68 61 6e 6e ---*. *. *.Chann
3ec0: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 2d elHandlerTimer -
3ed0: 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d -. *. *.--------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 43 61 6c --------*. *.Cal
3f10: 6c 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 led by the notif
3f20: 69 65 72 20 28 2d 3e 20 74 69 6d 65 72 29 20 74 ier (-> timer) t
3f30: 6f 20 66 6c 75 73 68 20 6f 75 74 0a 20 2a 09 69 o flush out. *.i
3f40: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 74 69 nformation waiti
3f50: 6e 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 62 75 ng in channel bu
3f60: 66 66 65 72 73 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d ffers.. *.------
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 2a 0a 20 2a 0a 20 ----------*. *.
3fa0: 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 *.Sideeffects:.
3fb0: 2a 09 09 41 73 20 6f 66 20 27 43 68 61 6e 6e 65 *..As of 'Channe
3fc0: 6c 48 61 6e 64 6c 65 72 27 2e 0a 20 2a 0a 20 2a lHandler'.. *. *
3fd0: 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e .Result:. *..Non
3fe0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
4020: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 */..static void
4030: 0a 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 .ChannelHandlerT
4040: 69 6d 65 72 20 28 63 6c 69 65 6e 74 44 61 74 61 imer (clientData
4050: 29 0a 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ).ClientData cli
4060: 65 6e 74 44 61 74 61 3b 20 2f 2a 20 54 72 61 6e entData; /* Tran
4070: 73 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 71 75 sformation to qu
4080: 65 72 79 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 ery */.{. Sta
4090: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
40a0: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
40b0: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 ata;. int mas
40c0: 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 73 74 61 74 k = 0;.. stat
40d0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 ePtr->timer = (T
40e0: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
40f0: 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 42 49 ULL;.. if (BI
4100: 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 O_wpending(state
4110: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 Ptr->bio)) {..ma
4120: 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 sk |= TCL_WRITAB
4130: 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LE;. }. if
4140: 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 (BIO_pending(st
4150: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
4160: 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 .mask |= TCL_REA
4170: 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 DABLE;. }.
4180: 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e Tcl_NotifyChann
4190: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c el(statePtr->sel
41a0: 66 2c 20 6d 61 73 6b 29 3b 0a 7d 0a 0c 0a 2f 2a f, mask);.}.../*
41b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
41f0: 09 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e .Tls_WaitForConn
4200: 65 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09 53 69 64 ect --. *. *.Sid
4210: 65 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 49 73 eeffects:. *..Is
4220: 73 75 65 73 20 53 53 4c 5f 61 63 63 65 70 74 20 sues SSL_accept
4230: 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 0a 20 or SSL_connect.
4240: 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
4250: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4290: 2d 2d 2a 0a 20 2a 2f 0a 69 6e 74 0a 54 6c 73 5f --*. */.int.Tls_
42a0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 20 WaitForConnect(
42b0: 73 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 statePtr, errorC
42c0: 6f 64 65 50 74 72 29 0a 20 20 20 20 53 74 61 74 odePtr). Stat
42d0: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 e *statePtr;.
42e0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
42f0: 74 72 3b 09 09 2f 2a 20 57 68 65 72 65 20 74 6f tr;../* Where to
4300: 20 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f 64 store error cod
4310: 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 e. */.{. int
4320: 65 72 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 err;.. dprint
4330: 66 28 73 74 64 65 72 72 2c 22 5c 6e 57 61 69 74 f(stderr,"\nWait
4340: 46 6f 72 43 6f 6e 6e 65 63 74 28 30 78 25 78 29 ForConnect(0x%x)
4350: 22 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 ", statePtr);..
4360: 20 20 20 66 6f 72 20 28 3b 3b 29 20 7b 0a 09 2f for (;;) {../
4370: 2a 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 * Not initialize
4380: 64 20 79 65 74 21 20 2a 2f 0a 09 69 66 20 28 73 d yet! */..if (s
4390: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
43a0: 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 TLS_TCL_SERVER)
43b0: 20 7b 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 {.. err = SS
43c0: 4c 5f 61 63 63 65 70 74 28 73 74 61 74 65 50 74 L_accept(statePt
43d0: 72 2d 3e 73 73 6c 29 3b 0a 09 7d 20 65 6c 73 65 r->ssl);..} else
43e0: 20 7b 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 {.. err = SS
43f0: 4c 5f 63 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 L_connect(stateP
4400: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 09 2f 2a tr->ssl);..}../*
4410: 53 53 4c 5f 77 72 69 74 65 28 73 74 61 74 65 50 SSL_write(stateP
4420: 74 72 2d 3e 73 73 6c 2c 20 28 63 68 61 72 2a 29 tr->ssl, (char*)
4430: 26 65 72 72 2c 20 30 29 3b 09 48 41 43 4b 21 21 &err, 0);.HACK!!
4440: 21 20 2a 2f 0a 09 69 66 20 28 65 72 72 20 3e 20 ! */..if (err >
4450: 30 29 0a 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 0).. BIO_flus
4460: 68 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 h(statePtr->bio)
4470: 3b 0a 0a 09 69 66 20 28 65 72 72 20 3c 3d 20 30 ;...if (err <= 0
4480: 29 20 7b 0a 09 20 20 20 20 69 6e 74 20 72 63 20 ) {.. int rc
4490: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 = SSL_get_error(
44a0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65 statePtr->ssl, e
44b0: 72 72 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 72 rr);... if (r
44c0: 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53 c == SSL_ERROR_S
44d0: 53 4c 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f SL) {...Tls_Erro
44e0: 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 61 r(statePtr, (cha
44f0: 72 2a 29 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 r*)ERR_reason_er
4500: 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 ror_string(ERR_g
4510: 65 74 5f 65 72 72 6f 72 28 29 29 29 3b 0a 09 09 et_error()));...
4520: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
4530: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 ECONNABORTED;...
4540: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20 20 return -1;..
4550: 7d 20 65 6c 73 65 20 69 66 20 28 42 49 4f 5f 73 } else if (BIO_s
4560: 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 hould_retry(stat
4570: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 ePtr->bio)) {...
4580: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c if (statePtr->fl
4590: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 ags & TLS_TCL_AS
45a0: 59 4e 43 29 20 7b 0a 09 09 20 20 20 20 64 70 72 YNC) {... dpr
45b0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 21 20 intf(stderr,"E!
45c0: 22 29 3b 0a 09 09 20 20 20 20 2a 65 72 72 6f 72 ");... *error
45d0: 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e CodePtr = EAGAIN
45e0: 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 2d ;... return -
45f0: 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 1;...} else {...
4600: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 continue;...
4610: 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 }.. } else if
4620: 20 28 65 72 72 20 3d 3d 20 30 29 20 7b 0a 09 09 (err == 0) {...
4630: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
4640: 43 52 21 20 22 29 3b 0a 09 09 2a 65 72 72 6f 72 CR! ");...*error
4650: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 CodePtr = ECONNR
4660: 45 53 45 54 3b 0a 09 09 72 65 74 75 72 6e 20 2d ESET;...return -
4670: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 1;.. }.. i
4680: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 f (statePtr->fla
4690: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52 gs & TLS_TCL_SER
46a0: 56 45 52 29 20 7b 0a 09 09 65 72 72 20 3d 20 53 VER) {...err = S
46b0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
46c0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
46d0: 73 6c 29 3b 0a 09 09 69 66 20 28 65 72 72 20 21 sl);...if (err !
46e0: 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 = X509_V_OK) {..
46f0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
4700: 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 2a 29 tatePtr, (char*)
4710: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 X509_verify_cert
4720: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 _error_string(er
4730: 72 29 29 3b 0a 09 09 20 20 20 20 2a 65 72 72 6f r));... *erro
4740: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
4750: 41 42 4f 52 54 45 44 3b 0a 09 09 20 20 20 20 72 ABORTED;... r
4760: 65 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 0a 09 20 eturn -1;...}..
4770: 20 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 }.. *error
4780: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 CodePtr = Tcl_Ge
4790: 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20 64 tErrno();.. d
47a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 printf(stderr,"E
47b0: 52 52 28 25 64 2c 20 25 64 29 20 22 2c 20 72 63 RR(%d, %d) ", rc
47c0: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 , *errorCodePtr)
47d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 ;.. return -1
47e0: 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 73 74 ;..}..dprintf(st
47f0: 64 65 72 72 2c 22 52 30 21 20 22 29 3b 0a 09 72 derr,"R0! ");..r
4800: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 7d eturn 1;. }.}
4810: 0a 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 0a 54 6c ..Tcl_Channel.Tl
4820: 73 5f 47 65 74 50 61 72 65 6e 74 28 20 73 74 61 s_GetParent( sta
4830: 74 65 50 74 72 20 29 0a 20 20 20 20 53 74 61 74 tePtr ). Stat
4840: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 7b 0a 23 e *statePtr;.{.#
4850: 69 66 64 65 66 20 54 43 4c 5f 43 48 41 4e 4e 45 ifdef TCL_CHANNE
4860: 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 20 20 20 20 L_VERSION_2.
4870: 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 return Tcl_GetSt
4880: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 ackedChannel(sta
4890: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 23 65 tePtr->self);.#e
48a0: 6c 73 65 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f lse.#if TCL_MAJO
48b0: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 20 26 R_VERSION == 8 &
48c0: 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 & TCL_MINOR_VERS
48d0: 49 4f 4e 20 3c 20 32 0a 20 20 20 20 72 65 74 75 ION < 2. retu
48e0: 72 6e 20 73 74 61 74 65 50 74 72 2d 3e 70 61 72 rn statePtr->par
48f0: 65 6e 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 2f ent;.#else. /
4900: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 66 6f 72 * The reason for
4910: 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f the existence o
4920: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 f this procedure
4930: 20 69 73 0a 20 20 20 20 20 2a 20 74 68 65 20 66 is. * the f
4940: 61 63 74 20 74 68 61 74 20 73 74 61 63 6b 69 6e act that stackin
4950: 67 20 61 20 74 72 61 6e 73 66 6f 72 6d 20 6f 76 g a transform ov
4960: 65 72 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 er another.
4970: 2a 20 74 72 61 6e 73 66 6f 72 6d 20 77 69 6c 6c * transform will
4980: 20 6c 65 61 76 65 20 6f 75 72 20 69 6e 74 65 72 leave our inter
4990: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 75 6e 63 68 nal pointer unch
49a0: 61 6e 67 65 64 2c 0a 20 20 20 20 20 2a 20 61 6e anged,. * an
49b0: 64 20 74 68 75 73 20 70 6f 69 6e 74 69 6e 67 20 d thus pointing
49c0: 74 6f 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 to the new trans
49d0: 66 6f 72 6d 2c 20 61 6e 64 20 6e 6f 74 20 74 68 form, and not th
49e0: 65 0a 20 20 20 20 20 2a 20 43 68 61 6e 6e 65 6c e. * Channel
49f0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 structure conta
4a00: 69 6e 69 6e 67 20 74 68 65 20 73 61 76 65 64 20 ining the saved
4a10: 73 74 61 74 65 20 6f 66 20 74 68 69 73 0a 20 20 state of this.
4a20: 20 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d 2e 20 * transform.
4a30: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 69 63 This is the pric
4a40: 65 20 74 6f 20 70 61 79 20 66 6f 72 20 6c 65 61 e to pay for lea
4a50: 76 69 6e 67 0a 20 20 20 20 20 2a 20 54 63 6c 5f ving. * Tcl_
4a60: 43 68 61 6e 6e 65 6c 20 72 65 66 65 72 65 6e 63 Channel referenc
4a70: 65 73 20 69 6e 74 61 63 74 2e 20 54 68 65 20 6f es intact. The o
4a80: 6e 6c 79 20 6f 74 68 65 72 20 73 6f 6c 75 74 69 nly other soluti
4a90: 6f 6e 0a 20 20 20 20 20 2a 20 69 73 20 61 6e 20 on. * is an
4aa0: 65 78 74 65 6e 73 69 6f 6e 20 6f 66 20 54 63 6c extension of Tcl
4ab0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 77 69 74 _ChannelType wit
4ac0: 68 20 61 6e 6f 74 68 65 72 20 64 72 69 76 65 72 h another driver
4ad0: 0a 20 20 20 20 20 2a 20 70 72 6f 63 65 64 75 72 . * procedur
4ae0: 65 20 74 6f 20 6e 6f 74 69 66 79 20 61 20 43 68 e to notify a Ch
4af0: 61 6e 6e 65 6c 20 61 62 6f 75 74 20 74 68 65 20 annel about the
4b00: 28 75 6e 29 73 74 61 63 6b 69 6e 67 2e 0a 20 20 (un)stacking..
4b10: 20 20 20 2a 0a 20 20 20 20 20 2a 20 49 74 20 77 *. * It w
4b20: 61 6c 6b 73 20 74 68 65 20 63 68 61 69 6e 20 6f alks the chain o
4b30: 66 20 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 f Channel struct
4b40: 75 72 65 73 20 75 6e 74 69 6c 20 69 74 0a 20 20 ures until it.
4b50: 20 20 20 2a 20 66 69 6e 64 73 20 74 68 65 20 6f * finds the o
4b60: 6e 65 20 70 6f 69 6e 74 69 6e 67 20 68 61 76 69 ne pointing havi
4b70: 6e 67 20 27 63 74 72 6c 27 20 61 73 20 69 6e 73 ng 'ctrl' as ins
4b80: 74 61 6e 63 65 44 61 74 61 0a 20 20 20 20 20 2a tanceData. *
4b90: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e and then return
4ba0: 73 20 74 68 65 20 73 75 70 65 72 63 65 64 69 6e s the supercedin
4bb0: 67 20 63 68 61 6e 6e 65 6c 20 74 6f 20 74 68 61 g channel to tha
4bc0: 74 2e 20 28 41 4b 29 0a 20 20 20 20 20 2a 2f 0a t. (AK). */.
4bd0: 20 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 . Tcl_Channe
4be0: 6c 20 73 65 6c 66 20 3d 20 73 74 61 74 65 50 74 l self = statePt
4bf0: 72 2d 3e 73 65 6c 66 3b 0a 20 20 20 20 54 63 6c r->self;. Tcl
4c00: 5f 43 68 61 6e 6e 65 6c 20 6e 65 78 74 3b 0a 0a _Channel next;..
4c10: 20 20 20 20 77 68 69 6c 65 20 28 28 43 6c 69 65 while ((Clie
4c20: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
4c30: 20 21 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e != Tcl_GetChann
4c40: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 20 28 elInstanceData (
4c50: 73 65 6c 66 29 29 20 7b 0a 09 6e 65 78 74 20 3d self)) {..next =
4c60: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 Tcl_GetStackedC
4c70: 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29 3b 0a 09 hannel (self);..
4c80: 69 66 20 28 6e 65 78 74 20 3d 3d 20 28 54 63 6c if (next == (Tcl
4c90: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
4ca0: 7b 0a 09 20 20 20 20 2f 2a 20 30 39 2f 32 34 2f {.. /* 09/24/
4cb0: 31 39 39 39 20 55 6e 73 74 61 63 6b 69 6e 67 20 1999 Unstacking
4cc0: 62 75 67 2c 0a 09 20 20 20 20 20 2a 20 66 6f 75 bug,.. * fou
4cd0: 6e 64 20 62 79 20 4d 61 74 74 20 4e 65 77 6d 61 nd by Matt Newma
4ce0: 6e 20 3c 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f n <matt@sensus.o
4cf0: 72 67 3e 2e 0a 09 20 20 20 20 20 2a 0a 09 20 20 rg>... *..
4d00: 20 20 20 2a 20 57 65 20 77 65 72 65 20 75 6e 61 * We were una
4d10: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 ble to find the
4d20: 63 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 channel structur
4d30: 65 20 66 6f 72 20 74 68 69 73 0a 09 20 20 20 20 e for this..
4d40: 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f * transformatio
4d50: 6e 20 69 6e 20 74 68 65 20 63 68 61 69 6e 20 6f n in the chain o
4d60: 66 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 f stacked channe
4d70: 6c 2e 20 54 68 69 73 0a 09 20 20 20 20 20 2a 20 l. This.. *
4d80: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 means that we ar
4d90: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 e currently in t
4da0: 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 75 6e he process of un
4db0: 73 74 61 63 6b 69 6e 67 0a 09 20 20 20 20 20 2a stacking.. *
4dc0: 20 69 74 20 2a 61 6e 64 2a 20 74 68 65 72 65 20 it *and* there
4dd0: 77 65 72 65 20 73 6f 6d 65 20 62 79 74 65 73 20 were some bytes
4de0: 77 61 69 74 69 6e 67 20 77 68 69 63 68 20 61 72 waiting which ar
4df0: 65 20 6e 6f 77 0a 09 20 20 20 20 20 2a 20 66 6c e now.. * fl
4e00: 75 73 68 65 64 2e 20 49 6e 20 74 68 69 73 20 73 ushed. In this s
4e10: 69 74 75 61 74 69 6f 6e 20 74 68 65 20 70 6f 69 ituation the poi
4e20: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 61 6e nter to the chan
4e30: 6e 65 6c 0a 09 20 20 20 20 20 2a 20 69 74 73 65 nel.. * itse
4e40: 6c 66 20 61 6c 72 65 61 64 79 20 72 65 66 65 72 lf already refer
4e50: 73 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 s to the parent
4e60: 63 68 61 6e 6e 65 6c 20 77 65 20 68 61 76 65 20 channel we have
4e70: 74 6f 0a 09 20 20 20 20 20 2a 20 77 72 69 74 65 to.. * write
4e80: 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 2c the bytes into,
4e90: 20 73 6f 20 77 65 20 72 65 74 75 72 6e 20 74 68 so we return th
4ea0: 61 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 at... */..
4eb0: 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 50 74 return statePt
4ec0: 72 2d 3e 73 65 6c 66 3b 0a 09 7d 0a 09 73 65 6c r->self;..}..sel
4ed0: 66 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a f = next;. }.
4ee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f . return Tcl_
4ef0: 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 GetStackedChanne
4f00: 6c 20 28 73 65 6c 66 29 3b 0a 23 65 6e 64 69 66 l (self);.#endif
4f10: 0a 23 65 6e 64 69 66 0a 7d 0a .#endif.}.