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 32 20 32 30 30 .c,v 1.7.2.2 200
0090: 30 2f 30 37 2f 31 32 20 30 31 3a 35 34 3a 32 36 0/07/12 01:54:26
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 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 t.TlsBlockModePr
0360: 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 oc _ANSI_ARGS_((
0370: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 ClientData insta
0380: 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 nceData,....int
0390: 6d 6f 64 65 29 29 3b 0a 73 74 61 74 69 63 20 69 mode));.static i
03a0: 6e 74 09 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 nt.TlsCloseProc
03b0: 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c _ANSI_ARGS_ ((Cl
03c0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
03d0: 65 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e eData,....Tcl_In
03e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 29 3b 0a terp *interp));.
03f0: 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 49 6e static int.TlsIn
0400: 70 75 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 putProc _ANSI_AR
0410: 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 GS_((ClientData
0420: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 instanceData,...
0430: 09 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 .char *buf, int
0440: 62 75 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 72 bufSize, int *er
0450: 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 73 74 rorCodePtr));.st
0460: 61 74 69 63 20 69 6e 74 09 54 6c 73 4f 75 74 70 atic int.TlsOutp
0470: 75 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 utProc _ANSI_ARG
0480: 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 S_((ClientData i
0490: 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 nstanceData,....
04a0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 char *buf, int t
04b0: 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 oWrite, int *err
04c0: 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 73 74 61 orCodePtr));.sta
04d0: 74 69 63 20 69 6e 74 09 54 6c 73 47 65 74 4f 70 tic int.TlsGetOp
04e0: 74 69 6f 6e 50 72 6f 63 20 5f 41 4e 53 49 5f 41 tionProc _ANSI_A
04f0: 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 RGS_ ((ClientDat
0500: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a a instanceData,.
0510: 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ...Tcl_Interp *i
0520: 6e 74 65 72 70 2c 20 63 68 61 72 20 2a 6f 70 74 nterp, char *opt
0530: 69 6f 6e 4e 61 6d 65 2c 0a 09 09 09 54 63 6c 5f ionName,....Tcl_
0540: 44 53 74 72 69 6e 67 20 2a 64 73 50 74 72 29 29 DString *dsPtr))
0550: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 54 6c ;.static void.Tl
0560: 73 57 61 74 63 68 50 72 6f 63 20 5f 41 4e 53 49 sWatchProc _ANSI
0570: 5f 41 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 _ARGS_((ClientDa
0580: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c ta instanceData,
0590: 20 69 6e 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61 int mask));.sta
05a0: 74 69 63 20 69 6e 74 09 54 6c 73 47 65 74 48 61 tic int.TlsGetHa
05b0: 6e 64 6c 65 50 72 6f 63 20 5f 41 4e 53 49 5f 41 ndleProc _ANSI_A
05c0: 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 RGS_ ((ClientDat
05d0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a a instanceData,.
05e0: 09 09 09 69 6e 74 20 64 69 72 65 63 74 69 6f 6e ...int direction
05f0: 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 , ClientData *ha
0600: 6e 64 6c 65 50 74 72 29 29 3b 0a 73 74 61 74 69 ndlePtr));.stati
0610: 63 20 69 6e 74 09 54 6c 73 4e 6f 74 69 66 79 50 c int.TlsNotifyP
0620: 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 roc _ANSI_ARGS_
0630: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ((ClientData ins
0640: 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 6e tanceData,....in
0650: 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 t mask));.static
0660: 20 76 6f 69 64 09 54 6c 73 43 68 61 6e 6e 65 6c void.TlsChannel
0670: 48 61 6e 64 6c 65 72 20 5f 41 4e 53 49 5f 41 52 Handler _ANSI_AR
0680: 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 GS_ ((ClientData
0690: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 clientData,....
06a0: 69 6e 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 int mask));.stat
06b0: 69 63 20 76 6f 69 64 09 54 6c 73 43 68 61 6e 6e ic void.TlsChann
06c0: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 5f elHandlerTimer _
06d0: 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 ANSI_ARGS_ ((Cli
06e0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
06f0: 74 61 29 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 69 ta));../*. * Thi
0700: 73 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63 s structure desc
0710: 72 69 62 65 73 20 74 68 65 20 63 68 61 6e 6e 65 ribes the channe
0720: 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72 65 l type structure
0730: 20 66 6f 72 20 54 43 50 20 73 6f 63 6b 65 74 0a for TCP socket.
0740: 20 2a 20 62 61 73 65 64 20 49 4f 3a 0a 20 2a 2f * based IO:. */
0750: 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 48 41 4e .#ifdef TCL_CHAN
0760: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 73 74 NEL_VERSION_2.st
0770: 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c atic Tcl_Channel
0780: 54 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54 Type tlsChannelT
0790: 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 74 6c 73 ype = {. "tls
07a0: 22 2c 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 ",../* Type name
07b0: 2e 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 . */. TCL_CHA
07c0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 09 NNEL_VERSION_2,.
07d0: 2f 2a 20 41 20 4e 47 20 63 68 61 6e 6e 65 6c 20 /* A NG channel
07e0: 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 */. TlsCloseP
07f0: 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 roc,../* Close p
0800: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 49 roc. */. TlsI
0810: 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e nputProc,../* In
0820: 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 put proc. */.
0830: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2c 09 TlsOutputProc,.
0840: 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 2e ./* Output proc.
0850: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f */. NULL,../
0860: 2a 20 53 65 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a * Seek proc. */.
0870: 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 NULL,../* Se
0880: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a t option proc. *
0890: 2f 0a 20 20 20 20 54 6c 73 47 65 74 4f 70 74 69 /. TlsGetOpti
08a0: 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f onProc,./* Get o
08b0: 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 ption proc. */.
08c0: 20 20 20 54 6c 73 57 61 74 63 68 50 72 6f 63 2c TlsWatchProc,
08d0: 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 ../* Initialize
08e0: 6e 6f 74 69 66 69 65 72 2e 20 2a 2f 0a 20 20 20 notifier. */.
08f0: 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f TlsGetHandlePro
0900: 63 2c 09 2f 2a 20 47 65 74 20 66 69 6c 65 20 68 c,./* Get file h
0910: 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 63 68 61 andle out of cha
0920: 6e 6e 65 6c 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c nnel. */. NUL
0930: 4c 2c 09 09 2f 2a 20 43 6c 6f 73 65 32 50 72 6f L,../* Close2Pro
0940: 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 42 6c 6f c. */. TlsBlo
0950: 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 ckModeProc,./* S
0960: 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 et blocking/nonb
0970: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a locking mode.*/.
0980: 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 46 6c NULL,../* Fl
0990: 75 73 68 50 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 ushProc. */.
09a0: 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 2c 09 2f TlsNotifyProc,./
09b0: 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63 2e 20 2a * handlerProc. *
09c0: 2f 0a 7d 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 /.};.#else.stati
09d0: 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 c Tcl_ChannelTyp
09e0: 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 e tlsChannelType
09f0: 20 3d 20 7b 0a 20 20 20 20 22 74 6c 73 22 2c 09 = {. "tls",.
0a00: 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a ./* Type name. *
0a10: 2f 0a 20 20 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f /. TlsBlockMo
0a20: 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 62 deProc,./* Set b
0a30: 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b locking/nonblock
0a40: 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20 ing mode.*/.
0a50: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f TlsCloseProc,../
0a60: 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a 2f * Close proc. */
0a70: 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 50 72 6f . TlsInputPro
0a80: 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f c,../* Input pro
0a90: 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4f 75 74 c. */. TlsOut
0aa0: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 putProc,../* Out
0ab0: 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 put proc. */.
0ac0: 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b 20 NULL,../* Seek
0ad0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c proc. */. NUL
0ae0: 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f L,../* Set optio
0af0: 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 n proc. */. T
0b00: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c lsGetOptionProc,
0b10: 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 ./* Get option p
0b20: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 57 roc. */. TlsW
0b30: 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e atchProc,../* In
0b40: 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 itialize notifie
0b50: 72 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 r. */. TlsGet
0b60: 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 HandleProc,./* G
0b70: 65 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f et file handle o
0b80: 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a ut of channel. *
0b90: 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 54 63 6c /.};.#endif..Tcl
0ba0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 54 6c _ChannelType *Tl
0bb0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 0a s_ChannelType().
0bc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 74 6c {. return &tl
0bd0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d 0a sChannelType;.}.
0be0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
0c30: 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f TlsBlockModePro
0c40: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 c --. *. *.This
0c50: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
0c60: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 oked by the gene
0c70: 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 ric IO level. *
0c80: 20 20 20 20 20 20 74 6f 20 73 65 74 20 62 6c 6f to set blo
0c90: 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f cking and nonblo
0ca0: 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 20 2a 20 52 cking modes. * R
0cb0: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 esults:. *.0 if
0cc0: 73 75 63 63 65 73 73 66 75 6c 2c 20 65 72 72 6e successful, errn
0cd0: 6f 20 77 68 65 6e 20 66 61 69 6c 65 64 2e 0a 20 o when failed..
0ce0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
0cf0: 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64 s:. *.Sets the d
0d00: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b evice into block
0d10: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 ing or nonblocki
0d20: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d ng mode.. *. *--
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
0d80: 74 0a 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 t.TlsBlockModePr
0d90: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e oc(ClientData in
0da0: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 stanceData,./* S
0db0: 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a ocket state. */.
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0dd0: 20 69 6e 74 20 6d 6f 64 65 29 09 09 09 2f 2a 20 int mode).../*
0de0: 54 68 65 20 6d 6f 64 65 20 74 6f 20 73 65 74 2e The mode to set.
0df0: 20 43 61 6e 20 62 65 20 6f 6e 65 20 6f 66 0a 09 Can be one of..
0e00: 09 09 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 5f .....* TCL_MODE_
0e10: 42 4c 4f 43 4b 49 4e 47 20 6f 72 0a 09 09 09 09 BLOCKING or.....
0e20: 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e ..* TCL_MODE_NON
0e30: 42 4c 4f 43 4b 49 4e 47 2e 20 2a 2f 0a 7b 0a 20 BLOCKING. */.{.
0e40: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
0e50: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 tr = (State *) i
0e60: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 nstanceData;..
0e70: 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 if (mode == TC
0e80: 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 L_MODE_NONBLOCKI
0e90: 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d NG) {..statePtr-
0ea0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
0eb0: 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 L_ASYNC;. } e
0ec0: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d lse {..statePtr-
0ed0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f >flags &= ~(TLS_
0ee0: 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 TCL_ASYNC);.
0ef0: 7d 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 48 41 }.#ifdef TCL_CHA
0f00: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 20 NNEL_VERSION_2.
0f10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c return 0;.#el
0f20: 73 65 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 se. return Tc
0f30: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
0f40: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 on(statePtr->int
0f50: 65 72 70 2c 20 54 6c 73 5f 47 65 74 50 61 72 65 erp, Tls_GetPare
0f60: 6e 74 28 73 74 61 74 65 50 74 72 29 2c 0a 09 09 nt(statePtr),...
0f70: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 28 6d 6f "-blocking", (mo
0f80: 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e de == TCL_MODE_N
0f90: 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 3f 20 22 30 ONBLOCKING) ? "0
0fa0: 22 20 3a 20 22 31 22 29 3b 0a 23 65 6e 64 69 66 " : "1");.#endif
0fb0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1000: 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 . * TlsCloseProc
1010: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
1020: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
1030: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 ked by the gener
1040: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 ic IO level to p
1050: 65 72 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 erform. *.channe
1060: 6c 2d 74 79 70 65 2d 73 70 65 63 69 66 69 63 20 l-type-specific
1070: 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 61 20 53 cleanup when a S
1080: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 SL socket based
1090: 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c channel. *.is cl
10a0: 6f 73 65 64 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 osed.. *. *.Note
10b0: 3a 20 77 65 20 6c 65 61 76 65 20 74 68 65 20 75 : we leave the u
10c0: 6e 64 65 72 6c 79 69 6e 67 20 73 6f 63 6b 65 74 nderlying socket
10d0: 20 61 6c 6f 6e 65 2c 20 69 73 20 74 68 69 73 20 alone, is this
10e0: 72 69 67 68 74 3f 0a 20 2a 0a 20 2a 20 52 65 73 right?. *. * Res
10f0: 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 ults:. *.0 if su
1100: 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 76 61 ccessful, the va
1110: 6c 75 65 20 6f 66 20 54 63 6c 5f 47 65 74 45 72 lue of Tcl_GetEr
1120: 72 6e 6f 28 29 20 69 66 20 66 61 69 6c 65 64 2e rno() if failed.
1130: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
1140: 63 74 73 3a 0a 20 2a 09 43 6c 6f 73 65 73 20 74 cts:. *.Closes t
1150: 68 65 20 73 6f 63 6b 65 74 20 6f 66 20 74 68 65 he socket of the
1160: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
11c0: 74 0a 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 43 t.TlsCloseProc(C
11d0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
11e0: 63 65 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 ceData,./* The s
11f0: 6f 63 6b 65 74 20 74 6f 20 63 6c 6f 73 65 2e 20 ocket to close.
1200: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 */.
1210: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1220: 72 70 29 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 rp)./* For error
1230: 20 72 65 70 6f 72 74 69 6e 67 20 2d 20 75 6e 75 reporting - unu
1240: 73 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 sed. */.{. St
1250: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
1260: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
1270: 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ceData;.. dpr
1280: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e 54 intf(stderr,"\nT
1290: 6c 73 43 6c 6f 73 65 50 72 6f 63 28 30 78 25 78 lsCloseProc(0x%x
12a0: 29 22 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 0a )", statePtr);..
12b0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 /*. * Re
12c0: 6d 6f 76 65 20 65 76 65 6e 74 20 68 61 6e 64 6c move event handl
12d0: 65 72 20 74 6f 20 75 6e 64 65 72 6c 79 69 6e 67 er to underlying
12e0: 20 63 68 61 6e 6e 65 6c 2c 20 74 68 69 73 20 63 channel, this c
12f0: 6f 75 6c 64 0a 20 20 20 20 20 2a 20 62 65 20 62 ould. * be b
1300: 65 63 61 75 73 65 20 77 65 20 61 72 65 20 63 6c ecause we are cl
1310: 6f 73 69 6e 67 20 66 6f 72 20 72 65 61 6c 2c 20 osing for real,
1320: 6f 72 20 62 65 69 6e 67 20 22 75 6e 73 74 61 63 or being "unstac
1330: 6b 65 64 22 2e 0a 20 20 20 20 20 2a 2f 0a 23 69 ked".. */.#i
1340: 66 6e 64 65 66 20 54 43 4c 5f 43 48 41 4e 4e 45 fndef TCL_CHANNE
1350: 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 20 20 20 20 L_VERSION_2.
1360: 54 63 6c 5f 44 65 6c 65 74 65 43 68 61 6e 6e 65 Tcl_DeleteChanne
1370: 6c 48 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 74 lHandler(Tls_Get
1380: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 Parent(statePtr)
1390: 2c 0a 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e ,..TlsChannelHan
13a0: 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 dler, (ClientDat
13b0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 23 65 a) statePtr);.#e
13c0: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 73 74 61 ndif. if (sta
13d0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
13e0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
13f0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
1400: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 eteTimerHandler
1410: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
1420: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
1430: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 mer = (Tcl_Timer
1440: 54 6f 6b 65 6e 29 4e 55 4c 4c 3b 0a 20 20 20 20 Token)NULL;.
1450: 7d 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e }.. Tls_Clean
1460: 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 (statePtr);.
1470: 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 Tcl_EventuallyFr
1480: 65 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 ee( (ClientData)
1490: 73 74 61 74 65 50 74 72 2c 20 54 6c 73 5f 46 72 statePtr, Tls_Fr
14a0: 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 ee);. return
14b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
14c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
14d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1500: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 49 6e ----. *. * TlsIn
1510: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a putProc --. *. *
1520: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
1530: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 is invoked by th
1540: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 e generic IO lev
1550: 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 72 el. * to r
1560: 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 ead input from a
1570: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
1580: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a d channel.. *. *
1590: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 Results:. *.The
15a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
15b0: 20 72 65 61 64 20 69 73 20 72 65 74 75 72 6e 65 read is returne
15c0: 64 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 d or -1 on error
15d0: 2e 20 41 6e 20 6f 75 74 70 75 74 0a 20 2a 09 61 . An output. *.a
15e0: 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 rgument contains
15f0: 20 74 68 65 20 50 4f 53 49 58 20 65 72 72 6f 72 the POSIX error
1600: 20 63 6f 64 65 20 6f 6e 20 65 72 72 6f 72 2c 20 code on error,
1610: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a 20 2a or zero if no. *
1620: 09 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2e .error occurred.
1630: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
1640: 63 74 73 3a 0a 20 2a 09 52 65 61 64 73 20 69 6e cts:. *.Reads in
1650: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 put from the inp
1660: 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 68 65 ut device of the
1670: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
16d0: 6e 74 0a 54 6c 73 49 6e 70 75 74 50 72 6f 63 28 nt.TlsInputProc(
16e0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 ClientData insta
16f0: 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b nceData,./* Sock
1700: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 et state. */.
1710: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a char *
1720: 62 75 66 2c 09 09 09 2f 2a 20 57 68 65 72 65 20 buf,.../* Where
1730: 74 6f 20 73 74 6f 72 65 20 64 61 74 61 20 72 65 to store data re
1740: 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 ad. */.
1750: 20 20 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c int bufSize,
1760: 09 09 2f 2a 20 48 6f 77 20 6d 75 63 68 20 73 70 ../* How much sp
1770: 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 ace is available
1780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17a0: 20 20 20 20 20 20 20 20 20 20 2a 20 69 6e 20 74 * in t
17b0: 68 65 20 62 75 66 66 65 72 3f 20 2a 2f 0a 20 20 he buffer? */.
17c0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a int *
17d0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 09 2f errorCodePtr)../
17e0: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 * Where to store
17f0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a error code. */.
1800: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
1810: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
1820: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
1830: 20 20 20 20 69 6e 74 20 62 79 74 65 73 52 65 61 int bytesRea
1840: 64 3b 09 09 09 2f 2a 20 48 6f 77 20 6d 61 6e 79 d;.../* How many
1850: 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 bytes were read
1860: 3f 20 2a 2f 0a 0a 20 20 20 20 2a 65 72 72 6f 72 ? */.. *error
1870: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 CodePtr = 0;..
1880: 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 dprintf(stderr
1890: 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 28 25 64 29 ,"\nBIO_read(%d)
18a0: 22 2c 20 62 75 66 53 69 7a 65 29 3b 0a 0a 20 20 ", bufSize);..
18b0: 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e if (!SSL_is_in
18c0: 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74 it_finished(stat
18d0: 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 62 ePtr->ssl)) {..b
18e0: 79 74 65 73 52 65 61 64 20 3d 20 54 6c 73 5f 57 ytesRead = Tls_W
18f0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 aitForConnect(st
1900: 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 atePtr, errorCod
1910: 65 50 74 72 29 3b 0a 09 69 66 20 28 62 79 74 65 ePtr);..if (byte
1920: 73 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 20 sRead <= 0) {..
1930: 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 09 goto input;..
1940: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. }. if (
1950: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
1960: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 & TLS_TCL_INIT)
1970: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 {..statePtr->fla
1980: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
1990: 49 4e 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 INIT);. }.
19a0: 20 62 79 74 65 73 52 65 61 64 20 3d 20 42 49 4f bytesRead = BIO
19b0: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e _read(statePtr->
19c0: 62 69 6f 2c 20 62 75 66 2c 20 62 75 66 53 69 7a bio, buf, bufSiz
19d0: 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 e);. dprintf(
19e0: 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 72 65 stderr,"\nBIO_re
19f0: 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 ad -> %d", bytes
1a00: 52 65 61 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 Read);.. if (
1a10: 62 79 74 65 73 52 65 61 64 20 3c 20 30 29 20 7b bytesRead < 0) {
1a20: 0a 09 69 6e 74 20 65 72 72 20 3d 20 53 53 4c 5f ..int err = SSL_
1a30: 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 get_error(stateP
1a40: 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 tr->ssl, bytesRe
1a50: 61 64 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 3d ad);...if (err =
1a60: 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 29 = SSL_ERROR_SSL)
1a70: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f {.. Tls_Erro
1a80: 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f r(statePtr, SSL_
1a90: 45 52 52 4f 52 28 73 74 61 74 65 50 74 72 2d 3e ERROR(statePtr->
1aa0: 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 29 29 ssl, bytesRead))
1ab0: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
1ac0: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 ePtr = ECONNABOR
1ad0: 54 45 44 3b 0a 09 20 20 20 20 67 6f 74 6f 20 69 TED;.. goto i
1ae0: 6e 70 75 74 3b 0a 09 7d 20 65 6c 73 65 20 69 66 nput;..} else if
1af0: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 (BIO_should_ret
1b00: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ry(statePtr->bio
1b10: 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 )) {.. dprint
1b20: 66 28 73 74 64 65 72 72 2c 22 52 45 21 20 22 29 f(stderr,"RE! ")
1b30: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
1b40: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 ePtr = EAGAIN;..
1b50: 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a goto input;.
1b60: 09 7d 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 45 .}..if (Tcl_GetE
1b70: 72 72 6e 6f 28 29 20 3d 3d 20 45 43 4f 4e 4e 52 rrno() == ECONNR
1b80: 45 53 45 54 29 20 7b 0a 09 20 20 20 20 2f 2a 20 ESET) {.. /*
1b90: 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 20 20 20 Soft EOF */..
1ba0: 20 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a bytesRead = 0;.
1bb0: 09 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b . goto input;
1bc0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
1bd0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
1be0: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a Tcl_GetErrno();.
1bf0: 09 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b . goto input;
1c00: 0a 09 7d 0a 20 20 20 20 7d 0a 69 6e 70 75 74 3a ..}. }.input:
1c10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
1c20: 65 72 72 2c 20 22 5c 6e 49 6e 70 75 74 28 25 64 err, "\nInput(%d
1c30: 29 20 2d 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 ) -> %d [%d]", b
1c40: 75 66 53 69 7a 65 2c 20 62 79 74 65 73 52 65 61 ufSize, bytesRea
1c50: 64 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 d, *errorCodePtr
1c60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 79 );. return by
1c70: 74 65 73 52 65 61 64 3b 0a 7d 0a 0c 0a 2f 2a 0a tesRead;.}.../*.
1c80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1cc0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f -----. *. * TlsO
1cd0: 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a utputProc --. *.
1ce0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
1cf0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 e is invoked by
1d00: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c the generic IO l
1d10: 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f evel. * to
1d20: 20 77 72 69 74 65 20 6f 75 74 70 75 74 20 74 6f write output to
1d30: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
1d40: 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a sed channel.. *.
1d50: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 * Results:. *.T
1d60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
1d70: 65 73 20 77 72 69 74 74 65 6e 20 69 73 20 72 65 es written is re
1d80: 74 75 72 6e 65 64 2e 20 41 6e 20 6f 75 74 70 75 turned. An outpu
1d90: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 2a t argument is. *
1da0: 09 73 65 74 20 74 6f 20 61 20 50 4f 53 49 58 20 .set to a POSIX
1db0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e error code if an
1dc0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c error occurred,
1dd0: 20 6f 72 20 7a 65 72 6f 2e 0a 20 2a 0a 20 2a 20 or zero.. *. *
1de0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
1df0: 09 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 6f .Writes output o
1e00: 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 65 76 n the output dev
1e10: 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e ice of the chann
1e20: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
1e70: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 ..static int.Tls
1e80: 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e OutputProc(Clien
1e90: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
1ea0: 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 ta,./* Socket st
1eb0: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 ate. */.
1ec0: 20 20 20 20 20 20 63 68 61 72 20 2a 62 75 66 2c char *buf,
1ed0: 09 09 09 2f 2a 20 54 68 65 20 64 61 74 61 20 62 .../* The data b
1ee0: 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 uffer. */.
1ef0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 57 72 int toWr
1f00: 69 74 65 2c 09 09 2f 2a 20 48 6f 77 20 6d 61 6e ite,../* How man
1f10: 79 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 y bytes to write
1f20: 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 ? */.
1f30: 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 int *errorCod
1f40: 65 50 74 72 29 09 2f 2a 20 57 68 65 72 65 20 74 ePtr)./* Where t
1f50: 6f 20 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f o store error co
1f60: 64 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 de. */.{. Sta
1f70: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
1f80: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
1f90: 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 eData;. int w
1fa0: 72 69 74 74 65 6e 2c 20 65 72 72 3b 0a 0a 20 20 ritten, err;..
1fb0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
1fc0: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
1fd0: 66 28 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f f(stderr,"\nBIO_
1fe0: 77 72 69 74 65 28 25 64 29 22 2c 20 74 6f 57 72 write(%d)", toWr
1ff0: 69 74 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 ite);.. if (!
2000: 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 SSL_is_init_fini
2010: 73 68 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 shed(statePtr->s
2020: 73 6c 29 29 20 7b 0a 09 77 72 69 74 74 65 6e 20 sl)) {..written
2030: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e = Tls_WaitForCon
2040: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 nect(statePtr, e
2050: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 69 rrorCodePtr);..i
2060: 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 f (written <= 0)
2070: 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 6f 75 74 {.. goto out
2080: 70 75 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 put;..}. }.
2090: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
20a0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
20b0: 49 4e 49 54 29 20 7b 0a 09 73 74 61 74 65 50 74 INIT) {..statePt
20c0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
20d0: 53 5f 54 43 4c 5f 49 4e 49 54 29 3b 0a 20 20 20 S_TCL_INIT);.
20e0: 20 7d 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69 }. if (toWri
20f0: 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 72 69 te == 0) {..dpri
2100: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7a 65 72 ntf(stderr, "zer
2110: 6f 2d 77 72 69 74 65 5c 6e 22 29 3b 0a 09 42 49 o-write\n");..BI
2120: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 O_flush(statePtr
2130: 2d 3e 62 69 6f 29 3b 0a 09 77 72 69 74 74 65 6e ->bio);..written
2140: 20 3d 20 30 3b 0a 09 67 6f 74 6f 20 6f 75 74 70 = 0;..goto outp
2150: 75 74 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ut;. } else {
2160: 0a 09 77 72 69 74 74 65 6e 20 3d 20 42 49 4f 5f ..written = BIO_
2170: 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e write(statePtr->
2180: 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69 74 bio, buf, toWrit
2190: 65 29 3b 0a 09 64 70 72 69 6e 74 66 28 73 74 64 e);..dprintf(std
21a0: 65 72 72 2c 22 5c 6e 42 49 4f 5f 77 72 69 74 65 err,"\nBIO_write
21b0: 28 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 74 (%d) -> [%d]", t
21c0: 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 oWrite, written)
21d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
21e0: 77 72 69 74 74 65 6e 20 3c 20 30 20 7c 7c 20 77 written < 0 || w
21f0: 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 ritten == 0) {..
2200: 73 77 69 74 63 68 20 28 28 65 72 72 20 3d 20 53 switch ((err = S
2210: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 SL_get_error(sta
2220: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 tePtr->ssl, writ
2230: 74 65 6e 29 29 29 20 7b 0a 09 63 61 73 65 20 53 ten))) {..case S
2240: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 SL_ERROR_NONE:..
2250: 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e 20 if (written
2260: 3c 3d 20 30 29 20 7b 0a 09 09 77 72 69 74 74 65 <= 0) {...writte
2270: 6e 20 3d 20 30 3b 0a 09 09 67 6f 74 6f 20 6f 75 n = 0;...goto ou
2280: 74 70 75 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 tput;.. }..
2290: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 break;..case S
22a0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 SL_ERROR_WANT_WR
22b0: 49 54 45 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 ITE:.. dprint
22c0: 66 28 73 74 64 65 72 72 2c 22 77 72 69 74 65 20 f(stderr,"write
22d0: 57 20 42 4c 4f 43 4b 5c 6e 22 29 3b 0a 09 20 20 W BLOCK\n");..
22e0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 break;..case S
22f0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
2300: 41 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 AD:.. dprintf
2310: 28 73 74 64 65 72 72 2c 22 77 72 69 74 65 20 52 (stderr,"write R
2320: 20 42 4c 4f 43 4b 5c 6e 22 29 3b 0a 09 20 20 20 BLOCK\n");..
2330: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 break;..case SS
2340: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 L_ERROR_WANT_X50
2350: 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 64 9_LOOKUP:.. d
2360: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 77 printf(stderr,"w
2370: 72 69 74 65 20 58 20 42 4c 4f 43 4b 5c 6e 22 29 rite X BLOCK\n")
2380: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
2390: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
23a0: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 RO_RETURN:..
23b0: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
23c0: 63 6c 6f 73 65 64 5c 6e 22 29 3b 0a 09 20 20 20 closed\n");..
23d0: 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 written = 0;..
23e0: 20 20 20 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a goto output;.
23f0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
2400: 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2a 65 SYSCALL:.. *e
2410: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 rrorCodePtr = Tc
2420: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 20 l_GetErrno();..
2430: 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 dprintf(stder
2440: 72 2c 22 5b 25 64 5d 20 73 79 73 63 61 6c 6c 20 r,"[%d] syscall
2450: 65 72 72 72 3a 20 25 64 5c 6e 22 2c 20 77 72 69 errr: %d\n", wri
2460: 74 74 65 6e 2c 20 54 63 6c 5f 47 65 74 45 72 72 tten, Tcl_GetErr
2470: 6e 6f 28 29 29 3b 0a 09 20 20 20 20 77 72 69 74 no());.. writ
2480: 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 67 ten = -1;.. g
2490: 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 09 63 61 73 oto output;..cas
24a0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a e SSL_ERROR_SSL:
24b0: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 .. Tls_Error(
24c0: 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 statePtr, SSL_ER
24d0: 52 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ROR(statePtr->ss
24e0: 6c 2c 20 77 72 69 74 74 65 6e 29 29 3b 0a 09 20 l, written));..
24f0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
2500: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
2510: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 .. written =
2520: 2d 31 3b 0a 09 20 20 20 20 67 6f 74 6f 20 6f 75 -1;.. goto ou
2530: 74 70 75 74 3b 0a 09 64 65 66 61 75 6c 74 3a 0a tput;..default:.
2540: 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
2550: 65 72 72 2c 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 err,"unknown err
2560: 3a 20 25 64 5c 6e 22 2c 20 65 72 72 29 3b 0a 09 : %d\n", err);..
2570: 7d 0a 20 20 20 20 7d 0a 6f 75 74 70 75 74 3a 0a }. }.output:.
2580: 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 dprintf(stde
2590: 72 72 2c 20 22 5c 6e 4f 75 74 70 75 74 28 25 64 rr, "\nOutput(%d
25a0: 29 20 2d 3e 20 25 64 22 2c 20 74 6f 57 72 69 74 ) -> %d", toWrit
25b0: 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 e, written);.
25c0: 20 72 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b return written;
25d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2620: 0a 20 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e . * TlsGetOption
2630: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f Proc --. *. *.Co
2640: 6d 70 75 74 65 73 20 61 6e 20 6f 70 74 69 6f 6e mputes an option
2650: 20 76 61 6c 75 65 20 66 6f 72 20 61 20 53 53 4c value for a SSL
2660: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 socket based ch
2670: 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a 20 2a 09 6c annel, or a. *.l
2680: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f ist of all optio
2690: 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c ns and their val
26a0: 75 65 73 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a ues.. *. *.Note:
26b0: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 This code is ba
26c0: 73 65 64 20 6f 6e 20 63 6f 64 65 20 63 6f 6e 74 sed on code cont
26d0: 72 69 62 75 74 65 64 20 62 79 20 4a 6f 68 6e 20 ributed by John
26e0: 48 61 78 62 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 Haxby.. *. * Res
26f0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
2700: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 ard Tcl result.
2710: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 The value of the
2720: 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 69 6f specified optio
2730: 6e 20 6f 72 20 61 0a 20 2a 09 6c 69 73 74 20 6f n or a. *.list o
2740: 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e f all options an
2750: 64 09 74 68 65 69 72 20 76 61 6c 75 65 73 20 69 d.their values i
2760: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 s returned in th
2770: 65 0a 20 2a 09 73 75 70 70 6c 69 65 64 20 44 53 e. *.supplied DS
2780: 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 tring.. *. * Sid
2790: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
27a0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
27f0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 47 .static int.TlsG
2800: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 etOptionProc(Cli
2810: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
2820: 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 Data,./* Socket
2830: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 state. */.
2840: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 Tcl_I
2850: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
2860: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 /* For errors -
2870: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a can be NULL. */.
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2890: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d char *optionNam
28a0: 65 2c 09 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 e,../* Name of t
28b0: 68 65 20 6f 70 74 69 6f 6e 20 74 6f 0a 20 20 20 he option to.
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 *
28f0: 72 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c retrieve the val
2900: 75 65 20 66 6f 72 2c 20 6f 72 0a 20 20 20 20 20 ue for, or.
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
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 2a 20 4e 55 * NU
2940: 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 LL to get all op
2950: 74 69 6f 6e 73 20 61 6e 64 0a 20 20 20 20 20 20 tions and.
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2980: 20 20 20 20 20 20 20 20 20 20 20 2a 20 74 68 65 * the
2990: 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 ir values. */.
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 T
29b0: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 74 cl_DString *dsPt
29c0: 72 29 09 20 20 20 20 20 20 20 20 20 2f 2a 20 57 r). /* W
29d0: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 here to store th
29e0: 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 e computed value
29f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a20: 20 20 20 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 * initialized
2a30: 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b by caller. */.{
2a40: 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 48 41 4e .#ifdef TCL_CHAN
2a50: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 20 20 NEL_VERSION_2.
2a60: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
2a70: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e r = (State *) in
2a80: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 stanceData;.
2a90: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 6e Tcl_Channel down
2aa0: 43 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 Chan = Tls_GetPa
2ab0: 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 3b 0a rent(statePtr);.
2ac0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 Tcl_DriverGe
2ad0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 tOptionProc *get
2ae0: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 OptionProc;..
2af0: 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d getOptionProc =
2b00: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f Tcl_ChannelGetO
2b10: 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 ptionProc(Tcl_Ge
2b20: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 tChannelType(dow
2b30: 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 69 66 20 nChan));. if
2b40: 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 (getOptionProc !
2b50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
2b60: 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f n (*getOptionPro
2b70: 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 c)(Tcl_GetChanne
2b80: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f lInstanceData(do
2b90: 77 6e 43 68 61 6e 29 2c 0a 09 09 69 6e 74 65 72 wnChan),...inter
2ba0: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 64 p, optionName, d
2bb0: 73 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 sPtr);. } els
2bc0: 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 e if (optionName
2bd0: 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c == (char*) NULL
2be0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75 ) {../*.. * Requ
2bf0: 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 est is query for
2c00: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 all options, th
2c10: 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 is is ok... */..
2c20: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 return TCL_OK;.
2c30: 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }. /*.
2c40: 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 * Request for a
2c50: 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e specific option
2c60: 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 has to fail, we
2c70: 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e don't have any.
2c80: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 . */. ret
2c90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
2ca0: 65 6c 73 65 0a 20 20 20 20 53 74 61 74 65 20 2a else. State *
2cb0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
2cc0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
2cd0: 61 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 a;. size_t le
2ce0: 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 n = 0;.. if (
2cf0: 6f 70 74 69 6f 6e 4e 61 6d 65 20 21 3d 20 28 63 optionName != (c
2d00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 20 har *) NULL) {.
2d10: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 len = str
2d20: 6c 65 6e 28 6f 70 74 69 6f 6e 4e 61 6d 65 29 3b len(optionName);
2d30: 0a 20 20 20 20 7d 0a 23 69 66 20 30 0a 20 20 20 . }.#if 0.
2d40: 20 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30 29 20 if ((len == 0)
2d50: 7c 7c 0a 20 20 20 20 20 20 20 20 28 28 6c 65 6e ||. ((len
2d60: 20 3e 20 31 29 20 26 26 20 28 6f 70 74 69 6f 6e > 1) && (option
2d70: 4e 61 6d 65 5b 31 5d 20 3d 3d 20 27 63 27 29 20 Name[1] == 'c')
2d80: 26 26 0a 20 20 20 20 20 20 20 20 20 28 73 74 72 &&. (str
2d90: 6e 63 6d 70 28 6f 70 74 69 6f 6e 4e 61 6d 65 2c ncmp(optionName,
2da0: 20 22 2d 63 69 70 68 65 72 22 2c 20 6c 65 6e 29 "-cipher", len)
2db0: 20 3d 3d 20 30 29 29 29 20 7b 0a 20 20 20 20 20 == 0))) {.
2dc0: 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29 if (len == 0)
2dd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 {. T
2de0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 cl_DStringAppend
2df0: 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 22 Element(dsPtr, "
2e00: 2d 63 69 70 68 65 72 22 29 3b 0a 20 20 20 20 20 -cipher");.
2e10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c }. Tcl
2e20: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c _DStringAppendEl
2e30: 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 53 53 4c ement(dsPtr, SSL
2e40: 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 _get_cipher(stat
2e50: 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 20 20 20 ePtr->ssl));.
2e60: 20 20 20 20 20 69 66 20 28 6c 65 6e 29 20 7b 0a if (len) {.
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
2e80: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 rn TCL_OK;.
2e90: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 }. }.#endi
2ea0: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c f. return TCL
2eb0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0c 0a _OK;.#endif.}...
2ec0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
2f10: 6c 73 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 lsWatchProc --.
2f20: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 *. *.Initialize
2f30: 74 68 65 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 the notifier to
2f40: 77 61 74 63 68 20 54 63 6c 5f 46 69 6c 65 73 20 watch Tcl_Files
2f50: 66 72 6f 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 from this channe
2f60: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 l.. *. * Results
2f70: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
2f80: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
2f90: 2a 09 53 65 74 73 20 75 70 20 74 68 65 20 6e 6f *.Sets up the no
2fa0: 74 69 66 69 65 72 20 73 6f 20 74 68 61 74 20 61 tifier so that a
2fb0: 20 66 75 74 75 72 65 20 65 76 65 6e 74 20 6f 6e future event on
2fc0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 the channel. *.
2fd0: 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 will be seen by
2fe0: 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d Tcl.. *. *------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3030: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 /..static void.T
3040: 6c 73 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 lsWatchProc(Clie
3050: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
3060: 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b ata,./* The sock
3070: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 et state. */.
3080: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 int ma
3090: 73 6b 29 09 09 09 2f 2a 20 45 76 65 6e 74 73 20 sk).../* Events
30a0: 6f 66 20 69 6e 74 65 72 65 73 74 3b 20 61 6e 20 of interest; an
30b0: 4f 52 2d 65 64 0a 20 20 20 20 20 20 20 20 20 20 OR-ed.
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a *
30e0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 combination of
30f0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 0a 20 20 TCL_READABLE,.
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3120: 20 20 20 20 20 20 20 2a 20 54 43 4c 5f 57 52 49 * TCL_WRI
3130: 54 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 TABLE and TCL_EX
3140: 43 45 50 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 CEPTION. */.{.
3150: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
3160: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e r = (State *) in
3170: 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 23 69 66 stanceData;..#if
3180: 64 65 66 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f def TCL_CHANNEL_
3190: 56 45 52 53 49 4f 4e 5f 32 0a 20 20 20 20 54 63 VERSION_2. Tc
31a0: 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64 6f l_Channel do
31b0: 77 6e 43 68 61 6e 3b 0a 0a 20 20 20 20 73 74 61 wnChan;.. sta
31c0: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b tePtr->watchMask
31d0: 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a = mask;.. /*
31e0: 20 4e 6f 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 No channel hand
31f0: 6c 65 72 73 20 61 6e 79 20 6d 6f 72 65 2e 20 57 lers any more. W
3200: 65 20 77 69 6c 6c 20 62 65 20 6e 6f 74 69 66 69 e will be notifi
3210: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 ed automatically
3220: 0a 20 20 20 20 20 2a 20 61 62 6f 75 74 20 65 76 . * about ev
3230: 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e ents on the chan
3240: 6e 65 6c 20 62 65 6c 6f 77 20 76 69 61 20 61 20 nel below via a
3250: 63 61 6c 6c 20 74 6f 20 6f 75 72 0a 20 20 20 20 call to our.
3260: 20 2a 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 * 'TransformNot
3270: 69 66 79 50 72 6f 63 27 2e 20 42 75 74 20 77 65 ifyProc'. But we
3280: 20 68 61 76 65 20 74 6f 20 70 61 73 73 20 74 68 have to pass th
3290: 65 20 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20 e interest down
32a0: 6e 6f 77 2e 0a 20 20 20 20 20 2a 20 57 65 20 61 now.. * We a
32b0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 re allowed to ad
32c0: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 27 69 6e d additional 'in
32d0: 74 65 72 65 73 74 27 20 74 6f 20 74 68 65 20 6d terest' to the m
32e0: 61 73 6b 20 69 66 20 77 65 20 77 61 6e 74 0a 20 ask if we want.
32f0: 20 20 20 20 2a 20 74 6f 2e 20 42 75 74 20 74 68 * to. But th
3300: 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f is transformatio
3310: 6e 20 68 61 73 20 6e 6f 20 73 75 63 68 20 69 6e n has no such in
3320: 74 65 72 65 73 74 2e 20 49 74 20 6a 75 73 74 20 terest. It just
3330: 70 61 73 73 65 73 0a 20 20 20 20 20 2a 20 74 68 passes. * th
3340: 65 20 72 65 71 75 65 73 74 20 64 6f 77 6e 2c 20 e request down,
3350: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 unchanged..
3360: 2a 2f 0a 0a 20 20 20 20 64 6f 77 6e 43 68 61 6e */.. downChan
3370: 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 = Tls_GetParent
3380: 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 (statePtr);..
3390: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
33a0: 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 0a Type(downChan)).
33b0: 09 2d 3e 77 61 74 63 68 50 72 6f 63 28 54 63 6c .->watchProc(Tcl
33c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
33d0: 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e nceData(downChan
33e0: 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f ), mask);.. /
33f0: 2a 0a 20 20 20 20 20 2a 20 4d 61 6e 61 67 65 6d *. * Managem
3400: 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72 ent of the inter
3410: 6e 61 6c 20 74 69 6d 65 72 2e 0a 20 20 20 20 20 nal timer..
3420: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 */.. if (stat
3430: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
3440: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
3450: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 NULL) {.
3460: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
3470: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
3480: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 >timer);..stateP
3490: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c tr->timer = (Tcl
34a0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
34b0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
34c0: 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 ((mask & TCL_REA
34d0: 44 41 42 4c 45 29 20 26 26 20 54 63 6c 5f 49 6e DABLE) && Tcl_In
34e0: 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 putBuffered(stat
34f0: 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 ePtr->self) > 0)
3500: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 09 20 {. /*..
3510: 2a 20 54 68 65 72 65 20 69 73 20 69 6e 74 65 72 * There is inter
3520: 65 73 74 20 69 6e 20 72 65 61 64 61 62 6c 65 20 est in readable
3530: 65 76 65 6e 74 73 20 61 6e 64 20 77 65 20 61 63 events and we ac
3540: 74 75 61 6c 6c 79 20 68 61 76 65 0a 09 20 2a 20 tually have.. *
3550: 64 61 74 61 20 77 61 69 74 69 6e 67 2c 20 73 6f data waiting, so
3560: 20 67 65 6e 65 72 61 74 65 20 61 20 74 69 6d 65 generate a time
3570: 72 20 74 6f 20 66 6c 75 73 68 20 74 68 61 74 2e r to flush that.
3580: 0a 09 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d .. */..statePtr-
3590: 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 >timer = Tcl_Cre
35a0: 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 ateTimerHandler(
35b0: 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c 0a 09 TLS_TCL_DELAY,..
35c0: 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c .TlsChannelHandl
35d0: 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 65 6e 74 erTimer, (Client
35e0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
35f0: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 . }.#else.
3600: 20 69 66 20 28 6d 61 73 6b 20 3d 3d 20 73 74 61 if (mask == sta
3610: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b tePtr->watchMask
3620: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 )..return;..
3630: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 77 61 if (statePtr->wa
3640: 74 63 68 4d 61 73 6b 29 20 7b 0a 09 2f 2a 0a 09 tchMask) {../*..
3650: 20 2a 20 52 65 6d 6f 76 65 20 65 76 65 6e 74 20 * Remove event
3660: 68 61 6e 64 6c 65 72 20 74 6f 20 75 6e 64 65 72 handler to under
3670: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2c 20 74 lying channel, t
3680: 68 69 73 20 63 6f 75 6c 64 0a 09 20 2a 20 62 65 his could.. * be
3690: 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 because we are
36a0: 63 6c 6f 73 69 6e 67 20 66 6f 72 20 72 65 61 6c closing for real
36b0: 2c 20 6f 72 20 62 65 69 6e 67 20 22 75 6e 73 74 , or being "unst
36c0: 61 63 6b 65 64 22 2e 0a 09 20 2a 2f 0a 0a 09 54 acked"... */...T
36d0: 63 6c 5f 44 65 6c 65 74 65 43 68 61 6e 6e 65 6c cl_DeleteChannel
36e0: 48 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 74 50 Handler(Tls_GetP
36f0: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 2c arent(statePtr),
3700: 0a 09 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e ...TlsChannelHan
3710: 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 dler, (ClientDat
3720: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 a) statePtr);.
3730: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
3740: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 ->watchMask = ma
3750: 73 6b 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 sk;. if (stat
3760: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29 ePtr->watchMask)
3770: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 65 74 75 70 {../*.. * Setup
3780: 20 61 63 74 69 76 65 20 6d 6f 6e 69 74 6f 72 20 active monitor
3790: 66 6f 72 20 65 76 65 6e 74 73 20 6f 6e 20 75 6e for events on un
37a0: 64 65 72 6c 79 69 6e 67 20 43 68 61 6e 6e 65 6c derlying Channel
37b0: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 72 65 ... */...Tcl_Cre
37c0: 61 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 ateChannelHandle
37d0: 72 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 r(Tls_GetParent(
37e0: 73 74 61 74 65 50 74 72 29 2c 0a 09 09 73 74 61 statePtr),...sta
37f0: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b tePtr->watchMask
3800: 2c 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 , TlsChannelHand
3810: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 ler, (ClientData
3820: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
3830: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0c 0a 2f 2a }.#endif.}.../*
3840: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3880: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
3890: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d GetHandleProc --
38a0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 . *. *.Called fr
38b0: 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 om Tcl_GetChanne
38c0: 6c 46 69 6c 65 20 74 6f 20 72 65 74 72 69 65 76 lFile to retriev
38d0: 65 20 6f 2f 73 20 66 69 6c 65 20 68 61 6e 64 6c e o/s file handl
38e0: 65 72 0a 20 2a 09 66 72 6f 6d 20 74 68 65 20 53 er. *.from the S
38f0: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 SL socket based
3900: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 channel.. *. * R
3910: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 esults:. *.The a
3920: 70 70 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 ppropriate Tcl_F
3930: 69 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e ile or NULL if n
3940: 6f 74 20 70 72 65 73 65 6e 74 2e 20 0a 20 2a 0a ot present. . *.
3950: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3960: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39b0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
39c0: 74 0a 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 t.TlsGetHandlePr
39d0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e oc(ClientData in
39e0: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54 stanceData,./* T
39f0: 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 65 2e he socket state.
3a00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 */.
3a10: 20 20 20 20 20 69 6e 74 20 64 69 72 65 63 74 69 int directi
3a20: 6f 6e 2c 09 09 2f 2a 20 57 68 69 63 68 20 54 63 on,../* Which Tc
3a30: 6c 5f 46 69 6c 65 20 74 6f 20 72 65 74 72 69 65 l_File to retrie
3a40: 76 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 ve? */.
3a50: 20 20 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61 ClientDa
3a60: 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f ta *handlePtr)./
3a70: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 * Where to store
3a80: 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 20 2a 2f the handle. */
3a90: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 .{. State *st
3aa0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
3ab0: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b *) instanceData;
3ac0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c .. return Tcl
3ad0: 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c _GetChannelHandl
3ae0: 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 e(Tls_GetParent(
3af0: 73 74 61 74 65 50 74 72 29 2c 20 64 69 72 65 63 statePtr), direc
3b00: 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 tion, handlePtr)
3b10: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3b60: 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72 *. * TlsNotifyPr
3b70: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 oc --. *. *.Hand
3b80: 6c 65 72 20 63 61 6c 6c 65 64 20 62 79 20 54 63 ler called by Tc
3b90: 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f l to inform us o
3ba0: 66 20 61 63 74 69 76 69 74 79 0a 20 2a 09 6f 6e f activity. *.on
3bb0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
3bc0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 channel.. *. * R
3bd0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e esults:. *.None.
3be0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3bf0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 70 72 6f 63 cts:. *.May proc
3c00: 65 73 73 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 ess the incoming
3c10: 20 65 76 65 6e 74 20 62 79 20 69 74 73 65 6c 66 event by itself
3c20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
3c70: 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 4e 6f static int.TlsNo
3c80: 74 69 66 79 50 72 6f 63 28 69 6e 73 74 61 6e 63 tifyProc(instanc
3c90: 65 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20 eData, mask).
3ca0: 20 43 6c 69 65 6e 74 44 61 74 61 09 20 20 20 69 ClientData. i
3cb0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 20 2f 2a 20 nstanceData; /*
3cc0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 The state of the
3cd0: 20 6e 6f 74 69 66 69 65 64 20 74 72 61 6e 73 66 notified transf
3ce0: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 ormation */.
3cf0: 69 6e 74 09 09 20 20 20 6d 61 73 6b 3b 20 20 20 int.. mask;
3d00: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 73 6b 20 /* The mask
3d10: 6f 66 20 6f 63 63 75 72 69 6e 67 20 65 76 65 6e of occuring even
3d20: 74 73 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 ts */.{. Stat
3d30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
3d40: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 tate *) instance
3d50: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 Data;.. /*.
3d60: 20 20 20 2a 20 41 6e 20 65 76 65 6e 74 20 6f 63 * An event oc
3d70: 63 75 72 65 64 20 69 6e 20 74 68 65 20 75 6e 64 cured in the und
3d80: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e erlying channel.
3d90: 20 20 54 68 69 73 0a 20 20 20 20 20 2a 20 74 72 This. * tr
3da0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 64 6f 65 ansformation doe
3db0: 73 6e 27 74 20 70 72 6f 63 65 73 73 20 73 75 63 sn't process suc
3dc0: 68 20 65 76 65 6e 74 73 20 74 68 75 73 20 72 65 h events thus re
3dd0: 74 75 72 6e 73 20 74 68 65 0a 20 20 20 20 20 2a turns the. *
3de0: 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 6b 20 75 incoming mask u
3df0: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a nchanged.. *
3e00: 2f 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 /.. if (state
3e10: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
3e20: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
3e30: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 ULL) {../*.. * D
3e40: 65 6c 65 74 65 20 61 6e 20 65 78 69 73 74 69 6e elete an existin
3e50: 67 20 74 69 6d 65 72 2e 20 49 74 20 77 61 73 20 g timer. It was
3e60: 6e 6f 74 20 66 69 72 65 64 2c 20 79 65 74 20 77 not fired, yet w
3e70: 65 20 61 72 65 0a 09 20 2a 20 68 65 72 65 2c 20 e are.. * here,
3e80: 73 6f 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 so the channel b
3e90: 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 64 20 73 elow generated s
3ea0: 75 63 68 20 61 6e 20 65 76 65 6e 74 20 61 6e 64 uch an event and
3eb0: 20 77 65 0a 09 20 2a 20 64 6f 6e 27 74 20 68 61 we.. * don't ha
3ec0: 76 65 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 ve to. The renew
3ed0: 61 6c 20 6f 66 20 74 68 65 20 69 6e 74 65 72 65 al of the intere
3ee0: 73 74 20 61 66 74 65 72 20 74 68 65 0a 09 20 2a st after the.. *
3ef0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 execution of ch
3f00: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 annel handlers w
3f10: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 ill eventually c
3f20: 61 75 73 65 20 75 73 20 74 6f 0a 09 20 2a 20 72 ause us to.. * r
3f30: 65 63 72 65 61 74 65 20 74 68 65 20 74 69 6d 65 ecreate the time
3f40: 72 20 28 69 6e 20 57 61 74 63 68 50 72 6f 63 29 r (in WatchProc)
3f50: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 65 6c ... */...Tcl_Del
3f60: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
3f70: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
3f80: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
3f90: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
3fa0: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 oken) NULL;.
3fb0: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 }.. return ma
3fc0: 73 6b 3b 0a 7d 0a 0c 0a 23 69 66 6e 64 65 66 20 sk;.}...#ifndef
3fd0: 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 TCL_CHANNEL_VERS
3fe0: 49 4f 4e 5f 32 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ION_2./*. *-----
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 2d 2d ----------------
4020: 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 54 6c -*. *. * Tl
4030: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 sChannelHandler
4040: 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 20 20 2d 2d --. *. * --
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
4080: 20 2a 20 20 20 20 20 20 48 61 6e 64 6c 65 72 20 * Handler
4090: 63 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 61 73 called by Tcl as
40a0: 20 61 20 72 65 73 75 6c 74 20 6f 66 0a 20 2a 20 a result of. *
40b0: 20 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 Tcl_CreateC
40c0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 20 hannelHandler -
40d0: 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 to inform us of
40e0: 61 63 74 69 76 69 74 79 0a 20 2a 20 20 20 20 20 activity. *
40f0: 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 on the underlyi
4100: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20 ng channel.. *
4110: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4140: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 ----*. *. *
4150: 20 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a Sideeffects:. *
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 Ma
4170: 79 20 67 65 6e 65 72 61 74 65 20 73 75 62 73 65 y generate subse
4180: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 20 quent calls to.
4190: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 * T
41a0: 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c cl_NotifyChannel
41b0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 20 52 65 73 .. *. * Res
41c0: 75 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20 20 20 ult:. *
41d0: 20 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a None.. *. *
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4210: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 ------*. */..sta
4220: 74 69 63 20 76 6f 69 64 0a 54 6c 73 43 68 61 6e tic void.TlsChan
4230: 6e 65 6c 48 61 6e 64 6c 65 72 20 28 63 6c 69 65 nelHandler (clie
4240: 6e 74 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20 ntData, mask).
4250: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 20 20 20 ClientData
4260: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 clientData;.
4270: 20 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 int
4280: 6d 61 73 6b 3b 0a 7b 0a 20 20 20 20 53 74 61 74 mask;.{. Stat
4290: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
42a0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
42b0: 74 61 3b 0a 0a 64 70 72 69 6e 74 66 28 73 74 64 ta;..dprintf(std
42c0: 65 72 72 2c 20 22 48 41 4e 44 4c 45 52 28 30 78 err, "HANDLER(0x
42d0: 25 78 29 5c 6e 22 2c 20 6d 61 73 6b 29 3b 0a 20 %x)\n", mask);.
42e0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
42f0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 (ClientData)sta
4300: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 tePtr);.. if
4310: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 (mask & TCL_READ
4320: 41 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 65 74 ABLE) {..BIO_set
4330: 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d _flags(statePtr-
4340: 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 >p_bio, BIO_FLAG
4350: 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 20 65 S_READ);. } e
4360: 6c 73 65 20 7b 0a 09 42 49 4f 5f 63 6c 65 61 72 lse {..BIO_clear
4370: 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d _flags(statePtr-
4380: 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 >p_bio, BIO_FLAG
4390: 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 0a 0a S_READ);. }..
43a0: 20 20 20 20 69 66 20 28 6d 61 73 6b 20 26 20 54 if (mask & T
43b0: 43 4c 5f 57 52 49 54 41 42 4c 45 29 20 7b 0a 09 CL_WRITABLE) {..
43c0: 42 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 73 74 BIO_set_flags(st
43d0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 atePtr->p_bio, B
43e0: 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b IO_FLAGS_WRITE);
43f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 . } else {..B
4400: 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 73 28 73 IO_clear_flags(s
4410: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 tatePtr->p_bio,
4420: 42 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 BIO_FLAGS_WRITE)
4430: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 73 ;. }.. mas
4440: 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 42 k = 0;. if (B
4450: 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 IO_wpending(stat
4460: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d ePtr->bio)) {..m
4470: 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 ask |= TCL_WRITA
4480: 42 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 BLE;. }. i
4490: 66 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 f (BIO_pending(s
44a0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
44b0: 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 ..mask |= TCL_RE
44c0: 41 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 ADABLE;. }..
44d0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 /*. * The
44e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 4e 6f 74 69 66 following Notif
44f0: 79 43 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 73 yChannel calls s
4500: 65 65 6d 73 20 74 6f 20 62 65 20 69 6d 70 6f 72 eems to be impor
4510: 74 61 6e 74 2c 20 62 75 74 0a 20 20 20 20 20 2a tant, but. *
4520: 20 77 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 77 we don't know w
4530: 68 79 2e 20 20 49 74 20 6c 6f 6f 6b 73 20 6c 69 hy. It looks li
4540: 6b 65 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 ke if the mask i
4550: 73 20 65 76 65 72 20 6e 6f 6e 2d 7a 65 72 6f 0a s ever non-zero.
4560: 20 20 20 20 20 2a 20 74 68 61 74 20 69 74 20 77 * that it w
4570: 69 6c 6c 20 65 6e 74 65 72 20 61 6e 20 69 6e 66 ill enter an inf
4580: 69 6e 69 74 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 inite loop..
4590: 20 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 69 66 79 *. * Notify
45a0: 20 74 68 65 20 75 70 70 65 72 20 63 68 61 6e 6e the upper chann
45b0: 65 6c 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e el of the curren
45c0: 74 20 42 49 4f 20 73 74 61 74 65 20 73 6f 20 74 t BIO state so t
45d0: 68 65 20 65 76 65 6e 74 0a 20 20 20 20 20 2a 20 he event. *
45e0: 63 6f 6e 74 69 6e 75 65 73 20 74 6f 20 70 72 6f continues to pro
45f0: 70 61 67 61 74 65 20 75 70 20 74 68 65 20 63 68 pagate up the ch
4600: 61 69 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 ain.. *.
4610: 20 2a 20 73 74 61 6e 74 6f 6e 3a 20 49 74 20 6c * stanton: It l
4620: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 20 63 ooks like this c
4630: 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 61 ould result in a
4640: 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 n infinite loop
4650: 69 66 0a 20 20 20 20 20 2a 20 74 68 65 20 75 70 if. * the up
4660: 70 65 72 20 63 68 61 6e 6e 65 6c 20 64 6f 65 73 per channel does
4670: 6e 27 74 20 63 61 75 73 65 20 43 68 61 6e 6e 65 n't cause Channe
4680: 6c 48 61 6e 64 6c 65 72 20 74 6f 20 62 65 20 72 lHandler to be r
4690: 65 6d 6f 76 65 64 0a 20 20 20 20 20 2a 20 62 65 emoved. * be
46a0: 66 6f 72 65 20 54 63 6c 5f 4e 6f 74 69 66 79 43 fore Tcl_NotifyC
46b0: 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 63 68 61 hannel calls cha
46c0: 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 6f 6e nnel handlers on
46d0: 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e the lower chann
46e0: 65 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 el.. */.
46f0: 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 . Tcl_NotifyC
4700: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d hannel(statePtr-
4710: 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 20 20 >self, mask);.
4720: 20 20 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 . if (state
4730: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
4740: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 cl_TimerToken)NU
4750: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 LL) {..Tcl_Delet
4760: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
4770: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
4780: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
4790: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b = (Tcl_TimerTok
47a0: 65 6e 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 en)NULL;. }.
47b0: 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 if ((mask & T
47c0: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 CL_READABLE) &&
47d0: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 Tcl_InputBuffere
47e0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 d(statePtr->self
47f0: 29 20 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a ) > 0) {../*.. *
4800: 20 44 61 74 61 20 69 73 20 77 61 69 74 69 6e 67 Data is waiting
4810: 2c 20 66 6c 75 73 68 20 69 74 20 6f 75 74 20 69 , flush it out i
4820: 6e 20 73 68 6f 72 74 20 74 69 6d 65 0a 09 20 2a n short time.. *
4830: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d /..statePtr->tim
4840: 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 er = Tcl_CreateT
4850: 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f imerHandler(TLS_
4860: 54 43 4c 5f 44 45 4c 41 59 2c 0a 09 09 54 6c 73 TCL_DELAY,...Tls
4870: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 ChannelHandlerTi
4880: 6d 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 mer, (ClientData
4890: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
48a0: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 }. Tcl_Relea
48b0: 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 se( (ClientData)
48c0: 73 74 61 74 65 50 74 72 29 3b 0a 7d 0a 23 65 6e statePtr);.}.#en
48d0: 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d dif.../*. *-----
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4910: 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 43 68 61 6e -*. *. *.TlsChan
4920: 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 nelHandlerTimer
4930: 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d --. *. *.-------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 43 61 ---------*. *.Ca
4970: 6c 6c 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69 lled by the noti
4980: 66 69 65 72 20 28 2d 3e 20 74 69 6d 65 72 29 20 fier (-> timer)
4990: 74 6f 20 66 6c 75 73 68 20 6f 75 74 0a 20 2a 09 to flush out. *.
49a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 74 information wait
49b0: 69 6e 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 62 ing in channel b
49c0: 75 66 66 65 72 73 2e 0a 20 2a 09 2d 2d 2d 2d 2d uffers.. *.-----
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
4a00: 20 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a *.Sideeffects:.
4a10: 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 43 68 *..As of 'TlsCh
4a20: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 27 2e 0a 20 annelHandler'..
4a30: 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
4a40: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a80: 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 --*. */..static
4a90: 76 6f 69 64 0a 54 6c 73 43 68 61 6e 6e 65 6c 48 void.TlsChannelH
4aa0: 61 6e 64 6c 65 72 54 69 6d 65 72 20 28 63 6c 69 andlerTimer (cli
4ab0: 65 6e 74 44 61 74 61 29 0a 43 6c 69 65 6e 74 44 entData).ClientD
4ac0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 20 ata clientData;
4ad0: 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 61 74 69 6f /* Transformatio
4ae0: 6e 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 7b 0a n to query */.{.
4af0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
4b00: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
4b10: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 clientData;.
4b20: 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 0a 20 int mask = 0;..
4b30: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d statePtr->tim
4b40: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
4b50: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 oken) NULL;..
4b60: 20 69 66 20 28 42 49 4f 5f 77 70 65 6e 64 69 6e if (BIO_wpendin
4b70: 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 g(statePtr->bio)
4b80: 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c ) {..mask |= TCL
4b90: 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d _WRITABLE;. }
4ba0: 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 70 65 6e . if (BIO_pen
4bb0: 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 ding(statePtr->b
4bc0: 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 io)) {..mask |=
4bd0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20 TCL_READABLE;.
4be0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 }. Tcl_Noti
4bf0: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 fyChannel(stateP
4c00: 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b tr->self, mask);
4c10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c50: 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 57 61 69 74 *. *. *.Tls_Wait
4c60: 46 6f 72 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a ForConnect --. *
4c70: 0a 20 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a . *.Sideeffects:
4c80: 0a 20 2a 09 09 49 73 73 75 65 73 20 53 53 4c 5f . *..Issues SSL_
4c90: 61 63 63 65 70 74 20 6f 72 20 53 53 4c 5f 63 6f accept or SSL_co
4ca0: 6e 6e 65 63 74 0a 20 2a 0a 20 2a 09 52 65 73 75 nnect. *. *.Resu
4cb0: 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a lt:. *..None.. *
4cc0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 69 ---------*. */.i
4d00: 6e 74 0a 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f nt.Tls_WaitForCo
4d10: 6e 6e 65 63 74 28 20 73 74 61 74 65 50 74 72 2c nnect( statePtr,
4d20: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 29 0a 20 errorCodePtr).
4d30: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
4d40: 74 72 3b 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 tr;. int *err
4d50: 6f 72 43 6f 64 65 50 74 72 3b 09 09 2f 2a 20 57 orCodePtr;../* W
4d60: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 65 72 here to store er
4d70: 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 7b 0a 20 ror code. */.{.
4d80: 20 20 20 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 int err;..
4d90: 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c dprintf(stderr,
4da0: 22 5c 6e 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 "\nWaitForConnec
4db0: 74 28 30 78 25 78 29 22 2c 20 73 74 61 74 65 50 t(0x%x)", stateP
4dc0: 74 72 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 3b tr);.. for (;
4dd0: 3b 29 20 7b 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69 ;) {../* Not ini
4de0: 74 69 61 6c 69 7a 65 64 20 79 65 74 21 20 2a 2f tialized yet! */
4df0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
4e00: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
4e10: 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 65 SERVER) {.. e
4e20: 72 72 20 3d 20 53 53 4c 5f 61 63 63 65 70 74 28 rr = SSL_accept(
4e30: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
4e40: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 65 .} else {.. e
4e50: 72 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 rr = SSL_connect
4e60: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
4e70: 0a 09 7d 0a 09 2f 2a 53 53 4c 5f 77 72 69 74 65 ..}../*SSL_write
4e80: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
4e90: 28 63 68 61 72 2a 29 26 65 72 72 2c 20 30 29 3b (char*)&err, 0);
4ea0: 09 48 41 43 4b 21 21 21 20 2a 2f 0a 09 69 66 20 .HACK!!! */..if
4eb0: 28 65 72 72 20 3e 20 30 29 0a 09 20 20 20 20 42 (err > 0).. B
4ec0: 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 IO_flush(statePt
4ed0: 72 2d 3e 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 r->bio);...if (e
4ee0: 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 rr <= 0) {..
4ef0: 69 6e 74 20 72 63 20 3d 20 53 53 4c 5f 67 65 74 int rc = SSL_get
4f00: 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d _error(statePtr-
4f10: 3e 73 73 6c 2c 20 65 72 72 29 3b 0a 0a 09 20 20 >ssl, err);...
4f20: 20 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f if (rc == SSL_
4f30: 45 52 52 4f 52 5f 53 53 4c 29 20 7b 0a 09 09 54 ERROR_SSL) {...T
4f40: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
4f50: 72 2c 20 28 63 68 61 72 2a 29 45 52 52 5f 72 65 r, (char*)ERR_re
4f60: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
4f70: 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 g(ERR_get_error(
4f80: 29 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 )));...*errorCod
4f90: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 ePtr = ECONNABOR
4fa0: 54 45 44 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 TED;...return -1
4fb0: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ;.. } else if
4fc0: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 (BIO_should_ret
4fd0: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ry(statePtr->bio
4fe0: 29 29 20 7b 0a 09 09 69 66 20 28 73 74 61 74 65 )) {...if (state
4ff0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
5000: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09 _TCL_ASYNC) {...
5010: 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 dprintf(stde
5020: 72 72 2c 22 45 21 20 22 29 3b 0a 09 09 20 20 20 rr,"E! ");...
5030: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
5040: 20 45 41 47 41 49 4e 3b 0a 09 09 20 20 20 20 72 EAGAIN;... r
5050: 65 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 20 65 6c eturn -1;...} el
5060: 73 65 20 7b 0a 09 09 20 20 20 20 63 6f 6e 74 69 se {... conti
5070: 6e 75 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 nue;...}.. }
5080: 65 6c 73 65 20 69 66 20 28 65 72 72 20 3d 3d 20 else if (err ==
5090: 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 73 0) {...dprintf(s
50a0: 74 64 65 72 72 2c 22 43 52 21 20 22 29 3b 0a 09 tderr,"CR! ");..
50b0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
50c0: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 72 ECONNRESET;...r
50d0: 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d eturn -1;.. }
50e0: 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
50f0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
5100: 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 09 TCL_SERVER) {...
5110: 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 err = SSL_get_ve
5120: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
5130: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 09 69 66 ePtr->ssl);...if
5140: 20 28 65 72 72 20 21 3d 20 58 35 30 39 5f 56 5f (err != X509_V_
5150: 4f 4b 29 20 7b 0a 09 09 20 20 20 20 54 6c 73 5f OK) {... Tls_
5160: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
5170: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 (char*)X509_veri
5180: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
5190: 72 69 6e 67 28 65 72 72 29 29 3b 0a 09 09 20 20 ring(err));...
51a0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
51b0: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a = ECONNABORTED;.
51c0: 09 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b .. return -1;
51d0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 ...}.. }..
51e0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
51f0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
5200: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 .. dprintf(st
5210: 64 65 72 72 2c 22 45 52 52 28 25 64 2c 20 25 64 derr,"ERR(%d, %d
5220: 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 43 ) ", rc, *errorC
5230: 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 odePtr);.. re
5240: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 64 70 72 turn -1;..}..dpr
5250: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 52 30 21 intf(stderr,"R0!
5260: 20 22 29 3b 0a 09 72 65 74 75 72 6e 20 31 3b 0a ");..return 1;.
5270: 20 20 20 20 7d 0a 7d 0a 0a 54 63 6c 5f 43 68 61 }.}..Tcl_Cha
5280: 6e 6e 65 6c 0a 54 6c 73 5f 47 65 74 50 61 72 65 nnel.Tls_GetPare
5290: 6e 74 28 20 73 74 61 74 65 50 74 72 20 29 0a 20 nt( statePtr ).
52a0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
52b0: 74 72 3b 0a 7b 0a 23 69 66 64 65 66 20 54 43 4c tr;.{.#ifdef TCL
52c0: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e _CHANNEL_VERSION
52d0: 5f 32 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 _2. return Tc
52e0: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e l_GetStackedChan
52f0: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 nel(statePtr->se
5300: 6c 66 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 54 lf);.#else.#if T
5310: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
5320: 20 3d 3d 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e == 8 && TCL_MIN
5330: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 32 0a 20 OR_VERSION < 2.
5340: 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 50 return stateP
5350: 74 72 2d 3e 70 61 72 65 6e 74 3b 0a 23 65 6c 73 tr->parent;.#els
5360: 65 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 e. /* The rea
5370: 73 6f 6e 20 66 6f 72 20 74 68 65 20 65 78 69 73 son for the exis
5380: 74 65 6e 63 65 20 6f 66 20 74 68 69 73 20 70 72 tence of this pr
5390: 6f 63 65 64 75 72 65 20 69 73 0a 20 20 20 20 20 ocedure is.
53a0: 2a 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 * the fact that
53b0: 73 74 61 63 6b 69 6e 67 20 61 20 74 72 61 6e 73 stacking a trans
53c0: 66 6f 72 6d 20 6f 76 65 72 20 61 6e 6f 74 68 65 form over anothe
53d0: 72 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f r. * transfo
53e0: 72 6d 20 77 69 6c 6c 20 6c 65 61 76 65 20 6f 75 rm will leave ou
53f0: 72 20 69 6e 74 65 72 6e 61 6c 20 70 6f 69 6e 74 r internal point
5400: 65 72 20 75 6e 63 68 61 6e 67 65 64 2c 0a 20 20 er unchanged,.
5410: 20 20 20 2a 20 61 6e 64 20 74 68 75 73 20 70 6f * and thus po
5420: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 inting to the ne
5430: 77 20 74 72 61 6e 73 66 6f 72 6d 2c 20 61 6e 64 w transform, and
5440: 20 6e 6f 74 20 74 68 65 0a 20 20 20 20 20 2a 20 not the. *
5450: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 Channel structur
5460: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 e containing the
5470: 20 73 61 76 65 64 20 73 74 61 74 65 20 6f 66 20 saved state of
5480: 74 68 69 73 0a 20 20 20 20 20 2a 20 74 72 61 6e this. * tran
5490: 73 66 6f 72 6d 2e 20 54 68 69 73 20 69 73 20 74 sform. This is t
54a0: 68 65 20 70 72 69 63 65 20 74 6f 20 70 61 79 20 he price to pay
54b0: 66 6f 72 20 6c 65 61 76 69 6e 67 0a 20 20 20 20 for leaving.
54c0: 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 72 * Tcl_Channel r
54d0: 65 66 65 72 65 6e 63 65 73 20 69 6e 74 61 63 74 eferences intact
54e0: 2e 20 54 68 65 20 6f 6e 6c 79 20 6f 74 68 65 72 . The only other
54f0: 20 73 6f 6c 75 74 69 6f 6e 0a 20 20 20 20 20 2a solution. *
5500: 20 69 73 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e is an extension
5510: 20 6f 66 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 of Tcl_ChannelT
5520: 79 70 65 20 77 69 74 68 20 61 6e 6f 74 68 65 72 ype with another
5530: 20 64 72 69 76 65 72 0a 20 20 20 20 20 2a 20 70 driver. * p
5540: 72 6f 63 65 64 75 72 65 20 74 6f 20 6e 6f 74 69 rocedure to noti
5550: 66 79 20 61 20 43 68 61 6e 6e 65 6c 20 61 62 6f fy a Channel abo
5560: 75 74 20 74 68 65 20 28 75 6e 29 73 74 61 63 6b ut the (un)stack
5570: 69 6e 67 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 ing.. *.
5580: 20 2a 20 49 74 20 77 61 6c 6b 73 20 74 68 65 20 * It walks the
5590: 63 68 61 69 6e 20 6f 66 20 43 68 61 6e 6e 65 6c chain of Channel
55a0: 20 73 74 72 75 63 74 75 72 65 73 20 75 6e 74 69 structures unti
55b0: 6c 20 69 74 0a 20 20 20 20 20 2a 20 66 69 6e 64 l it. * find
55c0: 73 20 74 68 65 20 6f 6e 65 20 70 6f 69 6e 74 69 s the one pointi
55d0: 6e 67 20 68 61 76 69 6e 67 20 27 63 74 72 6c 27 ng having 'ctrl'
55e0: 20 61 73 20 69 6e 73 74 61 6e 63 65 44 61 74 61 as instanceData
55f0: 0a 20 20 20 20 20 2a 20 61 6e 64 20 74 68 65 6e . * and then
5600: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 75 70 returns the sup
5610: 65 72 63 65 64 69 6e 67 20 63 68 61 6e 6e 65 6c erceding channel
5620: 20 74 6f 20 74 68 61 74 2e 20 28 41 4b 29 0a 20 to that. (AK).
5630: 20 20 20 20 2a 2f 0a 20 0a 20 20 20 20 54 63 6c */. . Tcl
5640: 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 20 3d 20 _Channel self =
5650: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a statePtr->self;.
5660: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
5670: 6e 65 78 74 3b 0a 0a 20 20 20 20 77 68 69 6c 65 next;.. while
5680: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 ((ClientData) s
5690: 74 61 74 65 50 74 72 20 21 3d 20 54 63 6c 5f 47 tatePtr != Tcl_G
56a0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
56b0: 65 44 61 74 61 20 28 73 65 6c 66 29 29 20 7b 0a eData (self)) {.
56c0: 09 6e 65 78 74 20 3d 20 54 63 6c 5f 47 65 74 53 .next = Tcl_GetS
56d0: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 20 28 73 tackedChannel (s
56e0: 65 6c 66 29 3b 0a 09 69 66 20 28 6e 65 78 74 20 elf);..if (next
56f0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
5700: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
5710: 20 30 39 2f 32 34 2f 31 39 39 39 20 55 6e 73 74 09/24/1999 Unst
5720: 61 63 6b 69 6e 67 20 62 75 67 2c 0a 09 20 20 20 acking bug,..
5730: 20 20 2a 20 66 6f 75 6e 64 20 62 79 20 4d 61 74 * found by Mat
5740: 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 73 t Newman <matt@s
5750: 65 6e 73 75 73 2e 6f 72 67 3e 2e 0a 09 20 20 20 ensus.org>...
5760: 20 20 2a 0a 09 20 20 20 20 20 2a 20 57 65 20 77 *.. * We w
5770: 65 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 69 ere unable to fi
5780: 6e 64 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 73 nd the channel s
5790: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 tructure for thi
57a0: 73 0a 09 20 20 20 20 20 2a 20 74 72 61 6e 73 66 s.. * transf
57b0: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 ormation in the
57c0: 63 68 61 69 6e 20 6f 66 20 73 74 61 63 6b 65 64 chain of stacked
57d0: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 0a 09 channel. This..
57e0: 20 20 20 20 20 2a 20 6d 65 61 6e 73 20 74 68 61 * means tha
57f0: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 t we are current
5800: 6c 79 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 ly in the proces
5810: 73 20 6f 66 20 75 6e 73 74 61 63 6b 69 6e 67 0a s of unstacking.
5820: 09 20 20 20 20 20 2a 20 69 74 20 2a 61 6e 64 2a . * it *and*
5830: 20 74 68 65 72 65 20 77 65 72 65 20 73 6f 6d 65 there were some
5840: 20 62 79 74 65 73 20 77 61 69 74 69 6e 67 20 77 bytes waiting w
5850: 68 69 63 68 20 61 72 65 20 6e 6f 77 0a 09 20 20 hich are now..
5860: 20 20 20 2a 20 66 6c 75 73 68 65 64 2e 20 49 6e * flushed. In
5870: 20 74 68 69 73 20 73 69 74 75 61 74 69 6f 6e 20 this situation
5880: 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 the pointer to t
5890: 68 65 20 63 68 61 6e 6e 65 6c 0a 09 20 20 20 20 he channel..
58a0: 20 2a 20 69 74 73 65 6c 66 20 61 6c 72 65 61 64 * itself alread
58b0: 79 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 y refers to the
58c0: 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 77 parent channel w
58d0: 65 20 68 61 76 65 20 74 6f 0a 09 20 20 20 20 20 e have to..
58e0: 2a 20 77 72 69 74 65 20 74 68 65 20 62 79 74 65 * write the byte
58f0: 73 20 69 6e 74 6f 2c 20 73 6f 20 77 65 20 72 65 s into, so we re
5900: 74 75 72 6e 20 74 68 61 74 2e 0a 09 20 20 20 20 turn that...
5910: 20 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 20 */.. return
5920: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a statePtr->self;.
5930: 09 7d 0a 09 73 65 6c 66 20 3d 20 6e 65 78 74 3b .}..self = next;
5940: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
5950: 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 rn Tcl_GetStacke
5960: 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29 3b dChannel (self);
5970: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 7d .#endif.#endif.}
5980: 0a .