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 36 20 /tlsIO.c,v 1.16
00b0: 32 30 30 37 2f 30 36 2f 32 32 20 32 31 3a 32 30 2007/06/22 21:20
00c0: 3a 33 38 20 68 6f 62 62 73 32 20 45 78 70 20 24 :38 hobbs2 Exp $
00d0: 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 6b 61 20 . *. * TLS (aka
00e0: 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 2d 20 63 SSL) Channel - c
00f0: 61 6e 20 62 65 20 6c 61 79 65 72 65 64 20 6f 6e an be layered on
0100: 20 61 6e 79 20 62 69 2d 64 69 72 65 63 74 69 6f any bi-directio
0110: 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 61 6e 6e nal. * Tcl_Chann
0120: 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 75 69 72 el (Note: Requir
0130: 65 73 20 54 72 66 20 43 6f 72 65 20 50 61 74 63 es Trf Core Patc
0140: 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 77 61 h). *. * This wa
0150: 73 20 62 75 69 6c 74 20 66 72 6f 6d 20 73 63 72 s built from scr
0160: 61 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e 20 atch based upon
0170: 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 20 4f observation of O
0180: 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a penSSL 0.9.2B. *
0190: 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 . * Addition cre
01a0: 64 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 dit is due for A
01b0: 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 ndreas Kupries (
01c0: 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e a.kupries@westen
01d0: 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 d.com), for. * p
01e0: 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c roviding the Tcl
01f0: 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 _ReplaceChannel
0200: 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f mechanism and wo
0210: 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 rking closely wi
0220: 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 th me. * to enha
0230: 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 nce it to suppor
0240: 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 t full fileevent
0250: 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 semantics.. *.
0260: 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 * Also work done
0270: 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 by the follow p
0280: 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 eople provided t
0290: 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f he impetus to do
02a0: 20 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 this "right":.
02b0: 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 *.tclSSL (Colin
02c0: 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 McCormack, Share
02d0: 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a d Technology). *
02e0: 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 .SSLtcl (Peter A
02f0: 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 ntman). *. */..#
0300: 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e include "tlsInt.
0310: 68 22 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 h"../*. * Forwar
0320: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 d declarations.
0330: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 */..static int.T
0340: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 lsBlockModeProc
0350: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c 69 _ANSI_ARGS_((Cli
0360: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
0370: 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 6f 64 Data,....int mod
0380: 65 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 e));.static int.
0390: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 5f 41 4e TlsCloseProc _AN
03a0: 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e SI_ARGS_ ((Clien
03b0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
03c0: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 ta,....Tcl_Inter
03d0: 70 20 2a 69 6e 74 65 72 70 29 29 3b 0a 73 74 61 p *interp));.sta
03e0: 74 69 63 20 69 6e 74 09 54 6c 73 49 6e 70 75 74 tic int.TlsInput
03f0: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f Proc _ANSI_ARGS_
0400: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ((ClientData ins
0410: 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 63 68 tanceData,....ch
0420: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 ar *buf, int buf
0430: 53 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 Size, int *error
0440: 43 6f 64 65 50 74 72 29 29 3b 0a 73 74 61 74 69 CodePtr));.stati
0450: 63 20 69 6e 74 09 54 6c 73 4f 75 74 70 75 74 50 c int.TlsOutputP
0460: 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 roc _ANSI_ARGS_(
0470: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
0480: 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 43 4f 4e anceData,....CON
0490: 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e ST char *buf, in
04a0: 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a t toWrite, int *
04b0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a errorCodePtr));.
04c0: 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 47 65 static int.TlsGe
04d0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 5f 41 4e 53 tOptionProc _ANS
04e0: 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 I_ARGS_ ((Client
04f0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
0500: 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 a,....Tcl_Interp
0510: 20 2a 69 6e 74 65 72 70 2c 20 43 4f 4e 53 54 38 *interp, CONST8
0520: 34 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 4 char *optionNa
0530: 6d 65 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 me,....Tcl_DStri
0540: 6e 67 20 2a 64 73 50 74 72 29 29 3b 0a 73 74 61 ng *dsPtr));.sta
0550: 74 69 63 20 76 6f 69 64 09 54 6c 73 57 61 74 63 tic void.TlsWatc
0560: 68 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 hProc _ANSI_ARGS
0570: 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e _((ClientData in
0580: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 stanceData, int
0590: 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 69 mask));.static i
05a0: 6e 74 09 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 nt.TlsGetHandleP
05b0: 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 roc _ANSI_ARGS_
05c0: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ((ClientData ins
05d0: 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 6e tanceData,....in
05e0: 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 t direction, Cli
05f0: 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 entData *handleP
0600: 74 72 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 tr));.static int
0610: 09 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 5f .TlsNotifyProc _
0620: 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 ANSI_ARGS_ ((Cli
0630: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
0640: 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 61 73 Data,....int mas
0650: 6b 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 k));.static void
0660: 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c .TlsChannelHandl
0670: 65 72 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 er _ANSI_ARGS_ (
0680: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
0690: 6e 74 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d ntData,....int m
06a0: 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 76 6f ask));.static vo
06b0: 69 64 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e id.TlsChannelHan
06c0: 64 6c 65 72 54 69 6d 65 72 20 5f 41 4e 53 49 5f dlerTimer _ANSI_
06d0: 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 ARGS_ ((ClientDa
06e0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 29 3b ta clientData));
06f0: 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 ../*. * This str
0700: 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65 73 ucture describes
0710: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 70 the channel typ
0720: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 e structure for
0730: 54 43 50 20 73 6f 63 6b 65 74 0a 20 2a 20 62 61 TCP socket. * ba
0740: 73 65 64 20 49 4f 2e 20 20 54 68 65 73 65 20 61 sed IO. These a
0750: 72 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 re what the stru
0760: 63 74 75 72 65 73 20 73 68 6f 75 6c 64 20 6c 6f ctures should lo
0770: 6f 6b 20 6c 69 6b 65 2c 20 62 75 74 20 77 65 0a ok like, but we.
0780: 20 2a 20 68 61 76 65 20 74 6f 20 62 75 69 6c 64 * have to build
0790: 20 74 68 65 6d 20 75 70 20 61 74 20 72 75 6e 74 them up at runt
07a0: 69 6d 65 20 74 6f 20 62 65 20 63 6f 72 72 65 63 ime to be correc
07b0: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 t depending on w
07c0: 68 65 74 68 65 72 0a 20 2a 20 77 65 20 61 72 65 hether. * we are
07d0: 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 6e 20 loaded into an
07e0: 38 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72 20 38 8.2.0-8.3.1 or 8
07f0: 2e 33 2e 32 2b 20 54 63 6c 20 69 6e 74 65 72 70 .3.2+ Tcl interp
0800: 72 65 74 65 72 2e 0a 20 2a 2f 0a 23 69 66 64 65 reter.. */.#ifde
0810: 66 20 54 4c 53 5f 53 54 41 54 49 43 5f 53 54 52 f TLS_STATIC_STR
0820: 55 43 54 55 52 45 53 5f 4e 4f 54 5f 55 53 45 44 UCTURES_NOT_USED
0830: 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e .static Tcl_Chan
0840: 6e 65 6c 54 79 70 65 20 74 6c 73 43 68 61 6e 6e nelType tlsChann
0850: 65 6c 54 79 70 65 32 20 3d 20 7b 0a 20 20 20 20 elType2 = {.
0860: 22 74 6c 73 22 2c 09 09 2f 2a 20 54 79 70 65 20 "tls",../* Type
0870: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 43 4c name. */. TCL
0880: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e _CHANNEL_VERSION
0890: 5f 32 2c 09 2f 2a 20 41 20 76 32 20 63 68 61 6e _2,./* A v2 chan
08a0: 6e 65 6c 20 28 38 2e 33 2e 32 2b 29 20 2a 2f 0a nel (8.3.2+) */.
08b0: 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 TlsCloseProc
08c0: 2c 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e ,./* Close proc.
08d0: 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 */. TlsInput
08e0: 50 72 6f 63 2c 09 2f 2a 20 49 6e 70 75 74 20 70 Proc,./* Input p
08f0: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4f roc. */. TlsO
0900: 75 74 70 75 74 50 72 6f 63 2c 09 2f 2a 20 4f 75 utputProc,./* Ou
0910: 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 tput proc. */.
0920: 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b NULL,../* Seek
0930: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 proc. */. NU
0940: 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 LL,../* Set opti
0950: 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 on proc. */.
0960: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 TlsGetOptionProc
0970: 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 ,./* Get option
0980: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 proc. */. Tls
0990: 57 61 74 63 68 50 72 6f 63 2c 09 2f 2a 20 49 6e WatchProc,./* In
09a0: 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 itialize notifie
09b0: 72 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 r. */. TlsGet
09c0: 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 HandleProc,./* G
09d0: 65 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f et file handle o
09e0: 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a ut of channel. *
09f0: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 /. NULL,../*
0a00: 43 6c 6f 73 65 32 50 72 6f 63 2e 20 2a 2f 0a 20 Close2Proc. */.
0a10: 20 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 TlsBlockModeP
0a20: 72 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 roc,./* Set bloc
0a30: 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 king/nonblocking
0a40: 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20 4e 55 4c mode.*/. NUL
0a50: 4c 2c 09 09 2f 2a 20 46 6c 75 73 68 50 72 6f 63 L,../* FlushProc
0a60: 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4e 6f 74 69 . */. TlsNoti
0a70: 66 79 50 72 6f 63 2c 09 2f 2a 20 68 61 6e 64 6c fyProc,./* handl
0a80: 65 72 50 72 6f 63 2e 20 2a 2f 0a 7d 3b 0a 0a 73 erProc. */.};..s
0a90: 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 tatic Tcl_Channe
0aa0: 6c 54 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 6c lType tlsChannel
0ab0: 54 79 70 65 31 20 3d 20 7b 0a 20 20 20 20 22 74 Type1 = {. "t
0ac0: 6c 73 22 2c 09 09 2f 2a 20 54 79 70 65 20 6e 61 ls",../* Type na
0ad0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 42 6c me. */. TlsBl
0ae0: 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 ockModeProc,./*
0af0: 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e Set blocking/non
0b00: 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 2a 2f blocking mode.*/
0b10: 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f . TlsClosePro
0b20: 63 2c 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 c,./* Close proc
0b30: 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 . */. TlsInpu
0b40: 74 50 72 6f 63 2c 09 2f 2a 20 49 6e 70 75 74 20 tProc,./* Input
0b50: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 proc. */. Tls
0b60: 4f 75 74 70 75 74 50 72 6f 63 2c 09 2f 2a 20 4f OutputProc,./* O
0b70: 75 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 utput proc. */.
0b80: 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 NULL,../* See
0b90: 6b 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e k proc. */. N
0ba0: 55 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 ULL,../* Set opt
0bb0: 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 ion proc. */.
0bc0: 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f TlsGetOptionPro
0bd0: 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e c,./* Get option
0be0: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c proc. */. Tl
0bf0: 73 57 61 74 63 68 50 72 6f 63 2c 09 2f 2a 20 49 sWatchProc,./* I
0c00: 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 nitialize notifi
0c10: 65 72 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 er. */. TlsGe
0c20: 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 tHandleProc,./*
0c30: 47 65 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 Get file handle
0c40: 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 out of channel.
0c50: 2a 2f 0a 7d 3b 0a 23 65 6c 73 65 0a 73 74 61 74 */.};.#else.stat
0c60: 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 ic Tcl_ChannelTy
0c70: 70 65 20 2a 74 6c 73 43 68 61 6e 6e 65 6c 54 79 pe *tlsChannelTy
0c80: 70 65 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 pe = NULL;.#endi
0c90: 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d f../*. *--------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
0ce0: 2a 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 * Tls_ChannelTyp
0cf0: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 e --. *. *.Retur
0d00: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 54 4c n the correct TL
0d10: 53 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 S channel driver
0d20: 20 69 6e 66 6f 0a 20 2a 0a 20 2a 20 52 65 73 75 info. *. * Resu
0d30: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 63 6f 72 72 lts:. *.The corr
0d40: 65 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 ect channel driv
0d50: 65 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 er for the curre
0d60: 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 63 nt version of Tc
0d70: 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 l.. *. * Side ef
0d80: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
0d90: 20 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a 54 63 6c --------. */.Tcl
0de0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 54 6c _ChannelType *Tl
0df0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 0a s_ChannelType().
0e00: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 {. /*. *
0e10: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 Initialize the c
0e20: 68 61 6e 6e 65 6c 20 74 79 70 65 20 69 66 20 6e hannel type if n
0e30: 65 63 65 73 73 61 72 79 0a 20 20 20 20 20 2a 2f ecessary. */
0e40: 0a 20 20 20 20 69 66 20 28 74 6c 73 43 68 61 6e . if (tlsChan
0e50: 6e 65 6c 54 79 70 65 20 3d 3d 20 4e 55 4c 4c 29 nelType == NULL)
0e60: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 41 6c 6c 6f 63 {../*.. * Alloc
0e70: 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 63 ation of a new c
0e80: 68 61 6e 6e 65 6c 74 79 70 65 20 73 74 72 75 63 hanneltype struc
0e90: 74 75 72 65 20 69 73 20 6e 6f 74 20 65 61 73 79 ture is not easy
0ea0: 2c 20 62 65 63 61 75 73 65 20 6f 66 0a 09 20 2a , because of.. *
0eb0: 20 74 68 65 20 76 61 72 69 6f 75 73 20 76 65 72 the various ver
0ec0: 73 6f 6e 20 6f 66 20 74 68 65 20 63 6f 72 65 20 son of the core
0ed0: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 63 and subsequent c
0ee0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 09 20 hanges to the..
0ef0: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 * structure. The
0f00: 20 6d 61 69 6e 20 63 68 61 6c 6c 65 6e 67 65 20 main challenge
0f10: 69 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 65 is to allocate e
0f20: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 nough memory for
0f30: 0a 09 20 2a 20 6f 64 65 72 6e 20 76 65 72 73 69 .. * odern versi
0f40: 6f 6e 73 20 65 76 65 6e 20 69 66 20 74 68 69 73 ons even if this
0f50: 20 65 78 74 79 65 6e 73 69 6f 6e 20 69 73 20 63 extyension is c
0f60: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 ompiled against
0f70: 6f 6e 65 0a 09 20 2a 20 6f 66 20 74 68 65 20 6f one.. * of the o
0f80: 6c 64 65 72 20 76 61 72 69 61 6e 74 21 0a 09 20 lder variant!..
0f90: 2a 0a 09 20 2a 20 28 31 29 20 56 65 72 73 69 6f *.. * (1) Versio
0fa0: 6e 73 20 62 65 66 6f 72 65 20 73 74 75 62 73 20 ns before stubs
0fb0: 28 38 2e 30 2e 78 29 20 61 72 65 20 73 69 6d 70 (8.0.x) are simp
0fc0: 6c 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 79 le, because they
0fd0: 20 61 72 65 0a 09 20 2a 20 20 20 20 20 73 75 70 are.. * sup
0fe0: 70 6f 72 74 65 64 20 6f 6e 6c 79 20 69 66 20 74 ported only if t
0ff0: 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 he extension is
1000: 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 compiled against
1010: 20 65 78 61 63 74 6c 79 0a 09 20 2a 20 20 20 20 exactly.. *
1020: 20 74 68 61 74 20 76 65 72 73 69 6f 6e 20 6f 66 that version of
1030: 20 74 68 65 20 63 6f 72 65 2e 0a 09 20 2a 0a 09 the core... *..
1040: 20 2a 20 28 32 29 20 57 69 74 68 20 73 74 75 62 * (2) With stub
1050: 73 20 77 65 20 6a 75 73 74 20 64 65 74 65 72 6d s we just determ
1060: 69 6e 65 20 74 68 65 20 64 69 66 66 65 72 65 6e ine the differen
1070: 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 6f ce between the o
1080: 6c 64 65 72 0a 09 20 2a 20 20 20 20 20 61 6e 64 lder.. * and
1090: 20 6d 6f 64 65 72 6e 20 76 61 72 69 61 6e 74 20 modern variant
10a0: 61 6e 64 20 6f 76 65 72 61 6c 6c 6f 63 61 74 65 and overallocate
10b0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 69 66 20 accordingly if
10c0: 63 6f 6d 70 69 6c 65 64 0a 09 20 2a 20 20 20 20 compiled.. *
10d0: 20 61 67 61 69 6e 73 74 20 61 6e 20 6f 6c 64 65 against an olde
10e0: 72 20 76 61 72 69 61 6e 74 2e 0a 09 20 2a 2f 0a r variant... */.
10f0: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 ..unsigned int s
1100: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 54 63 6c ize = sizeof(Tcl
1110: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 29 3b 20 2f _ChannelType); /
1120: 2a 20 42 61 73 65 20 73 69 7a 65 20 2a 2f 0a 0a * Base size */..
1130: 09 2f 2a 0a 09 20 2a 20 53 69 7a 65 20 6f 66 20 ./*.. * Size of
1140: 61 20 70 72 6f 63 65 64 75 72 65 20 70 6f 69 6e a procedure poin
1150: 74 65 72 2e 20 57 65 20 61 73 73 75 6d 65 20 74 ter. We assume t
1160: 68 61 74 20 61 6c 6c 20 70 72 6f 63 65 64 75 72 hat all procedur
1170: 65 0a 09 20 2a 20 70 6f 69 6e 74 65 72 73 20 61 e.. * pointers a
1180: 72 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 re of the same s
1190: 69 7a 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 ize, regardless
11a0: 6f 66 20 65 78 61 63 74 20 74 79 70 65 0a 09 20 of exact type..
11b0: 2a 20 28 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 * (arguments and
11c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 29 2e return values).
11d0: 0a 09 20 2a 0a 09 20 2a 20 38 2e 32 2e 20 20 20 .. *.. * 8.2.
11e0: 46 69 72 73 74 20 76 65 72 73 69 6f 6e 20 63 6f First version co
11f0: 6e 74 61 69 6e 69 6e 67 20 63 6c 6f 73 65 32 70 ntaining close2p
1200: 72 6f 63 2e 20 42 61 73 65 6c 69 6e 65 2e 0a 09 roc. Baseline...
1210: 20 2a 20 38 2e 33 2e 32 20 20 54 68 72 65 65 20 * 8.3.2 Three
1220: 61 64 64 69 74 69 6f 6e 61 6c 20 76 65 63 74 6f additional vecto
1230: 72 73 2e 20 4d 6f 76 65 64 20 62 6c 6f 63 6b 4d rs. Moved blockM
1240: 6f 64 65 2c 20 6e 65 77 20 66 6c 75 73 68 2d 20 ode, new flush-
1250: 61 6e 64 0a 09 20 2a 20 20 20 20 20 20 20 20 68 and.. * h
1260: 61 6e 64 6c 65 72 50 72 6f 63 27 73 2e 0a 09 20 andlerProc's...
1270: 2a 0a 09 20 2a 20 3d 3e 20 43 6f 6d 70 69 6c 61 *.. * => Compila
1280: 74 69 6f 6e 20 61 67 61 69 6e 73 74 20 65 61 72 tion against ear
1290: 6c 69 65 72 20 76 65 72 73 69 6f 6e 20 68 61 73 lier version has
12a0: 20 74 6f 20 6f 76 65 72 61 6c 6c 6f 63 61 74 65 to overallocate
12b0: 20 74 68 72 65 65 0a 09 20 2a 20 20 20 20 70 72 three.. * pr
12c0: 6f 63 65 64 75 72 65 20 70 6f 69 6e 74 65 72 73 ocedure pointers
12d0: 2e 0a 09 20 2a 2f 0a 0a 23 69 66 64 65 66 20 45 ... */..#ifdef E
12e0: 4d 55 4c 41 54 45 5f 43 48 41 4e 4e 45 4c 5f 56 MULATE_CHANNEL_V
12f0: 45 52 53 49 4f 4e 5f 32 0a 09 73 69 7a 65 20 2b ERSION_2..size +
1300: 3d 20 33 20 2a 20 70 72 6f 63 50 74 72 53 69 7a = 3 * procPtrSiz
1310: 65 3b 0a 23 65 6e 64 69 66 0a 0a 09 74 6c 73 43 e;.#endif...tlsC
1320: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 28 54 63 hannelType = (Tc
1330: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 29 l_ChannelType *)
1340: 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a ckalloc(size);.
1350: 09 6d 65 6d 73 65 74 28 28 56 4f 49 44 20 2a 29 .memset((VOID *)
1360: 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2c tlsChannelType,
1370: 20 30 2c 20 73 69 7a 65 29 3b 0a 0a 09 2f 2a 0a 0, size);.../*.
1380: 09 20 2a 20 43 6f 6d 6d 6f 6e 20 65 6c 65 6d 65 . * Common eleme
1390: 6e 74 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 nts of the struc
13a0: 74 75 72 65 20 28 6e 6f 20 63 68 61 6e 67 65 73 ture (no changes
13b0: 20 69 6e 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 in location or
13c0: 6e 61 6d 65 29 0a 09 20 2a 20 63 6c 6f 73 65 32 name).. * close2
13d0: 50 72 6f 63 2c 20 73 65 65 6b 50 72 6f 63 2c 20 Proc, seekProc,
13e0: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 73 74 setOptionProc st
13f0: 61 79 20 4e 55 4c 4c 2e 0a 09 20 2a 2f 0a 0a 09 ay NULL... */...
1400: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e tlsChannelType->
1410: 74 79 70 65 4e 61 6d 65 09 3d 20 22 74 6c 73 22 typeName.= "tls"
1420: 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 ;..tlsChannelTyp
1430: 65 2d 3e 63 6c 6f 73 65 50 72 6f 63 09 3d 20 54 e->closeProc.= T
1440: 6c 73 43 6c 6f 73 65 50 72 6f 63 3b 0a 09 74 6c lsCloseProc;..tl
1450: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 69 6e sChannelType->in
1460: 70 75 74 50 72 6f 63 09 3d 20 54 6c 73 49 6e 70 putProc.= TlsInp
1470: 75 74 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e utProc;..tlsChan
1480: 6e 65 6c 54 79 70 65 2d 3e 6f 75 74 70 75 74 50 nelType->outputP
1490: 72 6f 63 09 3d 20 54 6c 73 4f 75 74 70 75 74 50 roc.= TlsOutputP
14a0: 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c roc;..tlsChannel
14b0: 54 79 70 65 2d 3e 67 65 74 4f 70 74 69 6f 6e 50 Type->getOptionP
14c0: 72 6f 63 09 3d 20 54 6c 73 47 65 74 4f 70 74 69 roc.= TlsGetOpti
14d0: 6f 6e 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e onProc;..tlsChan
14e0: 6e 65 6c 54 79 70 65 2d 3e 77 61 74 63 68 50 72 nelType->watchPr
14f0: 6f 63 09 3d 20 54 6c 73 57 61 74 63 68 50 72 6f oc.= TlsWatchPro
1500: 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 c;..tlsChannelTy
1510: 70 65 2d 3e 67 65 74 48 61 6e 64 6c 65 50 72 6f pe->getHandlePro
1520: 63 09 3d 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 c.= TlsGetHandle
1530: 50 72 6f 63 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 62 Proc;.../*.. * b
1540: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 69 73 20 lockModeProc is
1550: 61 20 74 77 69 73 74 65 72 2e 20 20 57 65 20 68 a twister. We h
1560: 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 6f 6d 65 ave to make some
1570: 20 72 75 6e 74 69 6d 65 2d 63 68 6f 69 63 65 73 runtime-choices
1580: 2c 0a 09 20 2a 20 64 65 70 65 6e 64 69 6e 67 20 ,.. * depending
1590: 6f 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 on the version w
15a0: 65 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e e compiled again
15b0: 73 74 2e 0a 09 20 2a 2f 0a 0a 23 69 66 64 65 66 st... */..#ifdef
15c0: 20 45 4d 55 4c 41 54 45 5f 43 48 41 4e 4e 45 4c EMULATE_CHANNEL
15d0: 5f 56 45 52 53 49 4f 4e 5f 32 0a 09 2f 2a 0a 09 _VERSION_2../*..
15e0: 20 2a 20 57 65 20 61 72 65 20 63 6f 6d 70 69 6c * We are compil
15f0: 69 6e 67 20 61 67 61 69 6e 73 74 20 61 6e 20 38 ing against an 8
1600: 2e 33 2e 31 2d 20 63 6f 72 65 2e 20 20 57 65 20 .3.1- core. We
1610: 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 73 have to create s
1620: 6f 6d 65 0a 09 20 2a 20 64 65 66 69 6e 69 74 69 ome.. * definiti
1630: 6f 6e 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 ons for the new
1640: 65 6c 65 6d 65 6e 74 73 20 61 73 20 74 68 65 20 elements as the
1650: 63 6f 6d 70 69 6c 65 72 20 64 6f 65 73 20 6e 6f compiler does no
1660: 74 20 6b 6e 6f 77 20 74 68 65 6d 0a 09 20 2a 20 t know them.. *
1670: 62 79 20 6e 61 6d 65 2e 0a 09 20 2a 2f 0a 0a 09 by name... */...
1680: 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 if (channelTypeV
1690: 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 ersion == TLS_CH
16a0: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 29 ANNEL_VERSION_1)
16b0: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
16c0: 20 2a 20 54 68 65 20 27 76 65 72 73 69 6f 6e 27 * The 'version'
16d0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 38 2e 33 2e element of 8.3.
16e0: 32 20 69 73 20 69 6e 20 74 68 65 20 74 68 65 20 2 is in the the
16f0: 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 09 20 20 place of the..
1700: 20 20 20 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 * blockModePr
1710: 6f 63 2e 20 46 6f 72 20 38 2e 32 2e 30 2d 38 2e oc. For 8.2.0-8.
1720: 33 2e 31 20 77 65 20 68 61 76 65 20 74 6f 20 73 3.1 we have to s
1730: 65 74 20 6f 75 72 20 62 6c 6f 63 6b 4d 6f 64 65 et our blockMode
1740: 50 72 6f 63 0a 09 20 20 20 20 20 2a 20 69 6e 74 Proc.. * int
1750: 6f 20 74 68 69 73 20 70 6c 61 63 65 2e 0a 09 20 o this place...
1760: 20 20 20 20 2a 2f 0a 09 20 20 20 20 74 6c 73 43 */.. tlsC
1770: 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 62 6c 6f 63 hannelType->bloc
1780: 6b 4d 6f 64 65 50 72 6f 63 20 3d 20 54 6c 73 42 kModeProc = TlsB
1790: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a 09 7d lockModeProc;..}
17a0: 20 65 6c 73 65 20 2f 2a 20 63 68 61 6e 6e 65 6c else /* channel
17b0: 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 TypeVersion == T
17c0: 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 LS_CHANNEL_VERSI
17d0: 4f 4e 5f 32 20 2a 2f 20 7b 0a 09 20 20 20 20 2f ON_2 */ {.. /
17e0: 2a 0a 09 20 20 20 20 20 2a 20 46 6f 72 20 74 68 *.. * For th
17f0: 65 20 38 2e 33 2e 32 20 63 6f 72 65 20 77 65 20 e 8.3.2 core we
1800: 70 72 65 73 65 6e 74 20 6f 75 72 73 65 6c 76 65 present ourselve
1810: 73 20 61 73 20 61 20 76 65 72 73 69 6f 6e 20 32 s as a version 2
1820: 0a 09 20 20 20 20 20 2a 20 64 72 69 76 65 72 2e .. * driver.
1830: 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 73 70 This means a sp
1840: 65 63 69 61 6c 20 76 61 6c 75 65 20 69 6e 20 76 ecial value in v
1850: 65 72 73 69 6f 6e 20 28 65 78 0a 09 20 20 20 20 ersion (ex..
1860: 20 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 * blockModeProc
1870: 29 2c 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 ), blockModeProc
1880: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 in a different
1890: 70 6c 61 63 65 20 61 6e 64 20 6f 66 0a 09 20 20 place and of..
18a0: 20 20 20 2a 20 63 6f 75 72 73 65 20 75 73 61 67 * course usag
18b0: 65 20 6f 66 20 74 68 65 20 68 61 6e 64 6c 65 72 e of the handler
18c0: 50 72 6f 63 2e 20 20 54 68 65 20 6c 61 73 74 20 Proc. The last
18d0: 74 77 6f 20 68 61 76 65 20 74 6f 0a 09 20 20 20 two have to..
18e0: 20 20 2a 20 72 65 66 65 72 65 6e 63 65 64 20 77 * referenced w
18f0: 69 74 68 20 70 6f 69 6e 74 65 72 20 6d 61 67 69 ith pointer magi
1900: 63 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 c because they a
1910: 72 65 6e 27 74 20 64 65 66 69 6e 65 64 0a 09 20 ren't defined..
1920: 20 20 20 20 2a 20 6f 74 68 65 72 77 69 73 65 2e * otherwise.
1930: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
1940: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e tlsChannelType->
1950: 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 3d 0a blockModeProc =.
1960: 09 09 28 54 63 6c 5f 44 72 69 76 65 72 42 6c 6f ..(Tcl_DriverBlo
1970: 63 6b 4d 6f 64 65 50 72 6f 63 2a 29 20 54 4c 53 ckModeProc*) TLS
1980: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e _CHANNEL_VERSION
1990: 5f 32 3b 0a 09 20 20 20 20 28 2a 28 28 54 63 6c _2;.. (*((Tcl
19a0: 5f 44 72 69 76 65 72 42 6c 6f 63 6b 4d 6f 64 65 _DriverBlockMode
19b0: 50 72 6f 63 2a 2a 29 28 26 28 74 6c 73 43 68 61 Proc**)(&(tlsCha
19c0: 6e 6e 65 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 32 nnelType->close2
19d0: 50 72 6f 63 29 2b 31 29 29 29 0a 09 09 3d 20 54 Proc)+1)))...= T
19e0: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b lsBlockModeProc;
19f0: 0a 09 20 20 20 20 28 2a 28 28 54 6c 73 44 72 69 .. (*((TlsDri
1a00: 76 65 72 48 61 6e 64 6c 65 72 50 72 6f 63 2a 2a verHandlerProc**
1a10: 29 28 26 28 74 6c 73 43 68 61 6e 6e 65 6c 54 79 )(&(tlsChannelTy
1a20: 70 65 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 29 2b pe->close2Proc)+
1a30: 33 29 29 29 0a 09 09 3d 20 54 6c 73 4e 6f 74 69 3)))...= TlsNoti
1a40: 66 79 50 72 6f 63 3b 0a 09 7d 0a 23 65 6c 73 65 fyProc;..}.#else
1a50: 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6d 70 69 6c 65 ../*.. * Compile
1a60: 64 20 61 67 61 69 6e 73 74 20 38 2e 33 2e 32 2b d against 8.3.2+
1a70: 2e 20 44 69 72 65 63 74 20 61 63 63 65 73 73 20 . Direct access
1a80: 74 6f 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 to all elements
1a90: 70 6f 73 73 69 62 6c 65 2e 20 55 73 65 0a 09 20 possible. Use..
1aa0: 2a 20 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 * channelTypeVer
1ab0: 73 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e sion information
1ac0: 20 74 6f 20 73 65 6c 65 63 74 20 74 68 65 20 76 to select the v
1ad0: 61 6c 75 65 73 20 74 6f 20 75 73 65 2e 0a 09 20 alues to use...
1ae0: 2a 2f 0a 0a 09 69 66 20 28 63 68 61 6e 6e 65 6c */...if (channel
1af0: 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 TypeVersion == T
1b00: 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 LS_CHANNEL_VERSI
1b10: 4f 4e 5f 31 29 20 7b 0a 09 20 20 20 20 2f 2a 0a ON_1) {.. /*.
1b20: 09 20 20 20 20 20 2a 20 54 68 65 20 27 76 65 72 . * The 'ver
1b30: 73 69 6f 6e 27 20 65 6c 65 6d 65 6e 74 20 6f 66 sion' element of
1b40: 20 38 2e 33 2e 32 20 69 73 20 69 6e 20 74 68 65 8.3.2 is in the
1b50: 20 74 68 65 20 70 6c 61 63 65 20 6f 66 20 74 68 the place of th
1b60: 65 0a 09 20 20 20 20 20 2a 20 62 6c 6f 63 6b 4d e.. * blockM
1b70: 6f 64 65 50 72 6f 63 2e 20 46 6f 72 20 74 68 65 odeProc. For the
1b80: 20 6f 72 69 67 69 6e 61 6c 20 70 61 74 63 68 20 original patch
1b90: 69 6e 20 38 2e 31 2e 78 20 61 6e 64 20 74 68 65 in 8.1.x and the
1ba0: 20 66 69 72 73 74 6c 79 0a 09 20 20 20 20 20 2a firstly.. *
1bb0: 20 69 6e 63 6c 75 64 65 64 20 28 38 2e 32 29 20 included (8.2)
1bc0: 77 65 20 68 61 76 65 20 74 6f 20 73 65 74 20 6f we have to set o
1bd0: 75 72 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 ur blockModeProc
1be0: 20 69 6e 74 6f 20 74 68 69 73 0a 09 20 20 20 20 into this..
1bf0: 20 2a 20 70 6c 61 63 65 2e 0a 09 20 20 20 20 20 * place...
1c00: 2a 2f 0a 09 20 20 20 20 74 6c 73 43 68 61 6e 6e */.. tlsChann
1c10: 65 6c 54 79 70 65 2d 3e 76 65 72 73 69 6f 6e 20 elType->version
1c20: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 = (Tcl_ChannelTy
1c30: 70 65 56 65 72 73 69 6f 6e 29 54 6c 73 42 6c 6f peVersion)TlsBlo
1c40: 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a 09 7d 20 65 ckModeProc;..} e
1c50: 6c 73 65 20 2f 2a 20 63 68 61 6e 6e 65 6c 54 79 lse /* channelTy
1c60: 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 peVersion == TLS
1c70: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e _CHANNEL_VERSION
1c80: 5f 32 20 2a 2f 20 7b 0a 09 20 20 20 20 2f 2a 0a _2 */ {.. /*.
1c90: 09 20 20 20 20 20 2a 20 46 6f 72 20 74 68 65 20 . * For the
1ca0: 38 2e 33 2e 32 20 63 6f 72 65 20 77 65 20 70 72 8.3.2 core we pr
1cb0: 65 73 65 6e 74 20 6f 75 72 73 65 6c 76 65 73 20 esent ourselves
1cc0: 61 73 20 61 20 76 65 72 73 69 6f 6e 20 32 0a 09 as a version 2..
1cd0: 20 20 20 20 20 2a 20 64 72 69 76 65 72 2e 20 54 * driver. T
1ce0: 68 69 73 20 6d 65 61 6e 73 20 61 20 73 70 65 63 his means a spec
1cf0: 69 61 6c 20 76 61 6c 75 65 20 69 6e 20 76 65 72 ial value in ver
1d00: 73 69 6f 6e 20 28 65 78 0a 09 20 20 20 20 20 2a sion (ex.. *
1d10: 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 29 2c blockModeProc),
1d20: 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 69 blockModeProc i
1d30: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 6c n a different pl
1d40: 61 63 65 20 61 6e 64 20 6f 66 0a 09 20 20 20 20 ace and of..
1d50: 20 2a 20 63 6f 75 72 73 65 20 75 73 61 67 65 20 * course usage
1d60: 6f 66 20 74 68 65 20 68 61 6e 64 6c 65 72 50 72 of the handlerPr
1d70: 6f 63 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 oc... */...
1d80: 20 20 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 tlsChannelTyp
1d90: 65 2d 3e 76 65 72 73 69 6f 6e 20 20 20 20 20 20 e->version
1da0: 20 3d 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 = TCL_CHANNEL_V
1db0: 45 52 53 49 4f 4e 5f 32 3b 0a 09 20 20 20 20 74 ERSION_2;.. t
1dc0: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 62 lsChannelType->b
1dd0: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 3d 20 54 lockModeProc = T
1de0: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b lsBlockModeProc;
1df0: 0a 09 20 20 20 20 74 6c 73 43 68 61 6e 6e 65 6c .. tlsChannel
1e00: 54 79 70 65 2d 3e 68 61 6e 64 6c 65 72 50 72 6f Type->handlerPro
1e10: 63 20 20 20 3d 20 54 6c 73 4e 6f 74 69 66 79 50 c = TlsNotifyP
1e20: 72 6f 63 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 roc;..}.#endif.
1e30: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
1e40: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 3b 0a tlsChannelType;.
1e50: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a ------------. *.
1ea0: 20 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 * TlsBlockModeP
1eb0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
1ec0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
1ed0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 nvoked by the ge
1ee0: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 neric IO level.
1ef0: 2a 20 20 20 20 20 20 20 74 6f 20 73 65 74 20 62 * to set b
1f00: 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 locking and nonb
1f10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 20 2a locking modes. *
1f20: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69 Results:. *.0 i
1f30: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 72 f successful, er
1f40: 72 6e 6f 20 77 68 65 6e 20 66 61 69 6c 65 64 2e rno when failed.
1f50: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
1f60: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 cts:. *.Sets the
1f70: 20 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f device into blo
1f80: 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 cking or nonbloc
1f90: 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a king 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 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
1ff0: 69 6e 74 0a 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 int.TlsBlockMode
2000: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
2010: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a instanceData,./*
2020: 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a Socket state. *
2030: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 /.
2040: 20 20 20 69 6e 74 20 6d 6f 64 65 29 09 09 09 2f int mode).../
2050: 2a 20 54 68 65 20 6d 6f 64 65 20 74 6f 20 73 65 * The mode to se
2060: 74 2e 20 43 61 6e 20 62 65 20 6f 6e 65 20 6f 66 t. Can be one of
2070: 0a 09 09 09 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 .......* TCL_MOD
2080: 45 5f 42 4c 4f 43 4b 49 4e 47 20 6f 72 0a 09 09 E_BLOCKING or...
2090: 09 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 5f 4e ....* TCL_MODE_N
20a0: 4f 4e 42 4c 4f 43 4b 49 4e 47 2e 20 2a 2f 0a 7b ONBLOCKING. */.{
20b0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
20c0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
20d0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a instanceData;..
20e0: 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 if (mode ==
20f0: 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 TCL_MODE_NONBLOC
2100: 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 KING) {..statePt
2110: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
2120: 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d TCL_ASYNC;. }
2130: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 else {..statePt
2140: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
2150: 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 S_TCL_ASYNC);.
2160: 20 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61 6e }. if (chan
2170: 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d nelTypeVersion =
2180: 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 = TLS_CHANNEL_VE
2190: 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 72 65 74 75 RSION_2) {..retu
21a0: 72 6e 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 rn 0;. } else
21b0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 53 {..return Tcl_S
21c0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
21d0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
21e0: 2c 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 , Tls_GetParent(
21f0: 73 74 61 74 65 50 74 72 29 2c 0a 09 09 22 2d 62 statePtr),..."-b
2200: 6c 6f 63 6b 69 6e 67 22 2c 20 28 6d 6f 64 65 20 locking", (mode
2210: 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 == TCL_MODE_NONB
2220: 4c 4f 43 4b 49 4e 47 29 20 3f 20 22 30 22 20 3a LOCKING) ? "0" :
2230: 20 22 31 22 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c "1");. }.}..
2240: 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2290: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a TlsCloseProc --.
22a0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
22b0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
22c0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
22d0: 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f O level to perfo
22e0: 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 rm. *.channel-ty
22f0: 70 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 pe-specific clea
2300: 6e 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 nup when a SSL s
2310: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
2320: 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
2330: 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a 20 77 65 .. *. *.Note: we
2340: 20 6c 65 61 76 65 20 74 68 65 20 75 6e 64 65 72 leave the under
2350: 6c 79 69 6e 67 20 73 6f 63 6b 65 74 20 61 6c 6f lying socket alo
2360: 6e 65 2c 20 69 73 20 74 68 69 73 20 72 69 67 68 ne, is this righ
2370: 74 3f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 t?. *. * Results
2380: 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 73 :. *.0 if succes
2390: 73 66 75 6c 2c 20 74 68 65 20 76 61 6c 75 65 20 sful, the value
23a0: 6f 66 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 of Tcl_GetErrno(
23b0: 29 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a ) if failed.. *.
23c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
23d0: 0a 20 2a 09 43 6c 6f 73 65 73 20 74 68 65 20 73 . *.Closes the s
23e0: 6f 63 6b 65 74 20 6f 66 20 74 68 65 20 63 68 61 ocket of the cha
23f0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c */.static int.Tl
2450: 73 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e sCloseProc(Clien
2460: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
2470: 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 ta,./* The socke
2480: 74 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 20 t to close. */.
2490: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f Tcl_
24a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 09 Interp *interp).
24b0: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70 /* For error rep
24c0: 6f 72 74 69 6e 67 20 2d 20 75 6e 75 73 65 64 2e orting - unused.
24d0: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 */.{. State
24e0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
24f0: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 te *) instanceDa
2500: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ta;.. dprintf
2510: 28 73 74 64 65 72 72 2c 22 5c 6e 54 6c 73 43 6c (stderr,"\nTlsCl
2520: 6f 73 65 50 72 6f 63 28 30 78 25 78 29 22 2c 20 oseProc(0x%x)",
2530: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 (unsigned int) s
2540: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 tatePtr);.. i
2550: 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 f (channelTypeVe
2560: 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 rsion == TLS_CHA
2570: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 29 20 NNEL_VERSION_1)
2580: 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 6d 6f 76 65 {../*.. * Remove
2590: 20 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 20 74 event handler t
25a0: 6f 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 o underlying cha
25b0: 6e 6e 65 6c 2c 20 74 68 69 73 20 63 6f 75 6c 64 nnel, this could
25c0: 0a 09 20 2a 20 62 65 20 62 65 63 61 75 73 65 20 .. * be because
25d0: 77 65 20 61 72 65 20 63 6c 6f 73 69 6e 67 20 66 we are closing f
25e0: 6f 72 20 72 65 61 6c 2c 20 6f 72 20 62 65 69 6e or real, or bein
25f0: 67 20 22 75 6e 73 74 61 63 6b 65 64 22 2e 0a 09 g "unstacked"...
2600: 20 2a 2f 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 */...Tcl_Delete
2610: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 ChannelHandler(T
2620: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 ls_GetParent(sta
2630: 74 65 50 74 72 29 2c 0a 09 09 54 6c 73 43 68 61 tePtr),...TlsCha
2640: 6e 6e 65 6c 48 61 6e 64 6c 65 72 2c 20 28 43 6c nnelHandler, (Cl
2650: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
2660: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tr);. }..
2670: 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 Tls_Clean(stateP
2680: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 65 tr);. Tcl_Eve
2690: 6e 74 75 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 ntuallyFree((Cli
26a0: 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72 entData)statePtr
26b0: 2c 20 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 , Tls_Free);.
26c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
26d0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a ------------. *.
2720: 20 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 * TlsInputProc
2730: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
2740: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
2750: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
2760: 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 c IO level. *
2770: 20 20 20 20 74 6f 20 72 65 61 64 20 69 6e 70 75 to read inpu
2780: 74 20 66 72 6f 6d 20 61 20 53 53 4c 20 73 6f 63 t from a SSL soc
2790: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
27a0: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 l.. *. * Results
27b0: 3a 0a 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 :. *.The number
27c0: 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 69 73 of bytes read is
27d0: 20 72 65 74 75 72 6e 65 64 20 6f 72 20 2d 31 20 returned or -1
27e0: 6f 6e 20 65 72 72 6f 72 2e 20 41 6e 20 6f 75 74 on error. An out
27f0: 70 75 74 0a 20 2a 09 61 72 67 75 6d 65 6e 74 20 put. *.argument
2800: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 4f 53 contains the POS
2810: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e IX error code on
2820: 20 65 72 72 6f 72 2c 20 6f 72 20 7a 65 72 6f 20 error, or zero
2830: 69 66 20 6e 6f 0a 20 2a 09 65 72 72 6f 72 20 6f if no. *.error o
2840: 63 63 75 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 53 ccurred.. *. * S
2850: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
2860: 52 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f 6d Reads input from
2870: 20 74 68 65 20 69 6e 70 75 74 20 64 65 76 69 63 the input devic
2880: 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c e of the channel
2890: 2e 0a 20 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a 0a ----------. */..
28e0: 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 49 6e static int.TlsIn
28f0: 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 putProc(ClientDa
2900: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c ta instanceData,
2910: 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 ./* Socket state
2920: 2e 20 2a 2f 0a 09 63 68 61 72 20 2a 62 75 66 2c . */..char *buf,
2930: 09 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 .../* Where to s
2940: 74 6f 72 65 20 64 61 74 61 20 72 65 61 64 2e 20 tore data read.
2950: 2a 2f 0a 09 69 6e 74 20 62 75 66 53 69 7a 65 2c */..int bufSize,
2960: 09 09 09 2f 2a 20 48 6f 77 20 6d 75 63 68 20 73 .../* How much s
2970: 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c pace is availabl
2980: 65 0a 09 09 09 09 09 20 2a 20 69 6e 20 74 68 65 e...... * in the
2990: 20 62 75 66 66 65 72 3f 20 2a 2f 0a 09 69 6e 74 buffer? */..int
29a0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 *errorCodePtr).
29b0: 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f ./* Where to sto
29c0: 72 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a re error code. *
29d0: 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 /.{. State *s
29e0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
29f0: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 *) instanceData
2a00: 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 65 73 52 ;. int bytesR
2a10: 65 61 64 3b 09 09 09 2f 2a 20 48 6f 77 20 6d 61 ead;.../* How ma
2a20: 6e 79 20 62 79 74 65 73 20 77 65 72 65 20 72 65 ny bytes were re
2a30: 61 64 3f 20 2a 2f 0a 0a 20 20 20 20 2a 65 72 72 ad? */.. *err
2a40: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a orCodePtr = 0;..
2a50: 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 dprintf(stde
2a60: 72 72 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 28 25 rr,"\nBIO_read(%
2a70: 64 29 22 2c 20 62 75 66 53 69 7a 65 29 3b 0a 0a d)", bufSize);..
2a80: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
2a90: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
2aa0: 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 20 20 L_CALLBACK) {.
2ab0: 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 70 72 /* don't pr
2ac0: 6f 63 65 73 73 20 61 6e 79 20 62 79 74 65 73 20 ocess any bytes
2ad0: 77 68 69 6c 65 20 76 65 72 69 66 79 20 63 61 6c while verify cal
2ae0: 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 lback is running
2af0: 20 2a 2f 0a 20 20 20 20 20 20 20 62 79 74 65 73 */. bytes
2b00: 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 Read = 0;.
2b10: 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 20 20 20 goto input;.
2b20: 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 53 53 4c }.. if (!SSL
2b30: 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 _is_init_finishe
2b40: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 d(statePtr->ssl)
2b50: 29 20 7b 0a 09 62 79 74 65 73 52 65 61 64 20 3d ) {..bytesRead =
2b60: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
2b70: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 ect(statePtr, er
2b80: 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 69 66 rorCodePtr);..if
2b90: 20 28 62 79 74 65 73 52 65 61 64 20 3c 3d 20 30 (bytesRead <= 0
2ba0: 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 69 6e ) {.. goto in
2bb0: 70 75 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 put;..}. }.
2bc0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
2bd0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
2be0: 49 4e 49 54 29 20 7b 0a 09 73 74 61 74 65 50 74 INIT) {..statePt
2bf0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
2c00: 53 5f 54 43 4c 5f 49 4e 49 54 29 3b 0a 20 20 20 S_TCL_INIT);.
2c10: 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }. /*. *
2c20: 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 We need to clea
2c30: 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20 r the SSL error
2c40: 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 stack now becaus
2c50: 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 e we sometimes r
2c60: 65 61 63 68 0a 20 20 20 20 20 2a 20 74 68 69 73 each. * this
2c70: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c function with l
2c80: 65 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69 eftover errors i
2c90: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 n the stack. If
2ca0: 20 42 49 4f 5f 72 65 61 64 0a 20 20 20 20 20 2a BIO_read. *
2cb0: 20 72 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 returns -1 and
2cc0: 69 6e 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 intends EAGAIN,
2cd0: 74 68 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f there is a lefto
2ce0: 76 65 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 ver error, it wi
2cf0: 6c 6c 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 ll be. * mis
2d00: 63 6f 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 construed as an
2d10: 65 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 error, not EAGAI
2d20: 4e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a N.. *. *
2d30: 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 Alternatively,
2d40: 77 65 20 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 we may want to h
2d50: 61 6e 64 6c 65 20 74 68 65 20 3c 30 20 72 65 74 andle the <0 ret
2d60: 75 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 urn codes from.
2d70: 20 20 20 20 2a 20 42 49 4f 5f 72 65 61 64 20 73 * BIO_read s
2d80: 70 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 pecially (as adv
2d90: 69 73 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 ised in the RSA
2da0: 64 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f docs). TLS's lo
2db0: 77 65 72 20 6c 65 76 65 6c 20 42 49 4f 0a 20 20 wer level BIO.
2dc0: 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 70 * functions p
2dd0: 6c 61 79 20 77 69 74 68 20 74 68 65 20 72 65 74 lay with the ret
2de0: 72 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c ry flags though,
2df0: 20 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 and this seems
2e00: 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 2a 20 63 to work. * c
2e10: 6f 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c orrectly. Simil
2e20: 61 72 20 66 69 78 20 69 6e 20 54 6c 73 4f 75 74 ar fix in TlsOut
2e30: 70 75 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 putProc. - hobbs
2e40: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 . */. ERR
2e50: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
2e60: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
2e70: 42 49 4f 5f 72 65 61 64 28 73 74 61 74 65 50 74 BIO_read(statePt
2e80: 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 62 75 66 r->bio, buf, buf
2e90: 53 69 7a 65 29 3b 0a 20 20 20 20 64 70 72 69 6e Size);. dprin
2ea0: 74 66 28 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f tf(stderr,"\nBIO
2eb0: 5f 72 65 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 _read -> %d", by
2ec0: 74 65 73 52 65 61 64 29 3b 0a 0a 20 20 20 20 69 tesRead);.. i
2ed0: 66 20 28 62 79 74 65 73 52 65 61 64 20 3c 20 30 f (bytesRead < 0
2ee0: 29 20 7b 0a 09 69 6e 74 20 65 72 72 20 3d 20 53 ) {..int err = S
2ef0: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 SL_get_error(sta
2f00: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 tePtr->ssl, byte
2f10: 73 52 65 61 64 29 3b 0a 0a 09 69 66 20 28 65 72 sRead);...if (er
2f20: 72 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53 r == SSL_ERROR_S
2f30: 53 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 45 SL) {.. Tls_E
2f40: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53 rror(statePtr, S
2f50: 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 65 50 74 SL_ERROR(statePt
2f60: 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61 r->ssl, bytesRea
2f70: 64 29 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 d));.. *error
2f80: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 CodePtr = ECONNA
2f90: 42 4f 52 54 45 44 3b 0a 09 7d 20 65 6c 73 65 20 BORTED;..} else
2fa0: 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 if (BIO_should_r
2fb0: 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 etry(statePtr->b
2fc0: 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 io)) {.. dpri
2fd0: 6e 74 66 28 73 74 64 65 72 72 2c 22 52 45 21 20 ntf(stderr,"RE!
2fe0: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 ");.. *errorC
2ff0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
3000: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
3010: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3020: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a Tcl_GetErrno();.
3030: 09 20 20 20 20 69 66 20 28 2a 65 72 72 6f 72 43 . if (*errorC
3040: 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 odePtr == ECONNR
3050: 45 53 45 54 29 20 7b 0a 09 09 2f 2a 20 53 6f 66 ESET) {.../* Sof
3060: 74 20 45 4f 46 20 2a 2f 0a 09 09 2a 65 72 72 6f t EOF */...*erro
3070: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 rCodePtr = 0;...
3080: 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 bytesRead = 0;..
3090: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 }..}. }.
30a0: 20 20 20 69 6e 70 75 74 3a 0a 20 20 20 20 64 70 input:. dp
30b0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c rintf(stderr, "\
30c0: 6e 49 6e 70 75 74 28 25 64 29 20 2d 3e 20 25 64 nInput(%d) -> %d
30d0: 20 5b 25 64 5d 22 2c 20 62 75 66 53 69 7a 65 2c [%d]", bufSize,
30e0: 20 62 79 74 65 73 52 65 61 64 2c 20 2a 65 72 72 bytesRead, *err
30f0: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20 20 20 20 orCodePtr);.
3100: 72 65 74 75 72 6e 20 62 79 74 65 73 52 65 61 64 return bytesRead
3110: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3160: 2a 0a 20 2a 20 54 6c 73 4f 75 74 70 75 74 50 72 *. * TlsOutputPr
3170: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 oc --. *. *.This
3180: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
3190: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e voked by the gen
31a0: 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a eric IO level. *
31b0: 20 20 20 20 20 20 20 74 6f 20 77 72 69 74 65 20 to write
31c0: 6f 75 74 70 75 74 20 74 6f 20 61 20 53 53 4c 20 output to a SSL
31d0: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
31e0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nnel.. *. * Resu
31f0: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 75 6d 62 lts:. *.The numb
3200: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 er of bytes writ
3210: 74 65 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e ten is returned.
3220: 20 41 6e 20 6f 75 74 70 75 74 20 61 72 67 75 6d An output argum
3230: 65 6e 74 20 69 73 0a 20 2a 09 73 65 74 20 74 6f ent is. *.set to
3240: 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 a POSIX error c
3250: 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 ode if an error
3260: 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 7a 65 72 occurred, or zer
3270: 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 o.. *. * Side ef
3280: 66 65 63 74 73 3a 0a 20 2a 09 57 72 69 74 65 73 fects:. *.Writes
3290: 20 6f 75 74 70 75 74 20 6f 6e 20 74 68 65 20 6f output on the o
32a0: 75 74 70 75 74 20 64 65 76 69 63 65 20 6f 66 20 utput device of
32b0: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a the channel.. *.
32c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3300: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
3310: 63 20 69 6e 74 0a 54 6c 73 4f 75 74 70 75 74 50 c int.TlsOutputP
3320: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 roc(ClientData i
3330: 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 nstanceData,./*
3340: 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f Socket state. */
3350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 . C
3360: 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c 09 ONST char *buf,.
3370: 09 2f 2a 20 54 68 65 20 64 61 74 61 20 62 75 66 ./* The data buf
3380: 66 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 fer. */.
3390: 20 20 20 20 20 20 69 6e 74 20 74 6f 57 72 69 74 int toWrit
33a0: 65 2c 09 09 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 e,../* How many
33b0: 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 3f 20 bytes to write?
33c0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 */.
33d0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
33e0: 74 72 29 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 tr)./* Where to
33f0: 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f 64 65 store error code
3400: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 . */.{. State
3410: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
3420: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
3430: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 72 69 ata;. int wri
3440: 74 74 65 6e 2c 20 65 72 72 3b 0a 0a 20 20 20 20 tten, err;..
3450: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3460: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
3470: 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 77 72 stderr,"\nBIO_wr
3480: 69 74 65 28 30 78 25 78 2c 20 25 64 29 22 2c 20 ite(0x%x, %d)",
3490: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 (unsigned int) s
34a0: 74 61 74 65 50 74 72 2c 20 74 6f 57 72 69 74 65 tatePtr, toWrite
34b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
34c0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c ePtr->flags & TL
34d0: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 S_TCL_CALLBACK)
34e0: 7b 0a 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 {. /* don'
34f0: 74 20 70 72 6f 63 65 73 73 20 61 6e 79 20 62 79 t process any by
3500: 74 65 73 20 77 68 69 6c 65 20 76 65 72 69 66 79 tes while verify
3510: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e callback is run
3520: 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 77 ning */. w
3530: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 ritten = -1;.
3540: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
3550: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 20 20 20 20 r = EAGAIN;.
3560: 20 20 20 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a goto output;.
3570: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 }.. if (!
3580: 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 SSL_is_init_fini
3590: 73 68 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 shed(statePtr->s
35a0: 73 6c 29 29 20 7b 0a 09 77 72 69 74 74 65 6e 20 sl)) {..written
35b0: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e = Tls_WaitForCon
35c0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 nect(statePtr, e
35d0: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 69 rrorCodePtr);..i
35e0: 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 f (written <= 0)
35f0: 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 6f 75 74 {.. goto out
3600: 70 75 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 put;..}. }.
3610: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
3620: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
3630: 49 4e 49 54 29 20 7b 0a 09 73 74 61 74 65 50 74 INIT) {..statePt
3640: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
3650: 53 5f 54 43 4c 5f 49 4e 49 54 29 3b 0a 20 20 20 S_TCL_INIT);.
3660: 20 7d 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69 }. if (toWri
3670: 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 72 69 te == 0) {..dpri
3680: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7a 65 72 ntf(stderr, "zer
3690: 6f 2d 77 72 69 74 65 5c 6e 22 29 3b 0a 09 42 49 o-write\n");..BI
36a0: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 O_flush(statePtr
36b0: 2d 3e 62 69 6f 29 3b 0a 09 77 72 69 74 74 65 6e ->bio);..written
36c0: 20 3d 20 30 3b 0a 09 67 6f 74 6f 20 6f 75 74 70 = 0;..goto outp
36d0: 75 74 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ut;. } else {
36e0: 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 6e 65 65 64 ../*.. * We need
36f0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 to clear the SS
3700: 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f L error stack no
3710: 77 20 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d w because we som
3720: 65 74 69 6d 65 73 20 72 65 61 63 68 0a 09 20 2a etimes reach.. *
3730: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 this function w
3740: 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72 72 ith leftover err
3750: 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b ors in the stack
3760: 2e 20 20 49 66 20 42 49 4f 5f 77 72 69 74 65 0a . If BIO_write.
3770: 09 20 2a 20 72 65 74 75 72 6e 73 20 2d 31 20 61 . * returns -1 a
3780: 6e 64 20 69 6e 74 65 6e 64 73 20 45 41 47 41 49 nd intends EAGAI
3790: 4e 2c 20 74 68 65 72 65 20 69 73 20 61 20 6c 65 N, there is a le
37a0: 66 74 6f 76 65 72 20 65 72 72 6f 72 2c 20 69 74 ftover error, it
37b0: 20 77 69 6c 6c 20 62 65 0a 09 20 2a 20 6d 69 73 will be.. * mis
37c0: 63 6f 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 construed as an
37d0: 65 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 error, not EAGAI
37e0: 4e 2e 0a 09 20 2a 0a 09 20 2a 20 41 6c 74 65 72 N... *.. * Alter
37f0: 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 natively, we may
3800: 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 want to handle
3810: 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f the <0 return co
3820: 64 65 73 20 66 72 6f 6d 0a 09 20 2a 20 42 49 4f des from.. * BIO
3830: 5f 77 72 69 74 65 20 73 70 65 63 69 61 6c 6c 79 _write specially
3840: 20 28 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 (as advised in
3850: 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 the RSA docs).
3860: 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 TLS's lower leve
3870: 6c 0a 09 20 2a 20 42 49 4f 20 66 75 6e 63 74 69 l.. * BIO functi
3880: 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 74 68 ons play with th
3890: 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 74 68 e retry flags th
38a0: 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 20 73 ough, and this s
38b0: 65 65 6d 73 20 74 6f 0a 09 20 2a 20 77 6f 72 6b eems to.. * work
38c0: 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 69 6d correctly. Sim
38d0: 69 6c 61 72 20 66 69 78 20 69 6e 20 54 6c 73 49 ilar fix in TlsI
38e0: 6e 70 75 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 nputProc. - hobb
38f0: 73 0a 09 20 2a 2f 0a 09 45 52 52 5f 63 6c 65 61 s.. */..ERR_clea
3900: 72 5f 65 72 72 6f 72 28 29 3b 0a 09 77 72 69 74 r_error();..writ
3910: 74 65 6e 20 3d 20 42 49 4f 5f 77 72 69 74 65 28 ten = BIO_write(
3920: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 statePtr->bio, b
3930: 75 66 2c 20 74 6f 57 72 69 74 65 29 3b 0a 09 64 uf, toWrite);..d
3940: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c printf(stderr,"\
3950: 6e 42 49 4f 5f 77 72 69 74 65 28 30 78 25 78 2c nBIO_write(0x%x,
3960: 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 0a 09 %d) -> [%d]",..
3970: 09 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 .(unsigned int)
3980: 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72 69 74 statePtr, toWrit
3990: 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 e, written);.
39a0: 20 7d 0a 20 20 20 20 69 66 20 28 77 72 69 74 74 }. if (writt
39b0: 65 6e 20 3c 3d 20 30 29 20 7b 0a 09 73 77 69 74 en <= 0) {..swit
39c0: 63 68 20 28 28 65 72 72 20 3d 20 53 53 4c 5f 67 ch ((err = SSL_g
39d0: 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 et_error(statePt
39e0: 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 6e 29 r->ssl, written)
39f0: 29 29 20 7b 0a 09 20 20 20 20 63 61 73 65 20 53 )) {.. case S
3a00: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 SL_ERROR_NONE:..
3a10: 09 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20 30 .if (written < 0
3a20: 29 20 7b 0a 09 09 20 20 20 20 77 72 69 74 74 65 ) {... writte
3a30: 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 09 62 72 65 n = 0;...}...bre
3a40: 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 53 53 ak;.. case SS
3a50: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 L_ERROR_WANT_WRI
3a60: 54 45 3a 0a 09 09 64 70 72 69 6e 74 66 28 73 74 TE:...dprintf(st
3a70: 64 65 72 72 2c 22 20 77 72 69 74 65 20 57 20 42 derr," write W B
3a80: 4c 4f 43 4b 22 29 3b 0a 09 09 62 72 65 61 6b 3b LOCK");...break;
3a90: 0a 09 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 .. case SSL_E
3aa0: 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a RROR_WANT_READ:.
3ab0: 09 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 ..dprintf(stderr
3ac0: 2c 22 20 77 72 69 74 65 20 52 20 42 4c 4f 43 4b ," write R BLOCK
3ad0: 22 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 ");...break;..
3ae0: 20 20 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 case SSL_ERROR
3af0: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 _WANT_X509_LOOKU
3b00: 50 3a 0a 09 09 64 70 72 69 6e 74 66 28 73 74 64 P:...dprintf(std
3b10: 65 72 72 2c 22 20 77 72 69 74 65 20 58 20 42 4c err," write X BL
3b20: 4f 43 4b 22 29 3b 0a 09 09 62 72 65 61 6b 3b 0a OCK");...break;.
3b30: 09 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52 . case SSL_ER
3b40: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a ROR_ZERO_RETURN:
3b50: 0a 09 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 ...dprintf(stder
3b60: 72 2c 22 20 63 6c 6f 73 65 64 5c 6e 22 29 3b 0a r," closed\n");.
3b70: 09 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 ..written = 0;..
3b80: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 .break;.. cas
3b90: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 e SSL_ERROR_SYSC
3ba0: 41 4c 4c 3a 0a 09 09 2a 65 72 72 6f 72 43 6f 64 ALL:...*errorCod
3bb0: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 ePtr = Tcl_GetEr
3bc0: 72 6e 6f 28 29 3b 0a 09 09 64 70 72 69 6e 74 66 rno();...dprintf
3bd0: 28 73 74 64 65 72 72 2c 22 20 5b 25 64 5d 20 73 (stderr," [%d] s
3be0: 79 73 63 61 6c 6c 20 65 72 72 72 3a 20 25 64 22 yscall errr: %d"
3bf0: 2c 0a 09 09 09 77 72 69 74 74 65 6e 2c 20 2a 65 ,....written, *e
3c00: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 09 rrorCodePtr);...
3c10: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 written = -1;...
3c20: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 break;.. case
3c30: 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a SSL_ERROR_SSL:.
3c40: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 ..Tls_Error(stat
3c50: 65 50 74 72 2c 20 53 53 4c 5f 45 52 52 4f 52 28 ePtr, SSL_ERROR(
3c60: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 statePtr->ssl, w
3c70: 72 69 74 74 65 6e 29 29 3b 0a 09 09 2a 65 72 72 ritten));...*err
3c80: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e orCodePtr = ECON
3c90: 4e 41 42 4f 52 54 45 44 3b 0a 09 09 77 72 69 74 NABORTED;...writ
3ca0: 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 62 72 65 61 ten = -1;...brea
3cb0: 6b 3b 0a 09 20 20 20 20 64 65 66 61 75 6c 74 3a k;.. default:
3cc0: 0a 09 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 ...dprintf(stder
3cd0: 72 2c 22 20 75 6e 6b 6e 6f 77 6e 20 65 72 72 3a r," unknown err:
3ce0: 20 25 64 5c 6e 22 2c 20 65 72 72 29 3b 0a 09 09 %d\n", err);...
3cf0: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a break;..}. }.
3d00: 20 20 20 20 6f 75 74 70 75 74 3a 0a 20 20 20 20 output:.
3d10: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 dprintf(stderr,
3d20: 22 5c 6e 4f 75 74 70 75 74 28 25 64 29 20 2d 3e "\nOutput(%d) ->
3d30: 20 25 64 22 2c 20 74 6f 57 72 69 74 65 2c 20 77 %d", toWrite, w
3d40: 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 72 65 74 ritten);. ret
3d50: 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a 7d 0a 0c urn written;.}..
3d60: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 ---------. *. *
3db0: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 TlsGetOptionProc
3dc0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 75 74 --. *. *.Comput
3dd0: 65 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61 6c es an option val
3de0: 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 ue for a SSL soc
3df0: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
3e00: 6c 2c 20 6f 72 20 61 0a 20 2a 09 6c 69 73 74 20 l, or a. *.list
3e10: 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 of all options a
3e20: 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e nd their values.
3e30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3e40: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
3e50: 6c 20 72 65 73 75 6c 74 2e 20 54 68 65 20 76 61 l result. The va
3e60: 6c 75 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 lue of the speci
3e70: 66 69 65 64 20 6f 70 74 69 6f 6e 20 6f 72 20 61 fied option or a
3e80: 0a 20 2a 09 6c 69 73 74 20 6f 66 20 61 6c 6c 20 . *.list of all
3e90: 6f 70 74 69 6f 6e 73 20 61 6e 64 09 74 68 65 69 options and.thei
3ea0: 72 20 76 61 6c 75 65 73 20 69 73 20 72 65 74 75 r values is retu
3eb0: 72 6e 65 64 20 69 6e 20 74 68 65 0a 20 2a 09 73 rned in the. *.s
3ec0: 75 70 70 6c 69 65 64 20 44 53 74 72 69 6e 67 2e upplied DString.
3ed0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3ee0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
3ef0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f30: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
3f40: 63 20 69 6e 74 0a 54 6c 73 47 65 74 4f 70 74 69 c int.TlsGetOpti
3f50: 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 onProc(ClientDat
3f60: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 a instanceData,.
3f70: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e /* Socket state.
3f80: 20 2a 2f 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20 */..Tcl_Interp
3f90: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 *interp,../* For
3fa0: 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 errors - can be
3fb0: 20 4e 55 4c 4c 2e 20 2a 2f 0a 09 43 4f 4e 53 54 NULL. */..CONST
3fc0: 38 34 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 84 char *optionN
3fd0: 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 ame,./* Name of
3fe0: 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 0a 09 09 the option to...
3ff0: 09 09 09 20 2a 20 72 65 74 72 69 65 76 65 20 74 ... * retrieve t
4000: 68 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 he value for, or
4010: 0a 09 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f ...... * NULL to
4020: 20 67 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 get all options
4030: 20 61 6e 64 0a 09 09 09 09 09 20 2a 20 74 68 65 and...... * the
4040: 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 09 54 ir values. */..T
4050: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 74 cl_DString *dsPt
4060: 72 29 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 r)../* Where to
4070: 73 74 6f 72 65 20 74 68 65 20 63 6f 6d 70 75 74 store the comput
4080: 65 64 20 76 61 6c 75 65 0a 09 09 09 09 09 20 2a ed value...... *
4090: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 initialized by
40a0: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 caller. */.{.
40b0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
40c0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
40d0: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 tanceData;..
40e0: 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 if (channelTypeV
40f0: 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 ersion == TLS_CH
4100: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 ANNEL_VERSION_2)
4110: 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 {..Tcl_Channel
4120: 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c 73 5f 47 downChan = Tls_G
4130: 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 etParent(statePt
4140: 72 29 3b 0a 09 54 63 6c 5f 44 72 69 76 65 72 47 r);..Tcl_DriverG
4150: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 etOptionProc *ge
4160: 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 09 67 tOptionProc;...g
4170: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 etOptionProc = T
4180: 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 cl_ChannelGetOpt
4190: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 ionProc(Tcl_GetC
41a0: 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 hannelType(downC
41b0: 68 61 6e 29 29 3b 0a 09 69 66 20 28 67 65 74 4f han));..if (getO
41c0: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c ptionProc != NUL
41d0: 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e L) {.. return
41e0: 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 (*getOptionProc
41f0: 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c )(Tcl_GetChannel
4200: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f 77 InstanceData(dow
4210: 6e 43 68 61 6e 29 2c 0a 09 09 20 20 20 20 69 6e nChan),... in
4220: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 terp, optionName
4230: 2c 20 64 73 50 74 72 29 3b 0a 09 7d 20 65 6c 73 , dsPtr);..} els
4240: 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 e if (optionName
4250: 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c == (char*) NULL
4260: 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 ) {.. /*..
4270: 20 20 2a 20 52 65 71 75 65 73 74 20 69 73 20 71 * Request is q
4280: 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 uery for all opt
4290: 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b ions, this is ok
42a0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 ... */..
42b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
42c0: 7d 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73 }../*.. * Reques
42d0: 74 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 t for a specific
42e0: 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 option has to f
42f0: 61 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 ail, we don't ha
4300: 76 65 20 61 6e 79 2e 0a 09 20 2a 2f 0a 09 72 65 ve any... */..re
4310: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
4320: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 69 } else {..si
4330: 7a 65 5f 74 20 6c 65 6e 20 3d 20 30 3b 0a 0a 09 ze_t len = 0;...
4340: 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 21 if (optionName !
4350: 3d 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 = (char *) NULL)
4360: 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 74 {.. len = st
4370: 72 6c 65 6e 28 6f 70 74 69 6f 6e 4e 61 6d 65 29 rlen(optionName)
4380: 3b 0a 09 7d 0a 23 69 66 20 30 0a 09 69 66 20 28 ;..}.#if 0..if (
4390: 28 6c 65 6e 20 3d 3d 20 30 29 20 7c 7c 20 28 28 (len == 0) || ((
43a0: 6c 65 6e 20 3e 20 31 29 20 26 26 20 28 6f 70 74 len > 1) && (opt
43b0: 69 6f 6e 4e 61 6d 65 5b 31 5d 20 3d 3d 20 27 63 ionName[1] == 'c
43c0: 27 29 20 26 26 0a 09 09 28 73 74 72 6e 63 6d 70 ') &&...(strncmp
43d0: 28 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 2d 63 (optionName, "-c
43e0: 69 70 68 65 72 22 2c 20 6c 65 6e 29 20 3d 3d 20 ipher", len) ==
43f0: 30 29 29 29 20 7b 0a 09 20 20 20 20 69 66 20 28 0))) {.. if (
4400: 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 54 63 len == 0) {...Tc
4410: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 l_DStringAppendE
4420: 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 22 2d lement(dsPtr, "-
4430: 63 69 70 68 65 72 22 29 3b 0a 09 20 20 20 20 7d cipher");.. }
4440: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
4450: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 gAppendElement(d
4460: 73 50 74 72 2c 20 53 53 4c 5f 67 65 74 5f 63 69 sPtr, SSL_get_ci
4470: 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 pher(statePtr->s
4480: 73 6c 29 29 3b 0a 09 20 20 20 20 69 66 20 28 6c sl));.. if (l
4490: 65 6e 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 en) {...return T
44a0: 43 4c 5f 4f 4b 3b 0a 09 20 20 20 20 7d 0a 09 7d CL_OK;.. }..}
44b0: 0a 23 65 6e 64 69 66 0a 09 72 65 74 75 72 6e 20 .#endif..return
44c0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 7d 0a TCL_OK;. }.}.
44d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
4520: 20 54 6c 73 57 61 74 63 68 50 72 6f 63 20 2d 2d TlsWatchProc --
4530: 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a . *. *.Initializ
4540: 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 74 e the notifier t
4550: 6f 20 77 61 74 63 68 20 54 63 6c 5f 46 69 6c 65 o watch Tcl_File
4560: 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68 61 6e s from this chan
4570: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c nel.. *. * Resul
4580: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
4590: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
45a0: 0a 20 2a 09 53 65 74 73 20 75 70 20 74 68 65 20 . *.Sets up the
45b0: 6e 6f 74 69 66 69 65 72 20 73 6f 20 74 68 61 74 notifier so that
45c0: 20 61 20 66 75 74 75 72 65 20 65 76 65 6e 74 20 a future event
45d0: 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 on the channel.
45e0: 2a 09 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 *.will be seen b
45f0: 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d y Tcl.. *. *----
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4640: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 */..static void
4650: 0a 54 6c 73 57 61 74 63 68 50 72 6f 63 28 43 6c .TlsWatchProc(Cl
4660: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
4670: 65 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f eData,./* The so
4680: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 cket state. */.
4690: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 int
46a0: 6d 61 73 6b 29 09 09 09 2f 2a 20 45 76 65 6e 74 mask).../* Event
46b0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 3b 20 61 s of interest; a
46c0: 6e 20 4f 52 2d 65 64 0a 20 20 20 20 20 20 20 20 n OR-ed.
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
46f0: 20 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f * combination o
4700: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 0a f TCL_READABLE,.
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4730: 20 20 20 20 20 20 20 20 20 2a 20 54 43 4c 5f 57 * TCL_W
4740: 52 49 54 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f RITABLE and TCL_
4750: 45 58 43 45 50 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a EXCEPTION. */.{.
4760: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
4770: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
4780: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 instanceData;..
4790: 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 dprintf(stder
47a0: 72 2c 20 22 54 6c 73 57 61 74 63 68 50 72 6f 63 r, "TlsWatchProc
47b0: 28 30 78 25 78 29 5c 6e 22 2c 20 6d 61 73 6b 29 (0x%x)\n", mask)
47c0: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 65 6e ;.. /* Preten
47d0: 64 20 74 6f 20 62 65 20 64 65 61 64 20 61 73 20 d to be dead as
47e0: 6c 6f 6e 67 20 61 73 20 74 68 65 20 76 65 72 69 long as the veri
47f0: 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 fy callback is r
4800: 75 6e 6e 69 6e 67 2e 20 0a 20 20 20 20 20 2a 20 unning. . *
4810: 4f 74 68 65 72 77 69 73 65 20 74 68 61 74 20 63 Otherwise that c
4820: 61 6c 6c 62 61 63 6b 20 63 6f 75 6c 64 20 62 65 allback could be
4830: 20 69 6e 76 6f 6b 65 64 20 72 65 63 75 72 73 69 invoked recursi
4840: 76 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 20 vely. */. if
4850: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
4860: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 & TLS_TCL_CALLB
4870: 41 43 4b 29 20 7b 20 72 65 74 75 72 6e 3b 20 7d ACK) { return; }
4880: 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 .. if (channe
4890: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 lTypeVersion ==
48a0: 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 TLS_CHANNEL_VERS
48b0: 49 4f 4e 5f 32 29 20 7b 0a 09 54 63 6c 5f 43 68 ION_2) {..Tcl_Ch
48c0: 61 6e 6e 65 6c 20 20 20 20 20 64 6f 77 6e 43 68 annel downCh
48d0: 61 6e 3b 0a 0a 09 73 74 61 74 65 50 74 72 2d 3e an;...statePtr->
48e0: 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b watchMask = mask
48f0: 3b 0a 0a 09 2f 2a 20 4e 6f 20 63 68 61 6e 6e 65 ;.../* No channe
4900: 6c 20 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d l handlers any m
4910: 6f 72 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20 ore. We will be
4920: 6e 6f 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74 notified automat
4930: 69 63 61 6c 6c 79 0a 09 20 2a 20 61 62 6f 75 74 ically.. * about
4940: 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 events on the c
4950: 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69 61 hannel below via
4960: 20 61 20 63 61 6c 6c 20 74 6f 20 6f 75 72 0a 09 a call to our..
4970: 20 2a 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 * 'TransformNot
4980: 69 66 79 50 72 6f 63 27 2e 20 42 75 74 20 77 65 ifyProc'. But we
4990: 20 68 61 76 65 20 74 6f 20 70 61 73 73 20 74 68 have to pass th
49a0: 65 20 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20 e interest down
49b0: 6e 6f 77 2e 0a 09 20 2a 20 57 65 20 61 72 65 20 now... * We are
49c0: 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64 20 61 allowed to add a
49d0: 64 64 69 74 69 6f 6e 61 6c 20 27 69 6e 74 65 72 dditional 'inter
49e0: 65 73 74 27 20 74 6f 20 74 68 65 20 6d 61 73 6b est' to the mask
49f0: 20 69 66 20 77 65 20 77 61 6e 74 0a 09 20 2a 20 if we want.. *
4a00: 74 6f 2e 20 42 75 74 20 74 68 69 73 20 74 72 61 to. But this tra
4a10: 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20 nsformation has
4a20: 6e 6f 20 73 75 63 68 20 69 6e 74 65 72 65 73 74 no such interest
4a30: 2e 20 49 74 20 6a 75 73 74 20 70 61 73 73 65 73 . It just passes
4a40: 0a 09 20 2a 20 74 68 65 20 72 65 71 75 65 73 74 .. * the request
4a50: 20 64 6f 77 6e 2c 20 75 6e 63 68 61 6e 67 65 64 down, unchanged
4a60: 2e 0a 09 20 2a 2f 0a 0a 09 64 6f 77 6e 43 68 61 ... */...downCha
4a70: 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e n = Tls_GetParen
4a80: 74 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 09 28 t(statePtr);...(
4a90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
4aa0: 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 0a 09 20 pe(downChan))..
4ab0: 20 20 20 2d 3e 77 61 74 63 68 50 72 6f 63 28 54 ->watchProc(T
4ac0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
4ad0: 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 tanceData(downCh
4ae0: 61 6e 29 2c 20 6d 61 73 6b 29 3b 0a 0a 09 2f 2a an), mask);.../*
4af0: 0a 09 20 2a 20 4d 61 6e 61 67 65 6d 65 6e 74 20 .. * Management
4b00: 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 of the internal
4b10: 74 69 6d 65 72 2e 0a 09 20 2a 2f 0a 0a 09 69 66 timer... */...if
4b20: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
4b30: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
4b40: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 oken) NULL) {..
4b50: 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d Tcl_DeleteTim
4b60: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 erHandler(stateP
4b70: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 20 20 20 tr->timer);..
4b80: 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 statePtr->timer
4b90: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b = (Tcl_TimerTok
4ba0: 65 6e 29 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 69 66 en) NULL;..}..if
4bb0: 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 ((mask & TCL_RE
4bc0: 41 44 41 42 4c 45 29 20 26 26 20 54 63 6c 5f 49 ADABLE) && Tcl_I
4bd0: 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 nputBuffered(sta
4be0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 tePtr->self) > 0
4bf0: 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 ) {.. /*..
4c00: 20 20 2a 20 54 68 65 72 65 20 69 73 20 69 6e 74 * There is int
4c10: 65 72 65 73 74 20 69 6e 20 72 65 61 64 61 62 6c erest in readabl
4c20: 65 20 65 76 65 6e 74 73 20 61 6e 64 20 77 65 20 e events and we
4c30: 61 63 74 75 61 6c 6c 79 20 68 61 76 65 0a 09 20 actually have..
4c40: 20 20 20 20 2a 20 64 61 74 61 20 77 61 69 74 69 * data waiti
4c50: 6e 67 2c 20 73 6f 20 67 65 6e 65 72 61 74 65 20 ng, so generate
4c60: 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 a timer to flush
4c70: 20 74 68 61 74 2e 0a 09 20 20 20 20 20 2a 2f 0a that... */.
4c80: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 . statePtr->t
4c90: 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 imer = Tcl_Creat
4ca0: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c eTimerHandler(TL
4cb0: 53 5f 54 43 4c 5f 44 45 4c 41 59 2c 0a 09 09 20 S_TCL_DELAY,...
4cc0: 20 20 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e TlsChannelHan
4cd0: 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 65 dlerTimer, (Clie
4ce0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
4cf0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 );..}. } else
4d00: 20 7b 0a 09 69 66 20 28 6d 61 73 6b 20 3d 3d 20 {..if (mask ==
4d10: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d statePtr->watchM
4d20: 61 73 6b 29 0a 09 20 20 20 20 72 65 74 75 72 6e ask).. return
4d30: 3b 0a 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 ;...if (statePtr
4d40: 2d 3e 77 61 74 63 68 4d 61 73 6b 29 20 7b 0a 09 ->watchMask) {..
4d50: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 52 /*.. * R
4d60: 65 6d 6f 76 65 20 65 76 65 6e 74 20 68 61 6e 64 emove event hand
4d70: 6c 65 72 20 74 6f 20 75 6e 64 65 72 6c 79 69 6e ler to underlyin
4d80: 67 20 63 68 61 6e 6e 65 6c 2c 20 74 68 69 73 20 g channel, this
4d90: 63 6f 75 6c 64 0a 09 20 20 20 20 20 2a 20 62 65 could.. * be
4da0: 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 because we are
4db0: 63 6c 6f 73 69 6e 67 20 66 6f 72 20 72 65 61 6c closing for real
4dc0: 2c 20 6f 72 20 62 65 69 6e 67 20 22 75 6e 73 74 , or being "unst
4dd0: 61 63 6b 65 64 22 2e 0a 09 20 20 20 20 20 2a 2f acked"... */
4de0: 0a 0a 09 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 ... Tcl_Delet
4df0: 65 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 eChannelHandler(
4e00: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 Tls_GetParent(st
4e10: 61 74 65 50 74 72 29 2c 0a 09 09 20 20 20 20 54 atePtr),... T
4e20: 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 lsChannelHandler
4e30: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
4e40: 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 09 73 74 tatePtr);..}..st
4e50: 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 atePtr->watchMas
4e60: 6b 20 3d 20 6d 61 73 6b 3b 0a 09 69 66 20 28 73 k = mask;..if (s
4e70: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 tatePtr->watchMa
4e80: 73 6b 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 sk) {.. /*..
4e90: 20 20 20 20 2a 20 53 65 74 75 70 20 61 63 74 69 * Setup acti
4ea0: 76 65 20 6d 6f 6e 69 74 6f 72 20 66 6f 72 20 65 ve monitor for e
4eb0: 76 65 6e 74 73 20 6f 6e 20 75 6e 64 65 72 6c 79 vents on underly
4ec0: 69 6e 67 20 43 68 61 6e 6e 65 6c 2e 0a 09 20 20 ing Channel...
4ed0: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f */... Tcl_
4ee0: 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 48 61 6e CreateChannelHan
4ef0: 64 6c 65 72 28 54 6c 73 5f 47 65 74 50 61 72 65 dler(Tls_GetPare
4f00: 6e 74 28 73 74 61 74 65 50 74 72 29 2c 0a 09 09 nt(statePtr),...
4f10: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 statePtr->wa
4f20: 74 63 68 4d 61 73 6b 2c 20 54 6c 73 43 68 61 6e tchMask, TlsChan
4f30: 6e 65 6c 48 61 6e 64 6c 65 72 2c 0a 09 09 20 20 nelHandler,...
4f40: 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 (ClientData) s
4f50: 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20 tatePtr);..}.
4f60: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d }.}.../*. *----
4f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4fb0: 20 2a 0a 20 2a 20 54 6c 73 47 65 74 48 61 6e 64 *. * TlsGetHand
4fc0: 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 leProc --. *. *.
4fd0: 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f Called from Tcl_
4fe0: 47 65 74 43 68 61 6e 6e 65 6c 46 69 6c 65 20 74 GetChannelFile t
4ff0: 6f 20 72 65 74 72 69 65 76 65 20 6f 2f 73 20 66 o retrieve o/s f
5000: 69 6c 65 20 68 61 6e 64 6c 65 72 0a 20 2a 09 66 ile handler. *.f
5010: 72 6f 6d 20 74 68 65 20 53 53 4c 20 73 6f 63 6b rom the SSL sock
5020: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
5030: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
5040: 0a 20 2a 09 54 68 65 20 61 70 70 72 6f 70 72 69 . *.The appropri
5050: 61 74 65 20 54 63 6c 5f 46 69 6c 65 20 6f 72 20 ate Tcl_File or
5060: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 70 72 65 73 NULL if not pres
5070: 65 6e 74 2e 20 0a 20 2a 0a 20 2a 20 53 69 64 65 ent. . *. * Side
5080: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
5090: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
50e0: 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 47 65 static int.TlsGe
50f0: 74 48 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 tHandleProc(Clie
5100: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
5110: 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b ata,./* The sock
5120: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 et state. */.
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e in
5140: 74 20 64 69 72 65 63 74 69 6f 6e 2c 09 09 2f 2a t direction,../*
5150: 20 57 68 69 63 68 20 54 63 6c 5f 46 69 6c 65 20 Which Tcl_File
5160: 74 6f 20 72 65 74 72 69 65 76 65 3f 20 2a 2f 0a to retrieve? */.
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5180: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e ClientData *han
5190: 64 6c 65 50 74 72 29 09 2f 2a 20 57 68 65 72 65 dlePtr)./* Where
51a0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 68 61 to store the ha
51b0: 6e 64 6c 65 2e 20 20 2a 2f 0a 7b 0a 20 20 20 20 ndle. */.{.
51c0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
51d0: 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 = (State *) inst
51e0: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 72 anceData;.. r
51f0: 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 eturn Tcl_GetCha
5200: 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 6c 73 5f 47 nnelHandle(Tls_G
5210: 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 etParent(statePt
5220: 72 29 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 r), direction, h
5230: 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0c 0a 2f andlePtr);.}.../
5240: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
5290: 73 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 sNotifyProc --.
52a0: 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20 63 61 6c *. *.Handler cal
52b0: 6c 65 64 20 62 79 20 54 63 6c 20 74 6f 20 69 6e led by Tcl to in
52c0: 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76 form us of activ
52d0: 69 74 79 0a 20 2a 09 6f 6e 20 74 68 65 20 75 6e ity. *.on the un
52e0: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
52f0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
5300: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 . *.None.. *. *
5310: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
5320: 09 4d 61 79 20 70 72 6f 63 65 73 73 20 74 68 65 .May process the
5330: 20 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 incoming event
5340: 62 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a by itself.. *. *
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
53a0: 69 6e 74 0a 54 6c 73 4e 6f 74 69 66 79 50 72 6f int.TlsNotifyPro
53b0: 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 c(instanceData,
53c0: 6d 61 73 6b 29 0a 20 20 20 20 43 6c 69 65 6e 74 mask). Client
53d0: 44 61 74 61 09 20 20 20 69 6e 73 74 61 6e 63 65 Data. instance
53e0: 44 61 74 61 3b 20 2f 2a 20 54 68 65 20 73 74 61 Data; /* The sta
53f0: 74 65 20 6f 66 20 74 68 65 20 6e 6f 74 69 66 69 te of the notifi
5400: 65 64 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f ed transformatio
5410: 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 20 20 n */. int..
5420: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 2f 2a 20 mask; /*
5430: 54 68 65 20 6d 61 73 6b 20 6f 66 20 6f 63 63 75 The mask of occu
5440: 72 69 6e 67 20 65 76 65 6e 74 73 20 2a 2f 0a 7b ring events */.{
5450: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
5460: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
5470: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a instanceData;..
5480: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e /*. * An
5490: 20 65 76 65 6e 74 20 6f 63 63 75 72 65 64 20 69 event occured i
54a0: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 n the underlying
54b0: 20 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a channel. This.
54c0: 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d * transform
54d0: 61 74 69 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72 ation doesn't pr
54e0: 6f 63 65 73 73 20 73 75 63 68 20 65 76 65 6e 74 ocess such event
54f0: 73 20 74 68 75 73 20 72 65 74 75 72 6e 73 20 74 s thus returns t
5500: 68 65 0a 20 20 20 20 20 2a 20 69 6e 63 6f 6d 69 he. * incomi
5510: 6e 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e 67 65 ng mask unchange
5520: 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 d.. */..
5530: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
5540: 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
5550: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a rToken) NULL) {.
5560: 09 2f 2a 0a 09 20 2a 20 44 65 6c 65 74 65 20 61 ./*.. * Delete a
5570: 6e 20 65 78 69 73 74 69 6e 67 20 74 69 6d 65 72 n existing timer
5580: 2e 20 49 74 20 77 61 73 20 6e 6f 74 20 66 69 72 . It was not fir
5590: 65 64 2c 20 79 65 74 20 77 65 20 61 72 65 0a 09 ed, yet we are..
55a0: 20 2a 20 68 65 72 65 2c 20 73 6f 20 74 68 65 20 * here, so the
55b0: 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 67 65 channel below ge
55c0: 6e 65 72 61 74 65 64 20 73 75 63 68 20 61 6e 20 nerated such an
55d0: 65 76 65 6e 74 20 61 6e 64 20 77 65 0a 09 20 2a event and we.. *
55e0: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 2e 20 don't have to.
55f0: 54 68 65 20 72 65 6e 65 77 61 6c 20 6f 66 20 74 The renewal of t
5600: 68 65 20 69 6e 74 65 72 65 73 74 20 61 66 74 65 he interest afte
5610: 72 20 74 68 65 0a 09 20 2a 20 65 78 65 63 75 74 r the.. * execut
5620: 69 6f 6e 20 6f 66 20 63 68 61 6e 6e 65 6c 20 68 ion of channel h
5630: 61 6e 64 6c 65 72 73 20 77 69 6c 6c 20 65 76 65 andlers will eve
5640: 6e 74 75 61 6c 6c 79 20 63 61 75 73 65 20 75 73 ntually cause us
5650: 20 74 6f 0a 09 20 2a 20 72 65 63 72 65 61 74 65 to.. * recreate
5660: 20 74 68 65 20 74 69 6d 65 72 20 28 69 6e 20 57 the timer (in W
5670: 61 74 63 68 50 72 6f 63 29 2e 0a 09 20 2a 2f 0a atchProc)... */.
5680: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
5690: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
56a0: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
56b0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 ePtr->timer = (T
56c0: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
56d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
56e0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0c return mask;.}..
56f0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
5730: 0a 20 2a 20 20 20 20 20 20 54 6c 73 43 68 61 6e . * TlsChan
5740: 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a nelHandler --. *
5750: 0a 20 2a 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d . * -------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 20 20 20 ---------*. *
5790: 20 20 20 48 61 6e 64 6c 65 72 20 63 61 6c 6c 65 Handler calle
57a0: 64 20 62 79 20 54 63 6c 20 61 73 20 61 20 72 65 d by Tcl as a re
57b0: 73 75 6c 74 20 6f 66 0a 20 2a 20 20 20 20 20 20 sult of. *
57c0: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 Tcl_CreateChanne
57d0: 6c 48 61 6e 64 6c 65 72 20 2d 20 74 6f 20 69 6e lHandler - to in
57e0: 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76 form us of activ
57f0: 69 74 79 0a 20 2a 20 20 20 20 20 20 6f 6e 20 74 ity. * on t
5800: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 he underlying ch
5810: 61 6e 6e 65 6c 2e 0a 20 2a 20 20 20 20 20 20 2d annel.. * -
5820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
5850: 0a 20 2a 0a 20 2a 20 20 20 20 20 20 53 69 64 65 . *. * Side
5860: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 20 effects:. *
5870: 20 20 20 20 20 20 20 20 20 4d 61 79 20 67 65 6e May gen
5880: 65 72 61 74 65 20 73 75 62 73 65 71 75 65 6e 74 erate subsequent
5890: 20 63 61 6c 6c 73 20 74 6f 0a 20 2a 20 20 20 20 calls to. *
58a0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 6f Tcl_No
58b0: 74 69 66 79 43 68 61 6e 6e 65 6c 2e 0a 20 2a 0a tifyChannel.. *.
58c0: 20 2a 20 20 20 20 20 20 52 65 73 75 6c 74 3a 0a * Result:.
58d0: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
58e0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5920: 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 -*. */..static v
5930: 6f 69 64 0a 54 6c 73 43 68 61 6e 6e 65 6c 48 61 oid.TlsChannelHa
5940: 6e 64 6c 65 72 20 28 63 6c 69 65 6e 74 44 61 74 ndler (clientDat
5950: 61 2c 20 6d 61 73 6b 29 0a 20 20 20 20 43 6c 69 a, mask). Cli
5960: 65 6e 74 44 61 74 61 20 20 20 20 20 63 6c 69 65 entData clie
5970: 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 ntData;. int
5980: 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 3b mask;
5990: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 .{. State *st
59a0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
59b0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a *) clientData;..
59c0: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 dprintf(stderr,
59d0: 22 48 41 4e 44 4c 45 52 28 30 78 25 78 29 5c 6e "HANDLER(0x%x)\n
59e0: 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 54 63 ", mask);. Tc
59f0: 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 l_Preserve( (Cli
5a00: 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72 entData)statePtr
5a10: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d 61 73 6b );.. if (mask
5a20: 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 & TCL_READABLE)
5a30: 20 7b 0a 09 42 49 4f 5f 73 65 74 5f 66 6c 61 67 {..BIO_set_flag
5a40: 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 s(statePtr->p_bi
5a50: 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41 o, BIO_FLAGS_REA
5a60: 44 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b D);. } else {
5a70: 0a 09 42 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 ..BIO_clear_flag
5a80: 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 s(statePtr->p_bi
5a90: 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 45 41 o, BIO_FLAGS_REA
5aa0: 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 D);. }.. i
5ab0: 66 20 28 6d 61 73 6b 20 26 20 54 43 4c 5f 57 52 f (mask & TCL_WR
5ac0: 49 54 41 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 ITABLE) {..BIO_s
5ad0: 65 74 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 et_flags(statePt
5ae0: 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c r->p_bio, BIO_FL
5af0: 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 AGS_WRITE);.
5b00: 7d 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f 63 6c } else {..BIO_cl
5b10: 65 61 72 5f 66 6c 61 67 73 28 73 74 61 74 65 50 ear_flags(stateP
5b20: 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 tr->p_bio, BIO_F
5b30: 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 20 20 LAGS_WRITE);.
5b40: 20 7d 0a 0a 20 20 20 20 6d 61 73 6b 20 3d 20 30 }.. mask = 0
5b50: 3b 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 77 70 ;. if (BIO_wp
5b60: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d ending(statePtr-
5b70: 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c >bio)) {..mask |
5b80: 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a = TCL_WRITABLE;.
5b90: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 42 49 }. if (BI
5ba0: 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 O_pending(stateP
5bb0: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 tr->bio)) {..mas
5bc0: 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c k |= TCL_READABL
5bd0: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a E;. }.. /*
5be0: 0a 20 20 20 20 20 2a 20 54 68 65 20 66 6f 6c 6c . * The foll
5bf0: 6f 77 69 6e 67 20 4e 6f 74 69 66 79 43 68 61 6e owing NotifyChan
5c00: 6e 65 6c 20 63 61 6c 6c 73 20 73 65 65 6d 73 20 nel calls seems
5c10: 74 6f 20 62 65 20 69 6d 70 6f 72 74 61 6e 74 2c to be important,
5c20: 20 62 75 74 0a 20 20 20 20 20 2a 20 77 65 20 64 but. * we d
5c30: 6f 6e 27 74 20 6b 6e 6f 77 20 77 68 79 2e 20 20 on't know why.
5c40: 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 69 66 It looks like if
5c50: 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 76 65 the mask is eve
5c60: 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 20 20 20 20 20 r non-zero.
5c70: 2a 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 65 * that it will e
5c80: 6e 74 65 72 20 61 6e 20 69 6e 66 69 6e 69 74 65 nter an infinite
5c90: 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 2a 0a 20 20 loop.. *.
5ca0: 20 20 20 2a 20 4e 6f 74 69 66 79 20 74 68 65 20 * Notify the
5cb0: 75 70 70 65 72 20 63 68 61 6e 6e 65 6c 20 6f 66 upper channel of
5cc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 42 49 4f the current BIO
5cd0: 20 73 74 61 74 65 20 73 6f 20 74 68 65 20 65 76 state so the ev
5ce0: 65 6e 74 0a 20 20 20 20 20 2a 20 63 6f 6e 74 69 ent. * conti
5cf0: 6e 75 65 73 20 74 6f 20 70 72 6f 70 61 67 61 74 nues to propagat
5d00: 65 20 75 70 20 74 68 65 20 63 68 61 69 6e 2e 0a e up the chain..
5d10: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 73 74 *. * st
5d20: 61 6e 74 6f 6e 3a 20 49 74 20 6c 6f 6f 6b 73 20 anton: It looks
5d30: 6c 69 6b 65 20 74 68 69 73 20 63 6f 75 6c 64 20 like this could
5d40: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 66 result in an inf
5d50: 69 6e 69 74 65 20 6c 6f 6f 70 20 69 66 0a 20 20 inite loop if.
5d60: 20 20 20 2a 20 74 68 65 20 75 70 70 65 72 20 63 * the upper c
5d70: 68 61 6e 6e 65 6c 20 64 6f 65 73 6e 27 74 20 63 hannel doesn't c
5d80: 61 75 73 65 20 43 68 61 6e 6e 65 6c 48 61 6e 64 ause ChannelHand
5d90: 6c 65 72 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 ler to be remove
5da0: 64 0a 20 20 20 20 20 2a 20 62 65 66 6f 72 65 20 d. * before
5db0: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
5dc0: 6c 20 63 61 6c 6c 73 20 63 68 61 6e 6e 65 6c 20 l calls channel
5dd0: 68 61 6e 64 6c 65 72 73 20 6f 6e 20 74 68 65 20 handlers on the
5de0: 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 2e 0a 20 lower channel..
5df0: 20 20 20 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 */. .
5e00: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
5e10: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 l(statePtr->self
5e20: 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 0a 20 20 , mask);. .
5e30: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
5e40: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
5e50: 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 29 20 7b merToken)NULL) {
5e60: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
5e70: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
5e80: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
5e90: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 ePtr->timer = (T
5ea0: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 cl_TimerToken)NU
5eb0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
5ec0: 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 ((mask & TCL_RE
5ed0: 41 44 41 42 4c 45 29 20 26 26 20 54 63 6c 5f 49 ADABLE) && Tcl_I
5ee0: 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 nputBuffered(sta
5ef0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 tePtr->self) > 0
5f00: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 61 74 61 ) {../*.. * Data
5f10: 20 69 73 20 77 61 69 74 69 6e 67 2c 20 66 6c 75 is waiting, flu
5f20: 73 68 20 69 74 20 6f 75 74 20 69 6e 20 73 68 6f sh it out in sho
5f30: 72 74 20 74 69 6d 65 0a 09 20 2a 2f 0a 09 73 74 rt time.. */..st
5f40: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
5f50: 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 Tcl_CreateTimerH
5f60: 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f 44 andler(TLS_TCL_D
5f70: 45 4c 41 59 2c 0a 09 09 54 6c 73 43 68 61 6e 6e ELAY,...TlsChann
5f80: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 elHandlerTimer,
5f90: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
5fa0: 74 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 tePtr);. }.
5fb0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 Tcl_Release( (
5fc0: 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74 65 ClientData)state
5fd0: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6010: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
6020: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 ChannelHandlerTi
6030: 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d mer --. *. *.---
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
6070: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 *.Called by the
6080: 6e 6f 74 69 66 69 65 72 20 28 2d 3e 20 74 69 6d notifier (-> tim
6090: 65 72 29 20 74 6f 20 66 6c 75 73 68 20 6f 75 74 er) to flush out
60a0: 0a 20 2a 09 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 . *.information
60b0: 77 61 69 74 69 6e 67 20 69 6e 20 63 68 61 6e 6e waiting in chann
60c0: 65 6c 20 62 75 66 66 65 72 73 2e 0a 20 2a 09 2d el buffers.. *.-
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 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
6100: 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63 . *. *.Sideeffec
6110: 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 ts:. *..As of 'T
6120: 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 lsChannelHandler
6130: 27 2e 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a '.. *. *.Result:
6140: 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a . *..None.. *. *
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6180: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 ------*. */..sta
6190: 74 69 63 20 76 6f 69 64 0a 54 6c 73 43 68 61 6e tic void.TlsChan
61a0: 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 nelHandlerTimer
61b0: 28 63 6c 69 65 6e 74 44 61 74 61 29 0a 43 6c 69 (clientData).Cli
61c0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
61d0: 74 61 3b 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d ta; /* Transform
61e0: 61 74 69 6f 6e 20 74 6f 20 71 75 65 72 79 20 2a ation to query *
61f0: 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 /.{. State *s
6200: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
6210: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
6220: 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 int mask = 0
6230: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d ;.. statePtr-
6240: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
6250: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a merToken) NULL;.
6260: 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 77 70 65 . if (BIO_wpe
6270: 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e nding(statePtr->
6280: 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d bio)) {..mask |=
6290: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 TCL_WRITABLE;.
62a0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 42 49 4f }. if (BIO
62b0: 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 _pending(statePt
62c0: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b r->bio)) {..mask
62d0: 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 |= TCL_READABLE
62e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
62f0: 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 NotifyChannel(st
6300: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 atePtr->self, ma
6310: 73 6b 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d sk);.}.../*. *--
6320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6350: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f ----*. *. *.Tls_
6360: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d WaitForConnect -
6370: 2d 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 -. *. *.Sideeffe
6380: 63 74 73 3a 0a 20 2a 09 09 49 73 73 75 65 73 20 cts:. *..Issues
6390: 53 53 4c 5f 61 63 63 65 70 74 20 6f 72 20 53 53 SSL_accept or SS
63a0: 4c 5f 63 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 09 L_connect. *. *.
63b0: 52 65 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 Result:. *..None
63c0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
63d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
6400: 2a 2f 0a 69 6e 74 0a 54 6c 73 5f 57 61 69 74 46 */.int.Tls_WaitF
6410: 6f 72 43 6f 6e 6e 65 63 74 28 20 73 74 61 74 65 orConnect( state
6420: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 Ptr, errorCodePt
6430: 72 29 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 r). State *st
6440: 61 74 65 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 atePtr;. int
6450: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 3b 09 09 *errorCodePtr;..
6460: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 /* Where to stor
6470: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f e error code. */
6480: 0a 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a .{. int err;.
6490: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
64a0: 65 72 72 2c 22 5c 6e 57 61 69 74 46 6f 72 43 6f err,"\nWaitForCo
64b0: 6e 6e 65 63 74 28 30 78 25 78 29 22 2c 20 28 75 nnect(0x%x)", (u
64c0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 61 nsigned int) sta
64d0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 66 6f 72 tePtr);.. for
64e0: 20 28 3b 3b 29 20 7b 0a 09 2f 2a 20 4e 6f 74 20 (;;) {../* Not
64f0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 79 65 74 21 initialized yet!
6500: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 */..if (statePt
6510: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
6520: 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 CL_SERVER) {..
6530: 20 20 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 65 err = SSL_acce
6540: 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c pt(statePtr->ssl
6550: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
6560: 20 20 65 72 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e err = SSL_conn
6570: 65 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ect(statePtr->ss
6580: 6c 29 3b 0a 09 7d 0a 09 2f 2a 53 53 4c 5f 77 72 l);..}../*SSL_wr
6590: 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ite(statePtr->ss
65a0: 6c 2c 20 28 63 68 61 72 2a 29 26 65 72 72 2c 20 l, (char*)&err,
65b0: 30 29 3b 09 48 41 43 4b 21 21 21 20 2a 2f 0a 09 0);.HACK!!! */..
65c0: 69 66 20 28 65 72 72 20 3e 20 30 29 20 7b 0a 09 if (err > 0) {..
65d0: 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 BIO_flush(st
65e0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 7d atePtr->bio);..}
65f0: 0a 0a 09 69 66 20 28 65 72 72 20 3c 3d 20 30 29 ...if (err <= 0)
6600: 20 7b 0a 09 20 20 20 20 69 6e 74 20 72 63 20 3d {.. int rc =
6610: 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 SSL_get_error(s
6620: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65 72 tatePtr->ssl, er
6630: 72 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 72 63 r);... if (rc
6640: 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 == SSL_ERROR_SS
6650: 4c 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 L) {...Tls_Error
6660: 28 73 74 61 74 65 50 74 72 2c 0a 09 09 09 28 63 (statePtr,....(c
6670: 68 61 72 20 2a 29 45 52 52 5f 72 65 61 73 6f 6e har *)ERR_reason
6680: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 _error_string(ER
6690: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 29 3b R_get_error()));
66a0: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
66b0: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
66c0: 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 ...return -1;..
66d0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 42 49 } else if (BI
66e0: 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 O_should_retry(s
66f0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
6700: 0a 09 09 69 66 20 28 73 74 61 74 65 50 74 72 2d ...if (statePtr-
6710: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
6720: 5f 41 53 59 4e 43 29 20 7b 0a 09 09 20 20 20 20 _ASYNC) {...
6730: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
6740: 45 21 20 22 29 3b 0a 09 09 20 20 20 20 2a 65 72 E! ");... *er
6750: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
6760: 41 49 4e 3b 0a 09 09 20 20 20 20 72 65 74 75 72 AIN;... retur
6770: 6e 20 2d 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b n -1;...} else {
6780: 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b ... continue;
6790: 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 ...}.. } else
67a0: 20 69 66 20 28 65 72 72 20 3d 3d 20 30 29 20 7b if (err == 0) {
67b0: 0a 09 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 ...dprintf(stder
67c0: 72 2c 22 43 52 21 20 22 29 3b 0a 09 09 2a 65 72 r,"CR! ");...*er
67d0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f rorCodePtr = ECO
67e0: 4e 4e 52 45 53 45 54 3b 0a 09 09 72 65 74 75 72 NNRESET;...retur
67f0: 6e 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 n -1;.. }..
6800: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
6810: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
6820: 53 45 52 56 45 52 29 20 7b 0a 09 09 65 72 72 20 SERVER) {...err
6830: 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 = SSL_get_verify
6840: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
6850: 2d 3e 73 73 6c 29 3b 0a 09 09 69 66 20 28 65 72 ->ssl);...if (er
6860: 72 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 r != X509_V_OK)
6870: 7b 0a 09 09 20 20 20 20 54 6c 73 5f 45 72 72 6f {... Tls_Erro
6880: 72 28 73 74 61 74 65 50 74 72 2c 0a 09 09 09 20 r(statePtr,....
6890: 20 20 20 28 63 68 61 72 20 2a 29 58 35 30 39 5f (char *)X509_
68a0: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
68b0: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 29 3b 0a r_string(err));.
68c0: 09 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
68d0: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 Ptr = ECONNABORT
68e0: 45 44 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e ED;... return
68f0: 20 2d 31 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a -1;...}.. }.
6900: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
6910: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e tr = Tcl_GetErrn
6920: 6f 28 29 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 o();.. dprint
6930: 66 28 73 74 64 65 72 72 2c 22 45 52 52 28 25 64 f(stderr,"ERR(%d
6940: 2c 20 25 64 29 20 22 2c 20 72 63 2c 20 2a 65 72 , %d) ", rc, *er
6950: 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 20 rorCodePtr);..
6960: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a return -1;..}.
6970: 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c .dprintf(stderr,
6980: 22 52 30 21 20 22 29 3b 0a 09 72 65 74 75 72 6e "R0! ");..return
6990: 20 31 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 54 63 6c 1;. }.}..Tcl
69a0: 5f 43 68 61 6e 6e 65 6c 0a 54 6c 73 5f 47 65 74 _Channel.Tls_Get
69b0: 50 61 72 65 6e 74 28 20 73 74 61 74 65 50 74 72 Parent( statePtr
69c0: 20 29 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 ). State *st
69d0: 61 74 65 50 74 72 3b 0a 7b 0a 20 20 20 20 69 66 atePtr;.{. if
69e0: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 (channelTypeVer
69f0: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e sion == TLS_CHAN
6a00: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b NEL_VERSION_2) {
6a10: 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 ..return Tcl_Get
6a20: 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 StackedChannel(s
6a30: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a tatePtr->self);.
6a40: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
6a50: 20 54 68 65 20 72 65 61 73 6f 6e 20 66 6f 72 20 The reason for
6a60: 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 the existence of
6a70: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 this procedure
6a80: 69 73 0a 09 20 2a 20 74 68 65 20 66 61 63 74 20 is.. * the fact
6a90: 74 68 61 74 20 73 74 61 63 6b 69 6e 67 20 61 20 that stacking a
6aa0: 74 72 61 6e 73 66 6f 72 6d 20 6f 76 65 72 20 61 transform over a
6ab0: 6e 6f 74 68 65 72 0a 09 20 2a 20 74 72 61 6e 73 nother.. * trans
6ac0: 66 6f 72 6d 20 77 69 6c 6c 20 6c 65 61 76 65 20 form will leave
6ad0: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 70 6f 69 our internal poi
6ae0: 6e 74 65 72 20 75 6e 63 68 61 6e 67 65 64 2c 0a nter unchanged,.
6af0: 09 20 2a 20 61 6e 64 20 74 68 75 73 20 70 6f 69 . * and thus poi
6b00: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 nting to the new
6b10: 20 74 72 61 6e 73 66 6f 72 6d 2c 20 61 6e 64 20 transform, and
6b20: 6e 6f 74 20 74 68 65 0a 09 20 2a 20 43 68 61 6e not the.. * Chan
6b30: 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 63 6f nel structure co
6b40: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 76 ntaining the sav
6b50: 65 64 20 73 74 61 74 65 20 6f 66 20 74 68 69 73 ed state of this
6b60: 0a 09 20 2a 20 74 72 61 6e 73 66 6f 72 6d 2e 20 .. * transform.
6b70: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 69 63 This is the pric
6b80: 65 20 74 6f 20 70 61 79 20 66 6f 72 20 6c 65 61 e to pay for lea
6b90: 76 69 6e 67 0a 09 20 2a 20 54 63 6c 5f 43 68 61 ving.. * Tcl_Cha
6ba0: 6e 6e 65 6c 20 72 65 66 65 72 65 6e 63 65 73 20 nnel references
6bb0: 69 6e 74 61 63 74 2e 20 54 68 65 20 6f 6e 6c 79 intact. The only
6bc0: 20 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 0a other solution.
6bd0: 09 20 2a 20 69 73 20 61 6e 20 65 78 74 65 6e 73 . * is an extens
6be0: 69 6f 6e 20 6f 66 20 54 63 6c 5f 43 68 61 6e 6e ion of Tcl_Chann
6bf0: 65 6c 54 79 70 65 20 77 69 74 68 20 61 6e 6f 74 elType with anot
6c00: 68 65 72 20 64 72 69 76 65 72 0a 09 20 2a 20 70 her driver.. * p
6c10: 72 6f 63 65 64 75 72 65 20 74 6f 20 6e 6f 74 69 rocedure to noti
6c20: 66 79 20 61 20 43 68 61 6e 6e 65 6c 20 61 62 6f fy a Channel abo
6c30: 75 74 20 74 68 65 20 28 75 6e 29 73 74 61 63 6b ut the (un)stack
6c40: 69 6e 67 2e 0a 09 20 2a 0a 09 20 2a 20 49 74 20 ing... *.. * It
6c50: 77 61 6c 6b 73 20 74 68 65 20 63 68 61 69 6e 20 walks the chain
6c60: 6f 66 20 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 of Channel struc
6c70: 74 75 72 65 73 20 75 6e 74 69 6c 20 69 74 0a 09 tures until it..
6c80: 20 2a 20 66 69 6e 64 73 20 74 68 65 20 6f 6e 65 * finds the one
6c90: 20 70 6f 69 6e 74 69 6e 67 20 68 61 76 69 6e 67 pointing having
6ca0: 20 27 63 74 72 6c 27 20 61 73 20 69 6e 73 74 61 'ctrl' as insta
6cb0: 6e 63 65 44 61 74 61 0a 09 20 2a 20 61 6e 64 20 nceData.. * and
6cc0: 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 then returns the
6cd0: 20 73 75 70 65 72 63 65 64 69 6e 67 20 63 68 61 superceding cha
6ce0: 6e 6e 65 6c 20 74 6f 20 74 68 61 74 2e 20 28 41 nnel to that. (A
6cf0: 4b 29 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 68 K).. */...Tcl_Ch
6d00: 61 6e 6e 65 6c 20 73 65 6c 66 20 3d 20 73 74 61 annel self = sta
6d10: 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a 09 54 63 tePtr->self;..Tc
6d20: 6c 5f 43 68 61 6e 6e 65 6c 20 6e 65 78 74 3b 0a l_Channel next;.
6d30: 0a 09 77 68 69 6c 65 20 28 28 43 6c 69 65 6e 74 ..while ((Client
6d40: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 20 21 Data) statePtr !
6d50: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
6d60: 49 6e 73 74 61 6e 63 65 44 61 74 61 20 28 73 65 InstanceData (se
6d70: 6c 66 29 29 20 7b 0a 09 20 20 20 20 6e 65 78 74 lf)) {.. next
6d80: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
6d90: 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29 3b dChannel (self);
6da0: 0a 09 20 20 20 20 69 66 20 28 6e 65 78 74 20 3d .. if (next =
6db0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
6dc0: 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 30 39 2f NULL) {.../* 09/
6dd0: 32 34 2f 31 39 39 39 20 55 6e 73 74 61 63 6b 69 24/1999 Unstacki
6de0: 6e 67 20 62 75 67 2c 0a 09 09 20 2a 20 66 6f 75 ng bug,... * fou
6df0: 6e 64 20 62 79 20 4d 61 74 74 20 4e 65 77 6d 61 nd by Matt Newma
6e00: 6e 20 3c 6d 61 74 74 40 73 65 6e 73 75 73 2e 6f n <matt@sensus.o
6e10: 72 67 3e 2e 0a 09 09 20 2a 0a 09 09 20 2a 20 57 rg>.... *... * W
6e20: 65 20 77 65 72 65 20 75 6e 61 62 6c 65 20 74 6f e were unable to
6e30: 20 66 69 6e 64 20 74 68 65 20 63 68 61 6e 6e 65 find the channe
6e40: 6c 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 l structure for
6e50: 74 68 69 73 0a 09 09 20 2a 20 74 72 61 6e 73 66 this... * transf
6e60: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 ormation in the
6e70: 63 68 61 69 6e 20 6f 66 20 73 74 61 63 6b 65 64 chain of stacked
6e80: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 0a 09 channel. This..
6e90: 09 20 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 77 . * means that w
6ea0: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 e are currently
6eb0: 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f in the process o
6ec0: 66 20 75 6e 73 74 61 63 6b 69 6e 67 0a 09 09 20 f unstacking...
6ed0: 2a 20 69 74 20 2a 61 6e 64 2a 20 74 68 65 72 65 * it *and* there
6ee0: 20 77 65 72 65 20 73 6f 6d 65 20 62 79 74 65 73 were some bytes
6ef0: 20 77 61 69 74 69 6e 67 20 77 68 69 63 68 20 61 waiting which a
6f00: 72 65 20 6e 6f 77 0a 09 09 20 2a 20 66 6c 75 73 re now... * flus
6f10: 68 65 64 2e 20 49 6e 20 74 68 69 73 20 73 69 74 hed. In this sit
6f20: 75 61 74 69 6f 6e 20 74 68 65 20 70 6f 69 6e 74 uation the point
6f30: 65 72 20 74 6f 20 74 68 65 20 63 68 61 6e 6e 65 er to the channe
6f40: 6c 0a 09 09 20 2a 20 69 74 73 65 6c 66 20 61 6c l... * itself al
6f50: 72 65 61 64 79 20 72 65 66 65 72 73 20 74 6f 20 ready refers to
6f60: 74 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e the parent chann
6f70: 65 6c 20 77 65 20 68 61 76 65 20 74 6f 0a 09 09 el we have to...
6f80: 20 2a 20 77 72 69 74 65 20 74 68 65 20 62 79 74 * write the byt
6f90: 65 73 20 69 6e 74 6f 2c 20 73 6f 20 77 65 20 72 es into, so we r
6fa0: 65 74 75 72 6e 20 74 68 61 74 2e 0a 09 09 20 2a eturn that.... *
6fb0: 2f 0a 09 09 72 65 74 75 72 6e 20 73 74 61 74 65 /...return state
6fc0: 50 74 72 2d 3e 73 65 6c 66 3b 0a 09 20 20 20 20 Ptr->self;..
6fd0: 7d 0a 09 20 20 20 20 73 65 6c 66 20 3d 20 6e 65 }.. self = ne
6fe0: 78 74 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 xt;..}...return
6ff0: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 Tcl_GetStackedCh
7000: 61 6e 6e 65 6c 20 28 73 65 6c 66 29 3b 0a 20 20 annel (self);.
7010: 20 20 7d 0a 7d 0a }.}.