0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 4d 61 (C) 1997-2000 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 Copyright (C) 2
0050: 30 30 30 20 41 6a 75 62 61 20 53 6f 6c 75 74 69 000 Ajuba Soluti
0060: 6f 6e 73 0a 20 2a 0a 20 2a 20 24 48 65 61 64 65 ons. *. * $Heade
0070: 72 3a 20 2f 68 6f 6d 65 2f 72 6b 65 65 6e 65 2f r: /home/rkeene/
0080: 74 6d 70 2f 63 76 73 32 66 6f 73 73 69 6c 2f 2e tmp/cvs2fossil/.
0090: 2e 2f 74 63 6c 74 6c 73 2f 74 6c 73 2f 74 6c 73 ./tcltls/tls/tls
00a0: 2f 74 6c 73 49 4f 2e 63 2c 76 20 31 2e 31 34 20 /tlsIO.c,v 1.14
00b0: 32 30 30 34 2f 30 33 2f 32 34 20 30 35 3a 32 32 2004/03/24 05:22
00c0: 3a 35 33 20 72 61 7a 7a 65 6c 6c 20 45 78 70 20 :53 razzell Exp
00d0: 24 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 6b 61 $. *. * TLS (aka
00e0: 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 2d 20 SSL) Channel -
00f0: 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 20 6f can be layered o
0100: 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 74 69 n any bi-directi
0110: 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 61 6e onal. * Tcl_Chan
0120: 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 75 69 nel (Note: Requi
0130: 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 61 74 res Trf Core Pat
0140: 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 77 ch). *. * This w
0150: 61 73 20 62 75 69 6c 74 20 66 72 6f 6d 20 73 63 as built from sc
0160: 72 61 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e ratch based upon
0170: 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 20 observation of
0180: 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 OpenSSL 0.9.2B.
0190: 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 *. * Addition cr
01a0: 65 64 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 edit is due for
01b0: 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 Andreas Kupries
01c0: 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 (a.kupries@weste
01d0: 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 nd.com), for. *
01e0: 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 providing the Tc
01f0: 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c l_ReplaceChannel
0200: 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 mechanism and w
0210: 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 orking closely w
0220: 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 ith me. * to enh
0230: 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f ance it to suppo
0240: 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e rt full fileeven
0250: 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a t semantics.. *.
0260: 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e * Also work don
0270: 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 e by the follow
0280: 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 people provided
0290: 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 the impetus to d
02a0: 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a o this "right":.
02b0: 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e *.tclSSL (Colin
02c0: 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 McCormack, Shar
02d0: 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 ed Technology).
02e0: 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 *.SSLtcl (Peter
02f0: 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a Antman). *. */..
0300: 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 #include "tlsInt
0310: 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 .h"../*. * Forwa
0320: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a rd declarations.
0330: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 */..static int.
0340: 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 TlsBlockModeProc
0350: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c _ANSI_ARGS_((Cl
0360: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
0370: 65 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 6f eData,....int mo
0380: 64 65 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 de));.static int
0390: 09 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 5f 41 .TlsCloseProc _A
03a0: 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 NSI_ARGS_ ((Clie
03b0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
03c0: 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 ata,....Tcl_Inte
03d0: 72 70 20 2a 69 6e 74 65 72 70 29 29 3b 0a 73 74 rp *interp));.st
03e0: 61 74 69 63 20 69 6e 74 09 54 6c 73 49 6e 70 75 atic int.TlsInpu
03f0: 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 tProc _ANSI_ARGS
0400: 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e _((ClientData in
0410: 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 63 stanceData,....c
0420: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 har *buf, int bu
0430: 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f fSize, int *erro
0440: 72 43 6f 64 65 50 74 72 29 29 3b 0a 73 74 61 74 rCodePtr));.stat
0450: 69 63 20 69 6e 74 09 54 6c 73 4f 75 74 70 75 74 ic int.TlsOutput
0460: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f Proc _ANSI_ARGS_
0470: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ((ClientData ins
0480: 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 43 4f tanceData,....CO
0490: 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 69 NST char *buf, i
04a0: 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 nt toWrite, int
04b0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b *errorCodePtr));
04c0: 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 47 .static int.TlsG
04d0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 5f 41 4e etOptionProc _AN
04e0: 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e SI_ARGS_ ((Clien
04f0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
0500: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 ta,....Tcl_Inter
0510: 70 20 2a 69 6e 74 65 72 70 2c 20 43 4f 4e 53 54 p *interp, CONST
0520: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d char *optionNam
0530: 65 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 6e e,....Tcl_DStrin
0540: 67 20 2a 64 73 50 74 72 29 29 3b 0a 73 74 61 74 g *dsPtr));.stat
0550: 69 63 20 76 6f 69 64 09 54 6c 73 57 61 74 63 68 ic void.TlsWatch
0560: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f Proc _ANSI_ARGS_
0570: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ((ClientData ins
0580: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d tanceData, int m
0590: 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 69 6e ask));.static in
05a0: 74 09 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 t.TlsGetHandlePr
05b0: 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 oc _ANSI_ARGS_ (
05c0: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
05d0: 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 6e 74 anceData,....int
05e0: 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65 direction, Clie
05f0: 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 ntData *handlePt
0600: 72 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 r));.static int.
0610: 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 5f 41 TlsNotifyProc _A
0620: 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 NSI_ARGS_ ((Clie
0630: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
0640: 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 61 73 6b ata,....int mask
0650: 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 ));.static void.
0660: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 TlsChannelHandle
0670: 72 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 r _ANSI_ARGS_ ((
0680: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
0690: 74 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 61 tData,....int ma
06a0: 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 sk));.static voi
06b0: 64 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 d.TlsChannelHand
06c0: 6c 65 72 54 69 6d 65 72 20 5f 41 4e 53 49 5f 41 lerTimer _ANSI_A
06d0: 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 RGS_ ((ClientDat
06e0: 61 20 63 6c 69 65 6e 74 44 61 74 61 29 29 3b 0a a clientData));.
06f0: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75 ./*. * This stru
0700: 63 74 75 72 65 20 64 65 73 63 72 69 62 65 73 20 cture describes
0710: 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 the channel type
0720: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 54 structure for T
0730: 43 50 20 73 6f 63 6b 65 74 0a 20 2a 20 62 61 73 CP socket. * bas
0740: 65 64 20 49 4f 2e 20 20 54 68 65 73 65 20 61 72 ed IO. These ar
0750: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63 e what the struc
0760: 74 75 72 65 73 20 73 68 6f 75 6c 64 20 6c 6f 6f tures should loo
0770: 6b 20 6c 69 6b 65 2c 20 62 75 74 20 77 65 0a 20 k like, but we.
0780: 2a 20 68 61 76 65 20 74 6f 20 62 75 69 6c 64 20 * have to build
0790: 74 68 65 6d 20 75 70 20 61 74 20 72 75 6e 74 69 them up at runti
07a0: 6d 65 20 74 6f 20 62 65 20 63 6f 72 72 65 63 74 me to be correct
07b0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 depending on wh
07c0: 65 74 68 65 72 0a 20 2a 20 77 65 20 61 72 65 20 ether. * we are
07d0: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 6e 20 38 loaded into an 8
07e0: 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72 20 38 2e .2.0-8.3.1 or 8.
07f0: 33 2e 32 2b 20 54 63 6c 20 69 6e 74 65 72 70 72 3.2+ Tcl interpr
0800: 65 74 65 72 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 eter.. */.#ifdef
0810: 20 54 4c 53 5f 53 54 41 54 49 43 5f 53 54 52 55 TLS_STATIC_STRU
0820: 43 54 55 52 45 53 5f 4e 4f 54 5f 55 53 45 44 0a CTURES_NOT_USED.
0830: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e static Tcl_Chann
0840: 65 6c 54 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 elType tlsChanne
0850: 6c 54 79 70 65 32 20 3d 20 7b 0a 20 20 20 20 22 lType2 = {. "
0860: 74 6c 73 22 2c 09 09 2f 2a 20 54 79 70 65 20 6e tls",../* Type n
0870: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 43 4c 5f ame. */. TCL_
0880: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f CHANNEL_VERSION_
0890: 32 2c 09 2f 2a 20 41 20 76 32 20 63 68 61 6e 6e 2,./* A v2 chann
08a0: 65 6c 20 28 38 2e 33 2e 32 2b 29 20 2a 2f 0a 20 el (8.3.2+) */.
08b0: 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c TlsCloseProc,
08c0: 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20 ./* Close proc.
08d0: 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 50 */. TlsInputP
08e0: 72 6f 63 2c 09 2f 2a 20 49 6e 70 75 74 20 70 72 roc,./* Input pr
08f0: 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4f 75 oc. */. TlsOu
0900: 74 70 75 74 50 72 6f 63 2c 09 2f 2a 20 4f 75 74 tputProc,./* Out
0910: 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 put proc. */.
0920: 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b 20 NULL,../* Seek
0930: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c proc. */. NUL
0940: 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f L,../* Set optio
0950: 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 n proc. */. T
0960: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c lsGetOptionProc,
0970: 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 ./* Get option p
0980: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 57 roc. */. TlsW
0990: 61 74 63 68 50 72 6f 63 2c 09 2f 2a 20 49 6e 69 atchProc,./* Ini
09a0: 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 tialize notifier
09b0: 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 48 . */. TlsGetH
09c0: 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 andleProc,./* Ge
09d0: 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f 75 t file handle ou
09e0: 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f t of channel. */
09f0: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 43 . NULL,../* C
0a00: 6c 6f 73 65 32 50 72 6f 63 2e 20 2a 2f 0a 20 20 lose2Proc. */.
0a10: 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 TlsBlockModePr
0a20: 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b oc,./* Set block
0a30: 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 ing/nonblocking
0a40: 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20 4e 55 4c 4c mode.*/. NULL
0a50: 2c 09 09 2f 2a 20 46 6c 75 73 68 50 72 6f 63 2e ,../* FlushProc.
0a60: 20 2a 2f 0a 20 20 20 20 54 6c 73 4e 6f 74 69 66 */. TlsNotif
0a70: 79 50 72 6f 63 2c 09 2f 2a 20 68 61 6e 64 6c 65 yProc,./* handle
0a80: 72 50 72 6f 63 2e 20 2a 2f 0a 7d 3b 0a 0a 73 74 rProc. */.};..st
0a90: 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c atic Tcl_Channel
0aa0: 54 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54 Type tlsChannelT
0ab0: 79 70 65 31 20 3d 20 7b 0a 20 20 20 20 22 74 6c ype1 = {. "tl
0ac0: 73 22 2c 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d s",../* Type nam
0ad0: 65 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 42 6c 6f e. */. TlsBlo
0ae0: 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 ckModeProc,./* S
0af0: 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 et blocking/nonb
0b00: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a locking mode.*/.
0b10: 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 TlsCloseProc
0b20: 2c 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e ,./* Close proc.
0b30: 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 */. TlsInput
0b40: 50 72 6f 63 2c 09 2f 2a 20 49 6e 70 75 74 20 70 Proc,./* Input p
0b50: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4f roc. */. TlsO
0b60: 75 74 70 75 74 50 72 6f 63 2c 09 2f 2a 20 4f 75 utputProc,./* Ou
0b70: 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 tput proc. */.
0b80: 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b NULL,../* Seek
0b90: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 proc. */. NU
0ba0: 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 LL,../* Set opti
0bb0: 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 on proc. */.
0bc0: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 TlsGetOptionProc
0bd0: 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 ,./* Get option
0be0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 proc. */. Tls
0bf0: 57 61 74 63 68 50 72 6f 63 2c 09 2f 2a 20 49 6e WatchProc,./* In
0c00: 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 itialize notifie
0c10: 72 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 r. */. TlsGet
0c20: 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 HandleProc,./* G
0c30: 65 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f et file handle o
0c40: 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a ut of channel. *
0c50: 2f 0a 7d 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 /.};.#else.stati
0c60: 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 c Tcl_ChannelTyp
0c70: 65 20 2a 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 e *tlsChannelTyp
0c80: 65 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 e = NULL;.#endif
0c90: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
0ce0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
0cf0: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e --. *. *.Return
0d00: 20 74 68 65 20 63 6f 72 72 65 63 74 20 54 4c 53 the correct TLS
0d10: 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 20 channel driver
0d20: 69 6e 66 6f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c info. *. * Resul
0d30: 74 73 3a 0a 20 2a 09 54 68 65 20 63 6f 72 72 65 ts:. *.The corre
0d40: 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 ct channel drive
0d50: 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e r for the curren
0d60: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 63 6c t version of Tcl
0d70: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
0d80: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
0d90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f -------. */.Tcl_
0de0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 54 6c 73 ChannelType *Tls
0df0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 0a 7b _ChannelType().{
0e00: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 . /*. * I
0e10: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 68 nitialize the ch
0e20: 61 6e 6e 65 6c 20 74 79 70 65 20 69 66 20 6e 65 annel type if ne
0e30: 63 65 73 73 61 72 79 0a 20 20 20 20 20 2a 2f 0a cessary. */.
0e40: 20 20 20 20 69 66 20 28 74 6c 73 43 68 61 6e 6e if (tlsChann
0e50: 65 6c 54 79 70 65 20 3d 3d 20 4e 55 4c 4c 29 20 elType == NULL)
0e60: 7b 0a 09 2f 2a 0a 09 20 2a 20 41 6c 6c 6f 63 61 {../*.. * Alloca
0e70: 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 63 68 tion of a new ch
0e80: 61 6e 6e 65 6c 74 79 70 65 20 73 74 72 75 63 74 anneltype struct
0e90: 75 72 65 20 69 73 20 6e 6f 74 20 65 61 73 79 2c ure is not easy,
0ea0: 20 62 65 63 61 75 73 65 20 6f 66 0a 09 20 2a 20 because of.. *
0eb0: 74 68 65 20 76 61 72 69 6f 75 73 20 76 65 72 73 the various vers
0ec0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 72 65 20 61 on of the core a
0ed0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 63 68 nd subsequent ch
0ee0: 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 09 20 2a anges to the.. *
0ef0: 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 structure. The
0f00: 6d 61 69 6e 20 63 68 61 6c 6c 65 6e 67 65 20 69 main challenge i
0f10: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 65 6e s to allocate en
0f20: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 0a ough memory for.
0f30: 09 20 2a 20 6f 64 65 72 6e 20 76 65 72 73 69 6f . * odern versio
0f40: 6e 73 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 ns even if this
0f50: 65 78 74 79 65 6e 73 69 6f 6e 20 69 73 20 63 6f extyension is co
0f60: 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 6f mpiled against o
0f70: 6e 65 0a 09 20 2a 20 6f 66 20 74 68 65 20 6f 6c ne.. * of the ol
0f80: 64 65 72 20 76 61 72 69 61 6e 74 21 0a 09 20 2a der variant!.. *
0f90: 0a 09 20 2a 20 28 31 29 20 56 65 72 73 69 6f 6e .. * (1) Version
0fa0: 73 20 62 65 66 6f 72 65 20 73 74 75 62 73 20 28 s before stubs (
0fb0: 38 2e 30 2e 78 29 20 61 72 65 20 73 69 6d 70 6c 8.0.x) are simpl
0fc0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 79 20 e, because they
0fd0: 61 72 65 0a 09 20 2a 20 20 20 20 20 73 75 70 70 are.. * supp
0fe0: 6f 72 74 65 64 20 6f 6e 6c 79 20 69 66 20 74 68 orted only if th
0ff0: 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 e extension is c
1000: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 ompiled against
1010: 65 78 61 63 74 6c 79 0a 09 20 2a 20 20 20 20 20 exactly.. *
1020: 74 68 61 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 that version of
1030: 74 68 65 20 63 6f 72 65 2e 0a 09 20 2a 0a 09 20 the core... *..
1040: 2a 20 28 32 29 20 57 69 74 68 20 73 74 75 62 73 * (2) With stubs
1050: 20 77 65 20 6a 75 73 74 20 64 65 74 65 72 6d 69 we just determi
1060: 6e 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 ne the differenc
1070: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 6f 6c e between the ol
1080: 64 65 72 0a 09 20 2a 20 20 20 20 20 61 6e 64 20 der.. * and
1090: 6d 6f 64 65 72 6e 20 76 61 72 69 61 6e 74 20 61 modern variant a
10a0: 6e 64 20 6f 76 65 72 61 6c 6c 6f 63 61 74 65 20 nd overallocate
10b0: 61 63 63 6f 72 64 69 6e 67 6c 79 20 69 66 20 63 accordingly if c
10c0: 6f 6d 70 69 6c 65 64 0a 09 20 2a 20 20 20 20 20 ompiled.. *
10d0: 61 67 61 69 6e 73 74 20 61 6e 20 6f 6c 64 65 72 against an older
10e0: 20 76 61 72 69 61 6e 74 2e 0a 09 20 2a 2f 0a 0a variant... */..
10f0: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 69 .unsigned int si
1100: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 54 63 6c 5f ze = sizeof(Tcl_
1110: 43 68 61 6e 6e 65 6c 54 79 70 65 29 3b 20 2f 2a ChannelType); /*
1120: 20 42 61 73 65 20 73 69 7a 65 20 2a 2f 0a 0a 09 Base size */...
1130: 2f 2a 0a 09 20 2a 20 53 69 7a 65 20 6f 66 20 61 /*.. * Size of a
1140: 20 70 72 6f 63 65 64 75 72 65 20 70 6f 69 6e 74 procedure point
1150: 65 72 2e 20 57 65 20 61 73 73 75 6d 65 20 74 68 er. We assume th
1160: 61 74 20 61 6c 6c 20 70 72 6f 63 65 64 75 72 65 at all procedure
1170: 0a 09 20 2a 20 70 6f 69 6e 74 65 72 73 20 61 72 .. * pointers ar
1180: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 69 e of the same si
1190: 7a 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f ze, regardless o
11a0: 66 20 65 78 61 63 74 20 74 79 70 65 0a 09 20 2a f exact type.. *
11b0: 20 28 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 (arguments and
11c0: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 29 2e 0a return values)..
11d0: 09 20 2a 0a 09 20 2a 20 38 2e 32 2e 20 20 20 46 . *.. * 8.2. F
11e0: 69 72 73 74 20 76 65 72 73 69 6f 6e 20 63 6f 6e irst version con
11f0: 74 61 69 6e 69 6e 67 20 63 6c 6f 73 65 32 70 72 taining close2pr
1200: 6f 63 2e 20 42 61 73 65 6c 69 6e 65 2e 0a 09 20 oc. Baseline...
1210: 2a 20 38 2e 33 2e 32 20 20 54 68 72 65 65 20 61 * 8.3.2 Three a
1220: 64 64 69 74 69 6f 6e 61 6c 20 76 65 63 74 6f 72 dditional vector
1230: 73 2e 20 4d 6f 76 65 64 20 62 6c 6f 63 6b 4d 6f s. Moved blockMo
1240: 64 65 2c 20 6e 65 77 20 66 6c 75 73 68 2d 20 61 de, new flush- a
1250: 6e 64 0a 09 20 2a 20 20 20 20 20 20 20 20 68 61 nd.. * ha
1260: 6e 64 6c 65 72 50 72 6f 63 27 73 2e 0a 09 20 2a ndlerProc's... *
1270: 0a 09 20 2a 20 3d 3e 20 43 6f 6d 70 69 6c 61 74 .. * => Compilat
1280: 69 6f 6e 20 61 67 61 69 6e 73 74 20 65 61 72 6c ion against earl
1290: 69 65 72 20 76 65 72 73 69 6f 6e 20 68 61 73 20 ier version has
12a0: 74 6f 20 6f 76 65 72 61 6c 6c 6f 63 61 74 65 20 to overallocate
12b0: 74 68 72 65 65 0a 09 20 2a 20 20 20 20 70 72 6f three.. * pro
12c0: 63 65 64 75 72 65 20 70 6f 69 6e 74 65 72 73 2e cedure pointers.
12d0: 0a 09 20 2a 2f 0a 0a 23 69 66 64 65 66 20 45 4d .. */..#ifdef EM
12e0: 55 4c 41 54 45 5f 43 48 41 4e 4e 45 4c 5f 56 45 ULATE_CHANNEL_VE
12f0: 52 53 49 4f 4e 5f 32 0a 09 73 69 7a 65 20 2b 3d RSION_2..size +=
1300: 20 33 20 2a 20 70 72 6f 63 50 74 72 53 69 7a 65 3 * procPtrSize
1310: 3b 0a 23 65 6e 64 69 66 0a 0a 09 74 6c 73 43 68 ;.#endif...tlsCh
1320: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 28 54 63 6c annelType = (Tcl
1330: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 29 20 _ChannelType *)
1340: 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 09 ckalloc(size);..
1350: 6d 65 6d 73 65 74 28 28 56 4f 49 44 20 2a 29 20 memset((VOID *)
1360: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 tlsChannelType,
1370: 30 2c 20 73 69 7a 65 29 3b 0a 0a 09 2f 2a 0a 09 0, size);.../*..
1380: 20 2a 20 43 6f 6d 6d 6f 6e 20 65 6c 65 6d 65 6e * Common elemen
1390: 74 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 ts of the struct
13a0: 75 72 65 20 28 6e 6f 20 63 68 61 6e 67 65 73 20 ure (no changes
13b0: 69 6e 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6e in location or n
13c0: 61 6d 65 29 0a 09 20 2a 20 63 6c 6f 73 65 32 50 ame).. * close2P
13d0: 72 6f 63 2c 20 73 65 65 6b 50 72 6f 63 2c 20 73 roc, seekProc, s
13e0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 73 74 61 etOptionProc sta
13f0: 79 20 4e 55 4c 4c 2e 0a 09 20 2a 2f 0a 0a 09 74 y NULL... */...t
1400: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 74 lsChannelType->t
1410: 79 70 65 4e 61 6d 65 09 3d 20 22 74 6c 73 22 3b ypeName.= "tls";
1420: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 ..tlsChannelType
1430: 2d 3e 63 6c 6f 73 65 50 72 6f 63 09 3d 20 54 6c ->closeProc.= Tl
1440: 73 43 6c 6f 73 65 50 72 6f 63 3b 0a 09 74 6c 73 sCloseProc;..tls
1450: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 69 6e 70 ChannelType->inp
1460: 75 74 50 72 6f 63 09 3d 20 54 6c 73 49 6e 70 75 utProc.= TlsInpu
1470: 74 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e tProc;..tlsChann
1480: 65 6c 54 79 70 65 2d 3e 6f 75 74 70 75 74 50 72 elType->outputPr
1490: 6f 63 09 3d 20 54 6c 73 4f 75 74 70 75 74 50 72 oc.= TlsOutputPr
14a0: 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 oc;..tlsChannelT
14b0: 79 70 65 2d 3e 67 65 74 4f 70 74 69 6f 6e 50 72 ype->getOptionPr
14c0: 6f 63 09 3d 20 54 6c 73 47 65 74 4f 70 74 69 6f oc.= TlsGetOptio
14d0: 6e 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e nProc;..tlsChann
14e0: 65 6c 54 79 70 65 2d 3e 77 61 74 63 68 50 72 6f elType->watchPro
14f0: 63 09 3d 20 54 6c 73 57 61 74 63 68 50 72 6f 63 c.= TlsWatchProc
1500: 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 ;..tlsChannelTyp
1510: 65 2d 3e 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 e->getHandleProc
1520: 09 3d 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 .= TlsGetHandleP
1530: 72 6f 63 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 62 6c roc;.../*.. * bl
1540: 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 69 73 20 61 ockModeProc is a
1550: 20 74 77 69 73 74 65 72 2e 20 20 57 65 20 68 61 twister. We ha
1560: 76 65 20 74 6f 20 6d 61 6b 65 20 73 6f 6d 65 20 ve to make some
1570: 72 75 6e 74 69 6d 65 2d 63 68 6f 69 63 65 73 2c runtime-choices,
1580: 0a 09 20 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f .. * depending o
1590: 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65 n the version we
15a0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 compiled agains
15b0: 74 2e 0a 09 20 2a 2f 0a 0a 23 69 66 64 65 66 20 t... */..#ifdef
15c0: 45 4d 55 4c 41 54 45 5f 43 48 41 4e 4e 45 4c 5f EMULATE_CHANNEL_
15d0: 56 45 52 53 49 4f 4e 5f 32 0a 09 2f 2a 0a 09 20 VERSION_2../*..
15e0: 2a 20 57 65 20 61 72 65 20 63 6f 6d 70 69 6c 69 * We are compili
15f0: 6e 67 20 61 67 61 69 6e 73 74 20 61 6e 20 38 2e ng against an 8.
1600: 33 2e 31 2d 20 63 6f 72 65 2e 20 20 57 65 20 68 3.1- core. We h
1610: 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 73 6f ave to create so
1620: 6d 65 0a 09 20 2a 20 64 65 66 69 6e 69 74 69 6f me.. * definitio
1630: 6e 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 ns for the new e
1640: 6c 65 6d 65 6e 74 73 20 61 73 20 74 68 65 20 63 lements as the c
1650: 6f 6d 70 69 6c 65 72 20 64 6f 65 73 20 6e 6f 74 ompiler does not
1660: 20 6b 6e 6f 77 20 74 68 65 6d 0a 09 20 2a 20 62 know them.. * b
1670: 79 20 6e 61 6d 65 2e 0a 09 20 2a 2f 0a 0a 09 69 y name... */...i
1680: 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 f (channelTypeVe
1690: 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 rsion == TLS_CHA
16a0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 29 20 NNEL_VERSION_1)
16b0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
16c0: 2a 20 54 68 65 20 27 76 65 72 73 69 6f 6e 27 20 * The 'version'
16d0: 65 6c 65 6d 65 6e 74 20 6f 66 20 38 2e 33 2e 32 element of 8.3.2
16e0: 20 69 73 20 69 6e 20 74 68 65 20 74 68 65 20 70 is in the the p
16f0: 6c 61 63 65 20 6f 66 20 74 68 65 0a 09 20 20 20 lace of the..
1700: 20 20 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f * blockModePro
1710: 63 2e 20 46 6f 72 20 38 2e 32 2e 30 2d 38 2e 33 c. For 8.2.0-8.3
1720: 2e 31 20 77 65 20 68 61 76 65 20 74 6f 20 73 65 .1 we have to se
1730: 74 20 6f 75 72 20 62 6c 6f 63 6b 4d 6f 64 65 50 t our blockModeP
1740: 72 6f 63 0a 09 20 20 20 20 20 2a 20 69 6e 74 6f roc.. * into
1750: 20 74 68 69 73 20 70 6c 61 63 65 2e 0a 09 20 20 this place...
1760: 20 20 20 2a 2f 0a 09 20 20 20 20 74 6c 73 43 68 */.. tlsCh
1770: 61 6e 6e 65 6c 54 79 70 65 2d 3e 62 6c 6f 63 6b annelType->block
1780: 4d 6f 64 65 50 72 6f 63 20 3d 20 54 6c 73 42 6c ModeProc = TlsBl
1790: 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a 09 7d 20 ockModeProc;..}
17a0: 65 6c 73 65 20 2f 2a 20 63 68 61 6e 6e 65 6c 54 else /* channelT
17b0: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c ypeVersion == TL
17c0: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f S_CHANNEL_VERSIO
17d0: 4e 5f 32 20 2a 2f 20 7b 0a 09 20 20 20 20 2f 2a N_2 */ {.. /*
17e0: 0a 09 20 20 20 20 20 2a 20 46 6f 72 20 74 68 65 .. * For the
17f0: 20 38 2e 33 2e 32 20 63 6f 72 65 20 77 65 20 70 8.3.2 core we p
1800: 72 65 73 65 6e 74 20 6f 75 72 73 65 6c 76 65 73 resent ourselves
1810: 20 61 73 20 61 20 76 65 72 73 69 6f 6e 20 32 0a as a version 2.
1820: 09 20 20 20 20 20 2a 20 64 72 69 76 65 72 2e 20 . * driver.
1830: 54 68 69 73 20 6d 65 61 6e 73 20 61 20 73 70 65 This means a spe
1840: 63 69 61 6c 20 76 61 6c 75 65 20 69 6e 20 76 65 cial value in ve
1850: 72 73 69 6f 6e 20 28 65 78 0a 09 20 20 20 20 20 rsion (ex..
1860: 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 29 * blockModeProc)
1870: 2c 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 , blockModeProc
1880: 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 in a different p
1890: 6c 61 63 65 20 61 6e 64 20 6f 66 0a 09 20 20 20 lace and of..
18a0: 20 20 2a 20 63 6f 75 72 73 65 20 75 73 61 67 65 * course usage
18b0: 20 6f 66 20 74 68 65 20 68 61 6e 64 6c 65 72 50 of the handlerP
18c0: 72 6f 63 2e 20 20 54 68 65 20 6c 61 73 74 20 74 roc. The last t
18d0: 77 6f 20 68 61 76 65 20 74 6f 0a 09 20 20 20 20 wo have to..
18e0: 20 2a 20 72 65 66 65 72 65 6e 63 65 64 20 77 69 * referenced wi
18f0: 74 68 20 70 6f 69 6e 74 65 72 20 6d 61 67 69 63 th pointer magic
1900: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72 because they ar
1910: 65 6e 27 74 20 64 65 66 69 6e 65 64 0a 09 20 20 en't defined..
1920: 20 20 20 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a * otherwise..
1930: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 74 . */... t
1940: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 62 lsChannelType->b
1950: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 3d 0a 09 lockModeProc =..
1960: 09 28 54 63 6c 5f 44 72 69 76 65 72 42 6c 6f 63 .(Tcl_DriverBloc
1970: 6b 4d 6f 64 65 50 72 6f 63 2a 29 20 54 4c 53 5f kModeProc*) TLS_
1980: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f CHANNEL_VERSION_
1990: 32 3b 0a 09 20 20 20 20 28 2a 28 28 54 63 6c 5f 2;.. (*((Tcl_
19a0: 44 72 69 76 65 72 42 6c 6f 63 6b 4d 6f 64 65 50 DriverBlockModeP
19b0: 72 6f 63 2a 2a 29 28 26 28 74 6c 73 43 68 61 6e roc**)(&(tlsChan
19c0: 6e 65 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 32 50 nelType->close2P
19d0: 72 6f 63 29 2b 31 29 29 29 0a 09 09 3d 20 54 6c roc)+1)))...= Tl
19e0: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a sBlockModeProc;.
19f0: 09 20 20 20 20 28 2a 28 28 54 6c 73 44 72 69 76 . (*((TlsDriv
1a00: 65 72 48 61 6e 64 6c 65 72 50 72 6f 63 2a 2a 29 erHandlerProc**)
1a10: 28 26 28 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 (&(tlsChannelTyp
1a20: 65 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 29 2b 33 e->close2Proc)+3
1a30: 29 29 29 0a 09 09 3d 20 54 6c 73 4e 6f 74 69 66 )))...= TlsNotif
1a40: 79 50 72 6f 63 3b 0a 09 7d 0a 23 65 6c 73 65 0a yProc;..}.#else.
1a50: 09 2f 2a 0a 09 20 2a 20 43 6f 6d 70 69 6c 65 64 ./*.. * Compiled
1a60: 20 61 67 61 69 6e 73 74 20 38 2e 33 2e 32 2b 2e against 8.3.2+.
1a70: 20 44 69 72 65 63 74 20 61 63 63 65 73 73 20 74 Direct access t
1a80: 6f 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 70 o all elements p
1a90: 6f 73 73 69 62 6c 65 2e 20 55 73 65 0a 09 20 2a ossible. Use.. *
1aa0: 20 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 channelTypeVers
1ab0: 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 ion information
1ac0: 74 6f 20 73 65 6c 65 63 74 20 74 68 65 20 76 61 to select the va
1ad0: 6c 75 65 73 20 74 6f 20 75 73 65 2e 0a 09 20 2a lues to use... *
1ae0: 2f 0a 0a 09 69 66 20 28 63 68 61 6e 6e 65 6c 54 /...if (channelT
1af0: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c ypeVersion == TL
1b00: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f S_CHANNEL_VERSIO
1b10: 4e 5f 31 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 N_1) {.. /*..
1b20: 20 20 20 20 20 2a 20 54 68 65 20 27 76 65 72 73 * The 'vers
1b30: 69 6f 6e 27 20 65 6c 65 6d 65 6e 74 20 6f 66 20 ion' element of
1b40: 38 2e 33 2e 32 20 69 73 20 69 6e 20 74 68 65 20 8.3.2 is in the
1b50: 74 68 65 20 70 6c 61 63 65 20 6f 66 20 74 68 65 the place of the
1b60: 0a 09 20 20 20 20 20 2a 20 62 6c 6f 63 6b 4d 6f .. * blockMo
1b70: 64 65 50 72 6f 63 2e 20 46 6f 72 20 74 68 65 20 deProc. For the
1b80: 6f 72 69 67 69 6e 61 6c 20 70 61 74 63 68 20 69 original patch i
1b90: 6e 20 38 2e 31 2e 78 20 61 6e 64 20 74 68 65 20 n 8.1.x and the
1ba0: 66 69 72 73 74 6c 79 0a 09 20 20 20 20 20 2a 20 firstly.. *
1bb0: 69 6e 63 6c 75 64 65 64 20 28 38 2e 32 29 20 77 included (8.2) w
1bc0: 65 20 68 61 76 65 20 74 6f 20 73 65 74 20 6f 75 e have to set ou
1bd0: 72 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 r blockModeProc
1be0: 69 6e 74 6f 20 74 68 69 73 0a 09 20 20 20 20 20 into this..
1bf0: 2a 20 70 6c 61 63 65 2e 0a 09 20 20 20 20 20 2a * place... *
1c00: 2f 0a 09 20 20 20 20 74 6c 73 43 68 61 6e 6e 65 /.. tlsChanne
1c10: 6c 54 79 70 65 2d 3e 76 65 72 73 69 6f 6e 20 3d lType->version =
1c20: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 (Tcl_ChannelTyp
1c30: 65 56 65 72 73 69 6f 6e 29 54 6c 73 42 6c 6f 63 eVersion)TlsBloc
1c40: 6b 4d 6f 64 65 50 72 6f 63 3b 0a 09 7d 20 65 6c kModeProc;..} el
1c50: 73 65 20 2f 2a 20 63 68 61 6e 6e 65 6c 54 79 70 se /* channelTyp
1c60: 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f eVersion == TLS_
1c70: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f CHANNEL_VERSION_
1c80: 32 20 2a 2f 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 2 */ {.. /*..
1c90: 20 20 20 20 20 2a 20 46 6f 72 20 74 68 65 20 38 * For the 8
1ca0: 2e 33 2e 32 20 63 6f 72 65 20 77 65 20 70 72 65 .3.2 core we pre
1cb0: 73 65 6e 74 20 6f 75 72 73 65 6c 76 65 73 20 61 sent ourselves a
1cc0: 73 20 61 20 76 65 72 73 69 6f 6e 20 32 0a 09 20 s a version 2..
1cd0: 20 20 20 20 2a 20 64 72 69 76 65 72 2e 20 54 68 * driver. Th
1ce0: 69 73 20 6d 65 61 6e 73 20 61 20 73 70 65 63 69 is means a speci
1cf0: 61 6c 20 76 61 6c 75 65 20 69 6e 20 76 65 72 73 al value in vers
1d00: 69 6f 6e 20 28 65 78 0a 09 20 20 20 20 20 2a 20 ion (ex.. *
1d10: 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 29 2c 20 blockModeProc),
1d20: 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 69 6e blockModeProc in
1d30: 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 6c 61 a different pla
1d40: 63 65 20 61 6e 64 20 6f 66 0a 09 20 20 20 20 20 ce and of..
1d50: 2a 20 63 6f 75 72 73 65 20 75 73 61 67 65 20 6f * course usage o
1d60: 66 20 74 68 65 20 68 61 6e 64 6c 65 72 50 72 6f f the handlerPro
1d70: 63 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 c... */...
1d80: 20 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 tlsChannelType
1d90: 2d 3e 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 ->version
1da0: 3d 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 = TCL_CHANNEL_VE
1db0: 52 53 49 4f 4e 5f 32 3b 0a 09 20 20 20 20 74 6c RSION_2;.. tl
1dc0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 62 6c sChannelType->bl
1dd0: 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 3d 20 54 6c ockModeProc = Tl
1de0: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a sBlockModeProc;.
1df0: 09 20 20 20 20 74 6c 73 43 68 61 6e 6e 65 6c 54 . tlsChannelT
1e00: 79 70 65 2d 3e 68 61 6e 64 6c 65 72 50 72 6f 63 ype->handlerProc
1e10: 20 20 20 3d 20 54 6c 73 4e 6f 74 69 66 79 50 72 = TlsNotifyPr
1e20: 6f 63 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 oc;..}.#endif.
1e30: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 74 }. return t
1e40: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d lsChannelType;.}
1e50: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
1ea0: 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 * TlsBlockModePr
1eb0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 oc --. *. *.This
1ec0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
1ed0: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e voked by the gen
1ee0: 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a eric IO level. *
1ef0: 20 20 20 20 20 20 20 74 6f 20 73 65 74 20 62 6c to set bl
1f00: 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c ocking and nonbl
1f10: 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 20 2a 20 ocking modes. *
1f20: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 Results:. *.0 if
1f30: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 72 72 successful, err
1f40: 6e 6f 20 77 68 65 6e 20 66 61 69 6c 65 64 2e 0a no when failed..
1f50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1f60: 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 ts:. *.Sets the
1f70: 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 device into bloc
1f80: 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b king or nonblock
1f90: 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ing mode.. *. *-
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fe0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
1ff0: 6e 74 0a 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 nt.TlsBlockModeP
2000: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 roc(ClientData i
2010: 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 nstanceData,./*
2020: 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f Socket state. */
2030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2040: 20 20 69 6e 74 20 6d 6f 64 65 29 09 09 09 2f 2a int mode).../*
2050: 20 54 68 65 20 6d 6f 64 65 20 74 6f 20 73 65 74 The mode to set
2060: 2e 20 43 61 6e 20 62 65 20 6f 6e 65 20 6f 66 0a . Can be one of.
2070: 09 09 09 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 ......* TCL_MODE
2080: 5f 42 4c 4f 43 4b 49 4e 47 20 6f 72 0a 09 09 09 _BLOCKING or....
2090: 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f ...* TCL_MODE_NO
20a0: 4e 42 4c 4f 43 4b 49 4e 47 2e 20 2a 2f 0a 7b 0a NBLOCKING. */.{.
20b0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
20c0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
20d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 instanceData;..
20e0: 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 if (mode == T
20f0: 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b CL_MODE_NONBLOCK
2100: 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72 ING) {..statePtr
2110: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
2120: 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 CL_ASYNC;. }
2130: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 else {..statePtr
2140: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 ->flags &= ~(TLS
2150: 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 _TCL_ASYNC);.
2160: 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e }. if (chann
2170: 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d elTypeVersion ==
2180: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 TLS_CHANNEL_VER
2190: 53 49 4f 4e 5f 32 29 20 7b 0a 09 72 65 74 75 72 SION_2) {..retur
21a0: 6e 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 n 0;. } else
21b0: 7b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 53 65 {..return Tcl_Se
21c0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 73 tChannelOption(s
21d0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
21e0: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 Tls_GetParent(s
21f0: 74 61 74 65 50 74 72 29 2c 0a 09 09 22 2d 62 6c tatePtr),..."-bl
2200: 6f 63 6b 69 6e 67 22 2c 20 28 6d 6f 64 65 20 3d ocking", (mode =
2210: 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c = TCL_MODE_NONBL
2220: 4f 43 4b 49 4e 47 29 20 3f 20 22 30 22 20 3a 20 OCKING) ? "0" :
2230: 22 31 22 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a "1");. }.}...
2240: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
2290: 6c 73 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 lsCloseProc --.
22a0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
22b0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 ure is invoked b
22c0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
22d0: 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 level to perfor
22e0: 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 m. *.channel-typ
22f0: 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e e-specific clean
2300: 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f up when a SSL so
2310: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
2320: 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 2e el. *.is closed.
2330: 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a 20 77 65 20 . *. *.Note: we
2340: 6c 65 61 76 65 20 74 68 65 20 75 6e 64 65 72 6c leave the underl
2350: 79 69 6e 67 20 73 6f 63 6b 65 74 20 61 6c 6f 6e ying socket alon
2360: 65 2c 20 69 73 20 74 68 69 73 20 72 69 67 68 74 e, is this right
2370: 3f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a ?. *. * Results:
2380: 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 73 73 . *.0 if success
2390: 66 75 6c 2c 20 74 68 65 20 76 61 6c 75 65 20 6f ful, the value o
23a0: 66 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 f Tcl_GetErrno()
23b0: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 if failed.. *.
23c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
23d0: 20 2a 09 43 6c 6f 73 65 73 20 74 68 65 20 73 6f *.Closes the so
23e0: 63 6b 65 74 20 6f 66 20 74 68 65 20 63 68 61 6e cket of the chan
23f0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 /.static int.Tls
2450: 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 CloseProc(Client
2460: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
2470: 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 a,./* The socket
2480: 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 20 20 to close. */.
2490: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 Tcl_I
24a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 09 2f nterp *interp)./
24b0: 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70 6f * For error repo
24c0: 72 74 69 6e 67 20 2d 20 75 6e 75 73 65 64 2e 20 rting - unused.
24d0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
24e0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
24f0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
2500: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
2510: 73 74 64 65 72 72 2c 22 5c 6e 54 6c 73 43 6c 6f stderr,"\nTlsClo
2520: 73 65 50 72 6f 63 28 30 78 25 78 29 22 2c 20 28 seProc(0x%x)", (
2530: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 unsigned int) st
2540: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 atePtr);.. if
2550: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 (channelTypeVer
2560: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e sion == TLS_CHAN
2570: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 29 20 7b NEL_VERSION_1) {
2580: 0a 09 2f 2a 0a 09 20 2a 20 52 65 6d 6f 76 65 20 ../*.. * Remove
2590: 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 20 74 6f event handler to
25a0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e underlying chan
25b0: 6e 65 6c 2c 20 74 68 69 73 20 63 6f 75 6c 64 0a nel, this could.
25c0: 09 20 2a 20 62 65 20 62 65 63 61 75 73 65 20 77 . * be because w
25d0: 65 20 61 72 65 20 63 6c 6f 73 69 6e 67 20 66 6f e are closing fo
25e0: 72 20 72 65 61 6c 2c 20 6f 72 20 62 65 69 6e 67 r real, or being
25f0: 20 22 75 6e 73 74 61 63 6b 65 64 22 2e 0a 09 20 "unstacked"...
2600: 2a 2f 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 43 */...Tcl_DeleteC
2610: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 6c hannelHandler(Tl
2620: 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 s_GetParent(stat
2630: 65 50 74 72 29 2c 0a 09 09 54 6c 73 43 68 61 6e ePtr),...TlsChan
2640: 6e 65 6c 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 nelHandler, (Cli
2650: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2660: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 r);. }.. T
2670: 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 ls_Clean(statePt
2680: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e r);. Tcl_Even
2690: 74 75 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 tuallyFree((Clie
26a0: 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72 2c ntData)statePtr,
26b0: 20 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 Tls_Free);.
26c0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
26d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
2720: 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d * TlsInputProc -
2730: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
2740: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
2750: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 d by the generic
2760: 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 IO level. *
2770: 20 20 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 to read input
2780: 20 66 72 6f 6d 20 61 20 53 53 4c 20 73 6f 63 6b from a SSL sock
2790: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
27a0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
27b0: 0a 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f . *.The number o
27c0: 66 20 62 79 74 65 73 20 72 65 61 64 20 69 73 20 f bytes read is
27d0: 72 65 74 75 72 6e 65 64 20 6f 72 20 2d 31 20 6f returned or -1 o
27e0: 6e 20 65 72 72 6f 72 2e 20 41 6e 20 6f 75 74 70 n error. An outp
27f0: 75 74 0a 20 2a 09 61 72 67 75 6d 65 6e 74 20 63 ut. *.argument c
2800: 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 4f 53 49 ontains the POSI
2810: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 X error code on
2820: 65 72 72 6f 72 2c 20 6f 72 20 7a 65 72 6f 20 69 error, or zero i
2830: 66 20 6e 6f 0a 20 2a 09 65 72 72 6f 72 20 6f 63 f no. *.error oc
2840: 63 75 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 curred.. *. * Si
2850: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 de effects:. *.R
2860: 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f 6d 20 eads input from
2870: 74 68 65 20 69 6e 70 75 74 20 64 65 76 69 63 65 the input device
2880: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e of the channel.
2890: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
28e0: 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 49 6e 70 tatic int.TlsInp
28f0: 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 utProc(ClientDat
2900: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 a instanceData,.
2910: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e /* Socket state.
2920: 20 2a 2f 0a 09 63 68 61 72 20 2a 62 75 66 2c 09 */..char *buf,.
2930: 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 ../* Where to st
2940: 6f 72 65 20 64 61 74 61 20 72 65 61 64 2e 20 2a ore data read. *
2950: 2f 0a 09 69 6e 74 20 62 75 66 53 69 7a 65 2c 09 /..int bufSize,.
2960: 09 09 2f 2a 20 48 6f 77 20 6d 75 63 68 20 73 70 ../* How much sp
2970: 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 ace is available
2980: 0a 09 09 09 09 09 20 2a 20 69 6e 20 74 68 65 20 ...... * in the
2990: 62 75 66 66 65 72 3f 20 2a 2f 0a 09 69 6e 74 20 buffer? */..int
29a0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 09 *errorCodePtr)..
29b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 /* Where to stor
29c0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f e error code. */
29d0: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 .{. State *st
29e0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
29f0: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b *) instanceData;
2a00: 0a 20 20 20 20 69 6e 74 20 62 79 74 65 73 52 65 . int bytesRe
2a10: 61 64 3b 09 09 09 2f 2a 20 48 6f 77 20 6d 61 6e ad;.../* How man
2a20: 79 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 y bytes were rea
2a30: 64 3f 20 2a 2f 0a 0a 20 20 20 20 2a 65 72 72 6f d? */.. *erro
2a40: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 rCodePtr = 0;..
2a50: 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 dprintf(stder
2a60: 72 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 28 25 64 r,"\nBIO_read(%d
2a70: 29 22 2c 20 62 75 66 53 69 7a 65 29 3b 0a 0a 20 )", bufSize);..
2a80: 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 if (!SSL_is_i
2a90: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 nit_finished(sta
2aa0: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 tePtr->ssl)) {..
2ab0: 62 79 74 65 73 52 65 61 64 20 3d 20 54 6c 73 5f bytesRead = Tls_
2ac0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 WaitForConnect(s
2ad0: 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f tatePtr, errorCo
2ae0: 64 65 50 74 72 29 3b 0a 09 69 66 20 28 62 79 74 dePtr);..if (byt
2af0: 65 73 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 esRead <= 0) {..
2b00: 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a goto input;.
2b10: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 .}. }. if
2b20: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
2b30: 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 & TLS_TCL_INIT)
2b40: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c {..statePtr->fl
2b50: 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c ags &= ~(TLS_TCL
2b60: 5f 49 4e 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20 _INIT);. }.
2b70: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e /*. * We n
2b80: 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 eed to clear the
2b90: 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63 6b SSL error stack
2ba0: 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65 20 now because we
2bb0: 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68 0a sometimes reach.
2bc0: 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e 63 * this func
2bd0: 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 tion with leftov
2be0: 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 er errors in the
2bf0: 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f stack. If BIO_
2c00: 72 65 61 64 0a 20 20 20 20 20 2a 20 72 65 74 75 read. * retu
2c10: 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e rns -1 and inten
2c20: 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 ds EAGAIN, there
2c30: 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 is a leftover e
2c40: 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 rror, it will be
2c50: 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 . * misconst
2c60: 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 rued as an error
2c70: 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 , not EAGAIN..
2c80: 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 *. * Alte
2c90: 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 rnatively, we ma
2ca0: 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 y want to handle
2cb0: 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63 the <0 return c
2cc0: 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a odes from. *
2cd0: 20 42 49 4f 5f 72 65 61 64 20 73 70 65 63 69 61 BIO_read specia
2ce0: 6c 6c 79 20 28 61 73 20 61 64 76 69 73 65 64 20 lly (as advised
2cf0: 69 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 in the RSA docs)
2d00: 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c . TLS's lower l
2d10: 65 76 65 6c 20 42 49 4f 0a 20 20 20 20 20 2a 20 evel BIO. *
2d20: 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 functions play w
2d30: 69 74 68 20 74 68 65 20 72 65 74 72 79 20 66 6c ith the retry fl
2d40: 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 ags though, and
2d50: 74 68 69 73 20 73 65 65 6d 73 20 74 6f 20 77 6f this seems to wo
2d60: 72 6b 0a 20 20 20 20 20 2a 20 63 6f 72 72 65 63 rk. * correc
2d70: 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 tly. Similar fi
2d80: 78 20 69 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 x in TlsOutputPr
2d90: 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 oc. - hobbs.
2da0: 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 */. ERR_clea
2db0: 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 62 r_error();. b
2dc0: 79 74 65 73 52 65 61 64 20 3d 20 42 49 4f 5f 72 ytesRead = BIO_r
2dd0: 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ead(statePtr->bi
2de0: 6f 2c 20 62 75 66 2c 20 62 75 66 53 69 7a 65 29 o, buf, bufSize)
2df0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 ;. dprintf(st
2e00: 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 derr,"\nBIO_read
2e10: 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52 65 -> %d", bytesRe
2e20: 61 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 62 79 ad);.. if (by
2e30: 74 65 73 52 65 61 64 20 3c 20 30 29 20 7b 0a 09 tesRead < 0) {..
2e40: 69 6e 74 20 65 72 72 20 3d 20 53 53 4c 5f 67 65 int err = SSL_ge
2e50: 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 t_error(statePtr
2e60: 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 ->ssl, bytesRead
2e70: 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 3d 3d 20 );...if (err ==
2e80: 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 29 20 7b SSL_ERROR_SSL) {
2e90: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 .. Tls_Error(
2ea0: 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 statePtr, SSL_ER
2eb0: 52 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ROR(statePtr->ss
2ec0: 6c 2c 20 62 79 74 65 73 52 65 61 64 29 29 3b 0a l, bytesRead));.
2ed0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
2ee0: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 tr = ECONNABORTE
2ef0: 44 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 42 D;..} else if (B
2f00: 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 IO_should_retry(
2f10: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 statePtr->bio))
2f20: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 {.. dprintf(s
2f30: 74 64 65 72 72 2c 22 52 45 21 20 22 29 3b 0a 09 tderr,"RE! ");..
2f40: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
2f50: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 7d 20 65 r = EAGAIN;..} e
2f60: 6c 73 65 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f lse {.. *erro
2f70: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 rCodePtr = Tcl_G
2f80: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20 etErrno();..
2f90: 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 if (*errorCodePt
2fa0: 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 r == ECONNRESET)
2fb0: 20 7b 0a 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 {.../* Soft EOF
2fc0: 20 2a 2f 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 */...*errorCode
2fd0: 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 Ptr = 0;...bytes
2fe0: 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d Read = 0;.. }
2ff0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e ..}. }. in
3000: 70 75 74 3a 0a 20 20 20 20 64 70 72 69 6e 74 66 put:. dprintf
3010: 28 73 74 64 65 72 72 2c 20 22 5c 6e 49 6e 70 75 (stderr, "\nInpu
3020: 74 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 64 5d t(%d) -> %d [%d]
3030: 22 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 74 65 ", bufSize, byte
3040: 73 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 6f 64 sRead, *errorCod
3050: 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 ePtr);. retur
3060: 6e 20 62 79 74 65 73 52 65 61 64 3b 0a 7d 0a 0c n bytesRead;.}..
3070: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
30c0: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d TlsOutputProc --
30d0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
30e0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
30f0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
3100: 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 IO level. *
3110: 20 20 74 6f 20 77 72 69 74 65 20 6f 75 74 70 75 to write outpu
3120: 74 20 74 6f 20 61 20 53 53 4c 20 73 6f 63 6b 65 t to a SSL socke
3130: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e t based channel.
3140: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3150: 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 *.The number of
3160: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 69 bytes written i
3170: 73 20 72 65 74 75 72 6e 65 64 2e 20 41 6e 20 6f s returned. An o
3180: 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 69 utput argument i
3190: 73 0a 20 2a 09 73 65 74 20 74 6f 20 61 20 50 4f s. *.set to a PO
31a0: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 SIX error code i
31b0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 f an error occur
31c0: 72 65 64 2c 20 6f 72 20 7a 65 72 6f 2e 0a 20 2a red, or zero.. *
31d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
31e0: 3a 0a 20 2a 09 57 72 69 74 65 73 20 6f 75 74 70 :. *.Writes outp
31f0: 75 74 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 ut on the output
3200: 20 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 device of the c
3210: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3260: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
3270: 0a 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 28 43 .TlsOutputProc(C
3280: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
3290: 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 ceData,./* Socke
32a0: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 t state. */.
32b0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 20 CONST
32c0: 63 68 61 72 20 2a 62 75 66 2c 09 09 2f 2a 20 54 char *buf,../* T
32d0: 68 65 20 64 61 74 61 20 62 75 66 66 65 72 2e 20 he data buffer.
32e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 */.
32f0: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 09 09 2f int toWrite,../
3300: 2a 20 48 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 * How many bytes
3310: 20 74 6f 20 77 72 69 74 65 3f 20 2a 2f 0a 20 20 to write? */.
3320: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 int
3330: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 2f *errorCodePtr)./
3340: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 * Where to store
3350: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a error code. */.
3360: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
3370: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
3380: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
3390: 20 20 20 20 69 6e 74 20 77 72 69 74 74 65 6e 2c int written,
33a0: 20 65 72 72 3b 0a 0a 20 20 20 20 2a 65 72 72 6f err;.. *erro
33b0: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 rCodePtr = 0;..
33c0: 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 dprintf(stder
33d0: 72 2c 22 5c 6e 42 49 4f 5f 77 72 69 74 65 28 30 r,"\nBIO_write(0
33e0: 78 25 78 2c 20 25 64 29 22 2c 20 28 75 6e 73 69 x%x, %d)", (unsi
33f0: 67 6e 65 64 20 69 6e 74 29 20 73 74 61 74 65 50 gned int) stateP
3400: 74 72 2c 20 74 6f 57 72 69 74 65 29 3b 0a 0a 20 tr, toWrite);..
3410: 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 if (!SSL_is_i
3420: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 nit_finished(sta
3430: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 tePtr->ssl)) {..
3440: 77 72 69 74 74 65 6e 20 3d 20 54 6c 73 5f 57 61 written = Tls_Wa
3450: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 itForConnect(sta
3460: 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 tePtr, errorCode
3470: 50 74 72 29 3b 0a 09 69 66 20 28 77 72 69 74 74 Ptr);..if (writt
3480: 65 6e 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 en <= 0) {..
3490: 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 09 7d 0a goto output;..}.
34a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
34b0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
34c0: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a TLS_TCL_INIT) {.
34d0: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 .statePtr->flags
34e0: 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 49 4e &= ~(TLS_TCL_IN
34f0: 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 IT);. }. i
3500: 66 20 28 74 6f 57 72 69 74 65 20 3d 3d 20 30 29 f (toWrite == 0)
3510: 20 7b 0a 09 64 70 72 69 6e 74 66 28 73 74 64 65 {..dprintf(stde
3520: 72 72 2c 20 22 7a 65 72 6f 2d 77 72 69 74 65 5c rr, "zero-write\
3530: 6e 22 29 3b 0a 09 42 49 4f 5f 66 6c 75 73 68 28 n");..BIO_flush(
3540: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
3550: 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 67 .written = 0;..g
3560: 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 20 20 20 20 oto output;.
3570: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a } else {../*.. *
3580: 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 We need to clea
3590: 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20 r the SSL error
35a0: 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 stack now becaus
35b0: 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 e we sometimes r
35c0: 65 61 63 68 0a 09 20 2a 20 74 68 69 73 20 66 75 each.. * this fu
35d0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 nction with left
35e0: 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 over errors in t
35f0: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 he stack. If BI
3600: 4f 5f 77 72 69 74 65 0a 09 20 2a 20 72 65 74 75 O_write.. * retu
3610: 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e rns -1 and inten
3620: 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 ds EAGAIN, there
3630: 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 is a leftover e
3640: 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 rror, it will be
3650: 0a 09 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 .. * misconstrue
3660: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e d as an error, n
3670: 6f 74 20 45 41 47 41 49 4e 2e 0a 09 20 2a 0a 09 ot EAGAIN... *..
3680: 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 * Alternatively
3690: 2c 20 77 65 20 6d 61 79 20 77 61 6e 74 20 74 6f , we may want to
36a0: 20 68 61 6e 64 6c 65 20 74 68 65 20 3c 30 20 72 handle the <0 r
36b0: 65 74 75 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d eturn codes from
36c0: 0a 09 20 2a 20 42 49 4f 5f 77 72 69 74 65 20 73 .. * BIO_write s
36d0: 70 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 pecially (as adv
36e0: 69 73 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 ised in the RSA
36f0: 64 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f docs). TLS's lo
3700: 77 65 72 20 6c 65 76 65 6c 0a 09 20 2a 20 42 49 wer level.. * BI
3710: 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 O functions play
3720: 20 77 69 74 68 20 74 68 65 20 72 65 74 72 79 20 with the retry
3730: 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e flags though, an
3740: 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f 0a d this seems to.
3750: 09 20 2a 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 . * work correct
3760: 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 ly. Similar fix
3770: 20 69 6e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 in TlsInputProc
3780: 2e 20 2d 20 68 6f 62 62 73 0a 09 20 2a 2f 0a 09 . - hobbs.. */..
3790: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
37a0: 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 42 49 );..written = BI
37b0: 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 O_write(statePtr
37c0: 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 ->bio, buf, toWr
37d0: 69 74 65 29 3b 0a 09 64 70 72 69 6e 74 66 28 73 ite);..dprintf(s
37e0: 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 77 72 69 tderr,"\nBIO_wri
37f0: 74 65 28 30 78 25 78 2c 20 25 64 29 20 2d 3e 20 te(0x%x, %d) ->
3800: 5b 25 64 5d 22 2c 0a 09 09 28 75 6e 73 69 67 6e [%d]",...(unsign
3810: 65 64 20 69 6e 74 29 20 73 74 61 74 65 50 74 72 ed int) statePtr
3820: 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 , toWrite, writt
3830: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 en);. }. i
3840: 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 f (written <= 0)
3850: 20 7b 0a 09 73 77 69 74 63 68 20 28 28 65 72 72 {..switch ((err
3860: 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 = SSL_get_error
3870: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
3880: 77 72 69 74 74 65 6e 29 29 29 20 7b 0a 09 20 20 written))) {..
3890: 20 20 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 case SSL_ERROR
38a0: 5f 4e 4f 4e 45 3a 0a 09 09 69 66 20 28 77 72 69 _NONE:...if (wri
38b0: 74 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09 20 20 tten < 0) {...
38c0: 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 written = 0;..
38d0: 09 7d 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 .}...break;..
38e0: 20 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f case SSL_ERROR_
38f0: 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 09 64 70 WANT_WRITE:...dp
3900: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 77 rintf(stderr," w
3910: 72 69 74 65 20 57 20 42 4c 4f 43 4b 22 29 3b 0a rite W BLOCK");.
3920: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
3930: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
3940: 54 5f 52 45 41 44 3a 0a 09 09 64 70 72 69 6e 74 T_READ:...dprint
3950: 66 28 73 74 64 65 72 72 2c 22 20 77 72 69 74 65 f(stderr," write
3960: 20 52 20 42 4c 4f 43 4b 22 29 3b 0a 09 09 62 72 R BLOCK");...br
3970: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 53 eak;.. case S
3980: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 SL_ERROR_WANT_X5
3990: 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 09 64 70 72 09_LOOKUP:...dpr
39a0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 77 72 intf(stderr," wr
39b0: 69 74 65 20 58 20 42 4c 4f 43 4b 22 29 3b 0a 09 ite X BLOCK");..
39c0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 .break;.. cas
39d0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f e SSL_ERROR_ZERO
39e0: 5f 52 45 54 55 52 4e 3a 0a 09 09 64 70 72 69 6e _RETURN:...dprin
39f0: 74 66 28 73 74 64 65 72 72 2c 22 20 63 6c 6f 73 tf(stderr," clos
3a00: 65 64 5c 6e 22 29 3b 0a 09 09 77 72 69 74 74 65 ed\n");...writte
3a10: 6e 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a n = 0;...break;.
3a20: 09 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52 . case SSL_ER
3a30: 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 09 2a ROR_SYSCALL:...*
3a40: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 errorCodePtr = T
3a50: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 cl_GetErrno();..
3a60: 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c .dprintf(stderr,
3a70: 22 20 5b 25 64 5d 20 73 79 73 63 61 6c 6c 20 65 " [%d] syscall e
3a80: 72 72 72 3a 20 25 64 22 2c 0a 09 09 09 77 72 69 rrr: %d",....wri
3a90: 74 74 65 6e 2c 20 2a 65 72 72 6f 72 43 6f 64 65 tten, *errorCode
3aa0: 50 74 72 29 3b 0a 09 09 77 72 69 74 74 65 6e 20 Ptr);...written
3ab0: 3d 20 2d 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 = -1;...break;..
3ac0: 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52 52 case SSL_ERR
3ad0: 4f 52 5f 53 53 4c 3a 0a 09 09 54 6c 73 5f 45 72 OR_SSL:...Tls_Er
3ae0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 ror(statePtr, SS
3af0: 4c 5f 45 52 52 4f 52 28 73 74 61 74 65 50 74 72 L_ERROR(statePtr
3b00: 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 6e 29 29 ->ssl, written))
3b10: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 ;...*errorCodePt
3b20: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 r = ECONNABORTED
3b30: 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 ;...written = -1
3b40: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ;...break;..
3b50: 64 65 66 61 75 6c 74 3a 0a 09 09 64 70 72 69 6e default:...dprin
3b60: 74 66 28 73 74 64 65 72 72 2c 22 20 75 6e 6b 6e tf(stderr," unkn
3b70: 6f 77 6e 20 65 72 72 3a 20 25 64 5c 6e 22 2c 20 own err: %d\n",
3b80: 65 72 72 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 err);...break;..
3b90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 }. }. outp
3ba0: 75 74 3a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ut:. dprintf(
3bb0: 73 74 64 65 72 72 2c 20 22 5c 6e 4f 75 74 70 75 stderr, "\nOutpu
3bc0: 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f t(%d) -> %d", to
3bd0: 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 3b Write, written);
3be0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 72 69 74 . return writ
3bf0: 74 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ten;.}.../*. *--
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c20: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 4f 70 -. *. * TlsGetOp
3c50: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 tionProc --. *.
3c60: 2a 09 43 6f 6d 70 75 74 65 73 20 61 6e 20 6f 70 *.Computes an op
3c70: 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 tion value for a
3c80: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
3c90: 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a d channel, or a.
3ca0: 20 2a 09 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f *.list of all o
3cb0: 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 ptions and their
3cc0: 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a 20 52 values.. *. * R
3cd0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
3ce0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
3cf0: 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 . The value of t
3d00: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 he specified opt
3d10: 69 6f 6e 20 6f 72 20 61 0a 20 2a 09 6c 69 73 74 ion or a. *.list
3d20: 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 of all options
3d30: 61 6e 64 09 74 68 65 69 72 20 76 61 6c 75 65 73 and.their values
3d40: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 is returned in
3d50: 74 68 65 0a 20 2a 09 73 75 70 70 6c 69 65 64 20 the. *.supplied
3d60: 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 DString.. *. * S
3d70: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3d80: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
3d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3dd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c */.static int.Tl
3de0: 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 sGetOptionProc(C
3df0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
3e00: 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 ceData,./* Socke
3e10: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 09 54 63 6c t state. */..Tcl
3e20: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
3e30: 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 ../* For errors
3e40: 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a - can be NULL. *
3e50: 2f 0a 09 43 4f 4e 53 54 20 63 68 61 72 20 2a 6f /..CONST char *o
3e60: 70 74 69 6f 6e 4e 61 6d 65 2c 09 09 2f 2a 20 4e ptionName,../* N
3e70: 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f ame of the optio
3e80: 6e 20 74 6f 0a 09 09 09 09 09 20 2a 20 72 65 74 n to...... * ret
3e90: 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 65 20 rieve the value
3ea0: 66 6f 72 2c 20 6f 72 0a 09 09 09 09 09 20 2a 20 for, or...... *
3eb0: 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 NULL to get all
3ec0: 6f 70 74 69 6f 6e 73 20 61 6e 64 0a 09 09 09 09 options and.....
3ed0: 09 20 2a 20 74 68 65 69 72 20 76 61 6c 75 65 73 . * their values
3ee0: 2e 20 2a 2f 0a 09 54 63 6c 5f 44 53 74 72 69 6e . */..Tcl_DStrin
3ef0: 67 20 2a 64 73 50 74 72 29 09 09 2f 2a 20 57 68 g *dsPtr)../* Wh
3f00: 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 ere to store the
3f10: 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 0a computed value.
3f20: 09 09 09 09 09 20 2a 20 69 6e 69 74 69 61 6c 69 ..... * initiali
3f30: 7a 65 64 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a zed by caller. *
3f40: 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 /.{. State *s
3f50: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
3f60: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 *) instanceData
3f70: 3b 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e ;.. if (chann
3f80: 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d elTypeVersion ==
3f90: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 TLS_CHANNEL_VER
3fa0: 53 49 4f 4e 5f 32 29 20 7b 0a 09 54 63 6c 5f 43 SION_2) {..Tcl_C
3fb0: 68 61 6e 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20 hannel downChan
3fc0: 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 = Tls_GetParent(
3fd0: 73 74 61 74 65 50 74 72 29 3b 0a 09 54 63 6c 5f statePtr);..Tcl_
3fe0: 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 DriverGetOptionP
3ff0: 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 roc *getOptionPr
4000: 6f 63 3b 0a 0a 09 67 65 74 4f 70 74 69 6f 6e 50 oc;...getOptionP
4010: 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 roc = Tcl_Channe
4020: 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 lGetOptionProc(T
4030: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
4040: 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b 0a 09 69 e(downChan));..i
4050: 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 f (getOptionProc
4060: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
4070: 20 72 65 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 return (*getOpt
4080: 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 ionProc)(Tcl_Get
4090: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
40a0: 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 0a 09 ata(downChan),..
40b0: 09 20 20 20 20 69 6e 74 65 72 70 2c 20 6f 70 74 . interp, opt
40c0: 69 6f 6e 4e 61 6d 65 2c 20 64 73 50 74 72 29 3b ionName, dsPtr);
40d0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 ..} else if (opt
40e0: 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 ionName == (char
40f0: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 *) NULL) {..
4100: 2f 2a 0a 09 20 20 20 20 20 2a 20 52 65 71 75 65 /*.. * Reque
4110: 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 st is query for
4120: 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 all options, thi
4130: 73 20 69 73 20 6f 6b 2e 0a 09 20 20 20 20 20 2a s is ok... *
4140: 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 /.. return TC
4150: 4c 5f 4f 4b 3b 0a 09 7d 0a 09 2f 2a 0a 09 20 2a L_OK;..}../*.. *
4160: 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 Request for a s
4170: 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 pecific option h
4180: 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 as to fail, we d
4190: 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 09 on't have any...
41a0: 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f */..return TCL_
41b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 ERROR;. } els
41c0: 65 20 7b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 20 e {..size_t len
41d0: 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 70 74 69 6f = 0;...if (optio
41e0: 6e 4e 61 6d 65 20 21 3d 20 28 63 68 61 72 20 2a nName != (char *
41f0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6c ) NULL) {.. l
4200: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 70 74 69 en = strlen(opti
4210: 6f 6e 4e 61 6d 65 29 3b 0a 09 7d 0a 23 69 66 20 onName);..}.#if
4220: 30 0a 09 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30 0..if ((len == 0
4230: 29 20 7c 7c 20 28 28 6c 65 6e 20 3e 20 31 29 20 ) || ((len > 1)
4240: 26 26 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 5b 31 && (optionName[1
4250: 5d 20 3d 3d 20 27 63 27 29 20 26 26 0a 09 09 28 ] == 'c') &&...(
4260: 73 74 72 6e 63 6d 70 28 6f 70 74 69 6f 6e 4e 61 strncmp(optionNa
4270: 6d 65 2c 20 22 2d 63 69 70 68 65 72 22 2c 20 6c me, "-cipher", l
4280: 65 6e 29 20 3d 3d 20 30 29 29 29 20 7b 0a 09 20 en) == 0))) {..
4290: 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29 if (len == 0)
42a0: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
42b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 AppendElement(ds
42c0: 50 74 72 2c 20 22 2d 63 69 70 68 65 72 22 29 3b Ptr, "-cipher");
42d0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
42e0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c _DStringAppendEl
42f0: 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 53 53 4c ement(dsPtr, SSL
4300: 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 _get_cipher(stat
4310: 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 09 20 20 ePtr->ssl));..
4320: 20 20 69 66 20 28 6c 65 6e 29 20 7b 0a 09 09 72 if (len) {...r
4330: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20 eturn TCL_OK;..
4340: 20 20 20 7d 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 }..}.#endif..
4350: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 return TCL_OK;.
4360: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d }.}.../*. *--
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43b0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 61 74 63 68 -. *. * TlsWatch
43c0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e Proc --. *. *.In
43d0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 itialize the not
43e0: 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 54 ifier to watch T
43f0: 63 6c 5f 46 69 6c 65 73 20 66 72 6f 6d 20 74 68 cl_Files from th
4400: 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 is channel.. *.
4410: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
4420: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ne.. *. * Side e
4430: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
4440: 75 70 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 up the notifier
4450: 73 6f 20 74 68 61 74 20 61 20 66 75 74 75 72 65 so that a future
4460: 20 65 76 65 6e 74 20 6f 6e 20 74 68 65 20 63 68 event on the ch
4470: 61 6e 6e 65 6c 0a 20 2a 09 77 69 6c 6c 20 62 65 annel. *.will be
4480: 20 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20 2a seen by Tcl.. *
4490: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
44e0: 69 63 20 76 6f 69 64 0a 54 6c 73 57 61 74 63 68 ic void.TlsWatch
44f0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
4500: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a instanceData,./*
4510: 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 The socket stat
4520: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 e. */.
4530: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f int mask).../
4540: 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 * Events of inte
4550: 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 0a 20 rest; an OR-ed.
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4580: 20 20 20 20 20 20 20 20 2a 20 63 6f 6d 62 69 6e * combin
4590: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 ation of TCL_REA
45a0: 44 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 DABLE,.
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
45d0: 2a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 * TCL_WRITABLE a
45e0: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e nd TCL_EXCEPTION
45f0: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 . */.{. State
4600: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
4610: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
4620: 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 63 68 ata;.. if (ch
4630: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e annelTypeVersion
4640: 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f == TLS_CHANNEL_
4650: 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 54 63 VERSION_2) {..Tc
4660: 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64 6f l_Channel do
4670: 77 6e 43 68 61 6e 3b 0a 0a 09 73 74 61 74 65 50 wnChan;...stateP
4680: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 tr->watchMask =
4690: 6d 61 73 6b 3b 0a 0a 09 2f 2a 20 4e 6f 20 63 68 mask;.../* No ch
46a0: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 61 annel handlers a
46b0: 6e 79 20 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c ny more. We will
46c0: 20 62 65 20 6e 6f 74 69 66 69 65 64 20 61 75 74 be notified aut
46d0: 6f 6d 61 74 69 63 61 6c 6c 79 0a 09 20 2a 20 61 omatically.. * a
46e0: 62 6f 75 74 20 65 76 65 6e 74 73 20 6f 6e 20 74 bout events on t
46f0: 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 he channel below
4700: 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f via a call to o
4710: 75 72 0a 09 20 2a 20 27 54 72 61 6e 73 66 6f 72 ur.. * 'Transfor
4720: 6d 4e 6f 74 69 66 79 50 72 6f 63 27 2e 20 42 75 mNotifyProc'. Bu
4730: 74 20 77 65 20 68 61 76 65 20 74 6f 20 70 61 73 t we have to pas
4740: 73 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 64 s the interest d
4750: 6f 77 6e 20 6e 6f 77 2e 0a 09 20 2a 20 57 65 20 own now... * We
4760: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 are allowed to a
4770: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 27 69 dd additional 'i
4780: 6e 74 65 72 65 73 74 27 20 74 6f 20 74 68 65 20 nterest' to the
4790: 6d 61 73 6b 20 69 66 20 77 65 20 77 61 6e 74 0a mask if we want.
47a0: 09 20 2a 20 74 6f 2e 20 42 75 74 20 74 68 69 73 . * to. But this
47b0: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 transformation
47c0: 68 61 73 20 6e 6f 20 73 75 63 68 20 69 6e 74 65 has no such inte
47d0: 72 65 73 74 2e 20 49 74 20 6a 75 73 74 20 70 61 rest. It just pa
47e0: 73 73 65 73 0a 09 20 2a 20 74 68 65 20 72 65 71 sses.. * the req
47f0: 75 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61 uest down, uncha
4800: 6e 67 65 64 2e 0a 09 20 2a 2f 0a 0a 09 64 6f 77 nged... */...dow
4810: 6e 43 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 nChan = Tls_GetP
4820: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 3b arent(statePtr);
4830: 0a 0a 09 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e ...(Tcl_GetChann
4840: 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 elType(downChan)
4850: 29 0a 09 20 20 20 20 2d 3e 77 61 74 63 68 50 72 ).. ->watchPr
4860: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 oc(Tcl_GetChanne
4870: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f lInstanceData(do
4880: 77 6e 43 68 61 6e 29 2c 20 6d 61 73 6b 29 3b 0a wnChan), mask);.
4890: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6e 61 67 65 6d ../*.. * Managem
48a0: 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72 ent of the inter
48b0: 6e 61 6c 20 74 69 6d 65 72 2e 0a 09 20 2a 2f 0a nal timer... */.
48c0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
48d0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
48e0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 merToken) NULL)
48f0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 {.. Tcl_Delet
4900: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
4910: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
4920: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 . statePtr->t
4930: 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 imer = (Tcl_Time
4940: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 09 7d rToken) NULL;..}
4950: 0a 09 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 ..if ((mask & TC
4960: 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 54 L_READABLE) && T
4970: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 cl_InputBuffered
4980: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
4990: 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a > 0) {.. /*.
49a0: 09 20 20 20 20 20 2a 20 54 68 65 72 65 20 69 73 . * There is
49b0: 20 69 6e 74 65 72 65 73 74 20 69 6e 20 72 65 61 interest in rea
49c0: 64 61 62 6c 65 20 65 76 65 6e 74 73 20 61 6e 64 dable events and
49d0: 20 77 65 20 61 63 74 75 61 6c 6c 79 20 68 61 76 we actually hav
49e0: 65 0a 09 20 20 20 20 20 2a 20 64 61 74 61 20 77 e.. * data w
49f0: 61 69 74 69 6e 67 2c 20 73 6f 20 67 65 6e 65 72 aiting, so gener
4a00: 61 74 65 20 61 20 74 69 6d 65 72 20 74 6f 20 66 ate a timer to f
4a10: 6c 75 73 68 20 74 68 61 74 2e 0a 09 20 20 20 20 lush that...
4a20: 20 2a 2f 0a 09 20 20 20 20 73 74 61 74 65 50 74 */.. statePt
4a30: 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 r->timer = Tcl_C
4a40: 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 reateTimerHandle
4a50: 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c r(TLS_TCL_DELAY,
4a60: 0a 09 09 20 20 20 20 54 6c 73 43 68 61 6e 6e 65 ... TlsChanne
4a70: 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28 lHandlerTimer, (
4a80: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
4a90: 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 ePtr);..}. }
4aa0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 6d 61 73 6b else {..if (mask
4ab0: 20 3d 3d 20 73 74 61 74 65 50 74 72 2d 3e 77 61 == statePtr->wa
4ac0: 74 63 68 4d 61 73 6b 29 0a 09 20 20 20 20 72 65 tchMask).. re
4ad0: 74 75 72 6e 3b 0a 0a 09 69 66 20 28 73 74 61 74 turn;...if (stat
4ae0: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29 ePtr->watchMask)
4af0: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
4b00: 20 2a 20 52 65 6d 6f 76 65 20 65 76 65 6e 74 20 * Remove event
4b10: 68 61 6e 64 6c 65 72 20 74 6f 20 75 6e 64 65 72 handler to under
4b20: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2c 20 74 lying channel, t
4b30: 68 69 73 20 63 6f 75 6c 64 0a 09 20 20 20 20 20 his could..
4b40: 2a 20 62 65 20 62 65 63 61 75 73 65 20 77 65 20 * be because we
4b50: 61 72 65 20 63 6c 6f 73 69 6e 67 20 66 6f 72 20 are closing for
4b60: 72 65 61 6c 2c 20 6f 72 20 62 65 69 6e 67 20 22 real, or being "
4b70: 75 6e 73 74 61 63 6b 65 64 22 2e 0a 09 20 20 20 unstacked"...
4b80: 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 44 */... Tcl_D
4b90: 65 6c 65 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64 eleteChannelHand
4ba0: 6c 65 72 28 54 6c 73 5f 47 65 74 50 61 72 65 6e ler(Tls_GetParen
4bb0: 74 28 73 74 61 74 65 50 74 72 29 2c 0a 09 09 20 t(statePtr),...
4bc0: 20 20 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e TlsChannelHan
4bd0: 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 dler, (ClientDat
4be0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 7d a) statePtr);..}
4bf0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 ..statePtr->watc
4c00: 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 09 69 hMask = mask;..i
4c10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 77 61 74 f (statePtr->wat
4c20: 63 68 4d 61 73 6b 29 20 7b 0a 09 20 20 20 20 2f chMask) {.. /
4c30: 2a 0a 09 20 20 20 20 20 2a 20 53 65 74 75 70 20 *.. * Setup
4c40: 61 63 74 69 76 65 20 6d 6f 6e 69 74 6f 72 20 66 active monitor f
4c50: 6f 72 20 65 76 65 6e 74 73 20 6f 6e 20 75 6e 64 or events on und
4c60: 65 72 6c 79 69 6e 67 20 43 68 61 6e 6e 65 6c 2e erlying Channel.
4c70: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
4c80: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 Tcl_CreateChanne
4c90: 6c 48 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 74 lHandler(Tls_Get
4ca0: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 Parent(statePtr)
4cb0: 2c 0a 09 09 20 20 20 20 73 74 61 74 65 50 74 72 ,... statePtr
4cc0: 2d 3e 77 61 74 63 68 4d 61 73 6b 2c 20 54 6c 73 ->watchMask, Tls
4cd0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 2c 0a ChannelHandler,.
4ce0: 09 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74 .. (ClientDat
4cf0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 7d a) statePtr);..}
4d00: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a . }.}.../*. *
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 ---. *. * TlsGet
4d60: 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a HandleProc --. *
4d70: 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20 . *.Called from
4d80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 46 69 Tcl_GetChannelFi
4d90: 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 6f le to retrieve o
4da0: 2f 73 20 66 69 6c 65 20 68 61 6e 64 6c 65 72 0a /s file handler.
4db0: 20 2a 09 66 72 6f 6d 20 74 68 65 20 53 53 4c 20 *.from the SSL
4dc0: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
4dd0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nnel.. *. * Resu
4de0: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 70 70 72 lts:. *.The appr
4df0: 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 opriate Tcl_File
4e00: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 or NULL if not
4e10: 70 72 65 73 65 6e 74 2e 20 0a 20 2a 0a 20 2a 20 present. . *. *
4e20: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4e30: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4e80: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 */.static int.T
4e90: 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 lsGetHandleProc(
4ea0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 ClientData insta
4eb0: 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 nceData,./* The
4ec0: 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f socket state. */
4ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4ee0: 20 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c int direction,
4ef0: 09 09 2f 2a 20 57 68 69 63 68 20 54 63 6c 5f 46 ../* Which Tcl_F
4f00: 69 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 3f ile to retrieve?
4f10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 */.
4f20: 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 ClientData
4f30: 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20 57 *handlePtr)./* W
4f40: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 here to store th
4f50: 65 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 7b 0a e handle. */.{.
4f60: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
4f70: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
4f80: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 instanceData;..
4f90: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 return Tcl_Ge
4fa0: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 tChannelHandle(T
4fb0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 ls_GetParent(sta
4fc0: 74 65 50 74 72 29 2c 20 64 69 72 65 63 74 69 6f tePtr), directio
4fd0: 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d n, handlePtr);.}
4fe0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5030: 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 * TlsNotifyProc
5040: 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 --. *. *.Handler
5050: 20 63 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 called by Tcl t
5060: 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 o inform us of a
5070: 63 74 69 76 69 74 79 0a 20 2a 09 6f 6e 20 74 68 ctivity. *.on th
5080: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 e underlying cha
5090: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nnel.. *. * Resu
50a0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a lts:. *.None.. *
50b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
50c0: 3a 0a 20 2a 09 4d 61 79 20 70 72 6f 63 65 73 73 :. *.May process
50d0: 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 65 76 the incoming ev
50e0: 65 6e 74 20 62 79 20 69 74 73 65 6c 66 2e 0a 20 ent by itself..
50f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
5140: 74 69 63 20 69 6e 74 0a 54 6c 73 4e 6f 74 69 66 tic int.TlsNotif
5150: 79 50 72 6f 63 28 69 6e 73 74 61 6e 63 65 44 61 yProc(instanceDa
5160: 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20 20 43 6c ta, mask). Cl
5170: 69 65 6e 74 44 61 74 61 09 20 20 20 69 6e 73 74 ientData. inst
5180: 61 6e 63 65 44 61 74 61 3b 20 2f 2a 20 54 68 65 anceData; /* The
5190: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6e 6f state of the no
51a0: 74 69 66 69 65 64 20 74 72 61 6e 73 66 6f 72 6d tified transform
51b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 ation */. int
51c0: 09 09 20 20 20 6d 61 73 6b 3b 20 20 20 20 20 20 .. mask;
51d0: 20 2f 2a 20 54 68 65 20 6d 61 73 6b 20 6f 66 20 /* The mask of
51e0: 6f 63 63 75 72 69 6e 67 20 65 76 65 6e 74 73 20 occuring events
51f0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
5200: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
5210: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
5220: 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 a;.. /*.
5230: 2a 20 41 6e 20 65 76 65 6e 74 20 6f 63 63 75 72 * An event occur
5240: 65 64 20 69 6e 20 74 68 65 20 75 6e 64 65 72 6c ed in the underl
5250: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 20 54 ying channel. T
5260: 68 69 73 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 his. * trans
5270: 66 6f 72 6d 61 74 69 6f 6e 20 64 6f 65 73 6e 27 formation doesn'
5280: 74 20 70 72 6f 63 65 73 73 20 73 75 63 68 20 65 t process such e
5290: 76 65 6e 74 73 20 74 68 75 73 20 72 65 74 75 72 vents thus retur
52a0: 6e 73 20 74 68 65 0a 20 20 20 20 20 2a 20 69 6e ns the. * in
52b0: 63 6f 6d 69 6e 67 20 6d 61 73 6b 20 75 6e 63 68 coming mask unch
52c0: 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a anged.. */..
52d0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
52e0: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f ->timer != (Tcl_
52f0: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
5300: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 65 6c 65 ) {../*.. * Dele
5310: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 te an existing t
5320: 69 6d 65 72 2e 20 49 74 20 77 61 73 20 6e 6f 74 imer. It was not
5330: 20 66 69 72 65 64 2c 20 79 65 74 20 77 65 20 61 fired, yet we a
5340: 72 65 0a 09 20 2a 20 68 65 72 65 2c 20 73 6f 20 re.. * here, so
5350: 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f the channel belo
5360: 77 20 67 65 6e 65 72 61 74 65 64 20 73 75 63 68 w generated such
5370: 20 61 6e 20 65 76 65 6e 74 20 61 6e 64 20 77 65 an event and we
5380: 0a 09 20 2a 20 64 6f 6e 27 74 20 68 61 76 65 20 .. * don't have
5390: 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 61 6c 20 to. The renewal
53a0: 6f 66 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 of the interest
53b0: 61 66 74 65 72 20 74 68 65 0a 09 20 2a 20 65 78 after the.. * ex
53c0: 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 61 6e 6e ecution of chann
53d0: 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 69 6c 6c el handlers will
53e0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 75 73 eventually caus
53f0: 65 20 75 73 20 74 6f 0a 09 20 2a 20 72 65 63 72 e us to.. * recr
5400: 65 61 74 65 20 74 68 65 20 74 69 6d 65 72 20 28 eate the timer (
5410: 69 6e 20 57 61 74 63 68 50 72 6f 63 29 2e 0a 09 in WatchProc)...
5420: 20 2a 2f 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 */...Tcl_Delete
5430: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
5440: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
5450: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
5460: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
5470: 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a n) NULL;. }..
5480: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b return mask;
5490: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54d0: 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 54 6c 73 *. *. * Tls
54e0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d ChannelHandler -
54f0: 2d 0a 20 2a 0a 20 2a 20 20 20 20 20 20 2d 2d 2d -. *. * ---
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
5530: 2a 20 20 20 20 20 20 48 61 6e 64 6c 65 72 20 63 * Handler c
5540: 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 61 73 20 alled by Tcl as
5550: 61 20 72 65 73 75 6c 74 20 6f 66 0a 20 2a 20 20 a result of. *
5560: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 68 Tcl_CreateCh
5570: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 20 74 annelHandler - t
5580: 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 o inform us of a
5590: 63 74 69 76 69 74 79 0a 20 2a 20 20 20 20 20 20 ctivity. *
55a0: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e on the underlyin
55b0: 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20 20 g channel.. *
55c0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55f0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 ---*. *. *
5600: 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 20 Sideeffects:. *
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 79 May
5620: 20 67 65 6e 65 72 61 74 65 20 73 75 62 73 65 71 generate subseq
5630: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 20 2a uent calls to. *
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 Tc
5650: 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 2e l_NotifyChannel.
5660: 0a 20 2a 0a 20 2a 20 20 20 20 20 20 52 65 73 75 . *. * Resu
5670: 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20 20 20 20 lt:. *
5680: 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d None.. *. *-
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56c0: 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74 -----*. */..stat
56d0: 69 63 20 76 6f 69 64 0a 54 6c 73 43 68 61 6e 6e ic void.TlsChann
56e0: 65 6c 48 61 6e 64 6c 65 72 20 28 63 6c 69 65 6e elHandler (clien
56f0: 74 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20 tData, mask).
5700: 20 43 6c 69 65 6e 74 44 61 74 61 20 20 20 20 20 ClientData
5710: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 clientData;.
5720: 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 6d int m
5730: 61 73 6b 3b 0a 7b 0a 20 20 20 20 53 74 61 74 65 ask;.{. State
5740: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
5750: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
5760: 61 3b 0a 0a 64 70 72 69 6e 74 66 28 73 74 64 65 a;..dprintf(stde
5770: 72 72 2c 20 22 48 41 4e 44 4c 45 52 28 30 78 25 rr, "HANDLER(0x%
5780: 78 29 5c 6e 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 x)\n", mask);.
5790: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 Tcl_Preserve(
57a0: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74 (ClientData)stat
57b0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
57c0: 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 mask & TCL_READA
57d0: 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 65 74 5f BLE) {..BIO_set_
57e0: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e flags(statePtr->
57f0: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 p_bio, BIO_FLAGS
5800: 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 20 65 6c _READ);. } el
5810: 73 65 20 7b 0a 09 42 49 4f 5f 63 6c 65 61 72 5f se {..BIO_clear_
5820: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e flags(statePtr->
5830: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 p_bio, BIO_FLAGS
5840: 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 _READ);. }..
5850: 20 20 20 69 66 20 28 6d 61 73 6b 20 26 20 54 43 if (mask & TC
5860: 4c 5f 57 52 49 54 41 42 4c 45 29 20 7b 0a 09 42 L_WRITABLE) {..B
5870: 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 73 74 61 IO_set_flags(sta
5880: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 tePtr->p_bio, BI
5890: 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a O_FLAGS_WRITE);.
58a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 } else {..BI
58b0: 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 73 28 73 74 O_clear_flags(st
58c0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 atePtr->p_bio, B
58d0: 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b IO_FLAGS_WRITE);
58e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 73 6b . }.. mask
58f0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 42 49 = 0;. if (BI
5900: 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 O_wpending(state
5910: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 Ptr->bio)) {..ma
5920: 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 sk |= TCL_WRITAB
5930: 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LE;. }. if
5940: 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 (BIO_pending(st
5950: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
5960: 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 .mask |= TCL_REA
5970: 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 DABLE;. }..
5980: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 /*. * The
5990: 66 6f 6c 6c 6f 77 69 6e 67 20 4e 6f 74 69 66 79 following Notify
59a0: 43 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 73 65 Channel calls se
59b0: 65 6d 73 20 74 6f 20 62 65 20 69 6d 70 6f 72 74 ems to be import
59c0: 61 6e 74 2c 20 62 75 74 0a 20 20 20 20 20 2a 20 ant, but. *
59d0: 77 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 77 68 we don't know wh
59e0: 79 2e 20 20 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b y. It looks lik
59f0: 65 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 e if the mask is
5a00: 20 65 76 65 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 20 ever non-zero.
5a10: 20 20 20 20 2a 20 74 68 61 74 20 69 74 20 77 69 * that it wi
5a20: 6c 6c 20 65 6e 74 65 72 20 61 6e 20 69 6e 66 69 ll enter an infi
5a30: 6e 69 74 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 nite loop..
5a40: 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 69 66 79 20 *. * Notify
5a50: 74 68 65 20 75 70 70 65 72 20 63 68 61 6e 6e 65 the upper channe
5a60: 6c 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 l of the current
5a70: 20 42 49 4f 20 73 74 61 74 65 20 73 6f 20 74 68 BIO state so th
5a80: 65 20 65 76 65 6e 74 0a 20 20 20 20 20 2a 20 63 e event. * c
5a90: 6f 6e 74 69 6e 75 65 73 20 74 6f 20 70 72 6f 70 ontinues to prop
5aa0: 61 67 61 74 65 20 75 70 20 74 68 65 20 63 68 61 agate up the cha
5ab0: 69 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 in.. *.
5ac0: 2a 20 73 74 61 6e 74 6f 6e 3a 20 49 74 20 6c 6f * stanton: It lo
5ad0: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 20 63 6f oks like this co
5ae0: 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 61 6e uld result in an
5af0: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 69 infinite loop i
5b00: 66 0a 20 20 20 20 20 2a 20 74 68 65 20 75 70 70 f. * the upp
5b10: 65 72 20 63 68 61 6e 6e 65 6c 20 64 6f 65 73 6e er channel doesn
5b20: 27 74 20 63 61 75 73 65 20 43 68 61 6e 6e 65 6c 't cause Channel
5b30: 48 61 6e 64 6c 65 72 20 74 6f 20 62 65 20 72 65 Handler to be re
5b40: 6d 6f 76 65 64 0a 20 20 20 20 20 2a 20 62 65 66 moved. * bef
5b50: 6f 72 65 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 ore Tcl_NotifyCh
5b60: 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 63 68 61 6e annel calls chan
5b70: 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 6f 6e 20 nel handlers on
5b80: 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 the lower channe
5b90: 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 0a l.. */. .
5ba0: 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 Tcl_NotifyCh
5bb0: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
5bc0: 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 self, mask);.
5bd0: 20 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 . if (stateP
5be0: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
5bf0: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c l_TimerToken)NUL
5c00: 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 L) {..Tcl_Delete
5c10: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
5c20: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
5c30: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
5c40: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
5c50: 6e 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 n)NULL;. }.
5c60: 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 if ((mask & TC
5c70: 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 54 L_READABLE) && T
5c80: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 cl_InputBuffered
5c90: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
5ca0: 20 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 > 0) {../*.. *
5cb0: 44 61 74 61 20 69 73 20 77 61 69 74 69 6e 67 2c Data is waiting,
5cc0: 20 66 6c 75 73 68 20 69 74 20 6f 75 74 20 69 6e flush it out in
5cd0: 20 73 68 6f 72 74 20 74 69 6d 65 0a 09 20 2a 2f short time.. */
5ce0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
5cf0: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 r = Tcl_CreateTi
5d00: 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 merHandler(TLS_T
5d10: 43 4c 5f 44 45 4c 41 59 2c 0a 09 09 54 6c 73 43 CL_DELAY,...TlsC
5d20: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d hannelHandlerTim
5d30: 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 er, (ClientData)
5d40: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
5d50: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 }. Tcl_Releas
5d60: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 73 e( (ClientData)s
5d70: 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a tatePtr);.}.../*
5d80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
5dc0: 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c .TlsChannelHandl
5dd0: 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a erTimer --. *. *
5de0: 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
5df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e10: 2d 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 -*. *.Called by
5e20: 74 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d 3e the notifier (->
5e30: 20 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 68 timer) to flush
5e40: 20 6f 75 74 0a 20 2a 09 69 6e 66 6f 72 6d 61 74 out. *.informat
5e50: 69 6f 6e 20 77 61 69 74 69 6e 67 20 69 6e 20 63 ion waiting in c
5e60: 68 61 6e 6e 65 6c 20 62 75 66 66 65 72 73 2e 0a hannel buffers..
5e70: 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ea0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 65 ---*. *. *.Sidee
5eb0: 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
5ec0: 66 20 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e f 'TlsChannelHan
5ed0: 64 6c 65 72 27 2e 0a 20 2a 0a 20 2a 09 52 65 73 dler'.. *. *.Res
5ee0: 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 ult:. *..None..
5ef0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
5f30: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 .static void.Tls
5f40: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 ChannelHandlerTi
5f50: 6d 65 72 20 28 63 6c 69 65 6e 74 44 61 74 61 29 mer (clientData)
5f60: 0a 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 .ClientData clie
5f70: 6e 74 44 61 74 61 3b 20 2f 2a 20 54 72 61 6e 73 ntData; /* Trans
5f80: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 71 75 65 formation to que
5f90: 72 79 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 ry */.{. Stat
5fa0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
5fb0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
5fc0: 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b ta;. int mask
5fd0: 20 3d 20 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 = 0;.. state
5fe0: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 Ptr->timer = (Tc
5ff0: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
6000: 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 42 49 4f LL;.. if (BIO
6010: 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 _wpending(stateP
6020: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 tr->bio)) {..mas
6030: 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c k |= TCL_WRITABL
6040: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 E;. }. if
6050: 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 (BIO_pending(sta
6060: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 tePtr->bio)) {..
6070: 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 mask |= TCL_READ
6080: 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ABLE;. }.
6090: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
60a0: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 l(statePtr->self
60b0: 2c 20 6d 61 73 6b 29 3b 0a 7d 0a 0c 0a 2f 2a 0a , mask);.}.../*.
60c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
6100: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
6110: 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09 53 69 64 65 ct --. *. *.Side
6120: 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 49 73 73 effects:. *..Iss
6130: 75 65 73 20 53 53 4c 5f 61 63 63 65 70 74 20 6f ues SSL_accept o
6140: 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 0a 20 2a r SSL_connect. *
6150: 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 . *.Result:. *..
6160: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61a0: 2d 2a 0a 20 2a 2f 0a 69 6e 74 0a 54 6c 73 5f 57 -*. */.int.Tls_W
61b0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 20 73 aitForConnect( s
61c0: 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f tatePtr, errorCo
61d0: 64 65 50 74 72 29 0a 20 20 20 20 53 74 61 74 65 dePtr). State
61e0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 *statePtr;.
61f0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 int *errorCodePt
6200: 72 3b 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 r;../* Where to
6210: 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f 64 65 store error code
6220: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 65 . */.{. int e
6230: 72 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 rr;.. dprintf
6240: 28 73 74 64 65 72 72 2c 22 5c 6e 57 61 69 74 46 (stderr,"\nWaitF
6250: 6f 72 43 6f 6e 6e 65 63 74 28 30 78 25 78 29 22 orConnect(0x%x)"
6260: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 , (unsigned int)
6270: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
6280: 20 66 6f 72 20 28 3b 3b 29 20 7b 0a 09 2f 2a 20 for (;;) {../*
6290: 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 Not initialized
62a0: 79 65 74 21 20 2a 2f 0a 09 69 66 20 28 73 74 61 yet! */..if (sta
62b0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
62c0: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b LS_TCL_SERVER) {
62d0: 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f .. err = SSL_
62e0: 61 63 63 65 70 74 28 73 74 61 74 65 50 74 72 2d accept(statePtr-
62f0: 3e 73 73 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b >ssl);..} else {
6300: 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f .. err = SSL_
6310: 63 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 connect(statePtr
6320: 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 09 2f 2a 53 53 ->ssl);..}../*SS
6330: 4c 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 L_write(statePtr
6340: 2d 3e 73 73 6c 2c 20 28 63 68 61 72 2a 29 26 65 ->ssl, (char*)&e
6350: 72 72 2c 20 30 29 3b 09 48 41 43 4b 21 21 21 20 rr, 0);.HACK!!!
6360: 2a 2f 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29 */..if (err > 0)
6370: 20 7b 0a 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 {.. BIO_flus
6380: 68 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 h(statePtr->bio)
6390: 3b 0a 09 7d 0a 0a 09 69 66 20 28 65 72 72 20 3c ;..}...if (err <
63a0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 6e 74 20 = 0) {.. int
63b0: 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 rc = SSL_get_err
63c0: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c or(statePtr->ssl
63d0: 2c 20 65 72 72 29 3b 0a 0a 09 20 20 20 20 69 66 , err);... if
63e0: 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f (rc == SSL_ERRO
63f0: 52 5f 53 53 4c 29 20 7b 0a 09 09 54 6c 73 5f 45 R_SSL) {...Tls_E
6400: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 0a 09 rror(statePtr,..
6410: 09 09 28 63 68 61 72 20 2a 29 45 52 52 5f 72 65 ..(char *)ERR_re
6420: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
6430: 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 g(ERR_get_error(
6440: 29 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 )));...*errorCod
6450: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 ePtr = ECONNABOR
6460: 54 45 44 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 TED;...return -1
6470: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ;.. } else if
6480: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 (BIO_should_ret
6490: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ry(statePtr->bio
64a0: 29 29 20 7b 0a 09 09 69 66 20 28 73 74 61 74 65 )) {...if (state
64b0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
64c0: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09 _TCL_ASYNC) {...
64d0: 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 dprintf(stde
64e0: 72 72 2c 22 45 21 20 22 29 3b 0a 09 09 20 20 20 rr,"E! ");...
64f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
6500: 20 45 41 47 41 49 4e 3b 0a 09 09 20 20 20 20 72 EAGAIN;... r
6510: 65 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 20 65 6c eturn -1;...} el
6520: 73 65 20 7b 0a 09 09 20 20 20 20 63 6f 6e 74 69 se {... conti
6530: 6e 75 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 nue;...}.. }
6540: 65 6c 73 65 20 69 66 20 28 65 72 72 20 3d 3d 20 else if (err ==
6550: 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 73 0) {...dprintf(s
6560: 74 64 65 72 72 2c 22 43 52 21 20 22 29 3b 0a 09 tderr,"CR! ");..
6570: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
6580: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 72 ECONNRESET;...r
6590: 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d eturn -1;.. }
65a0: 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
65b0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
65c0: 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 09 TCL_SERVER) {...
65d0: 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 err = SSL_get_ve
65e0: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
65f0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 09 69 66 ePtr->ssl);...if
6600: 20 28 65 72 72 20 21 3d 20 58 35 30 39 5f 56 5f (err != X509_V_
6610: 4f 4b 29 20 7b 0a 09 09 20 20 20 20 54 6c 73 5f OK) {... Tls_
6620: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 0a Error(statePtr,.
6630: 09 09 09 20 20 20 20 28 63 68 61 72 20 2a 29 58 ... (char *)X
6640: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
6650: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 error_string(err
6660: 29 29 3b 0a 09 09 20 20 20 20 2a 65 72 72 6f 72 ));... *error
6670: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 CodePtr = ECONNA
6680: 42 4f 52 54 45 44 3b 0a 09 09 20 20 20 20 72 65 BORTED;... re
6690: 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 0a 09 20 20 turn -1;...}..
66a0: 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 }.. *errorC
66b0: 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 odePtr = Tcl_Get
66c0: 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20 64 70 Errno();.. dp
66d0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 52 rintf(stderr,"ER
66e0: 52 28 25 64 2c 20 25 64 29 20 22 2c 20 72 63 2c R(%d, %d) ", rc,
66f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b *errorCodePtr);
6700: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b .. return -1;
6710: 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 73 74 64 ..}..dprintf(std
6720: 65 72 72 2c 22 52 30 21 20 22 29 3b 0a 09 72 65 err,"R0! ");..re
6730: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 7d 0a turn 1;. }.}.
6740: 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 0a 54 6c 73 .Tcl_Channel.Tls
6750: 5f 47 65 74 50 61 72 65 6e 74 28 20 73 74 61 74 _GetParent( stat
6760: 65 50 74 72 20 29 0a 20 20 20 20 53 74 61 74 65 ePtr ). State
6770: 20 2a 73 74 61 74 65 50 74 72 3b 0a 7b 0a 20 20 *statePtr;.{.
6780: 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 if (channelTyp
6790: 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f eVersion == TLS_
67a0: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f CHANNEL_VERSION_
67b0: 32 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 63 6c 2) {..return Tcl
67c0: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e _GetStackedChann
67d0: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c el(statePtr->sel
67e0: 66 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b f);. } else {
67f0: 0a 09 2f 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 ../* The reason
6800: 66 6f 72 20 74 68 65 20 65 78 69 73 74 65 6e 63 for the existenc
6810: 65 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 e of this proced
6820: 75 72 65 20 69 73 0a 09 20 2a 20 74 68 65 20 66 ure is.. * the f
6830: 61 63 74 20 74 68 61 74 20 73 74 61 63 6b 69 6e act that stackin
6840: 67 20 61 20 74 72 61 6e 73 66 6f 72 6d 20 6f 76 g a transform ov
6850: 65 72 20 61 6e 6f 74 68 65 72 0a 09 20 2a 20 74 er another.. * t
6860: 72 61 6e 73 66 6f 72 6d 20 77 69 6c 6c 20 6c 65 ransform will le
6870: 61 76 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c ave our internal
6880: 20 70 6f 69 6e 74 65 72 20 75 6e 63 68 61 6e 67 pointer unchang
6890: 65 64 2c 0a 09 20 2a 20 61 6e 64 20 74 68 75 73 ed,.. * and thus
68a0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 pointing to the
68b0: 20 6e 65 77 20 74 72 61 6e 73 66 6f 72 6d 2c 20 new transform,
68c0: 61 6e 64 20 6e 6f 74 20 74 68 65 0a 09 20 2a 20 and not the.. *
68d0: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 Channel structur
68e0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 e containing the
68f0: 20 73 61 76 65 64 20 73 74 61 74 65 20 6f 66 20 saved state of
6900: 74 68 69 73 0a 09 20 2a 20 74 72 61 6e 73 66 6f this.. * transfo
6910: 72 6d 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 rm. This is the
6920: 70 72 69 63 65 20 74 6f 20 70 61 79 20 66 6f 72 price to pay for
6930: 20 6c 65 61 76 69 6e 67 0a 09 20 2a 20 54 63 6c leaving.. * Tcl
6940: 5f 43 68 61 6e 6e 65 6c 20 72 65 66 65 72 65 6e _Channel referen
6950: 63 65 73 20 69 6e 74 61 63 74 2e 20 54 68 65 20 ces intact. The
6960: 6f 6e 6c 79 20 6f 74 68 65 72 20 73 6f 6c 75 74 only other solut
6970: 69 6f 6e 0a 09 20 2a 20 69 73 20 61 6e 20 65 78 ion.. * is an ex
6980: 74 65 6e 73 69 6f 6e 20 6f 66 20 54 63 6c 5f 43 tension of Tcl_C
6990: 68 61 6e 6e 65 6c 54 79 70 65 20 77 69 74 68 20 hannelType with
69a0: 61 6e 6f 74 68 65 72 20 64 72 69 76 65 72 0a 09 another driver..
69b0: 20 2a 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 * procedure to
69c0: 6e 6f 74 69 66 79 20 61 20 43 68 61 6e 6e 65 6c notify a Channel
69d0: 20 61 62 6f 75 74 20 74 68 65 20 28 75 6e 29 73 about the (un)s
69e0: 74 61 63 6b 69 6e 67 2e 0a 09 20 2a 0a 09 20 2a tacking... *.. *
69f0: 20 49 74 20 77 61 6c 6b 73 20 74 68 65 20 63 68 It walks the ch
6a00: 61 69 6e 20 6f 66 20 43 68 61 6e 6e 65 6c 20 73 ain of Channel s
6a10: 74 72 75 63 74 75 72 65 73 20 75 6e 74 69 6c 20 tructures until
6a20: 69 74 0a 09 20 2a 20 66 69 6e 64 73 20 74 68 65 it.. * finds the
6a30: 20 6f 6e 65 20 70 6f 69 6e 74 69 6e 67 20 68 61 one pointing ha
6a40: 76 69 6e 67 20 27 63 74 72 6c 27 20 61 73 20 69 ving 'ctrl' as i
6a50: 6e 73 74 61 6e 63 65 44 61 74 61 0a 09 20 2a 20 nstanceData.. *
6a60: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 73 and then returns
6a70: 20 74 68 65 20 73 75 70 65 72 63 65 64 69 6e 67 the superceding
6a80: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 74 68 61 74 channel to that
6a90: 2e 20 28 41 4b 29 0a 09 20 2a 2f 0a 0a 09 54 63 . (AK).. */...Tc
6aa0: 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 20 3d l_Channel self =
6ab0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b statePtr->self;
6ac0: 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 6e 65 ..Tcl_Channel ne
6ad0: 78 74 3b 0a 0a 09 77 68 69 6c 65 20 28 28 43 6c xt;...while ((Cl
6ae0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
6af0: 74 72 20 21 3d 20 54 63 6c 5f 47 65 74 43 68 61 tr != Tcl_GetCha
6b00: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
6b10: 20 28 73 65 6c 66 29 29 20 7b 0a 09 20 20 20 20 (self)) {..
6b20: 6e 65 78 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 next = Tcl_GetSt
6b30: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 20 28 73 65 ackedChannel (se
6b40: 6c 66 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 65 lf);.. if (ne
6b50: 78 74 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e xt == (Tcl_Chann
6b60: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a el) NULL) {.../*
6b70: 20 30 39 2f 32 34 2f 31 39 39 39 20 55 6e 73 74 09/24/1999 Unst
6b80: 61 63 6b 69 6e 67 20 62 75 67 2c 0a 09 09 20 2a acking bug,... *
6b90: 20 66 6f 75 6e 64 20 62 79 20 4d 61 74 74 20 4e found by Matt N
6ba0: 65 77 6d 61 6e 20 3c 6d 61 74 74 40 73 65 6e 73 ewman <matt@sens
6bb0: 75 73 2e 6f 72 67 3e 2e 0a 09 09 20 2a 0a 09 09 us.org>.... *...
6bc0: 20 2a 20 57 65 20 77 65 72 65 20 75 6e 61 62 6c * We were unabl
6bd0: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 63 68 e to find the ch
6be0: 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 annel structure
6bf0: 66 6f 72 20 74 68 69 73 0a 09 09 20 2a 20 74 72 for this... * tr
6c00: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 ansformation in
6c10: 74 68 65 20 63 68 61 69 6e 20 6f 66 20 73 74 61 the chain of sta
6c20: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2e 20 54 68 cked channel. Th
6c30: 69 73 0a 09 09 20 2a 20 6d 65 61 6e 73 20 74 68 is... * means th
6c40: 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e at we are curren
6c50: 74 6c 79 20 69 6e 20 74 68 65 20 70 72 6f 63 65 tly in the proce
6c60: 73 73 20 6f 66 20 75 6e 73 74 61 63 6b 69 6e 67 ss of unstacking
6c70: 0a 09 09 20 2a 20 69 74 20 2a 61 6e 64 2a 20 74 ... * it *and* t
6c80: 68 65 72 65 20 77 65 72 65 20 73 6f 6d 65 20 62 here were some b
6c90: 79 74 65 73 20 77 61 69 74 69 6e 67 20 77 68 69 ytes waiting whi
6ca0: 63 68 20 61 72 65 20 6e 6f 77 0a 09 09 20 2a 20 ch are now... *
6cb0: 66 6c 75 73 68 65 64 2e 20 49 6e 20 74 68 69 73 flushed. In this
6cc0: 20 73 69 74 75 61 74 69 6f 6e 20 74 68 65 20 70 situation the p
6cd0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 ointer to the ch
6ce0: 61 6e 6e 65 6c 0a 09 09 20 2a 20 69 74 73 65 6c annel... * itsel
6cf0: 66 20 61 6c 72 65 61 64 79 20 72 65 66 65 72 73 f already refers
6d00: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 63 to the parent c
6d10: 68 61 6e 6e 65 6c 20 77 65 20 68 61 76 65 20 74 hannel we have t
6d20: 6f 0a 09 09 20 2a 20 77 72 69 74 65 20 74 68 65 o... * write the
6d30: 20 62 79 74 65 73 20 69 6e 74 6f 2c 20 73 6f 20 bytes into, so
6d40: 77 65 20 72 65 74 75 72 6e 20 74 68 61 74 2e 0a we return that..
6d50: 09 09 20 2a 2f 0a 09 09 72 65 74 75 72 6e 20 73 .. */...return s
6d60: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a 09 tatePtr->self;..
6d70: 20 20 20 20 7d 0a 09 20 20 20 20 73 65 6c 66 20 }.. self
6d80: 3d 20 6e 65 78 74 3b 0a 09 7d 0a 0a 09 72 65 74 = next;..}...ret
6d90: 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 6b urn Tcl_GetStack
6da0: 65 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29 edChannel (self)
6db0: 3b 0a 20 20 20 20 7d 0a 7d 0a ;. }.}.