0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 4d 61 (C) 1997-2000 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 0a 20 2a 20 24 48 65 61 64 65 72 3a 20 2f 68 6f . * $Header: /ho
0050: 6d 65 2f 72 6b 65 65 6e 65 2f 74 6d 70 2f 63 76 me/rkeene/tmp/cv
0060: 73 32 66 6f 73 73 69 6c 2f 2e 2e 2f 74 63 6c 74 s2fossil/../tclt
0070: 6c 73 2f 74 6c 73 2f 74 6c 73 2f 74 6c 73 49 4f ls/tls/tls/tlsIO
0080: 2e 63 2c 76 20 31 2e 38 20 32 30 30 30 2f 30 37 .c,v 1.8 2000/07
0090: 2f 32 37 20 30 31 3a 35 38 3a 31 38 20 68 6f 62 /27 01:58:18 hob
00a0: 62 73 20 45 78 70 20 24 0a 20 2a 0a 20 2a 20 54 bs Exp $. *. * T
00b0: 4c 53 20 28 61 6b 61 20 53 53 4c 29 20 43 68 61 LS (aka SSL) Cha
00c0: 6e 6e 65 6c 20 2d 20 63 61 6e 20 62 65 20 6c 61 nnel - can be la
00d0: 79 65 72 65 64 20 6f 6e 20 61 6e 79 20 62 69 2d yered on any bi-
00e0: 64 69 72 65 63 74 69 6f 6e 61 6c 0a 20 2a 20 54 directional. * T
00f0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 28 4e 6f 74 65 cl_Channel (Note
0100: 3a 20 52 65 71 75 69 72 65 73 20 54 72 66 20 43 : Requires Trf C
0110: 6f 72 65 20 50 61 74 63 68 29 0a 20 2a 0a 20 2a ore Patch). *. *
0120: 20 54 68 69 73 20 77 61 73 20 62 75 69 6c 74 20 This was built
0130: 66 72 6f 6d 20 73 63 72 61 74 63 68 20 62 61 73 from scratch bas
0140: 65 64 20 75 70 6f 6e 20 6f 62 73 65 72 76 61 74 ed upon observat
0150: 69 6f 6e 20 6f 66 20 4f 70 65 6e 53 53 4c 20 30 ion of OpenSSL 0
0160: 2e 39 2e 32 42 0a 20 2a 0a 20 2a 20 41 64 64 69 .9.2B. *. * Addi
0170: 74 69 6f 6e 20 63 72 65 64 69 74 20 69 73 20 64 tion credit is d
0180: 75 65 20 66 6f 72 20 41 6e 64 72 65 61 73 20 4b ue for Andreas K
0190: 75 70 72 69 65 73 20 28 61 2e 6b 75 70 72 69 65 upries (a.kuprie
01a0: 73 40 77 65 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 s@westend.com),
01b0: 66 6f 72 0a 20 2a 20 70 72 6f 76 69 64 69 6e 67 for. * providing
01c0: 20 74 68 65 20 54 63 6c 5f 52 65 70 6c 61 63 65 the Tcl_Replace
01d0: 43 68 61 6e 6e 65 6c 20 6d 65 63 68 61 6e 69 73 Channel mechanis
01e0: 6d 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 63 6c m and working cl
01f0: 6f 73 65 6c 79 20 77 69 74 68 20 6d 65 0a 20 2a osely with me. *
0200: 20 74 6f 20 65 6e 68 61 6e 63 65 20 69 74 20 74 to enhance it t
0210: 6f 20 73 75 70 70 6f 72 74 20 66 75 6c 6c 20 66 o support full f
0220: 69 6c 65 65 76 65 6e 74 20 73 65 6d 61 6e 74 69 ileevent semanti
0230: 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 cs.. *. * Also w
0240: 6f 72 6b 20 64 6f 6e 65 20 62 79 20 74 68 65 20 ork done by the
0250: 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 20 70 72 follow people pr
0260: 6f 76 69 64 65 64 20 74 68 65 20 69 6d 70 65 74 ovided the impet
0270: 75 73 20 74 6f 20 64 6f 20 74 68 69 73 20 22 72 us to do this "r
0280: 69 67 68 74 22 3a 0a 20 2a 09 74 63 6c 53 53 4c ight":. *.tclSSL
0290: 20 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 (Colin McCormac
02a0: 6b 2c 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f k, Shared Techno
02b0: 6c 6f 67 79 29 0a 20 2a 09 53 53 4c 74 63 6c 20 logy). *.SSLtcl
02c0: 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a 20 (Peter Antman).
02d0: 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 *. */..#include
02e0: 22 74 6c 73 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 20 "tlsInt.h"../*.
02f0: 2a 20 45 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 * External funct
0300: 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 ions. */../*. *
0310: 4c 6f 63 61 6c 20 44 65 66 69 6e 65 73 0a 20 2a Local Defines. *
0320: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 /../*. * Forward
0330: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a declarations. *
0340: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c /..static int.Tl
0350: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 5f sBlockModeProc _
0360: 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c 69 65 ANSI_ARGS_((Clie
0370: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
0380: 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 6f 64 65 ata,....int mode
0390: 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 54 ));.static int.T
03a0: 6c 73 43 6c 6f 73 65 50 72 6f 63 20 5f 41 4e 53 lsCloseProc _ANS
03b0: 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 I_ARGS_ ((Client
03c0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
03d0: 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 a,....Tcl_Interp
03e0: 20 2a 69 6e 74 65 72 70 29 29 3b 0a 73 74 61 74 *interp));.stat
03f0: 69 63 20 69 6e 74 09 54 6c 73 49 6e 70 75 74 50 ic int.TlsInputP
0400: 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 roc _ANSI_ARGS_(
0410: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
0420: 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 63 68 61 anceData,....cha
0430: 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 53 r *buf, int bufS
0440: 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 ize, int *errorC
0450: 6f 64 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63 odePtr));.static
0460: 20 69 6e 74 09 54 6c 73 4f 75 74 70 75 74 50 72 int.TlsOutputPr
0470: 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 oc _ANSI_ARGS_((
0480: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 ClientData insta
0490: 6e 63 65 44 61 74 61 2c 0a 09 09 09 63 68 61 72 nceData,....char
04a0: 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 *buf, int toWri
04b0: 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f te, int *errorCo
04c0: 64 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 dePtr));.static
04d0: 69 6e 74 09 54 6c 73 47 65 74 4f 70 74 69 6f 6e int.TlsGetOption
04e0: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f Proc _ANSI_ARGS_
04f0: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e ((ClientData in
0500: 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 54 stanceData,....T
0510: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0520: 70 2c 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e p, char *optionN
0530: 61 6d 65 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72 ame,....Tcl_DStr
0540: 69 6e 67 20 2a 64 73 50 74 72 29 29 3b 0a 73 74 ing *dsPtr));.st
0550: 61 74 69 63 20 76 6f 69 64 09 54 6c 73 57 61 74 atic void.TlsWat
0560: 63 68 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 chProc _ANSI_ARG
0570: 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 S_((ClientData i
0580: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 nstanceData, int
0590: 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 mask));.static
05a0: 69 6e 74 09 54 6c 73 47 65 74 48 61 6e 64 6c 65 int.TlsGetHandle
05b0: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f Proc _ANSI_ARGS_
05c0: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e ((ClientData in
05d0: 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 stanceData,....i
05e0: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c nt direction, Cl
05f0: 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 ientData *handle
0600: 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 69 6e Ptr));.static in
0610: 74 09 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 t.TlsNotifyProc
0620: 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c _ANSI_ARGS_ ((Cl
0630: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
0640: 65 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 61 eData,....int ma
0650: 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 sk));.static voi
0660: 64 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 d.TlsChannelHand
0670: 6c 65 72 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 ler _ANSI_ARGS_
0680: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ((ClientData cli
0690: 65 6e 74 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 entData,....int
06a0: 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 76 mask));.static v
06b0: 6f 69 64 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 oid.TlsChannelHa
06c0: 6e 64 6c 65 72 54 69 6d 65 72 20 5f 41 4e 53 49 ndlerTimer _ANSI
06d0: 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 _ARGS_ ((ClientD
06e0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 29 ata clientData))
06f0: 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 ;../*. * This st
0700: 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65 ructure describe
0710: 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 s the channel ty
0720: 70 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 pe structure for
0730: 20 54 43 50 20 73 6f 63 6b 65 74 0a 20 2a 20 62 TCP socket. * b
0740: 61 73 65 64 20 49 4f 3a 0a 20 2a 2f 0a 23 69 66 ased IO:. */.#if
0750: 64 65 66 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f def TCL_CHANNEL_
0760: 56 45 52 53 49 4f 4e 5f 32 0a 73 74 61 74 69 63 VERSION_2.static
0770: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tcl_ChannelType
0780: 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 tlsChannelType
0790: 3d 20 7b 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 = {. "tls",..
07a0: 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a 2f /* Type name. */
07b0: 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c . TCL_CHANNEL
07c0: 5f 56 45 52 53 49 4f 4e 5f 32 2c 09 2f 2a 20 41 _VERSION_2,./* A
07d0: 20 76 32 20 63 68 61 6e 6e 65 6c 20 28 38 2e 33 v2 channel (8.3
07e0: 2e 32 2f 38 2e 34 61 32 2b 29 20 2a 2f 0a 20 20 .2/8.4a2+) */.
07f0: 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c 09 TlsCloseProc,.
0800: 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a /* Close proc. *
0810: 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 50 72 /. TlsInputPr
0820: 6f 63 2c 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f oc,./* Input pro
0830: 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4f 75 74 c. */. TlsOut
0840: 70 75 74 50 72 6f 63 2c 09 2f 2a 20 4f 75 74 70 putProc,./* Outp
0850: 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 ut proc. */.
0860: 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b 20 70 NULL,../* Seek p
0870: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c roc. */. NULL
0880: 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e ,../* Set option
0890: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c proc. */. Tl
08a0: 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 sGetOptionProc,.
08b0: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 /* Get option pr
08c0: 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 57 61 oc. */. TlsWa
08d0: 74 63 68 50 72 6f 63 2c 09 2f 2a 20 49 6e 69 74 tchProc,./* Init
08e0: 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 2e ialize notifier.
08f0: 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 48 61 */. TlsGetHa
0900: 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 ndleProc,./* Get
0910: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f 75 74 file handle out
0920: 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a of channel. */.
0930: 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 43 6c NULL,../* Cl
0940: 6f 73 65 32 50 72 6f 63 2e 20 2a 2f 0a 20 20 20 ose2Proc. */.
0950: 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f TlsBlockModePro
0960: 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 c,./* Set blocki
0970: 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d ng/nonblocking m
0980: 6f 64 65 2e 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c ode.*/. NULL,
0990: 09 09 2f 2a 20 46 6c 75 73 68 50 72 6f 63 2e 20 ../* FlushProc.
09a0: 2a 2f 0a 20 20 20 20 54 6c 73 4e 6f 74 69 66 79 */. TlsNotify
09b0: 50 72 6f 63 2c 09 2f 2a 20 68 61 6e 64 6c 65 72 Proc,./* handler
09c0: 50 72 6f 63 2e 20 2a 2f 0a 7d 3b 0a 23 65 6c 73 Proc. */.};.#els
09d0: 65 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 e.static Tcl_Cha
09e0: 6e 6e 65 6c 54 79 70 65 20 74 6c 73 43 68 61 6e nnelType tlsChan
09f0: 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 nelType = {.
0a00: 22 74 6c 73 22 2c 09 09 2f 2a 20 54 79 70 65 20 "tls",../* Type
0a10: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 name. */. Tls
0a20: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f BlockModeProc,./
0a30: 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e * Set blocking/n
0a40: 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e onblocking mode.
0a50: 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 */. TlsCloseP
0a60: 72 6f 63 2c 09 2f 2a 20 43 6c 6f 73 65 20 70 72 roc,./* Close pr
0a70: 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e oc. */. TlsIn
0a80: 70 75 74 50 72 6f 63 2c 09 2f 2a 20 49 6e 70 75 putProc,./* Inpu
0a90: 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 t proc. */. T
0aa0: 6c 73 4f 75 74 70 75 74 50 72 6f 63 2c 09 2f 2a lsOutputProc,./*
0ab0: 20 4f 75 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f Output proc. */
0ac0: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 . NULL,../* S
0ad0: 65 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 eek proc. */.
0ae0: 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 6f NULL,../* Set o
0af0: 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 ption proc. */.
0b00: 20 20 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 TlsGetOptionP
0b10: 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 roc,./* Get opti
0b20: 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 on proc. */.
0b30: 54 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 2f 2a TlsWatchProc,./*
0b40: 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 Initialize noti
0b50: 66 69 65 72 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 fier. */. Tls
0b60: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f GetHandleProc,./
0b70: 2a 20 47 65 74 20 66 69 6c 65 20 68 61 6e 64 6c * Get file handl
0b80: 65 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c e out of channel
0b90: 2e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a . */.};.#endif..
0ba0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 Tcl_ChannelType
0bb0: 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 *Tls_ChannelType
0bc0: 28 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ().{. return
0bd0: 26 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 3b &tlsChannelType;
0be0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
0c30: 0a 20 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 . * TlsBlockMode
0c40: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Proc --. *. *.Th
0c50: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
0c60: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 invoked by the g
0c70: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a eneric IO level.
0c80: 20 2a 20 20 20 20 20 20 20 74 6f 20 73 65 74 20 * to set
0c90: 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e blocking and non
0ca0: 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 20 blocking modes.
0cb0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 * Results:. *.0
0cc0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 if successful, e
0cd0: 72 72 6e 6f 20 77 68 65 6e 20 66 61 69 6c 65 64 rrno when failed
0ce0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
0cf0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 ects:. *.Sets th
0d00: 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c e device into bl
0d10: 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f ocking or nonblo
0d20: 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 cking mode.. *.
0d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
0d80: 20 69 6e 74 0a 54 6c 73 42 6c 6f 63 6b 4d 6f 64 int.TlsBlockMod
0d90: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 eProc(ClientData
0da0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f instanceData,./
0db0: 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 * Socket state.
0dc0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 */.
0dd0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 29 09 09 09 int mode)...
0de0: 2f 2a 20 54 68 65 20 6d 6f 64 65 20 74 6f 20 73 /* The mode to s
0df0: 65 74 2e 20 43 61 6e 20 62 65 20 6f 6e 65 20 6f et. Can be one o
0e00: 66 0a 09 09 09 09 09 09 2a 20 54 43 4c 5f 4d 4f f.......* TCL_MO
0e10: 44 45 5f 42 4c 4f 43 4b 49 4e 47 20 6f 72 0a 09 DE_BLOCKING or..
0e20: 09 09 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 5f .....* TCL_MODE_
0e30: 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 2e 20 2a 2f 0a NONBLOCKING. */.
0e40: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
0e50: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
0e60: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
0e70: 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d . if (mode ==
0e80: 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f TCL_MODE_NONBLO
0e90: 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 CKING) {..stateP
0ea0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
0eb0: 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 _TCL_ASYNC;.
0ec0: 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 } else {..stateP
0ed0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 tr->flags &= ~(T
0ee0: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 LS_TCL_ASYNC);.
0ef0: 20 20 20 7d 0a 23 69 66 64 65 66 20 54 43 4c 5f }.#ifdef TCL_
0f00: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f CHANNEL_VERSION_
0f10: 32 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2. return 0;.
0f20: 23 65 6c 73 65 0a 20 20 20 20 72 65 74 75 72 6e #else. return
0f30: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
0f40: 70 74 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e ption(statePtr->
0f50: 69 6e 74 65 72 70 2c 20 54 6c 73 5f 47 65 74 50 interp, Tls_GetP
0f60: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 2c arent(statePtr),
0f70: 0a 09 09 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 ..."-blocking",
0f80: 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 (mode == TCL_MOD
0f90: 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 3f E_NONBLOCKING) ?
0fa0: 20 22 30 22 20 3a 20 22 31 22 29 3b 0a 23 65 6e "0" : "1");.#en
0fb0: 64 69 66 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d dif.}.../*. *---
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1000: 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 . *. * TlsCloseP
1010: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
1020: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
1030: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 nvoked by the ge
1040: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 neric IO level t
1050: 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 63 68 61 o perform. *.cha
1060: 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 63 69 66 nnel-type-specif
1070: 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 ic cleanup when
1080: 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
1090: 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 ed channel. *.is
10a0: 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20 2a 09 4e closed.. *. *.N
10b0: 6f 74 65 3a 20 77 65 20 6c 65 61 76 65 20 74 68 ote: we leave th
10c0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 6f 63 e underlying soc
10d0: 6b 65 74 20 61 6c 6f 6e 65 2c 20 69 73 20 74 68 ket alone, is th
10e0: 69 73 20 72 69 67 68 74 3f 0a 20 2a 0a 20 2a 20 is right?. *. *
10f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 Results:. *.0 if
1100: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 successful, the
1110: 20 76 61 6c 75 65 20 6f 66 20 54 63 6c 5f 47 65 value of Tcl_Ge
1120: 74 45 72 72 6e 6f 28 29 20 69 66 20 66 61 69 6c tErrno() if fail
1130: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ed.. *. * Side e
1140: 66 66 65 63 74 73 3a 0a 20 2a 09 43 6c 6f 73 65 ffects:. *.Close
1150: 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f 66 20 s the socket of
1160: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a the channel.. *.
1170: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
11c0: 20 69 6e 74 0a 54 6c 73 43 6c 6f 73 65 50 72 6f int.TlsClosePro
11d0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
11e0: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54 68 tanceData,./* Th
11f0: 65 20 73 6f 63 6b 65 74 20 74 6f 20 63 6c 6f 73 e socket to clos
1200: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 e. */.
1210: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
1220: 6e 74 65 72 70 29 09 2f 2a 20 46 6f 72 20 65 72 nterp)./* For er
1230: 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20 2d 20 ror reporting -
1240: 75 6e 75 73 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 unused. */.{.
1250: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
1260: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
1270: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 tanceData;..
1280: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
1290: 5c 6e 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 30 \nTlsCloseProc(0
12a0: 78 25 78 29 22 2c 20 73 74 61 74 65 50 74 72 29 x%x)", statePtr)
12b0: 3b 0a 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 ;..#ifndef TCL_C
12c0: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 HANNEL_VERSION_2
12d0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 . /*. * R
12e0: 65 6d 6f 76 65 20 65 76 65 6e 74 20 68 61 6e 64 emove event hand
12f0: 6c 65 72 20 74 6f 20 75 6e 64 65 72 6c 79 69 6e ler to underlyin
1300: 67 20 63 68 61 6e 6e 65 6c 2c 20 74 68 69 73 20 g channel, this
1310: 63 6f 75 6c 64 0a 20 20 20 20 20 2a 20 62 65 20 could. * be
1320: 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 63 because we are c
1330: 6c 6f 73 69 6e 67 20 66 6f 72 20 72 65 61 6c 2c losing for real,
1340: 20 6f 72 20 62 65 69 6e 67 20 22 75 6e 73 74 61 or being "unsta
1350: 63 6b 65 64 22 2e 0a 20 20 20 20 20 2a 2f 0a 0a cked".. */..
1360: 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 68 Tcl_DeleteCh
1370: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 6c 73 annelHandler(Tls
1380: 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 _GetParent(state
1390: 50 74 72 29 2c 0a 09 54 6c 73 43 68 61 6e 6e 65 Ptr),..TlsChanne
13a0: 6c 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65 6e lHandler, (Clien
13b0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
13c0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 6c ;.#endif.. Tl
13d0: 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 s_Clean(statePtr
13e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 );. Tcl_Event
13f0: 75 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e uallyFree((Clien
1400: 74 44 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 tData)statePtr,
1410: 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 72 Tls_Free);. r
1420: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
1430: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
1480: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d TlsInputProc --
1490: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
14a0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
14b0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
14c0: 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 IO level. *
14d0: 20 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 to read input
14e0: 66 72 6f 6d 20 61 20 53 53 4c 20 73 6f 63 6b 65 from a SSL socke
14f0: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e t based channel.
1500: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
1510: 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 *.The number of
1520: 20 62 79 74 65 73 20 72 65 61 64 20 69 73 20 72 bytes read is r
1530: 65 74 75 72 6e 65 64 20 6f 72 20 2d 31 20 6f 6e eturned or -1 on
1540: 20 65 72 72 6f 72 2e 20 41 6e 20 6f 75 74 70 75 error. An outpu
1550: 74 0a 20 2a 09 61 72 67 75 6d 65 6e 74 20 63 6f t. *.argument co
1560: 6e 74 61 69 6e 73 20 74 68 65 20 50 4f 53 49 58 ntains the POSIX
1570: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 65 error code on e
1580: 72 72 6f 72 2c 20 6f 72 20 7a 65 72 6f 20 69 66 rror, or zero if
1590: 20 6e 6f 0a 20 2a 09 65 72 72 6f 72 20 6f 63 63 no. *.error occ
15a0: 75 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 urred.. *. * Sid
15b0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 e effects:. *.Re
15c0: 61 64 73 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 ads input from t
15d0: 68 65 20 69 6e 70 75 74 20 64 65 76 69 63 65 20 he input device
15e0: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a of the channel..
15f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1630: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
1640: 61 74 69 63 20 69 6e 74 0a 54 6c 73 49 6e 70 75 atic int.TlsInpu
1650: 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 tProc(ClientData
1660: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f instanceData,./
1670: 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 * Socket state.
1680: 2a 2f 0a 09 63 68 61 72 20 2a 62 75 66 2c 09 09 */..char *buf,..
1690: 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f ./* Where to sto
16a0: 72 65 20 64 61 74 61 20 72 65 61 64 2e 20 2a 2f re data read. */
16b0: 0a 09 69 6e 74 20 62 75 66 53 69 7a 65 2c 09 09 ..int bufSize,..
16c0: 09 2f 2a 20 48 6f 77 20 6d 75 63 68 20 73 70 61 ./* How much spa
16d0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a ce is available.
16e0: 09 09 09 09 09 20 2a 20 69 6e 20 74 68 65 20 62 ..... * in the b
16f0: 75 66 66 65 72 3f 20 2a 2f 0a 09 69 6e 74 20 2a uffer? */..int *
1700: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 09 2f errorCodePtr)../
1710: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 * Where to store
1720: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a error code. */.
1730: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
1740: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
1750: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
1760: 20 20 20 20 69 6e 74 20 62 79 74 65 73 52 65 61 int bytesRea
1770: 64 3b 09 09 09 2f 2a 20 48 6f 77 20 6d 61 6e 79 d;.../* How many
1780: 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 bytes were read
1790: 3f 20 2a 2f 0a 0a 20 20 20 20 2a 65 72 72 6f 72 ? */.. *error
17a0: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 CodePtr = 0;..
17b0: 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 dprintf(stderr
17c0: 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 28 25 64 29 ,"\nBIO_read(%d)
17d0: 22 2c 20 62 75 66 53 69 7a 65 29 3b 0a 0a 20 20 ", bufSize);..
17e0: 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e if (!SSL_is_in
17f0: 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74 it_finished(stat
1800: 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 62 ePtr->ssl)) {..b
1810: 79 74 65 73 52 65 61 64 20 3d 20 54 6c 73 5f 57 ytesRead = Tls_W
1820: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 aitForConnect(st
1830: 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 atePtr, errorCod
1840: 65 50 74 72 29 3b 0a 09 69 66 20 28 62 79 74 65 ePtr);..if (byte
1850: 73 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 20 sRead <= 0) {..
1860: 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 09 goto input;..
1870: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. }. if (
1880: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
1890: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 & TLS_TCL_INIT)
18a0: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 {..statePtr->fla
18b0: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
18c0: 49 4e 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 INIT);. }.
18d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 /*. * We ne
18e0: 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 ed to clear the
18f0: 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 SSL error stack
1900: 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65 20 73 now because we s
1910: 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20 ometimes reach.
1920: 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74 * this funct
1930: 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65 ion with leftove
1940: 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 r errors in the
1950: 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 72 stack. If BIO_r
1960: 65 61 64 0a 20 20 20 20 20 2a 20 72 65 74 75 72 ead. * retur
1970: 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 ns -1 and intend
1980: 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 s EAGAIN, there
1990: 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 is a leftover er
19a0: 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a ror, it will be.
19b0: 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 * misconstr
19c0: 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c ued as an error,
19d0: 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 not EAGAIN..
19e0: 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 *. * Alter
19f0: 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 natively, we may
1a00: 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 want to handle
1a10: 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f the <0 return co
1a20: 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 des from. *
1a30: 42 49 4f 5f 72 65 61 64 20 73 70 65 63 69 61 6c BIO_read special
1a40: 6c 79 20 28 61 73 20 61 64 76 69 73 65 64 20 69 ly (as advised i
1a50: 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e n the RSA docs).
1a60: 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 TLS's lower le
1a70: 76 65 6c 20 42 49 4f 0a 20 20 20 20 20 2a 20 66 vel BIO. * f
1a80: 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 unctions play wi
1a90: 74 68 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 th the retry fla
1aa0: 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 gs though, and t
1ab0: 68 69 73 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 his seems to wor
1ac0: 6b 0a 20 20 20 20 20 2a 20 63 6f 72 72 65 63 74 k. * correct
1ad0: 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 ly. Similar fix
1ae0: 20 69 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 6f in TlsOutputPro
1af0: 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 c. - hobbs.
1b00: 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 */. ERR_clear
1b10: 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 62 79 _error();. by
1b20: 74 65 73 52 65 61 64 20 3d 20 42 49 4f 5f 72 65 tesRead = BIO_re
1b30: 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ad(statePtr->bio
1b40: 2c 20 62 75 66 2c 20 62 75 66 53 69 7a 65 29 3b , buf, bufSize);
1b50: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
1b60: 65 72 72 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 20 err,"\nBIO_read
1b70: 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52 65 61 -> %d", bytesRea
1b80: 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 62 79 74 d);.. if (byt
1b90: 65 73 52 65 61 64 20 3c 20 30 29 20 7b 0a 09 69 esRead < 0) {..i
1ba0: 6e 74 20 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 nt err = SSL_get
1bb0: 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d _error(statePtr-
1bc0: 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 29 >ssl, bytesRead)
1bd0: 3b 0a 0a 09 69 66 20 28 65 72 72 20 3d 3d 20 53 ;...if (err == S
1be0: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 29 20 7b 0a SL_ERROR_SSL) {.
1bf0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
1c00: 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 52 tatePtr, SSL_ERR
1c10: 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c OR(statePtr->ssl
1c20: 2c 20 62 79 74 65 73 52 65 61 64 29 29 3b 0a 09 , bytesRead));..
1c30: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
1c40: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 r = ECONNABORTED
1c50: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 42 49 ;..} else if (BI
1c60: 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 O_should_retry(s
1c70: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
1c80: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 .. dprintf(st
1c90: 64 65 72 72 2c 22 52 45 21 20 22 29 3b 0a 09 20 derr,"RE! ");..
1ca0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
1cb0: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 7d 20 65 6c = EAGAIN;..} el
1cc0: 73 65 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f 72 se {.. *error
1cd0: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 CodePtr = Tcl_Ge
1ce0: 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20 69 tErrno();.. i
1cf0: 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 f (*errorCodePtr
1d00: 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 == ECONNRESET)
1d10: 7b 0a 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 {.../* Soft EOF
1d20: 2a 2f 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 */...*errorCodeP
1d30: 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 tr = 0;...bytesR
1d40: 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a ead = 0;.. }.
1d50: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 70 .}. }. inp
1d60: 75 74 3a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ut:. dprintf(
1d70: 73 74 64 65 72 72 2c 20 22 5c 6e 49 6e 70 75 74 stderr, "\nInput
1d80: 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 64 5d 22 (%d) -> %d [%d]"
1d90: 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 74 65 73 , bufSize, bytes
1da0: 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 6f 64 65 Read, *errorCode
1db0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
1dc0: 20 62 79 74 65 73 52 65 61 64 3b 0a 7d 0a 0c 0a bytesRead;.}...
1dd0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
1de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
1e20: 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a lsOutputProc --.
1e30: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
1e40: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
1e50: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
1e60: 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 O level. *
1e70: 20 74 6f 20 77 72 69 74 65 20 6f 75 74 70 75 74 to write output
1e80: 20 74 6f 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 to a SSL socket
1e90: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a based channel..
1ea0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
1eb0: 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 *.The number of
1ec0: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 69 73 bytes written is
1ed0: 20 72 65 74 75 72 6e 65 64 2e 20 41 6e 20 6f 75 returned. An ou
1ee0: 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 69 73 tput argument is
1ef0: 0a 20 2a 09 73 65 74 20 74 6f 20 61 20 50 4f 53 . *.set to a POS
1f00: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 IX error code if
1f10: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 an error occurr
1f20: 65 64 2c 20 6f 72 20 7a 65 72 6f 2e 0a 20 2a 0a ed, or zero.. *.
1f30: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
1f40: 0a 20 2a 09 57 72 69 74 65 73 20 6f 75 74 70 75 . *.Writes outpu
1f50: 74 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20 t on the output
1f60: 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 device of the ch
1f70: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a ---------------.
1fc0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
1fd0: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 28 43 6c TlsOutputProc(Cl
1fe0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
1ff0: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 eData,./* Socket
2000: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 state. */.
2010: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 62 char *b
2020: 75 66 2c 09 09 2f 2a 20 54 68 65 20 64 61 74 61 uf,../* The data
2030: 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20 20 buffer. */.
2040: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f int to
2050: 57 72 69 74 65 2c 09 09 2f 2a 20 48 6f 77 20 6d Write,../* How m
2060: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 77 72 69 any bytes to wri
2070: 74 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 te? */.
2080: 20 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 int *errorC
2090: 6f 64 65 50 74 72 29 09 2f 2a 20 57 68 65 72 65 odePtr)./* Where
20a0: 20 74 6f 20 73 74 6f 72 65 20 65 72 72 6f 72 20 to store error
20b0: 63 6f 64 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 code. */.{. S
20c0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
20d0: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
20e0: 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 nceData;. int
20f0: 20 77 72 69 74 74 65 6e 2c 20 65 72 72 3b 0a 0a written, err;..
2100: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
2110: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 r = 0;.. dpri
2120: 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e 42 49 ntf(stderr,"\nBI
2130: 4f 5f 77 72 69 74 65 28 30 78 25 78 2c 20 25 64 O_write(0x%x, %d
2140: 29 22 2c 20 73 74 61 74 65 50 74 72 2c 20 74 6f )", statePtr, to
2150: 57 72 69 74 65 29 3b 0a 0a 20 20 20 20 69 66 20 Write);.. if
2160: 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 (!SSL_is_init_fi
2170: 6e 69 73 68 65 64 28 73 74 61 74 65 50 74 72 2d nished(statePtr-
2180: 3e 73 73 6c 29 29 20 7b 0a 09 77 72 69 74 74 65 >ssl)) {..writte
2190: 6e 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 n = Tls_WaitForC
21a0: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c onnect(statePtr,
21b0: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a errorCodePtr);.
21c0: 09 69 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 .if (written <=
21d0: 30 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 6f 0) {.. goto o
21e0: 75 74 70 75 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a utput;..}. }.
21f0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
2200: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
2210: 4c 5f 49 4e 49 54 29 20 7b 0a 09 73 74 61 74 65 L_INIT) {..state
2220: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 Ptr->flags &= ~(
2230: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 3b 0a 20 TLS_TCL_INIT);.
2240: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 74 6f 57 }. if (toW
2250: 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 rite == 0) {..dp
2260: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7a rintf(stderr, "z
2270: 65 72 6f 2d 77 72 69 74 65 5c 6e 22 29 3b 0a 09 ero-write\n");..
2280: 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 BIO_flush(stateP
2290: 74 72 2d 3e 62 69 6f 29 3b 0a 09 77 72 69 74 74 tr->bio);..writt
22a0: 65 6e 20 3d 20 30 3b 0a 09 67 6f 74 6f 20 6f 75 en = 0;..goto ou
22b0: 74 70 75 74 3b 0a 20 20 20 20 7d 20 65 6c 73 65 tput;. } else
22c0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 6e 65 {../*.. * We ne
22d0: 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 ed to clear the
22e0: 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 SSL error stack
22f0: 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65 20 73 now because we s
2300: 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68 0a 09 ometimes reach..
2310: 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e * this function
2320: 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 with leftover e
2330: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 rrors in the sta
2340: 63 6b 2e 20 20 49 66 20 42 49 4f 5f 77 72 69 74 ck. If BIO_writ
2350: 65 0a 09 20 2a 20 72 65 74 75 72 6e 73 20 2d 31 e.. * returns -1
2360: 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41 47 and intends EAG
2370: 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61 20 AIN, there is a
2380: 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c 20 leftover error,
2390: 69 74 20 77 69 6c 6c 20 62 65 0a 09 20 2a 20 6d it will be.. * m
23a0: 69 73 63 6f 6e 73 74 72 75 65 64 20 61 73 20 61 isconstrued as a
23b0: 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47 n error, not EAG
23c0: 41 49 4e 2e 0a 09 20 2a 0a 09 20 2a 20 41 6c 74 AIN... *.. * Alt
23d0: 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d ernatively, we m
23e0: 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c ay want to handl
23f0: 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20 e the <0 return
2400: 63 6f 64 65 73 20 66 72 6f 6d 0a 09 20 2a 20 42 codes from.. * B
2410: 49 4f 5f 77 72 69 74 65 20 73 70 65 63 69 61 6c IO_write special
2420: 6c 79 20 28 61 73 20 61 64 76 69 73 65 64 20 69 ly (as advised i
2430: 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e n the RSA docs).
2440: 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 TLS's lower le
2450: 76 65 6c 0a 09 20 2a 20 42 49 4f 20 66 75 6e 63 vel.. * BIO func
2460: 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 tions play with
2470: 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 the retry flags
2480: 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 though, and this
2490: 20 73 65 65 6d 73 20 74 6f 0a 09 20 2a 20 77 6f seems to.. * wo
24a0: 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 rk correctly. S
24b0: 69 6d 69 6c 61 72 20 66 69 78 20 69 6e 20 54 6c imilar fix in Tl
24c0: 73 49 6e 70 75 74 50 72 6f 63 2e 20 2d 20 68 6f sInputProc. - ho
24d0: 62 62 73 0a 09 20 2a 2f 0a 09 45 52 52 5f 63 6c bbs.. */..ERR_cl
24e0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 09 77 72 ear_error();..wr
24f0: 69 74 74 65 6e 20 3d 20 42 49 4f 5f 77 72 69 74 itten = BIO_writ
2500: 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c e(statePtr->bio,
2510: 20 62 75 66 2c 20 74 6f 57 72 69 74 65 29 3b 0a buf, toWrite);.
2520: 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c .dprintf(stderr,
2530: 22 5c 6e 42 49 4f 5f 77 72 69 74 65 28 30 78 25 "\nBIO_write(0x%
2540: 78 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c x, %d) -> [%d]",
2550: 0a 09 09 73 74 61 74 65 50 74 72 2c 20 74 6f 57 ...statePtr, toW
2560: 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a rite, written);.
2570: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 77 72 }. if (wr
2580: 69 74 74 65 6e 20 3c 3d 20 30 29 20 7b 0a 09 73 itten <= 0) {..s
2590: 77 69 74 63 68 20 28 28 65 72 72 20 3d 20 53 53 witch ((err = SS
25a0: 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 L_get_error(stat
25b0: 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 ePtr->ssl, writt
25c0: 65 6e 29 29 29 20 7b 0a 09 20 20 20 20 63 61 73 en))) {.. cas
25d0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 e SSL_ERROR_NONE
25e0: 3a 0a 09 09 69 66 20 28 77 72 69 74 74 65 6e 20 :...if (written
25f0: 3c 20 30 29 20 7b 0a 09 09 20 20 20 20 77 72 69 < 0) {... wri
2600: 74 74 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 09 tten = 0;...}...
2610: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 break;.. case
2620: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
2630: 57 52 49 54 45 3a 0a 09 09 64 70 72 69 6e 74 66 WRITE:...dprintf
2640: 28 73 74 64 65 72 72 2c 22 20 77 72 69 74 65 20 (stderr," write
2650: 57 20 42 4c 4f 43 4b 22 29 3b 0a 09 09 62 72 65 W BLOCK");...bre
2660: 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 53 53 ak;.. case SS
2670: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 L_ERROR_WANT_REA
2680: 44 3a 0a 09 09 64 70 72 69 6e 74 66 28 73 74 64 D:...dprintf(std
2690: 65 72 72 2c 22 20 77 72 69 74 65 20 52 20 42 4c err," write R BL
26a0: 4f 43 4b 22 29 3b 0a 09 09 62 72 65 61 6b 3b 0a OCK");...break;.
26b0: 09 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52 . case SSL_ER
26c0: 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f ROR_WANT_X509_LO
26d0: 4f 4b 55 50 3a 0a 09 09 64 70 72 69 6e 74 66 28 OKUP:...dprintf(
26e0: 73 74 64 65 72 72 2c 22 20 77 72 69 74 65 20 58 stderr," write X
26f0: 20 42 4c 4f 43 4b 22 29 3b 0a 09 09 62 72 65 61 BLOCK");...brea
2700: 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 53 53 4c k;.. case SSL
2710: 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 _ERROR_ZERO_RETU
2720: 52 4e 3a 0a 09 09 64 70 72 69 6e 74 66 28 73 74 RN:...dprintf(st
2730: 64 65 72 72 2c 22 20 63 6c 6f 73 65 64 5c 6e 22 derr," closed\n"
2740: 29 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 30 );...written = 0
2750: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ;...break;..
2760: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 case SSL_ERROR_S
2770: 59 53 43 41 4c 4c 3a 0a 09 09 2a 65 72 72 6f 72 YSCALL:...*error
2780: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 CodePtr = Tcl_Ge
2790: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 64 70 72 69 tErrno();...dpri
27a0: 6e 74 66 28 73 74 64 65 72 72 2c 22 20 5b 25 64 ntf(stderr," [%d
27b0: 5d 20 73 79 73 63 61 6c 6c 20 65 72 72 72 3a 20 ] syscall errr:
27c0: 25 64 22 2c 0a 09 09 09 77 72 69 74 74 65 6e 2c %d",....written,
27d0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b *errorCodePtr);
27e0: 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b ...written = -1;
27f0: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 ...break;.. c
2800: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 ase SSL_ERROR_SS
2810: 4c 3a 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 L:...Tls_Error(s
2820: 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 52 tatePtr, SSL_ERR
2830: 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c OR(statePtr->ssl
2840: 2c 20 77 72 69 74 74 65 6e 29 29 3b 0a 09 09 2a , written));...*
2850: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
2860: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 77 CONNABORTED;...w
2870: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 62 ritten = -1;...b
2880: 72 65 61 6b 3b 0a 09 20 20 20 20 64 65 66 61 75 reak;.. defau
2890: 6c 74 3a 0a 09 09 64 70 72 69 6e 74 66 28 73 74 lt:...dprintf(st
28a0: 64 65 72 72 2c 22 20 75 6e 6b 6e 6f 77 6e 20 65 derr," unknown e
28b0: 72 72 3a 20 25 64 5c 6e 22 2c 20 65 72 72 29 3b rr: %d\n", err);
28c0: 0a 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 ...break;..}.
28d0: 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 3a 0a 20 }. output:.
28e0: 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 dprintf(stder
28f0: 72 2c 20 22 5c 6e 4f 75 74 70 75 74 28 25 64 29 r, "\nOutput(%d)
2900: 20 2d 3e 20 25 64 22 2c 20 74 6f 57 72 69 74 65 -> %d", toWrite
2910: 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 , written);.
2920: 72 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a return written;.
2930: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2980: 20 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 * TlsGetOptionP
2990: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d roc --. *. *.Com
29a0: 70 75 74 65 73 20 61 6e 20 6f 70 74 69 6f 6e 20 putes an option
29b0: 76 61 6c 75 65 20 66 6f 72 20 61 20 53 53 4c 20 value for a SSL
29c0: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
29d0: 6e 6e 65 6c 2c 20 6f 72 20 61 0a 20 2a 09 6c 69 nnel, or a. *.li
29e0: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e st of all option
29f0: 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 s and their valu
2a00: 65 73 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a 20 es.. *. *.Note:
2a10: 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 This code is bas
2a20: 65 64 20 6f 6e 20 63 6f 64 65 20 63 6f 6e 74 72 ed on code contr
2a30: 69 62 75 74 65 64 20 62 79 20 4a 6f 68 6e 20 48 ibuted by John H
2a40: 61 78 62 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 axby.. *. * Resu
2a50: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
2a60: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 54 rd Tcl result. T
2a70: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 he value of the
2a80: 73 70 65 63 69 66 69 65 64 20 6f 70 74 69 6f 6e specified option
2a90: 20 6f 72 20 61 0a 20 2a 09 6c 69 73 74 20 6f 66 or a. *.list of
2aa0: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 all options and
2ab0: 09 74 68 65 69 72 20 76 61 6c 75 65 73 20 69 73 .their values is
2ac0: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 65 returned in the
2ad0: 0a 20 2a 09 73 75 70 70 6c 69 65 64 20 44 53 74 . *.supplied DSt
2ae0: 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 ring.. *. * Side
2af0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
2b00: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
2b50: 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 47 65 static int.TlsGe
2b60: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 tOptionProc(Clie
2b70: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
2b80: 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 ata,./* Socket s
2b90: 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 tate. */.
2ba0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e Tcl_In
2bb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
2bc0: 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 * For errors - c
2bd0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 an be NULL. */.
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2bf0: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 char *optionName
2c00: 2c 09 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 ,../* Name of th
2c10: 65 20 6f 70 74 69 6f 6e 20 74 6f 0a 20 20 20 20 e option to.
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 72 * r
2c50: 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 etrieve the valu
2c60: 65 20 66 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 e for, or.
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c90: 20 20 20 20 20 20 20 20 20 20 20 2a 20 4e 55 4c * NUL
2ca0: 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 74 L to get all opt
2cb0: 69 6f 6e 73 20 61 6e 64 0a 20 20 20 20 20 20 20 ions and.
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ce0: 20 20 20 20 20 20 20 20 20 20 2a 20 74 68 65 69 * thei
2cf0: 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 r values. */.
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 Tc
2d10: 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 74 72 l_DString *dsPtr
2d20: 29 09 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 ). /* Wh
2d30: 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 ere to store the
2d40: 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 0a computed value.
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2d80: 20 20 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 * initialized
2d90: 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a by caller. */.{.
2da0: 23 69 66 64 65 66 20 54 43 4c 5f 43 48 41 4e 4e #ifdef TCL_CHANN
2db0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 20 20 20 EL_VERSION_2.
2dc0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
2dd0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
2de0: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 54 tanceData;. T
2df0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 6e 43 cl_Channel downC
2e00: 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 han = Tls_GetPar
2e10: 65 6e 74 28 73 74 61 74 65 50 74 72 29 3b 0a 20 ent(statePtr);.
2e20: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 Tcl_DriverGet
2e30: 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f OptionProc *getO
2e40: 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 ptionProc;..
2e50: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 getOptionProc =
2e60: 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 Tcl_ChannelGetOp
2e70: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 tionProc(Tcl_Get
2e80: 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e ChannelType(down
2e90: 43 68 61 6e 29 29 3b 0a 20 20 20 20 69 66 20 28 Chan));. if (
2ea0: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d getOptionProc !=
2eb0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
2ec0: 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 (*getOptionProc
2ed0: 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c )(Tcl_GetChannel
2ee0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f 77 InstanceData(dow
2ef0: 6e 43 68 61 6e 29 2c 0a 09 09 69 6e 74 65 72 70 nChan),...interp
2f00: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 64 73 , optionName, ds
2f10: 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 Ptr);. } else
2f20: 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 if (optionName
2f30: 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 == (char*) NULL)
2f40: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 {../*.. * Reque
2f50: 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 st is query for
2f60: 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 all options, thi
2f70: 73 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 s is ok... */..r
2f80: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 eturn TCL_OK;.
2f90: 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }. /*.
2fa0: 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 * Request for a
2fb0: 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 specific option
2fc0: 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 has to fail, we
2fd0: 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a don't have any..
2fe0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 */. retu
2ff0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
3000: 6c 73 65 0a 20 20 20 20 53 74 61 74 65 20 2a 73 lse. State *s
3010: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
3020: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 *) instanceData
3030: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e ;. size_t len
3040: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 6f = 0;.. if (o
3050: 70 74 69 6f 6e 4e 61 6d 65 20 21 3d 20 28 63 68 ptionName != (ch
3060: 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 20 20 ar *) NULL) {.
3070: 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c len = strl
3080: 65 6e 28 6f 70 74 69 6f 6e 4e 61 6d 65 29 3b 0a en(optionName);.
3090: 20 20 20 20 7d 0a 23 69 66 20 30 0a 20 20 20 20 }.#if 0.
30a0: 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30 29 20 7c if ((len == 0) |
30b0: 7c 0a 20 20 20 20 20 20 20 20 28 28 6c 65 6e 20 |. ((len
30c0: 3e 20 31 29 20 26 26 20 28 6f 70 74 69 6f 6e 4e > 1) && (optionN
30d0: 61 6d 65 5b 31 5d 20 3d 3d 20 27 63 27 29 20 26 ame[1] == 'c') &
30e0: 26 0a 20 20 20 20 20 20 20 20 20 28 73 74 72 6e &. (strn
30f0: 63 6d 70 28 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 cmp(optionName,
3100: 22 2d 63 69 70 68 65 72 22 2c 20 6c 65 6e 29 20 "-cipher", len)
3110: 3d 3d 20 30 29 29 29 20 7b 0a 20 20 20 20 20 20 == 0))) {.
3120: 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29 20 if (len == 0)
3130: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 {. Tc
3140: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 l_DStringAppendE
3150: 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 22 2d lement(dsPtr, "-
3160: 63 69 70 68 65 72 22 29 3b 0a 20 20 20 20 20 20 cipher");.
3170: 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f }. Tcl_
3180: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 DStringAppendEle
3190: 6d 65 6e 74 28 64 73 50 74 72 2c 20 53 53 4c 5f ment(dsPtr, SSL_
31a0: 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 get_cipher(state
31b0: 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 20 20 20 20 Ptr->ssl));.
31c0: 20 20 20 20 69 66 20 28 6c 65 6e 29 20 7b 0a 20 if (len) {.
31d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
31e0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 n TCL_OK;.
31f0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 }. }.#endif
3200: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
3210: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0c 0a 2f OK;.#endif.}.../
3220: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
3270: 73 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a sWatchProc --. *
3280: 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 . *.Initialize t
3290: 68 65 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 he notifier to w
32a0: 61 74 63 68 20 54 63 6c 5f 46 69 6c 65 73 20 66 atch Tcl_Files f
32b0: 72 6f 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c rom this channel
32c0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
32d0: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 . *.None.. *. *
32e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
32f0: 09 53 65 74 73 20 75 70 20 74 68 65 20 6e 6f 74 .Sets up the not
3300: 69 66 69 65 72 20 73 6f 20 74 68 61 74 20 61 20 ifier so that a
3310: 66 75 74 75 72 65 20 65 76 65 6e 74 20 6f 6e 20 future event on
3320: 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 77 the channel. *.w
3330: 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 ill be seen by T
3340: 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d cl.. *. *-------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3390: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 6c ..static void.Tl
33a0: 73 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e sWatchProc(Clien
33b0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
33c0: 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 ta,./* The socke
33d0: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 t state. */.
33e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 int mas
33f0: 6b 29 09 09 09 2f 2a 20 45 76 65 6e 74 73 20 6f k).../* Events o
3400: 66 20 69 6e 74 65 72 65 73 74 3b 20 61 6e 20 4f f interest; an O
3410: 52 2d 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 R-ed.
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 *
3440: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 combination of T
3450: 43 4c 5f 52 45 41 44 41 42 4c 45 2c 0a 20 20 20 CL_READABLE,.
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3480: 20 20 20 20 20 20 2a 20 54 43 4c 5f 57 52 49 54 * TCL_WRIT
3490: 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 ABLE and TCL_EXC
34a0: 45 50 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 EPTION. */.{.
34b0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
34c0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
34d0: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 23 69 66 64 tanceData;..#ifd
34e0: 65 66 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 ef TCL_CHANNEL_V
34f0: 45 52 53 49 4f 4e 5f 32 0a 20 20 20 20 54 63 6c ERSION_2. Tcl
3500: 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64 6f 77 _Channel dow
3510: 6e 43 68 61 6e 3b 0a 0a 20 20 20 20 73 74 61 74 nChan;.. stat
3520: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 ePtr->watchMask
3530: 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 = mask;.. /*
3540: 4e 6f 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c No channel handl
3550: 65 72 73 20 61 6e 79 20 6d 6f 72 65 2e 20 57 65 ers any more. We
3560: 20 77 69 6c 6c 20 62 65 20 6e 6f 74 69 66 69 65 will be notifie
3570: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a d automatically.
3580: 20 20 20 20 20 2a 20 61 62 6f 75 74 20 65 76 65 * about eve
3590: 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e nts on the chann
35a0: 65 6c 20 62 65 6c 6f 77 20 76 69 61 20 61 20 63 el below via a c
35b0: 61 6c 6c 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 all to our.
35c0: 2a 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 * 'TransformNoti
35d0: 66 79 50 72 6f 63 27 2e 20 42 75 74 20 77 65 20 fyProc'. But we
35e0: 68 61 76 65 20 74 6f 20 70 61 73 73 20 74 68 65 have to pass the
35f0: 20 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20 6e interest down n
3600: 6f 77 2e 0a 20 20 20 20 20 2a 20 57 65 20 61 72 ow.. * We ar
3610: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64 e allowed to add
3620: 20 61 64 64 69 74 69 6f 6e 61 6c 20 27 69 6e 74 additional 'int
3630: 65 72 65 73 74 27 20 74 6f 20 74 68 65 20 6d 61 erest' to the ma
3640: 73 6b 20 69 66 20 77 65 20 77 61 6e 74 0a 20 20 sk if we want.
3650: 20 20 20 2a 20 74 6f 2e 20 42 75 74 20 74 68 69 * to. But thi
3660: 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e s transformation
3670: 20 68 61 73 20 6e 6f 20 73 75 63 68 20 69 6e 74 has no such int
3680: 65 72 65 73 74 2e 20 49 74 20 6a 75 73 74 20 70 erest. It just p
3690: 61 73 73 65 73 0a 20 20 20 20 20 2a 20 74 68 65 asses. * the
36a0: 20 72 65 71 75 65 73 74 20 64 6f 77 6e 2c 20 75 request down, u
36b0: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a nchanged.. *
36c0: 2f 0a 0a 20 20 20 20 64 6f 77 6e 43 68 61 6e 20 /.. downChan
36d0: 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 = Tls_GetParent(
36e0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
36f0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
3700: 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 0a 09 ype(downChan))..
3710: 2d 3e 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f ->watchProc(Tcl_
3720: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
3730: 63 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 ceData(downChan)
3740: 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a , mask);.. /*
3750: 0a 20 20 20 20 20 2a 20 4d 61 6e 61 67 65 6d 65 . * Manageme
3760: 6e 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e nt of the intern
3770: 61 6c 20 74 69 6d 65 72 2e 0a 20 20 20 20 20 2a al timer.. *
3780: 2f 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 /.. if (state
3790: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
37a0: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
37b0: 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 54 ULL) {. T
37c0: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
37d0: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
37e0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
37f0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
3800: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
3810: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
3820: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 (mask & TCL_READ
3830: 41 42 4c 45 29 20 26 26 20 54 63 6c 5f 49 6e 70 ABLE) && Tcl_Inp
3840: 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 utBuffered(state
3850: 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20 Ptr->self) > 0)
3860: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 09 20 2a {. /*.. *
3870: 20 54 68 65 72 65 20 69 73 20 69 6e 74 65 72 65 There is intere
3880: 73 74 20 69 6e 20 72 65 61 64 61 62 6c 65 20 65 st in readable e
3890: 76 65 6e 74 73 20 61 6e 64 20 77 65 20 61 63 74 vents and we act
38a0: 75 61 6c 6c 79 20 68 61 76 65 0a 09 20 2a 20 64 ually have.. * d
38b0: 61 74 61 20 77 61 69 74 69 6e 67 2c 20 73 6f 20 ata waiting, so
38c0: 67 65 6e 65 72 61 74 65 20 61 20 74 69 6d 65 72 generate a timer
38d0: 20 74 6f 20 66 6c 75 73 68 20 74 68 61 74 2e 0a to flush that..
38e0: 09 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e . */..statePtr->
38f0: 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 timer = Tcl_Crea
3900: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 teTimerHandler(T
3910: 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c 0a 09 09 LS_TCL_DELAY,...
3920: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 TlsChannelHandle
3930: 72 54 69 6d 65 72 2c 20 28 43 6c 69 65 6e 74 44 rTimer, (ClientD
3940: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3950: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 }.#else.
3960: 69 66 20 28 6d 61 73 6b 20 3d 3d 20 73 74 61 74 if (mask == stat
3970: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29 ePtr->watchMask)
3980: 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 ..return;.. i
3990: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 77 61 74 f (statePtr->wat
39a0: 63 68 4d 61 73 6b 29 20 7b 0a 09 2f 2a 0a 09 20 chMask) {../*..
39b0: 2a 20 52 65 6d 6f 76 65 20 65 76 65 6e 74 20 68 * Remove event h
39c0: 61 6e 64 6c 65 72 20 74 6f 20 75 6e 64 65 72 6c andler to underl
39d0: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2c 20 74 68 ying channel, th
39e0: 69 73 20 63 6f 75 6c 64 0a 09 20 2a 20 62 65 20 is could.. * be
39f0: 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 63 because we are c
3a00: 6c 6f 73 69 6e 67 20 66 6f 72 20 72 65 61 6c 2c losing for real,
3a10: 20 6f 72 20 62 65 69 6e 67 20 22 75 6e 73 74 61 or being "unsta
3a20: 63 6b 65 64 22 2e 0a 09 20 2a 2f 0a 0a 09 54 63 cked"... */...Tc
3a30: 6c 5f 44 65 6c 65 74 65 43 68 61 6e 6e 65 6c 48 l_DeleteChannelH
3a40: 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 74 50 61 andler(Tls_GetPa
3a50: 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 2c 0a rent(statePtr),.
3a60: 09 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 ..TlsChannelHand
3a70: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 ler, (ClientData
3a80: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
3a90: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d }. statePtr-
3aa0: 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 >watchMask = mas
3ab0: 6b 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 k;. if (state
3ac0: 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29 20 Ptr->watchMask)
3ad0: 7b 0a 09 2f 2a 0a 09 20 2a 20 53 65 74 75 70 20 {../*.. * Setup
3ae0: 61 63 74 69 76 65 20 6d 6f 6e 69 74 6f 72 20 66 active monitor f
3af0: 6f 72 20 65 76 65 6e 74 73 20 6f 6e 20 75 6e 64 or events on und
3b00: 65 72 6c 79 69 6e 67 20 43 68 61 6e 6e 65 6c 2e erlying Channel.
3b10: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 72 65 61 .. */...Tcl_Crea
3b20: 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 teChannelHandler
3b30: 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 (Tls_GetParent(s
3b40: 74 61 74 65 50 74 72 29 2c 0a 09 09 73 74 61 74 tatePtr),...stat
3b50: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 2c ePtr->watchMask,
3b60: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c TlsChannelHandl
3b70: 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 er, (ClientData)
3b80: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
3b90: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0c 0a 2f 2a 0a }.#endif.}.../*.
3ba0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3be0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 -----. *. * TlsG
3bf0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a etHandleProc --.
3c00: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f *. *.Called fro
3c10: 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c m Tcl_GetChannel
3c20: 46 69 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 File to retrieve
3c30: 20 6f 2f 73 20 66 69 6c 65 20 68 61 6e 64 6c 65 o/s file handle
3c40: 72 0a 20 2a 09 66 72 6f 6d 20 74 68 65 20 53 53 r. *.from the SS
3c50: 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
3c60: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 hannel.. *. * Re
3c70: 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 70 sults:. *.The ap
3c80: 70 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69 propriate Tcl_Fi
3c90: 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f le or NULL if no
3ca0: 74 20 70 72 65 73 65 6e 74 2e 20 0a 20 2a 0a 20 t present. . *.
3cb0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3cc0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d10: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
3d20: 0a 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f .TlsGetHandlePro
3d30: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
3d40: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54 68 tanceData,./* Th
3d50: 65 20 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 e socket state.
3d60: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 */.
3d70: 20 20 20 20 69 6e 74 20 64 69 72 65 63 74 69 6f int directio
3d80: 6e 2c 09 09 2f 2a 20 57 68 69 63 68 20 54 63 6c n,../* Which Tcl
3d90: 5f 46 69 6c 65 20 74 6f 20 72 65 74 72 69 65 76 _File to retriev
3da0: 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 e? */.
3db0: 20 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 ClientDat
3dc0: 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f 2a a *handlePtr)./*
3dd0: 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 Where to store
3de0: 74 68 65 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a the handle. */.
3df0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
3e00: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
3e10: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
3e20: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f . return Tcl_
3e30: 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 GetChannelHandle
3e40: 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 (Tls_GetParent(s
3e50: 74 61 74 65 50 74 72 29 2c 20 64 69 72 65 63 74 tatePtr), direct
3e60: 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b ion, handlePtr);
3e70: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3ec0: 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f . * TlsNotifyPro
3ed0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c c --. *. *.Handl
3ee0: 65 72 20 63 61 6c 6c 65 64 20 62 79 20 54 63 6c er called by Tcl
3ef0: 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 to inform us of
3f00: 20 61 63 74 69 76 69 74 79 0a 20 2a 09 6f 6e 20 activity. *.on
3f10: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 the underlying c
3f20: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 hannel.. *. * Re
3f30: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a sults:. *.None..
3f40: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3f50: 74 73 3a 0a 20 2a 09 4d 61 79 20 70 72 6f 63 65 ts:. *.May proce
3f60: 73 73 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 ss the incoming
3f70: 65 76 65 6e 74 20 62 79 20 69 74 73 65 6c 66 2e event by itself.
3f80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
3f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
3fd0: 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 4e 6f 74 tatic int.TlsNot
3fe0: 69 66 79 50 72 6f 63 28 69 6e 73 74 61 6e 63 65 ifyProc(instance
3ff0: 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20 20 Data, mask).
4000: 43 6c 69 65 6e 74 44 61 74 61 09 20 20 20 69 6e ClientData. in
4010: 73 74 61 6e 63 65 44 61 74 61 3b 20 2f 2a 20 54 stanceData; /* T
4020: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 he state of the
4030: 6e 6f 74 69 66 69 65 64 20 74 72 61 6e 73 66 6f notified transfo
4040: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 rmation */. i
4050: 6e 74 09 09 20 20 20 6d 61 73 6b 3b 20 20 20 20 nt.. mask;
4060: 20 20 20 2f 2a 20 54 68 65 20 6d 61 73 6b 20 6f /* The mask o
4070: 66 20 6f 63 63 75 72 69 6e 67 20 65 76 65 6e 74 f occuring event
4080: 73 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 s */.{. State
4090: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
40a0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
40b0: 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 ata;.. /*.
40c0: 20 20 2a 20 41 6e 20 65 76 65 6e 74 20 6f 63 63 * An event occ
40d0: 75 72 65 64 20 69 6e 20 74 68 65 20 75 6e 64 65 ured in the unde
40e0: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 rlying channel.
40f0: 20 54 68 69 73 0a 20 20 20 20 20 2a 20 74 72 61 This. * tra
4100: 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 64 6f 65 73 nsformation does
4110: 6e 27 74 20 70 72 6f 63 65 73 73 20 73 75 63 68 n't process such
4120: 20 65 76 65 6e 74 73 20 74 68 75 73 20 72 65 74 events thus ret
4130: 75 72 6e 73 20 74 68 65 0a 20 20 20 20 20 2a 20 urns the. *
4140: 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 6b 20 75 6e incoming mask un
4150: 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f changed.. */
4160: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
4170: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
4180: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
4190: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 65 LL) {../*.. * De
41a0: 6c 65 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 lete an existing
41b0: 20 74 69 6d 65 72 2e 20 49 74 20 77 61 73 20 6e timer. It was n
41c0: 6f 74 20 66 69 72 65 64 2c 20 79 65 74 20 77 65 ot fired, yet we
41d0: 20 61 72 65 0a 09 20 2a 20 68 65 72 65 2c 20 73 are.. * here, s
41e0: 6f 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 o the channel be
41f0: 6c 6f 77 20 67 65 6e 65 72 61 74 65 64 20 73 75 low generated su
4200: 63 68 20 61 6e 20 65 76 65 6e 74 20 61 6e 64 20 ch an event and
4210: 77 65 0a 09 20 2a 20 64 6f 6e 27 74 20 68 61 76 we.. * don't hav
4220: 65 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 61 e to. The renewa
4230: 6c 20 6f 66 20 74 68 65 20 69 6e 74 65 72 65 73 l of the interes
4240: 74 20 61 66 74 65 72 20 74 68 65 0a 09 20 2a 20 t after the.. *
4250: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 61 execution of cha
4260: 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 69 nnel handlers wi
4270: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 ll eventually ca
4280: 75 73 65 20 75 73 20 74 6f 0a 09 20 2a 20 72 65 use us to.. * re
4290: 63 72 65 61 74 65 20 74 68 65 20 74 69 6d 65 72 create the timer
42a0: 20 28 69 6e 20 57 61 74 63 68 50 72 6f 63 29 2e (in WatchProc).
42b0: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 65 6c 65 .. */...Tcl_Dele
42c0: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
42d0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
42e0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
42f0: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f r = (Tcl_TimerTo
4300: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d ken) NULL;. }
4310: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 .. return mas
4320: 6b 3b 0a 7d 0a 0c 0a 23 69 66 6e 64 65 66 20 54 k;.}...#ifndef T
4330: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 CL_CHANNEL_VERSI
4340: 4f 4e 5f 32 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ON_2./*. *------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 54 6c 73 *. *. * Tls
4390: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d ChannelHandler -
43a0: 2d 0a 20 2a 0a 20 2a 20 20 20 20 20 20 2d 2d 2d -. *. * ---
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
43e0: 2a 20 20 20 20 20 20 48 61 6e 64 6c 65 72 20 63 * Handler c
43f0: 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 61 73 20 alled by Tcl as
4400: 61 20 72 65 73 75 6c 74 20 6f 66 0a 20 2a 20 20 a result of. *
4410: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 68 Tcl_CreateCh
4420: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 20 74 annelHandler - t
4430: 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 o inform us of a
4440: 63 74 69 76 69 74 79 0a 20 2a 20 20 20 20 20 20 ctivity. *
4450: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e on the underlyin
4460: 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20 20 g channel.. *
4470: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -------------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44a0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 ---*. *. *
44b0: 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 20 Sideeffects:. *
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 79 May
44d0: 20 67 65 6e 65 72 61 74 65 20 73 75 62 73 65 71 generate subseq
44e0: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 20 2a uent calls to. *
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 Tc
4500: 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 2e l_NotifyChannel.
4510: 0a 20 2a 0a 20 2a 20 20 20 20 20 20 52 65 73 75 . *. * Resu
4520: 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20 20 20 20 lt:. *
4530: 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d None.. *. *-
4540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4570: 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74 -----*. */..stat
4580: 69 63 20 76 6f 69 64 0a 54 6c 73 43 68 61 6e 6e ic void.TlsChann
4590: 65 6c 48 61 6e 64 6c 65 72 20 28 63 6c 69 65 6e elHandler (clien
45a0: 74 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20 tData, mask).
45b0: 20 43 6c 69 65 6e 74 44 61 74 61 20 20 20 20 20 ClientData
45c0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 clientData;.
45d0: 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 6d int m
45e0: 61 73 6b 3b 0a 7b 0a 20 20 20 20 53 74 61 74 65 ask;.{. State
45f0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
4600: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
4610: 61 3b 0a 0a 64 70 72 69 6e 74 66 28 73 74 64 65 a;..dprintf(stde
4620: 72 72 2c 20 22 48 41 4e 44 4c 45 52 28 30 78 25 rr, "HANDLER(0x%
4630: 78 29 5c 6e 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 x)\n", mask);.
4640: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 Tcl_Preserve(
4650: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74 (ClientData)stat
4660: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
4670: 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 mask & TCL_READA
4680: 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 65 74 5f BLE) {..BIO_set_
4690: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e flags(statePtr->
46a0: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 p_bio, BIO_FLAGS
46b0: 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 20 65 6c _READ);. } el
46c0: 73 65 20 7b 0a 09 42 49 4f 5f 63 6c 65 61 72 5f se {..BIO_clear_
46d0: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e flags(statePtr->
46e0: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 p_bio, BIO_FLAGS
46f0: 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 _READ);. }..
4700: 20 20 20 69 66 20 28 6d 61 73 6b 20 26 20 54 43 if (mask & TC
4710: 4c 5f 57 52 49 54 41 42 4c 45 29 20 7b 0a 09 42 L_WRITABLE) {..B
4720: 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 73 74 61 IO_set_flags(sta
4730: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 tePtr->p_bio, BI
4740: 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a O_FLAGS_WRITE);.
4750: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 } else {..BI
4760: 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 73 28 73 74 O_clear_flags(st
4770: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 atePtr->p_bio, B
4780: 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b IO_FLAGS_WRITE);
4790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 73 6b . }.. mask
47a0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 42 49 = 0;. if (BI
47b0: 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 O_wpending(state
47c0: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 Ptr->bio)) {..ma
47d0: 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 sk |= TCL_WRITAB
47e0: 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LE;. }. if
47f0: 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 (BIO_pending(st
4800: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
4810: 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 .mask |= TCL_REA
4820: 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 DABLE;. }..
4830: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 /*. * The
4840: 66 6f 6c 6c 6f 77 69 6e 67 20 4e 6f 74 69 66 79 following Notify
4850: 43 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 73 65 Channel calls se
4860: 65 6d 73 20 74 6f 20 62 65 20 69 6d 70 6f 72 74 ems to be import
4870: 61 6e 74 2c 20 62 75 74 0a 20 20 20 20 20 2a 20 ant, but. *
4880: 77 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 77 68 we don't know wh
4890: 79 2e 20 20 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b y. It looks lik
48a0: 65 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 e if the mask is
48b0: 20 65 76 65 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 20 ever non-zero.
48c0: 20 20 20 20 2a 20 74 68 61 74 20 69 74 20 77 69 * that it wi
48d0: 6c 6c 20 65 6e 74 65 72 20 61 6e 20 69 6e 66 69 ll enter an infi
48e0: 6e 69 74 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 nite loop..
48f0: 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 69 66 79 20 *. * Notify
4900: 74 68 65 20 75 70 70 65 72 20 63 68 61 6e 6e 65 the upper channe
4910: 6c 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 l of the current
4920: 20 42 49 4f 20 73 74 61 74 65 20 73 6f 20 74 68 BIO state so th
4930: 65 20 65 76 65 6e 74 0a 20 20 20 20 20 2a 20 63 e event. * c
4940: 6f 6e 74 69 6e 75 65 73 20 74 6f 20 70 72 6f 70 ontinues to prop
4950: 61 67 61 74 65 20 75 70 20 74 68 65 20 63 68 61 agate up the cha
4960: 69 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 in.. *.
4970: 2a 20 73 74 61 6e 74 6f 6e 3a 20 49 74 20 6c 6f * stanton: It lo
4980: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 20 63 6f oks like this co
4990: 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 61 6e uld result in an
49a0: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 69 infinite loop i
49b0: 66 0a 20 20 20 20 20 2a 20 74 68 65 20 75 70 70 f. * the upp
49c0: 65 72 20 63 68 61 6e 6e 65 6c 20 64 6f 65 73 6e er channel doesn
49d0: 27 74 20 63 61 75 73 65 20 43 68 61 6e 6e 65 6c 't cause Channel
49e0: 48 61 6e 64 6c 65 72 20 74 6f 20 62 65 20 72 65 Handler to be re
49f0: 6d 6f 76 65 64 0a 20 20 20 20 20 2a 20 62 65 66 moved. * bef
4a00: 6f 72 65 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 ore Tcl_NotifyCh
4a10: 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 63 68 61 6e annel calls chan
4a20: 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 6f 6e 20 nel handlers on
4a30: 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 the lower channe
4a40: 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 0a l.. */. .
4a50: 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 Tcl_NotifyCh
4a60: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
4a70: 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 self, mask);.
4a80: 20 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 . if (stateP
4a90: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
4aa0: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c l_TimerToken)NUL
4ab0: 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 L) {..Tcl_Delete
4ac0: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
4ad0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
4ae0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
4af0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
4b00: 6e 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 n)NULL;. }.
4b10: 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 if ((mask & TC
4b20: 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 54 L_READABLE) && T
4b30: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 cl_InputBuffered
4b40: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
4b50: 20 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 > 0) {../*.. *
4b60: 44 61 74 61 20 69 73 20 77 61 69 74 69 6e 67 2c Data is waiting,
4b70: 20 66 6c 75 73 68 20 69 74 20 6f 75 74 20 69 6e flush it out in
4b80: 20 73 68 6f 72 74 20 74 69 6d 65 0a 09 20 2a 2f short time.. */
4b90: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
4ba0: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 r = Tcl_CreateTi
4bb0: 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 merHandler(TLS_T
4bc0: 43 4c 5f 44 45 4c 41 59 2c 0a 09 09 54 6c 73 43 CL_DELAY,...TlsC
4bd0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d hannelHandlerTim
4be0: 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 er, (ClientData)
4bf0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
4c00: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 }. Tcl_Releas
4c10: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 73 e( (ClientData)s
4c20: 74 61 74 65 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 tatePtr);.}.#end
4c30: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d if.../*. *------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c70: 2a 0a 20 2a 0a 20 2a 09 54 6c 73 43 68 61 6e 6e *. *. *.TlsChann
4c80: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 2d elHandlerTimer -
4c90: 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d -. *. *.--------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 43 61 6c --------*. *.Cal
4cd0: 6c 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 led by the notif
4ce0: 69 65 72 20 28 2d 3e 20 74 69 6d 65 72 29 20 74 ier (-> timer) t
4cf0: 6f 20 66 6c 75 73 68 20 6f 75 74 0a 20 2a 09 69 o flush out. *.i
4d00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 74 69 nformation waiti
4d10: 6e 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 62 75 ng in channel bu
4d20: 66 66 65 72 73 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d ffers.. *.------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
4d60: 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 *.Sideeffects:.
4d70: 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 43 68 61 *..As of 'TlsCha
4d80: 6e 6e 65 6c 48 61 6e 64 6c 65 72 27 2e 0a 20 2a nnelHandler'.. *
4d90: 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 . *.Result:. *..
4da0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
4db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4de0: 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 -*. */..static v
4df0: 6f 69 64 0a 54 6c 73 43 68 61 6e 6e 65 6c 48 61 oid.TlsChannelHa
4e00: 6e 64 6c 65 72 54 69 6d 65 72 20 28 63 6c 69 65 ndlerTimer (clie
4e10: 6e 74 44 61 74 61 29 0a 43 6c 69 65 6e 74 44 61 ntData).ClientDa
4e20: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 20 2f ta clientData; /
4e30: 2a 20 54 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e * Transformation
4e40: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 7b 0a 20 to query */.{.
4e50: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
4e60: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 63 tr = (State *) c
4e70: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 lientData;. i
4e80: 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 0a 20 20 nt mask = 0;..
4e90: 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 statePtr->time
4ea0: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f r = (Tcl_TimerTo
4eb0: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 ken) NULL;..
4ec0: 69 66 20 28 42 49 4f 5f 77 70 65 6e 64 69 6e 67 if (BIO_wpending
4ed0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 (statePtr->bio))
4ee0: 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f {..mask |= TCL_
4ef0: 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a WRITABLE;. }.
4f00: 20 20 20 20 69 66 20 28 42 49 4f 5f 70 65 6e 64 if (BIO_pend
4f10: 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ing(statePtr->bi
4f20: 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54 o)) {..mask |= T
4f30: 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20 20 CL_READABLE;.
4f40: 20 7d 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 }. Tcl_Notif
4f50: 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 yChannel(statePt
4f60: 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a r->self, mask);.
4f70: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2a ---------------*
4fb0: 0a 20 2a 0a 20 2a 09 54 6c 73 5f 57 61 69 74 46 . *. *.Tls_WaitF
4fc0: 6f 72 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a orConnect --. *.
4fd0: 20 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a *.Sideeffects:.
4fe0: 20 2a 09 09 49 73 73 75 65 73 20 53 53 4c 5f 61 *..Issues SSL_a
4ff0: 63 63 65 70 74 20 6f 72 20 53 53 4c 5f 63 6f 6e ccept or SSL_con
5000: 6e 65 63 74 0a 20 2a 0a 20 2a 09 52 65 73 75 6c nect. *. *.Resul
5010: 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a 0a t:. *..None.. *.
5020: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 69 6e --------*. */.in
5060: 74 0a 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e t.Tls_WaitForCon
5070: 6e 65 63 74 28 20 73 74 61 74 65 50 74 72 2c 20 nect( statePtr,
5080: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 0a 20 20 errorCodePtr).
5090: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
50a0: 72 3b 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f r;. int *erro
50b0: 72 43 6f 64 65 50 74 72 3b 09 09 2f 2a 20 57 68 rCodePtr;../* Wh
50c0: 65 72 65 20 74 6f 20 73 74 6f 72 65 20 65 72 72 ere to store err
50d0: 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 7b 0a 20 20 or code. */.{.
50e0: 20 20 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 20 int err;..
50f0: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 dprintf(stderr,"
5100: 5c 6e 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 \nWaitForConnect
5110: 28 30 78 25 78 29 22 2c 20 73 74 61 74 65 50 74 (0x%x)", statePt
5120: 72 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 3b 3b r);.. for (;;
5130: 29 20 7b 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 ) {../* Not init
5140: 69 61 6c 69 7a 65 64 20 79 65 74 21 20 2a 2f 0a ialized yet! */.
5150: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 .if (statePtr->f
5160: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 lags & TLS_TCL_S
5170: 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 65 72 ERVER) {.. er
5180: 72 20 3d 20 53 53 4c 5f 61 63 63 65 70 74 28 73 r = SSL_accept(s
5190: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
51a0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 65 72 } else {.. er
51b0: 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 r = SSL_connect(
51c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
51d0: 09 7d 0a 09 2f 2a 53 53 4c 5f 77 72 69 74 65 28 .}../*SSL_write(
51e0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
51f0: 63 68 61 72 2a 29 26 65 72 72 2c 20 30 29 3b 09 char*)&err, 0);.
5200: 48 41 43 4b 21 21 21 20 2a 2f 0a 09 69 66 20 28 HACK!!! */..if (
5210: 65 72 72 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 err > 0) {..
5220: 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 BIO_flush(stateP
5230: 74 72 2d 3e 62 69 6f 29 3b 0a 09 7d 0a 0a 09 69 tr->bio);..}...i
5240: 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 f (err <= 0) {..
5250: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 53 4c int rc = SSL
5260: 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 _get_error(state
5270: 50 74 72 2d 3e 73 73 6c 2c 20 65 72 72 29 3b 0a Ptr->ssl, err);.
5280: 0a 09 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 .. if (rc ==
5290: 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 29 20 7b SSL_ERROR_SSL) {
52a0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ...Tls_Error(sta
52b0: 74 65 50 74 72 2c 0a 09 09 09 28 63 68 61 72 20 tePtr,....(char
52c0: 2a 29 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 *)ERR_reason_err
52d0: 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 or_string(ERR_ge
52e0: 74 5f 65 72 72 6f 72 28 29 29 29 3b 0a 09 09 2a t_error()));...*
52f0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
5300: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 72 CONNABORTED;...r
5310: 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d eturn -1;.. }
5320: 20 65 6c 73 65 20 69 66 20 28 42 49 4f 5f 73 68 else if (BIO_sh
5330: 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 ould_retry(state
5340: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 69 Ptr->bio)) {...i
5350: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 f (statePtr->fla
5360: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 gs & TLS_TCL_ASY
5370: 4e 43 29 20 7b 0a 09 09 20 20 20 20 64 70 72 69 NC) {... dpri
5380: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 21 20 22 ntf(stderr,"E! "
5390: 29 3b 0a 09 09 20 20 20 20 2a 65 72 72 6f 72 43 );... *errorC
53a0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
53b0: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 ... return -1
53c0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
53d0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d continue;...}
53e0: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
53f0: 28 65 72 72 20 3d 3d 20 30 29 20 7b 0a 09 09 64 (err == 0) {...d
5400: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 printf(stderr,"C
5410: 52 21 20 22 29 3b 0a 09 09 2a 65 72 72 6f 72 43 R! ");...*errorC
5420: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 odePtr = ECONNRE
5430: 53 45 54 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 SET;...return -1
5440: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 ;.. }.. if
5450: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 (statePtr->flag
5460: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 s & TLS_TCL_SERV
5470: 45 52 29 20 7b 0a 09 09 65 72 72 20 3d 20 53 53 ER) {...err = SS
5480: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 L_get_verify_res
5490: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ult(statePtr->ss
54a0: 6c 29 3b 0a 09 09 69 66 20 28 65 72 72 20 21 3d l);...if (err !=
54b0: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 X509_V_OK) {...
54c0: 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 Tls_Error(st
54d0: 61 74 65 50 74 72 2c 0a 09 09 09 20 20 20 20 28 atePtr,.... (
54e0: 63 68 61 72 20 2a 29 58 35 30 39 5f 76 65 72 69 char *)X509_veri
54f0: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
5500: 72 69 6e 67 28 65 72 72 29 29 3b 0a 09 09 20 20 ring(err));...
5510: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
5520: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a = ECONNABORTED;.
5530: 09 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b .. return -1;
5540: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 ...}.. }..
5550: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
5560: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
5570: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 .. dprintf(st
5580: 64 65 72 72 2c 22 45 52 52 28 25 64 2c 20 25 64 derr,"ERR(%d, %d
5590: 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 43 ) ", rc, *errorC
55a0: 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 odePtr);.. re
55b0: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 64 70 72 turn -1;..}..dpr
55c0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 52 30 21 intf(stderr,"R0!
55d0: 20 22 29 3b 0a 09 72 65 74 75 72 6e 20 31 3b 0a ");..return 1;.
55e0: 20 20 20 20 7d 0a 7d 0a 0a 54 63 6c 5f 43 68 61 }.}..Tcl_Cha
55f0: 6e 6e 65 6c 0a 54 6c 73 5f 47 65 74 50 61 72 65 nnel.Tls_GetPare
5600: 6e 74 28 20 73 74 61 74 65 50 74 72 20 29 0a 20 nt( statePtr ).
5610: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
5620: 74 72 3b 0a 7b 0a 23 69 66 64 65 66 20 54 43 4c tr;.{.#ifdef TCL
5630: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e _CHANNEL_VERSION
5640: 5f 32 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 _2. return Tc
5650: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e l_GetStackedChan
5660: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 nel(statePtr->se
5670: 6c 66 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 54 lf);.#else.#if T
5680: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
5690: 20 3d 3d 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e == 8 && TCL_MIN
56a0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 32 0a 20 OR_VERSION < 2.
56b0: 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 50 return stateP
56c0: 74 72 2d 3e 70 61 72 65 6e 74 3b 0a 23 65 6c 73 tr->parent;.#els
56d0: 65 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 e. /* The rea
56e0: 73 6f 6e 20 66 6f 72 20 74 68 65 20 65 78 69 73 son for the exis
56f0: 74 65 6e 63 65 20 6f 66 20 74 68 69 73 20 70 72 tence of this pr
5700: 6f 63 65 64 75 72 65 20 69 73 0a 20 20 20 20 20 ocedure is.
5710: 2a 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 * the fact that
5720: 73 74 61 63 6b 69 6e 67 20 61 20 74 72 61 6e 73 stacking a trans
5730: 66 6f 72 6d 20 6f 76 65 72 20 61 6e 6f 74 68 65 form over anothe
5740: 72 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f r. * transfo
5750: 72 6d 20 77 69 6c 6c 20 6c 65 61 76 65 20 6f 75 rm will leave ou
5760: 72 20 69 6e 74 65 72 6e 61 6c 20 70 6f 69 6e 74 r internal point
5770: 65 72 20 75 6e 63 68 61 6e 67 65 64 2c 0a 20 20 er unchanged,.
5780: 20 20 20 2a 20 61 6e 64 20 74 68 75 73 20 70 6f * and thus po
5790: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 inting to the ne
57a0: 77 20 74 72 61 6e 73 66 6f 72 6d 2c 20 61 6e 64 w transform, and
57b0: 20 6e 6f 74 20 74 68 65 0a 20 20 20 20 20 2a 20 not the. *
57c0: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 Channel structur
57d0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 e containing the
57e0: 20 73 61 76 65 64 20 73 74 61 74 65 20 6f 66 20 saved state of
57f0: 74 68 69 73 0a 20 20 20 20 20 2a 20 74 72 61 6e this. * tran
5800: 73 66 6f 72 6d 2e 20 54 68 69 73 20 69 73 20 74 sform. This is t
5810: 68 65 20 70 72 69 63 65 20 74 6f 20 70 61 79 20 he price to pay
5820: 66 6f 72 20 6c 65 61 76 69 6e 67 0a 20 20 20 20 for leaving.
5830: 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 72 * Tcl_Channel r
5840: 65 66 65 72 65 6e 63 65 73 20 69 6e 74 61 63 74 eferences intact
5850: 2e 20 54 68 65 20 6f 6e 6c 79 20 6f 74 68 65 72 . The only other
5860: 20 73 6f 6c 75 74 69 6f 6e 0a 20 20 20 20 20 2a solution. *
5870: 20 69 73 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e is an extension
5880: 20 6f 66 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 of Tcl_ChannelT
5890: 79 70 65 20 77 69 74 68 20 61 6e 6f 74 68 65 72 ype with another
58a0: 20 64 72 69 76 65 72 0a 20 20 20 20 20 2a 20 70 driver. * p
58b0: 72 6f 63 65 64 75 72 65 20 74 6f 20 6e 6f 74 69 rocedure to noti
58c0: 66 79 20 61 20 43 68 61 6e 6e 65 6c 20 61 62 6f fy a Channel abo
58d0: 75 74 20 74 68 65 20 28 75 6e 29 73 74 61 63 6b ut the (un)stack
58e0: 69 6e 67 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 ing.. *.
58f0: 20 2a 20 49 74 20 77 61 6c 6b 73 20 74 68 65 20 * It walks the
5900: 63 68 61 69 6e 20 6f 66 20 43 68 61 6e 6e 65 6c chain of Channel
5910: 20 73 74 72 75 63 74 75 72 65 73 20 75 6e 74 69 structures unti
5920: 6c 20 69 74 0a 20 20 20 20 20 2a 20 66 69 6e 64 l it. * find
5930: 73 20 74 68 65 20 6f 6e 65 20 70 6f 69 6e 74 69 s the one pointi
5940: 6e 67 20 68 61 76 69 6e 67 20 27 63 74 72 6c 27 ng having 'ctrl'
5950: 20 61 73 20 69 6e 73 74 61 6e 63 65 44 61 74 61 as instanceData
5960: 0a 20 20 20 20 20 2a 20 61 6e 64 20 74 68 65 6e . * and then
5970: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 75 70 returns the sup
5980: 65 72 63 65 64 69 6e 67 20 63 68 61 6e 6e 65 6c erceding channel
5990: 20 74 6f 20 74 68 61 74 2e 20 28 41 4b 29 0a 20 to that. (AK).
59a0: 20 20 20 20 2a 2f 0a 20 0a 20 20 20 20 54 63 6c */. . Tcl
59b0: 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 20 3d 20 _Channel self =
59c0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a statePtr->self;.
59d0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
59e0: 6e 65 78 74 3b 0a 0a 20 20 20 20 77 68 69 6c 65 next;.. while
59f0: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 ((ClientData) s
5a00: 74 61 74 65 50 74 72 20 21 3d 20 54 63 6c 5f 47 tatePtr != Tcl_G
5a10: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
5a20: 65 44 61 74 61 20 28 73 65 6c 66 29 29 20 7b 0a eData (self)) {.
5a30: 09 6e 65 78 74 20 3d 20 54 63 6c 5f 47 65 74 53 .next = Tcl_GetS
5a40: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 20 28 73 tackedChannel (s
5a50: 65 6c 66 29 3b 0a 09 69 66 20 28 6e 65 78 74 20 elf);..if (next
5a60: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
5a70: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
5a80: 20 30 39 2f 32 34 2f 31 39 39 39 20 55 6e 73 74 09/24/1999 Unst
5a90: 61 63 6b 69 6e 67 20 62 75 67 2c 0a 09 20 20 20 acking bug,..
5aa0: 20 20 2a 20 66 6f 75 6e 64 20 62 79 20 4d 61 74 * found by Mat
5ab0: 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 73 t Newman <matt@s
5ac0: 65 6e 73 75 73 2e 6f 72 67 3e 2e 0a 09 20 20 20 ensus.org>...
5ad0: 20 20 2a 0a 09 20 20 20 20 20 2a 20 57 65 20 77 *.. * We w
5ae0: 65 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 69 ere unable to fi
5af0: 6e 64 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 73 nd the channel s
5b00: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 tructure for thi
5b10: 73 0a 09 20 20 20 20 20 2a 20 74 72 61 6e 73 66 s.. * transf
5b20: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 ormation in the
5b30: 63 68 61 69 6e 20 6f 66 20 73 74 61 63 6b 65 64 chain of stacked
5b40: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 0a 09 channel. This..
5b50: 20 20 20 20 20 2a 20 6d 65 61 6e 73 20 74 68 61 * means tha
5b60: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 t we are current
5b70: 6c 79 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 ly in the proces
5b80: 73 20 6f 66 20 75 6e 73 74 61 63 6b 69 6e 67 0a s of unstacking.
5b90: 09 20 20 20 20 20 2a 20 69 74 20 2a 61 6e 64 2a . * it *and*
5ba0: 20 74 68 65 72 65 20 77 65 72 65 20 73 6f 6d 65 there were some
5bb0: 20 62 79 74 65 73 20 77 61 69 74 69 6e 67 20 77 bytes waiting w
5bc0: 68 69 63 68 20 61 72 65 20 6e 6f 77 0a 09 20 20 hich are now..
5bd0: 20 20 20 2a 20 66 6c 75 73 68 65 64 2e 20 49 6e * flushed. In
5be0: 20 74 68 69 73 20 73 69 74 75 61 74 69 6f 6e 20 this situation
5bf0: 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 the pointer to t
5c00: 68 65 20 63 68 61 6e 6e 65 6c 0a 09 20 20 20 20 he channel..
5c10: 20 2a 20 69 74 73 65 6c 66 20 61 6c 72 65 61 64 * itself alread
5c20: 79 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 y refers to the
5c30: 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 77 parent channel w
5c40: 65 20 68 61 76 65 20 74 6f 0a 09 20 20 20 20 20 e have to..
5c50: 2a 20 77 72 69 74 65 20 74 68 65 20 62 79 74 65 * write the byte
5c60: 73 20 69 6e 74 6f 2c 20 73 6f 20 77 65 20 72 65 s into, so we re
5c70: 74 75 72 6e 20 74 68 61 74 2e 0a 09 20 20 20 20 turn that...
5c80: 20 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 20 */.. return
5c90: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a statePtr->self;.
5ca0: 09 7d 0a 09 73 65 6c 66 20 3d 20 6e 65 78 74 3b .}..self = next;
5cb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
5cc0: 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 rn Tcl_GetStacke
5cd0: 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29 3b dChannel (self);
5ce0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 7d .#endif.#endif.}
5cf0: 0a .