0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 4d 61 (C) 1997-2000 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 Copyright (C) 2
0050: 30 30 30 20 41 6a 75 62 61 20 53 6f 6c 75 74 69 000 Ajuba Soluti
0060: 6f 6e 73 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 ons. *. * TLS (a
0070: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0080: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0090: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
00a0: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
00b0: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
00c0: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
00d0: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
00e0: 20 77 61 73 20 62 75 69 6c 74 20 66 72 6f 6d 20 was built from
00f0: 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75 70 scratch based up
0100: 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f on observation o
0110: 66 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 f OpenSSL 0.9.2B
0120: 0a 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 . *. * Addition
0130: 63 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f credit is due fo
0140: 72 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 r Andreas Kuprie
0150: 73 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 s (a.kupries@wes
0160: 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 tend.com), for.
0170: 2a 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 * providing the
0180: 54 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e Tcl_ReplaceChann
0190: 65 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 el mechanism and
01a0: 20 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 working closely
01b0: 20 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 with me. * to e
01c0: 6e 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 nhance it to sup
01d0: 70 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 port full fileev
01e0: 65 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 ent semantics..
01f0: 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 *. * Also work d
0200: 6f 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f one by the follo
0210: 77 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 w people provide
0220: 64 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f d the impetus to
0230: 20 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 do this "right"
0240: 3a 0a 20 2a 20 20 20 20 74 63 6c 53 53 4c 20 28 :. * tclSSL (
0250: 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c Colin McCormack,
0260: 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f Shared Technolo
0270: 67 79 29 0a 20 2a 20 20 20 20 53 53 4c 74 63 6c gy). * SSLtcl
0280: 20 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a (Peter Antman).
0290: 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 *. */..#include
02a0: 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 "tlsInt.h".#inc
02b0: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a lude <errno.h>..
02c0: 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 /*. * Forward de
02d0: 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 73 clarations. */.s
02e0: 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 68 tatic void TlsCh
02f0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 annelHandlerTime
0300: 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 r(ClientData cli
0310: 65 6e 74 44 61 74 61 29 3b 0a 0a 2f 2a 0a 20 2a entData);../*. *
0320: 20 54 4c 53 20 43 68 61 6e 6e 65 6c 20 54 79 70 TLS Channel Typ
0330: 65 0a 20 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c e. */.static Tcl
0340: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 74 6c _ChannelType *tl
0350: 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 4e sChannelType = N
0360: 55 4c 4c 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ULL;../*. *-----
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
03b0: 2a 0a 20 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 *. * TlsBlockMod
03c0: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 eProc --. *. *
03d0: 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 This procedure
03e0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 is invoked by t
03f0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 he generic IO le
0400: 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 vel. * to
0410: 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 set blocking and
0420: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 nonblocking mod
0430: 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 es. *. * Results
0440: 3a 0a 20 2a 20 20 20 20 30 20 69 66 20 73 75 63 :. * 0 if suc
0450: 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 cessful or POSIX
0460: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 error code if f
0470: 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 ailed.. *. * Sid
0480: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 e effects:. *
0490: 20 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65 Sets the device
04a0: 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f into blocking o
04b0: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f r nonblocking mo
04c0: 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d de.. *. *-------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
0510: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42 .static int TlsB
0520: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 lockModeProc(Cli
0530: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
0540: 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 Data, int mode)
0550: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
0560: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
0570: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
0580: 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d . if (mode ==
0590: 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f TCL_MODE_NONBLO
05a0: 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 CKING) {..stateP
05b0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
05c0: 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 _TCL_ASYNC;.
05d0: 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 } else {..stateP
05e0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 tr->flags &= ~(T
05f0: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 LS_TCL_ASYNC);.
0600: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28 }. return(
0610: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0);.}../*. *----
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0660: 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 72 *. * TlsClosePr
0670: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54 oc --. *. * T
0680: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
0690: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 invoked by the
06a0: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c generic IO level
06b0: 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 20 20 to perform. *
06c0: 20 20 63 68 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 channel-type-s
06d0: 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 pecific cleanup
06e0: 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
06f0: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
0700: 20 2a 20 20 20 20 69 73 20 63 6c 6f 73 65 64 2e * is closed.
0710: 0a 20 2a 0a 20 2a 20 20 20 20 4e 6f 74 65 3a 20 . *. * Note:
0720: 77 65 20 6c 65 61 76 65 20 74 68 65 20 75 6e 64 we leave the und
0730: 65 72 6c 79 69 6e 67 20 73 6f 63 6b 65 74 20 61 erlying socket a
0740: 6c 6f 6e 65 2c 20 69 73 20 74 68 69 73 20 72 69 lone, is this ri
0750: 67 68 74 3f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ght?. *. * Resul
0760: 74 73 3a 0a 20 2a 20 20 20 20 30 20 69 66 20 73 ts:. * 0 if s
0770: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 uccessful or POS
0780: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 IX error code if
0790: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 failed.. *. * S
07a0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 ide effects:. *
07b0: 20 20 20 43 6c 6f 73 65 73 20 74 68 65 20 73 6f Closes the so
07c0: 63 6b 65 74 20 6f 66 20 74 68 65 20 63 68 61 6e cket of the chan
07d0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
0820: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 /.static int Tls
0830: 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 CloseProc(Client
0840: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
0850: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
0860: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 53 74 61 nterp) {. Sta
0870: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
0880: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
0890: 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 eData;.. dpri
08a0: 6e 74 66 28 22 54 6c 73 43 6c 6f 73 65 50 72 6f ntf("TlsClosePro
08b0: 63 28 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 c(%p)", (void *)
08c0: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
08d0: 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 Tls_Clean(state
08e0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 Ptr);. Tcl_Ev
08f0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 28 28 43 6c entuallyFree((Cl
0900: 69 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 ientData)statePt
0910: 72 2c 20 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 r, Tls_Free);.
0920: 20 20 72 65 74 75 72 6e 28 30 29 3b 0a 0a 09 2f return(0);.../
0930: 2a 20 49 6e 74 65 72 70 20 69 73 20 75 6e 75 73 * Interp is unus
0940: 65 64 2e 20 2a 2f 0a 09 69 6e 74 65 72 70 20 3d ed. */..interp =
0950: 20 69 6e 74 65 72 70 3b 0a 7d 0a 0a 73 74 61 74 interp;.}..stat
0960: 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 50 ic int TlsCloseP
0970: 72 6f 63 32 28 43 6c 69 65 6e 74 44 61 74 61 20 roc2(ClientData
0980: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 instanceData,
0990: 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 73 /* The socket s
09a0: 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c tate. */. Tcl
09b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
09c0: 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 ../* For errors
09d0: 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a - can be NULL. *
09e0: 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 /. int flags)
09f0: 09 09 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 .../* Flags to c
0a00: 6c 6f 73 65 20 72 65 61 64 20 61 6e 64 2f 6f 72 lose read and/or
0a10: 20 77 72 69 74 65 20 73 69 64 65 20 6f 66 20 63 write side of c
0a20: 68 61 6e 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 hannel */.{.
0a30: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
0a40: 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 = (State *) inst
0a50: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 anceData;.. d
0a60: 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 65 printf("TlsClose
0a70: 50 72 6f 63 32 28 25 70 29 22 2c 20 28 76 6f 69 Proc2(%p)", (voi
0a80: 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a d *) statePtr);.
0a90: 0a 20 20 20 20 69 66 20 28 28 66 6c 61 67 73 20 . if ((flags
0aa0: 26 20 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 & (TCL_CLOSE_REA
0ab0: 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 D|TCL_CLOSE_WRIT
0ac0: 45 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 E)) == 0) {..ret
0ad0: 75 72 6e 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 urn TlsCloseProc
0ae0: 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 (instanceData, i
0af0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 nterp);. }.
0b00: 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b return EINVAL;
0b10: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
0b50: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 57 61 69 74 46 . *. * Tls_WaitF
0b60: 6f 72 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a orConnect --. *.
0b70: 20 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 * Result:. *
0b80: 20 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0 if successful
0b90: 2c 20 2d 31 20 69 66 20 66 61 69 6c 65 64 2e 0a , -1 if failed..
0ba0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0bb0: 74 73 3a 0a 20 2a 20 20 20 20 49 73 73 75 65 73 ts:. * Issues
0bc0: 20 53 53 4c 5f 61 63 63 65 70 74 20 6f 72 20 53 SSL_accept or S
0bd0: 53 4c 5f 63 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a SL_connect. *. *
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c10: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 69 6e 74 20 ------*. */.int
0c20: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
0c30: 63 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 ct(State *stateP
0c40: 74 72 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f tr, int *errorCo
0c50: 64 65 50 74 72 2c 20 69 6e 74 20 68 61 6e 64 73 dePtr, int hands
0c60: 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72 hakeFailureIsPer
0c70: 6d 61 6e 65 6e 74 29 20 7b 0a 20 20 20 20 75 6e manent) {. un
0c80: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b signed long back
0c90: 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20 69 6e ingError;. in
0ca0: 74 20 65 72 72 2c 20 72 63 3b 0a 20 20 20 20 69 t err, rc;. i
0cb0: 6e 74 20 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 nt bioShouldRetr
0cc0: 79 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 y;. *errorCod
0cd0: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 ePtr = 0;.. d
0ce0: 70 72 69 6e 74 66 28 22 57 61 69 74 46 6f 72 43 printf("WaitForC
0cf0: 6f 6e 6e 65 63 74 28 25 70 29 22 2c 20 28 76 6f onnect(%p)", (vo
0d00: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b id *) statePtr);
0d10: 0a 20 20 20 20 64 70 72 69 6e 74 46 6c 61 67 73 . dprintFlags
0d20: 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 (statePtr);..
0d30: 20 69 66 20 28 21 28 73 74 61 74 65 50 74 72 2d if (!(statePtr-
0d40: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
0d50: 5f 49 4e 49 54 29 29 20 7b 0a 09 64 70 72 69 6e _INIT)) {..dprin
0d60: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 tf("Tls_WaitForC
0d70: 6f 6e 6e 65 63 74 20 63 61 6c 6c 65 64 20 6f 6e onnect called on
0d80: 20 61 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c already initial
0d90: 69 7a 65 64 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 ized channel --
0da0: 72 65 74 75 72 6e 69 6e 67 20 77 69 74 68 20 69 returning with i
0db0: 6d 6d 65 64 69 61 74 65 20 73 75 63 63 65 73 73 mmediate success
0dc0: 22 29 3b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a ");..return(0);.
0dd0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
0de0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
0df0: 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 TLS_TCL_HANDSHA
0e00: 4b 45 5f 46 41 49 4c 45 44 29 20 7b 0a 09 2f 2a KE_FAILED) {../*
0e10: 0a 09 20 2a 20 44 69 66 66 65 72 65 6e 74 20 74 .. * Different t
0e20: 79 70 65 73 20 6f 66 20 6f 70 65 72 61 74 69 6f ypes of operatio
0e30: 6e 73 20 68 61 76 65 20 64 69 66 66 65 72 65 6e ns have differen
0e40: 74 20 72 65 71 75 69 72 65 6d 65 6e 74 73 0a 09 t requirements..
0e50: 20 2a 20 53 53 4c 20 62 65 69 6e 67 20 65 73 74 * SSL being est
0e60: 61 62 6c 69 73 68 65 64 0a 09 20 2a 2f 0a 09 69 ablished.. */..i
0e70: 66 20 28 68 61 6e 64 73 68 61 6b 65 46 61 69 6c f (handshakeFail
0e80: 75 72 65 49 73 50 65 72 6d 61 6e 65 6e 74 29 20 ureIsPermanent)
0e90: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
0ea0: 41 73 6b 65 64 20 74 6f 20 77 61 69 74 20 66 6f Asked to wait fo
0eb0: 72 20 61 20 54 4c 53 20 68 61 6e 64 73 68 61 6b r a TLS handshak
0ec0: 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 e that has alrea
0ed0: 64 79 20 66 61 69 6c 65 64 2e 20 20 52 65 74 75 dy failed. Retu
0ee0: 72 6e 69 6e 67 20 66 61 74 61 6c 20 65 72 72 6f rning fatal erro
0ef0: 72 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 r");.. *error
0f00: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 CodePtr = ECONNA
0f10: 42 4f 52 54 45 44 3b 0a 09 7d 20 65 6c 73 65 20 BORTED;..} else
0f20: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
0f30: 41 73 6b 65 64 20 74 6f 20 77 61 69 74 20 66 6f Asked to wait fo
0f40: 72 20 61 20 54 4c 53 20 68 61 6e 64 73 68 61 6b r a TLS handshak
0f50: 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 e that has alrea
0f60: 64 79 20 66 61 69 6c 65 64 2e 20 20 52 65 74 75 dy failed. Retu
0f70: 72 6e 69 6e 67 20 73 6f 66 74 20 65 72 72 6f 72 rning soft error
0f80: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 ");.. *errorC
0f90: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 odePtr = ECONNRE
0fa0: 53 45 54 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 28 SET;..}..return(
0fb0: 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -1);. }..
0fc0: 66 6f 72 20 28 3b 3b 29 20 7b 0a 09 2f 2a 20 4e for (;;) {../* N
0fd0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 79 ot initialized y
0fe0: 65 74 21 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 et! */..if (stat
0ff0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c ePtr->flags & TL
1000: 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a S_TCL_SERVER) {.
1010: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
1020: 6c 6c 69 6e 67 20 53 53 4c 5f 61 63 63 65 70 74 lling SSL_accept
1030: 28 29 22 29 3b 0a 09 20 20 20 20 65 72 72 20 3d ()");.. err =
1040: 20 53 53 4c 5f 61 63 63 65 70 74 28 73 74 61 74 SSL_accept(stat
1050: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 0a 09 7d 20 ePtr->ssl);...}
1060: 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 else {.. dpri
1070: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c ntf("Calling SSL
1080: 5f 63 6f 6e 6e 65 63 74 28 29 22 29 3b 0a 09 20 _connect()");..
1090: 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 63 6f 6e err = SSL_con
10a0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73 nect(statePtr->s
10b0: 73 6c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 65 72 sl);..}...if (er
10c0: 72 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 64 70 r > 0) {.. dp
10d0: 72 69 6e 74 66 28 22 54 68 61 74 20 73 65 65 6d rintf("That seem
10e0: 73 20 74 6f 20 68 61 76 65 20 67 6f 6e 65 20 6f s to have gone o
10f0: 6b 61 79 22 29 3b 0a 0a 09 20 20 20 20 65 72 72 kay");... err
1100: 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 = BIO_flush(sta
1110: 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 tePtr->bio);..
1120: 20 20 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 if (err <= 0)
1130: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 46 6c 75 {...dprintf("Flu
1140: 73 68 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 shing the lower
1150: 6c 61 79 65 72 73 20 66 61 69 6c 65 64 2c 20 74 layers failed, t
1160: 68 69 73 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c his will probabl
1170: 79 20 74 65 72 6d 69 6e 61 74 65 20 74 68 69 73 y terminate this
1180: 20 73 65 73 73 69 6f 6e 22 29 3b 0a 09 20 20 20 session");..
1190: 20 7d 0a 09 7d 0a 0a 09 72 63 20 3d 20 53 53 4c }..}...rc = SSL
11a0: 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 _get_error(state
11b0: 50 74 72 2d 3e 73 73 6c 2c 20 65 72 72 29 3b 0a Ptr->ssl, err);.
11c0: 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 65 ..dprintf("Got e
11d0: 72 72 6f 72 3a 20 25 69 20 28 72 63 20 3d 20 25 rror: %i (rc = %
11e0: 69 29 22 2c 20 65 72 72 2c 20 72 63 29 3b 0a 09 i)", err, rc);..
11f0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 65 72 72 dprintf("Got err
1200: 6f 72 3a 20 25 73 22 2c 20 45 52 52 5f 72 65 61 or: %s", ERR_rea
1210: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 son_error_string
1220: 28 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 (ERR_get_error()
1230: 29 29 3b 0a 0a 09 62 69 6f 53 68 6f 75 6c 64 52 ));...bioShouldR
1240: 65 74 72 79 20 3d 20 30 3b 0a 09 69 66 20 28 65 etry = 0;..if (e
1250: 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 rr <= 0) {..
1260: 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 if (rc == SSL_ER
1270: 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 ROR_WANT_CONNECT
1280: 20 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 || rc == SSL_ER
1290: 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 50 54 20 ROR_WANT_ACCEPT
12a0: 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 || rc == SSL_ERR
12b0: 4f 52 5f 57 41 4e 54 5f 52 45 41 44 20 7c 7c 20 OR_WANT_READ ||
12c0: 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f rc == SSL_ERROR_
12d0: 57 41 4e 54 5f 57 52 49 54 45 29 20 7b 0a 09 09 WANT_WRITE) {...
12e0: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d bioShouldRetry =
12f0: 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 1;.. } else
1300: 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 if (BIO_should_r
1310: 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 etry(statePtr->b
1320: 69 6f 29 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 io)) {...bioShou
1330: 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 ldRetry = 1;..
1340: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 63 20 } else if (rc
1350: 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 == SSL_ERROR_SYS
1360: 43 41 4c 4c 20 26 26 20 54 63 6c 5f 47 65 74 45 CALL && Tcl_GetE
1370: 72 72 6e 6f 28 29 20 3d 3d 20 45 41 47 41 49 4e rrno() == EAGAIN
1380: 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 ) {...bioShouldR
1390: 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d etry = 1;.. }
13a0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
13b0: 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 if (!SSL_is_init
13c0: 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74 65 50 _finished(stateP
13d0: 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 09 62 69 tr->ssl)) {...bi
13e0: 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 oShouldRetry = 1
13f0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 ;.. }..}...if
1400: 20 28 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 (bioShouldRetry
1410: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
1420: 28 22 54 68 65 20 49 2f 4f 20 64 69 64 20 6e 6f ("The I/O did no
1430: 74 20 63 6f 6d 70 6c 65 74 65 20 2d 2d 20 62 75 t complete -- bu
1440: 74 20 77 65 20 73 68 6f 75 6c 64 20 74 72 79 20 t we should try
1450: 69 74 20 61 67 61 69 6e 22 29 3b 0a 0a 09 20 20 it again");...
1460: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1470: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
1480: 41 53 59 4e 43 29 20 7b 0a 09 09 64 70 72 69 6e ASYNC) {...dprin
1490: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 45 41 tf("Returning EA
14a0: 47 41 49 4e 20 73 6f 20 74 68 61 74 20 69 74 20 GAIN so that it
14b0: 63 61 6e 20 62 65 20 72 65 74 72 69 65 64 20 6c can be retried l
14c0: 61 74 65 72 22 29 3b 0a 0a 09 09 2a 65 72 72 6f ater");....*erro
14d0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 rCodePtr = EAGAI
14e0: 4e 3b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b N;...return(-1);
14f0: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
1500: 09 64 70 72 69 6e 74 66 28 22 44 6f 69 6e 67 20 .dprintf("Doing
1510: 73 6f 20 6e 6f 77 22 29 3b 0a 0a 09 09 63 6f 6e so now");....con
1520: 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 7d tinue;.. }..}
1530: 0a 0a 09 64 70 72 69 6e 74 66 28 22 57 65 20 68 ...dprintf("We h
1540: 61 76 65 20 65 69 74 68 65 72 20 63 6f 6d 70 6c ave either compl
1550: 65 74 65 6c 79 20 65 73 74 61 62 6c 69 73 68 65 etely establishe
1560: 64 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 72 d the session or
1570: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 66 61 69 6c completely fail
1580: 65 64 20 69 74 20 2d 2d 20 74 68 65 72 65 20 69 ed it -- there i
1590: 73 20 6e 6f 20 6d 6f 72 65 20 6e 65 65 64 20 74 s no more need t
15a0: 6f 20 65 76 65 72 20 72 65 74 72 79 20 69 74 20 o ever retry it
15b0: 74 68 6f 75 67 68 22 29 3b 0a 09 62 72 65 61 6b though");..break
15c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
15d0: 74 63 68 20 28 72 63 29 20 7b 0a 09 63 61 73 65 tch (rc) {..case
15e0: 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a SSL_ERROR_NONE:
15f0: 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e .. /* The con
1600: 6e 65 63 74 69 6f 6e 20 69 73 20 75 70 2c 20 77 nection is up, w
1610: 65 20 61 72 65 20 64 6f 6e 65 20 68 65 72 65 20 e are done here
1620: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 */.. dprintf(
1630: 22 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 "The connection
1640: 69 73 20 75 70 22 29 3b 0a 09 20 20 20 20 2a 65 is up");.. *e
1650: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b rrorCodePtr = 0;
1660: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
1670: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 se SSL_ERROR_ZER
1680: 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 64 O_RETURN:.. d
1690: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f printf("SSL_ERRO
16a0: 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 20 43 R_ZERO_RETURN: C
16b0: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 20 onnect returned
16c0: 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 an invalid value
16d0: 2e 2e 2e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 ...");.. *err
16e0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 orCodePtr = EINV
16f0: 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28 AL;.. return(
1700: 2d 31 29 3b 0a 09 63 61 73 65 20 53 53 4c 5f 45 -1);..case SSL_E
1710: 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 RROR_SYSCALL:..
1720: 20 20 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 backingError
1730: 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 = ERR_get_error(
1740: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63 );... if (bac
1750: 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 kingError == 0 &
1760: 26 20 65 72 72 20 3d 3d 20 30 29 20 7b 0a 09 09 & err == 0) {...
1770: 64 70 72 69 6e 74 66 28 22 45 4f 46 20 72 65 61 dprintf("EOF rea
1780: 63 68 65 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 ched")...*errorC
1790: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 odePtr = ECONNRE
17a0: 53 45 54 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 SET;.. } else
17b0: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f if (backingErro
17c0: 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20 3d 3d r == 0 && err ==
17d0: 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 -1) {...dprintf
17e0: 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 ("I/O error occu
17f0: 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c rred (errno = %l
1800: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u)", (unsigned l
1810: 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 72 6e ong) Tcl_GetErrn
1820: 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f o());...*errorCo
1830: 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 dePtr = Tcl_GetE
1840: 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 rrno();...if (*e
1850: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 rrorCodePtr == E
1860: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 CONNRESET) {...
1870: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
1880: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
1890: 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 ...}.. } else
18a0: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f {...dprintf("I/
18b0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 O error occurred
18c0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d (backingError =
18d0: 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 %lu)", backingE
18e0: 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 rror);...*errorC
18f0: 6f 64 65 50 74 72 20 3d 20 62 61 63 6b 69 6e 67 odePtr = backing
1900: 45 72 72 6f 72 3b 0a 09 09 69 66 20 28 2a 65 72 Error;...if (*er
1910: 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 rorCodePtr == EC
1920: 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 20 ONNRESET) {...
1930: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
1940: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a = ECONNABORTED;.
1950: 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 ..}.. }...
1960: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
1970: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 |= TLS_TCL_HAND
1980: 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 SHAKE_FAILED;..
1990: 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 0a return(-1);..
19a0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
19b0: 53 53 4c 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 SSL:.. dprint
19c0: 66 28 22 47 6f 74 20 70 65 72 6d 61 6e 65 6e 74 f("Got permanent
19d0: 20 66 61 74 61 6c 20 53 53 4c 20 65 72 72 6f 72 fatal SSL error
19e0: 2c 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d 65 64 , aborting immed
19f0: 69 61 74 65 6c 79 22 29 3b 0a 09 20 20 20 20 54 iately");.. T
1a00: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
1a10: 72 2c 20 28 63 68 61 72 20 2a 29 45 52 52 5f 72 r, (char *)ERR_r
1a20: 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 eason_error_stri
1a30: 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 ng(ERR_get_error
1a40: 28 29 29 29 3b 0a 09 20 20 20 20 73 74 61 74 65 ()));.. state
1a50: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
1a60: 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f S_TCL_HANDSHAKE_
1a70: 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 2a 65 72 FAILED;.. *er
1a80: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f rorCodePtr = ECO
1a90: 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 NNABORTED;..
1aa0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 return(-1);...ca
1ab0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
1ac0: 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09 63 61 73 65 T_CONNECT:..case
1ad0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
1ae0: 41 43 43 45 50 54 3a 0a 09 63 61 73 65 20 53 53 ACCEPT:..case SS
1af0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 L_ERROR_WANT_X50
1b00: 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 64 65 66 61 75 9_LOOKUP:..defau
1b10: 6c 74 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 lt:.. dprintf
1b20: 28 22 57 65 20 67 6f 74 20 61 20 63 6f 6e 66 75 ("We got a confu
1b30: 73 69 6e 67 20 72 65 70 6c 79 3a 20 25 69 22 2c sing reply: %i",
1b40: 20 72 63 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f rc);.. *erro
1b50: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 rCodePtr = Tcl_G
1b60: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20 etErrno();..
1b70: 64 70 72 69 6e 74 66 28 22 45 52 52 28 25 64 2c dprintf("ERR(%d,
1b80: 20 25 64 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 %d) ", rc, *err
1b90: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 orCodePtr);..
1ba0: 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 20 20 20 return(-1);.
1bb0: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 }..#if 0. if
1bc0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 (statePtr->flag
1bd0: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 s & TLS_TCL_SERV
1be0: 45 52 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ER) {..dprintf("
1bf0: 54 68 69 73 20 69 73 20 61 6e 20 54 4c 53 20 73 This is an TLS s
1c00: 65 72 76 65 72 2c 20 63 68 65 63 6b 69 6e 67 20 erver, checking
1c10: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
1c20: 66 6f 72 20 74 68 65 20 70 65 65 72 22 29 3b 0a for the peer");.
1c30: 0a 09 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f ..err = SSL_get_
1c40: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
1c50: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 69 atePtr->ssl);..i
1c60: 66 20 28 65 72 72 20 21 3d 20 58 35 30 39 5f 56 f (err != X509_V
1c70: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 64 70 72 69 _OK) {.. dpri
1c80: 6e 74 66 28 22 49 6e 76 61 6c 69 64 20 63 65 72 ntf("Invalid cer
1c90: 74 69 66 69 63 61 74 65 2c 20 72 65 74 75 72 6e tificate, return
1ca0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
1cb0: 3b 0a 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f ;... Tls_Erro
1cc0: 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 61 r(statePtr, (cha
1cd0: 72 20 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f r *)X509_verify_
1ce0: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
1cf0: 67 28 65 72 72 29 29 3b 0a 09 20 20 20 20 73 74 g(err));.. st
1d00: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
1d10: 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 TLS_TCL_HANDSHA
1d20: 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 KE_FAILED;..
1d30: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
1d40: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 ECONNABORTED;..
1d50: 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 return(-1);..
1d60: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a }. }.#endif..
1d70: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 6d dprintf("Rem
1d80: 6f 76 69 6e 67 20 74 68 65 20 5c 22 54 4c 53 5f oving the \"TLS_
1d90: 54 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67 20 TCL_INIT\" flag
1da0: 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 63 6f since we have co
1db0: 6d 70 6c 65 74 65 64 20 74 68 65 20 68 61 6e 64 mpleted the hand
1dc0: 73 68 61 6b 65 22 29 3b 0a 20 20 20 20 73 74 61 shake");. sta
1dd0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 tePtr->flags &=
1de0: 7e 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a ~TLS_TCL_INIT;..
1df0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
1e00: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 urning in succes
1e10: 73 22 29 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 s");. *errorC
1e20: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 odePtr = 0;.
1e30: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a return(0);.}../*
1e40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e80: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
1e90: 49 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a InputProc --. *.
1ea0: 20 2a 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 * This proce
1eb0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
1ec0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
1ed0: 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 O level. *
1ee0: 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 to read input f
1ef0: 72 6f 6d 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 rom a SSL socket
1f00: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a based channel..
1f10: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
1f20: 2a 20 20 20 20 52 65 74 75 72 6e 73 20 74 68 65 * Returns the
1f30: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
1f40: 20 72 65 61 64 20 6f 72 20 2d 31 20 6f 6e 20 65 read or -1 on e
1f50: 72 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72 rror. Sets error
1f60: 43 6f 64 65 50 74 72 0a 20 2a 20 20 20 20 74 6f CodePtr. * to
1f70: 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 a POSIX error c
1f80: 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 ode if an error
1f90: 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30 20 69 occurred, or 0 i
1fa0: 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 f none.. *. * Si
1fb0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 de effects:. *
1fc0: 20 20 52 65 61 64 73 20 69 6e 70 75 74 20 66 72 Reads input fr
1fd0: 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 64 65 76 om the input dev
1fe0: 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e ice of the chann
1ff0: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2040: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 49 .static int TlsI
2050: 6e 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 nputProc(ClientD
2060: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 ata instanceData
2070: 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 , char *buf, int
2080: 20 62 75 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 bufSize, int *e
2090: 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 rrorCodePtr) {.
20a0: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
20b0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 backingError;.
20c0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
20d0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 tr = (State *) i
20e0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 nstanceData;.
20f0: 20 69 6e 74 20 62 79 74 65 73 52 65 61 64 3b 0a int bytesRead;.
2100: 20 20 20 20 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 int tlsConne
2110: 63 74 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b ct;. int err;
2120: 0a 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
2130: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 Ptr = 0;.. dp
2140: 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 61 64 28 rintf("BIO_read(
2150: 25 64 29 22 2c 20 62 75 66 53 69 7a 65 29 3b 0a %d)", bufSize);.
2160: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
2170: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
2180: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 CL_CALLBACK) {..
2190: 2f 2a 20 64 6f 6e 27 74 20 70 72 6f 63 65 73 73 /* don't process
21a0: 20 61 6e 79 20 62 79 74 65 73 20 77 68 69 6c 65 any bytes while
21b0: 20 76 65 72 69 66 79 20 63 61 6c 6c 62 61 63 6b verify callback
21c0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 2a 2f 0a 09 is running */..
21d0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 dprintf("Callbac
21e0: 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 72 65 k is running, re
21f0: 61 64 69 6e 67 20 30 20 62 79 74 65 73 22 29 3b ading 0 bytes");
2200: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 ..return(0);.
2210: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
2220: 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 "Calling Tls_Wai
2230: 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 tForConnect");.
2240: 20 20 20 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 tlsConnect =
2250: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
2260: 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 72 ct(statePtr, err
2270: 6f 72 43 6f 64 65 50 74 72 2c 20 30 29 3b 0a 20 orCodePtr, 0);.
2280: 20 20 20 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 if (tlsConnec
2290: 74 20 3c 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 t < 0) {..dprint
22a0: 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 f("Got an error
22b0: 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e 65 waiting to conne
22c0: 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d ct (tlsConnect =
22d0: 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 %i, *errorCodeP
22e0: 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73 43 6f tr = %i)", tlsCo
22f0: 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43 6f 64 nnect, *errorCod
2300: 65 50 74 72 29 3b 0a 09 54 6c 73 5f 45 72 72 6f ePtr);..Tls_Erro
2310: 72 28 73 74 61 74 65 50 74 72 2c 20 73 74 72 65 r(statePtr, stre
2320: 72 72 6f 72 28 2a 65 72 72 6f 72 43 6f 64 65 50 rror(*errorCodeP
2330: 74 72 29 29 3b 0a 0a 09 62 79 74 65 73 52 65 61 tr));...bytesRea
2340: 64 20 3d 20 2d 31 3b 0a 09 69 66 20 28 2a 65 72 d = -1;..if (*er
2350: 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 rorCodePtr == EC
2360: 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 20 20 20 ONNRESET) {..
2370: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f dprintf("Got co
2380: 6e 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 nnection reset")
2390: 3b 0a 09 20 20 20 20 2f 2a 20 53 6f 66 74 20 45 ;.. /* Soft E
23a0: 4f 46 20 2a 2f 0a 09 20 20 20 20 2a 65 72 72 6f OF */.. *erro
23b0: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 rCodePtr = 0;..
23c0: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 30 bytesRead = 0
23d0: 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 28 62 79 74 ;..}..return(byt
23e0: 65 73 52 65 61 64 29 3b 0a 20 20 20 20 7d 0a 0a esRead);. }..
23f0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
2400: 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 need to clear t
2410: 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 he SSL error sta
2420: 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 ck now because w
2430: 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 e sometimes reac
2440: 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 h. * this fu
2450: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 nction with left
2460: 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 over errors in t
2470: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 he stack. If BI
2480: 4f 5f 72 65 61 64 0a 20 20 20 20 20 2a 20 72 65 O_read. * re
2490: 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 turns -1 and int
24a0: 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 ends EAGAIN, the
24b0: 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 re is a leftover
24c0: 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 error, it will
24d0: 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e be. * miscon
24e0: 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 strued as an err
24f0: 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a or, not EAGAIN..
2500: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c *. * Al
2510: 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 ternatively, we
2520: 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 may want to hand
2530: 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e le the <0 return
2540: 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 codes from.
2550: 20 2a 20 42 49 4f 5f 72 65 61 64 20 73 70 65 63 * BIO_read spec
2560: 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73 65 ially (as advise
2570: 64 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f 63 d in the RSA doc
2580: 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 s). TLS's lower
2590: 20 6c 65 76 65 6c 20 42 49 4f 0a 20 20 20 20 20 level BIO.
25a0: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 * functions play
25b0: 20 77 69 74 68 20 74 68 65 20 72 65 74 72 79 20 with the retry
25c0: 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e flags though, an
25d0: 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f 20 d this seems to
25e0: 77 6f 72 6b 0a 20 20 20 20 20 2a 20 63 6f 72 72 work. * corr
25f0: 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 ectly. Similar
2600: 66 69 78 20 69 6e 20 54 6c 73 4f 75 74 70 75 74 fix in TlsOutput
2610: 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 Proc. - hobbs.
2620: 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c */. ERR_cl
2630: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 ear_error();.
2640: 20 62 79 74 65 73 52 65 61 64 20 3d 20 42 49 4f bytesRead = BIO
2650: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e _read(statePtr->
2660: 62 69 6f 2c 20 62 75 66 2c 20 62 75 66 53 69 7a bio, buf, bufSiz
2670: 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 e);. dprintf(
2680: 22 42 49 4f 5f 72 65 61 64 20 2d 3e 20 25 64 22 "BIO_read -> %d"
2690: 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a 0a 20 , bytesRead);..
26a0: 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 err = SSL_get
26b0: 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d _error(statePtr-
26c0: 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 29 >ssl, bytesRead)
26d0: 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 ;..#if 0. if
26e0: 28 62 79 74 65 73 52 65 61 64 20 3c 3d 20 30 29 (bytesRead <= 0)
26f0: 20 7b 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 {..if (BIO_shou
2700: 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 ld_retry(statePt
2710: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 r->bio)) {..
2720: 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 66 61 69 dprintf("I/O fai
2730: 6c 65 64 2c 20 77 69 6c 6c 20 72 65 74 72 79 20 led, will retry
2740: 62 61 73 65 64 20 6f 6e 20 45 41 47 41 49 4e 22 based on EAGAIN"
2750: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f );.. *errorCo
2760: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a dePtr = EAGAIN;.
2770: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a .}. }.#endif.
2780: 0a 20 20 20 20 73 77 69 74 63 68 20 28 65 72 72 . switch (err
2790: 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 ) {..case SSL_ER
27a0: 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 64 ROR_NONE:.. d
27b0: 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c printBuffer(buf,
27c0: 20 62 79 74 65 73 52 65 61 64 29 3b 0a 09 20 20 bytesRead);..
27d0: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 break;...case
27e0: 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 SSL_ERROR_SSL:..
27f0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c dprintf("SSL
2800: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 65 72 72 negotiation err
2810: 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 or, indicating t
2820: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 hat the connecti
2830: 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 62 6f 72 on has been abor
2840: 74 65 64 22 29 3b 0a 0a 09 20 20 20 20 54 6c 73 ted");... Tls
2850: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
2860: 20 54 43 4c 54 4c 53 5f 53 53 4c 5f 45 52 52 4f TCLTLS_SSL_ERRO
2870: 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c R(statePtr->ssl,
2880: 20 62 79 74 65 73 52 65 61 64 29 29 3b 0a 09 20 bytesRead));..
2890: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
28a0: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
28b0: 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 .. bytesRead
28c0: 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b = -1;.. break
28d0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
28e0: 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 OR_SYSCALL:..
28f0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 backingError =
2900: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b ERR_get_error();
2910: 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 ... if (backi
2920: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 ngError == 0 &&
2930: 62 79 74 65 73 52 65 61 64 20 3d 3d 20 30 29 20 bytesRead == 0)
2940: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 {...dprintf("EOF
2950: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 reached")...*er
2960: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
2970: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b ..bytesRead = 0;
2980: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
2990: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d (backingError ==
29a0: 20 30 20 26 26 20 62 79 74 65 73 52 65 61 64 20 0 && bytesRead
29b0: 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e == -1) {...dprin
29c0: 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 tf("I/O error oc
29d0: 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 curred (errno =
29e0: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu)", (unsigned
29f0: 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 long) Tcl_GetEr
2a00: 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 rno());...*error
2a10: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 CodePtr = Tcl_Ge
2a20: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74 65 tErrno();...byte
2a30: 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 sRead = -1;..
2a40: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 } else {...dpri
2a50: 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f ntf("I/O error o
2a60: 63 63 75 72 72 65 64 20 28 62 61 63 6b 69 6e 67 ccurred (backing
2a70: 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62 Error = %lu)", b
2a80: 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09 ackingError);...
2a90: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
2aa0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 09 09 backingError;...
2ab0: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a bytesRead = -1;.
2ac0: 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 . }.. brea
2ad0: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 k;...case SSL_ER
2ae0: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a ROR_ZERO_RETURN:
2af0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 .. dprintf("G
2b00: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 ot SSL_ERROR_ZER
2b10: 4f 5f 52 45 54 55 52 4e 2c 20 74 68 69 73 20 6d O_RETURN, this m
2b20: 65 61 6e 73 20 61 6e 20 45 4f 46 20 68 61 73 20 eans an EOF has
2b30: 62 65 65 6e 20 72 65 61 63 68 65 64 22 29 3b 0a been reached");.
2b40: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d . bytesRead =
2b50: 20 30 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 0;.. *errorC
2b60: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 odePtr = 0;..
2b70: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 break;...case S
2b80: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
2b90: 41 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 AD:.. dprintf
2ba0: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f ("Got SSL_ERROR_
2bb0: 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 WANT_READ, mappi
2bc0: 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 ng this to EAGAI
2bd0: 4e 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 N");.. bytesR
2be0: 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 2a ead = -1;.. *
2bf0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
2c00: 41 47 41 49 4e 3b 0a 09 20 20 20 20 62 72 65 61 AGAIN;.. brea
2c10: 6b 3b 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 k;...default:..
2c20: 20 20 20 64 70 72 69 6e 74 66 28 22 55 6e 6b 6e dprintf("Unkn
2c30: 6f 77 6e 20 65 72 72 6f 72 20 28 65 72 72 20 3d own error (err =
2c40: 20 25 69 29 2c 20 6d 61 70 70 69 6e 67 20 74 6f %i), mapping to
2c50: 20 45 4f 46 22 2c 20 65 72 72 29 3b 0a 09 20 20 EOF", err);..
2c60: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
2c70: 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73 52 = 0;.. bytesR
2c80: 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 62 72 ead = 0;.. br
2c90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
2ca0: 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 if (*errorCodePt
2cb0: 72 20 3c 20 30 29 20 7b 0a 09 54 6c 73 5f 45 72 r < 0) {..Tls_Er
2cc0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 73 74 ror(statePtr, st
2cd0: 72 65 72 72 6f 72 28 2a 65 72 72 6f 72 43 6f 64 rerror(*errorCod
2ce0: 65 50 74 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 ePtr));. }.
2cf0: 20 20 64 70 72 69 6e 74 66 28 22 49 6e 70 75 74 dprintf("Input
2d00: 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 64 5d 22 (%d) -> %d [%d]"
2d10: 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 74 65 73 , bufSize, bytes
2d20: 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 6f 64 65 Read, *errorCode
2d30: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
2d40: 28 62 79 74 65 73 52 65 61 64 29 3b 0a 7d 0a 0a (bytesRead);.}..
2d50: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
2da0: 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a lsOutputProc --.
2db0: 20 2a 0a 20 2a 20 20 20 20 54 68 69 73 20 70 72 *. * This pr
2dc0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
2dd0: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
2de0: 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 c IO level. *
2df0: 20 20 20 20 74 6f 20 77 72 69 74 65 20 6f 75 74 to write out
2e00: 70 75 74 20 74 6f 20 61 20 53 53 4c 20 73 6f 63 put to a SSL soc
2e10: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
2e20: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 l.. *. * Results
2e30: 3a 0a 20 2a 20 20 20 20 52 65 74 75 72 6e 73 20 :. * Returns
2e40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
2e50: 74 65 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d tes written or -
2e60: 31 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 1 on error. Sets
2e70: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 20 2a errorCodePtr. *
2e80: 20 20 20 20 74 6f 20 61 20 50 4f 53 49 58 20 65 to a POSIX e
2e90: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 rror code if an
2ea0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 error occurred,
2eb0: 6f 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a or 0 if none.. *
2ec0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2ed0: 3a 0a 20 2a 20 20 20 20 57 72 69 74 65 73 20 6f :. * Writes o
2ee0: 75 74 70 75 74 20 6f 6e 20 74 68 65 20 6f 75 74 utput on the out
2ef0: 70 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 68 put device of th
2f00: 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a e channel.. *. *
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f50: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
2f60: 6e 74 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 nt TlsOutputProc
2f70: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
2f80: 61 6e 63 65 44 61 74 61 2c 20 63 6f 6e 73 74 20 anceData, const
2f90: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 char *buf, int t
2fa0: 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 oWrite, int *err
2fb0: 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 orCodePtr) {.
2fc0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 unsigned long b
2fd0: 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 ackingError;.
2fe0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
2ff0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
3000: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 tanceData;. i
3010: 6e 74 20 77 72 69 74 74 65 6e 2c 20 65 72 72 3b nt written, err;
3020: 0a 20 20 20 20 69 6e 74 20 74 6c 73 43 6f 6e 6e . int tlsConn
3030: 65 63 74 3b 0a 0a 20 20 20 20 2a 65 72 72 6f 72 ect;.. *error
3040: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 CodePtr = 0;..
3050: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 77 dprintf("BIO_w
3060: 72 69 74 65 28 25 70 2c 20 25 64 29 22 2c 20 28 rite(%p, %d)", (
3070: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 void *) statePtr
3080: 2c 20 74 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 , toWrite);.
3090: 64 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 dprintBuffer(buf
30a0: 2c 20 74 6f 57 72 69 74 65 29 3b 0a 0a 20 20 20 , toWrite);..
30b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 if (statePtr->f
30c0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 lags & TLS_TCL_C
30d0: 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 ALLBACK) {..dpri
30e0: 6e 74 66 28 22 44 6f 6e 27 74 20 70 72 6f 63 65 ntf("Don't proce
30f0: 73 73 20 6f 75 74 70 75 74 20 77 68 69 6c 65 20 ss output while
3100: 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20 72 75 callbacks are ru
3110: 6e 6e 69 6e 67 22 29 3b 0a 09 77 72 69 74 74 65 nning");..writte
3120: 6e 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 n = -1;..*errorC
3130: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
3140: 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 20 20 ..return(-1);.
3150: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
3160: 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 ("Calling Tls_Wa
3170: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a itForConnect");.
3180: 20 20 20 20 74 6c 73 43 6f 6e 6e 65 63 74 20 3d tlsConnect =
3190: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
31a0: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 ect(statePtr, er
31b0: 72 6f 72 43 6f 64 65 50 74 72 2c 20 31 29 3b 0a rorCodePtr, 1);.
31c0: 20 20 20 20 69 66 20 28 74 6c 73 43 6f 6e 6e 65 if (tlsConne
31d0: 63 74 20 3c 20 30 29 20 7b 0a 09 64 70 72 69 6e ct < 0) {..dprin
31e0: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 tf("Got an error
31f0: 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e waiting to conn
3200: 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 ect (tlsConnect
3210: 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65 = %i, *errorCode
3220: 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73 43 Ptr = %i)", tlsC
3230: 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43 6f onnect, *errorCo
3240: 64 65 50 74 72 29 3b 0a 09 54 6c 73 5f 45 72 72 dePtr);..Tls_Err
3250: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 73 74 72 or(statePtr, str
3260: 65 72 72 6f 72 28 2a 65 72 72 6f 72 43 6f 64 65 error(*errorCode
3270: 50 74 72 29 29 3b 0a 0a 09 77 72 69 74 74 65 6e Ptr));...written
3280: 20 3d 20 2d 31 3b 0a 09 69 66 20 28 2a 65 72 72 = -1;..if (*err
3290: 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f orCodePtr == ECO
32a0: 4e 4e 52 45 53 45 54 29 20 7b 0a 09 20 20 20 20 NNRESET) {..
32b0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e dprintf("Got con
32c0: 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b nection reset");
32d0: 0a 09 20 20 20 20 2f 2a 20 53 6f 66 74 20 45 4f .. /* Soft EO
32e0: 46 20 2a 2f 0a 09 20 20 20 20 2a 65 72 72 6f 72 F */.. *error
32f0: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 CodePtr = 0;..
3300: 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 written = 0;..
3310: 7d 0a 09 72 65 74 75 72 6e 28 77 72 69 74 74 65 }..return(writte
3320: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 n);. }.. i
3330: 66 20 28 74 6f 57 72 69 74 65 20 3d 3d 20 30 29 f (toWrite == 0)
3340: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 7a 65 72 {..dprintf("zer
3350: 6f 2d 77 72 69 74 65 22 29 3b 0a 09 65 72 72 20 o-write");..err
3360: 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 = BIO_flush(stat
3370: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 69 66 ePtr->bio);...if
3380: 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 (err <= 0) {..
3390: 20 20 20 64 70 72 69 6e 74 66 28 22 46 6c 75 73 dprintf("Flus
33a0: 68 69 6e 67 20 66 61 69 6c 65 64 22 29 3b 0a 0a hing failed");..
33b0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
33c0: 74 72 20 3d 20 45 49 4f 3b 0a 09 20 20 20 20 77 tr = EIO;.. w
33d0: 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 ritten = 0;..
33e0: 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a return(-1);..}.
33f0: 0a 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 ..written = 0;..
3400: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3410: 30 3b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 0;..return(0);.
3420: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
3430: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 63 * We need to c
3440: 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65 72 72 lear the SSL err
3450: 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 or stack now bec
3460: 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 ause we sometime
3470: 73 20 72 65 61 63 68 0a 20 20 20 20 20 2a 20 74 s reach. * t
3480: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 his function wit
3490: 68 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 h leftover error
34a0: 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 s in the stack.
34b0: 20 49 66 20 42 49 4f 5f 77 72 69 74 65 0a 20 20 If BIO_write.
34c0: 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d 31 20 * returns -1
34d0: 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41 47 41 and intends EAGA
34e0: 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61 20 6c IN, there is a l
34f0: 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c 20 69 eftover error, i
3500: 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 2a t will be. *
3510: 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20 61 73 misconstrued as
3520: 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20 45 an error, not E
3530: 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a 20 20 AGAIN.. *.
3540: 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 * Alternative
3550: 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e 74 20 ly, we may want
3560: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 3c 30 to handle the <0
3570: 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 66 72 return codes fr
3580: 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f 77 72 om. * BIO_wr
3590: 69 74 65 20 73 70 65 63 69 61 6c 6c 79 20 28 61 ite specially (a
35a0: 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 68 65 s advised in the
35b0: 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c 53 RSA docs). TLS
35c0: 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 0a 20 's lower level.
35d0: 20 20 20 20 2a 20 42 49 4f 20 66 75 6e 63 74 69 * BIO functi
35e0: 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 74 68 ons play with th
35f0: 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 74 68 e retry flags th
3600: 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 20 73 ough, and this s
3610: 65 65 6d 73 20 74 6f 0a 20 20 20 20 20 2a 20 77 eems to. * w
3620: 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 ork correctly.
3630: 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e 20 54 Similar fix in T
3640: 6c 73 49 6e 70 75 74 50 72 6f 63 2e 20 2d 20 68 lsInputProc. - h
3650: 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 obbs. */.
3660: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
3670: 28 29 3b 0a 20 20 20 20 77 72 69 74 74 65 6e 20 ();. written
3680: 3d 20 42 49 4f 5f 77 72 69 74 65 28 73 74 61 74 = BIO_write(stat
3690: 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 ePtr->bio, buf,
36a0: 74 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 64 70 toWrite);. dp
36b0: 72 69 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 rintf("BIO_write
36c0: 28 25 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d (%p, %d) -> [%d]
36d0: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 ", (void *) stat
36e0: 65 50 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 ePtr, toWrite, w
36f0: 72 69 74 74 65 6e 29 3b 0a 0a 20 20 20 20 65 72 ritten);.. er
3700: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f r = SSL_get_erro
3710: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c r(statePtr->ssl,
3720: 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 73 written);. s
3730: 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 63 witch (err) {..c
3740: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f ase SSL_ERROR_NO
3750: 4e 45 3a 0a 09 20 20 20 20 69 66 20 28 77 72 69 NE:.. if (wri
3760: 74 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09 77 72 tten < 0) {...wr
3770: 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 itten = 0;..
3780: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 }.. break;...
3790: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 case SSL_ERROR_W
37a0: 41 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 20 ANT_WRITE:..
37b0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c dprintf("Got SSL
37c0: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 _ERROR_WANT_WRIT
37d0: 45 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f E, mapping it to
37e0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 EAGAIN");..
37f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3800: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 EAGAIN;.. wri
3810: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 tten = -1;..
3820: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 break;...case SS
3830: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 L_ERROR_WANT_REA
3840: 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 D:.. dprintf(
3850: 22 20 77 72 69 74 65 20 52 20 42 4c 4f 43 4b 22 " write R BLOCK"
3860: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a );.. break;..
3870: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
3880: 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 WANT_X509_LOOKUP
3890: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 :.. dprintf("
38a0: 20 77 72 69 74 65 20 58 20 42 4c 4f 43 4b 22 29 write X BLOCK")
38b0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ;.. break;...
38c0: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a case SSL_ERROR_Z
38d0: 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 ERO_RETURN:..
38e0: 20 64 70 72 69 6e 74 66 28 22 20 63 6c 6f 73 65 dprintf(" close
38f0: 64 22 29 3b 0a 09 20 20 20 20 77 72 69 74 74 65 d");.. writte
3900: 6e 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72 72 n = 0;.. *err
3910: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 orCodePtr = 0;..
3920: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 break;...cas
3930: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 e SSL_ERROR_SYSC
3940: 41 4c 4c 3a 0a 09 20 20 20 20 62 61 63 6b 69 6e ALL:.. backin
3950: 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 gError = ERR_get
3960: 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 20 20 20 20 _error();...
3970: 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 if (backingError
3980: 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e == 0 && written
3990: 20 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e == 0) {...dprin
39a0: 74 66 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 tf("EOF reached"
39b0: 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 )...*errorCodePt
39c0: 72 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 6e r = 0;...written
39d0: 20 3d 20 30 3b 0a 09 20 20 20 20 7d 20 65 6c 73 = 0;.. } els
39e0: 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 e if (backingErr
39f0: 6f 72 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 or == 0 && writt
3a00: 65 6e 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 en == -1) {...dp
3a10: 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 rintf("I/O error
3a20: 20 6f 63 63 75 72 72 65 64 20 28 65 72 72 6e 6f occurred (errno
3a30: 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 = %lu)", (unsig
3a40: 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 ned long) Tcl_Ge
3a50: 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 tErrno());...*er
3a60: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c rorCodePtr = Tcl
3a70: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 _GetErrno();...w
3a80: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 ritten = -1;..
3a90: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 } else {...dpr
3aa0: 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 intf("I/O error
3ab0: 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b 69 6e occurred (backin
3ac0: 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20 gError = %lu)",
3ad0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09 backingError);..
3ae0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
3af0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 09 backingError;..
3b00: 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 .written = -1;..
3b10: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b }.. break
3b20: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
3b30: 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 54 6c 73 OR_SSL:.. Tls
3b40: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
3b50: 20 54 43 4c 54 4c 53 5f 53 53 4c 5f 45 52 52 4f TCLTLS_SSL_ERRO
3b60: 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c R(statePtr->ssl,
3b70: 20 77 72 69 74 74 65 6e 29 29 3b 0a 09 20 20 20 written));..
3b80: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
3b90: 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 ECONNABORTED;..
3ba0: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 written = -1
3bb0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ;.. break;...
3bc0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 default:.. dp
3bd0: 72 69 6e 74 66 28 22 20 75 6e 6b 6e 6f 77 6e 20 rintf(" unknown
3be0: 65 72 72 3a 20 25 64 22 2c 20 65 72 72 29 3b 0a err: %d", err);.
3bf0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 . break;.
3c00: 7d 0a 0a 20 20 20 20 69 66 20 28 2a 65 72 72 6f }.. if (*erro
3c10: 72 43 6f 64 65 50 74 72 20 3c 20 30 29 20 7b 0a rCodePtr < 0) {.
3c20: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 .Tls_Error(state
3c30: 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28 2a 65 Ptr, strerror(*e
3c40: 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 20 rrorCodePtr));.
3c50: 20 20 20 7d 0a 20 20 20 20 64 70 72 69 6e 74 66 }. dprintf
3c60: 28 22 4f 75 74 70 75 74 28 25 64 29 20 2d 3e 20 ("Output(%d) ->
3c70: 25 64 22 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 %d", toWrite, wr
3c80: 69 74 74 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 itten);. retu
3c90: 72 6e 28 77 72 69 74 74 65 6e 29 3b 0a 7d 0a 0a rn(written);.}..
3ca0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 54 --------. *. * T
3cf0: 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 lsSetOptionProc
3d00: 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 53 65 74 73 --. *. * Sets
3d10: 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 an option value
3d20: 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 for a SSL socke
3d30: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c t based channel,
3d40: 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69 73 74 or a. * list
3d50: 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 of all options
3d60: 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 and their values
3d70: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
3d80: 0a 20 2a 20 20 20 20 54 43 4c 5f 4f 4b 20 69 66 . * TCL_OK if
3d90: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 successful or T
3da0: 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 69 6c CL_ERROR if fail
3db0: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ed.. *. * Side e
3dc0: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 55 70 ffects:. * Up
3dd0: 64 61 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 dates channel op
3de0: 74 69 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 tion to new valu
3df0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3e40: 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 53 65 static int.TlsSe
3e50: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 tOptionProc(Clie
3e60: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
3e70: 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 ata, /* Socke
3e80: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 t state. */.
3e90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
3ea0: 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f rp,../* For erro
3eb0: 72 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c rs - can be NULL
3ec0: 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 . */. const c
3ed0: 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c har *optionName,
3ee0: 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 ./* Name of the
3ef0: 6f 70 74 69 6f 6e 20 74 6f 20 73 65 74 20 74 68 option to set th
3f00: 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 0a e value for, or.
3f10: 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 67 .... * NULL to g
3f20: 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 et all options a
3f30: 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e nd their values.
3f40: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
3f50: 61 72 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 ar *optionValue)
3f60: 09 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 6f 70 ./* Value for op
3f70: 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 tion. */.{. S
3f80: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
3f90: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
3fa0: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 54 63 nceData;.. Tc
3fb0: 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 6e 43 68 l_Channel downCh
3fc0: 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 an = Tls_GetPare
3fd0: 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 nt(statePtr, TLS
3fe0: 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a _TCL_FASTPATH);.
3ff0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65 Tcl_DriverSe
4000: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 tOptionProc *set
4010: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 OptionProc;..
4020: 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d setOptionProc =
4030: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f Tcl_ChannelSetO
4040: 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 ptionProc(Tcl_Ge
4050: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 tChannelType(dow
4060: 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 69 66 20 nChan));. if
4070: 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 (setOptionProc !
4080: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
4090: 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f n (*setOptionPro
40a0: 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 c)(Tcl_GetChanne
40b0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f lInstanceData(do
40c0: 77 6e 43 68 61 6e 29 2c 20 69 6e 74 65 72 70 2c wnChan), interp,
40d0: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 optionName, opt
40e0: 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d ionValue);. }
40f0: 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e else if (option
4100: 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 Name == (char*)
4110: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 NULL) {../*.. *
4120: 52 65 71 75 65 73 74 20 69 73 20 71 75 65 72 79 Request is query
4130: 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 for all options
4140: 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09 20 , this is ok...
4150: 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f */..return TCL_O
4160: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a K;. }. /*.
4170: 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 20 66 * Request f
4180: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 6f 70 or a specific op
4190: 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 69 6c tion has to fail
41a0: 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 , we don't have
41b0: 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 any.. */.
41c0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 return Tcl_BadC
41d0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
41e0: 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c erp, optionName,
41f0: 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d "");.}../*. *--
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4240: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 4f 70 -. *. * TlsGetOp
4250: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 tionProc --. *.
4260: 2a 20 20 20 20 47 65 74 73 20 61 6e 20 6f 70 74 * Gets an opt
4270: 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 ion value for a
4280: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
4290: 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a 20 channel, or a.
42a0: 2a 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c 6c * list of all
42b0: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 options and the
42c0: 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a ir values.. *. *
42d0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 Results:. *
42e0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
42f0: 65 73 75 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 esult. The value
4300: 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 of the specifie
4310: 64 20 6f 70 74 69 6f 6e 20 6f 72 20 61 0a 20 2a d option or a. *
4320: 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 list of all
4330: 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 options and thei
4340: 72 20 76 61 6c 75 65 73 20 69 73 20 72 65 74 75 r values is retu
4350: 72 6e 65 64 20 69 6e 20 74 68 65 0a 20 2a 20 20 rned in the. *
4360: 20 20 73 75 70 70 6c 69 65 64 20 44 53 74 72 69 supplied DStri
4370: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
4380: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f ffects:. * No
4390: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f ------------. */
43e0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 47 .static int.TlsG
43f0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 etOptionProc(Cli
4400: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
4410: 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b Data, /* Sock
4420: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 et state. */.
4430: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
4440: 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 erp,../* For err
4450: 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c ors - can be NUL
4460: 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 L. */. const
4470: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 char *optionName
4480: 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 ,./* Name of the
4490: 20 6f 70 74 69 6f 6e 20 74 6f 20 72 65 74 72 69 option to retri
44a0: 65 76 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f eve the value fo
44b0: 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e 55 4c r, or..... * NUL
44c0: 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 74 L to get all opt
44d0: 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 ions and their v
44e0: 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 54 63 alues. */. Tc
44f0: 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 6f l_DString *optio
4500: 6e 56 61 6c 75 65 29 09 2f 2a 20 57 68 65 72 65 nValue)./* Where
4510: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f to store the co
4520: 6d 70 75 74 65 64 20 76 61 6c 75 65 20 69 6e 69 mputed value ini
4530: 74 69 61 6c 69 7a 65 64 20 62 79 20 63 61 6c 6c tialized by call
4540: 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 er. */.{. Sta
4550: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
4560: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
4570: 65 44 61 74 61 3b 0a 0a 20 20 20 20 54 63 6c 5f eData;.. Tcl_
4580: 43 68 61 6e 6e 65 6c 20 64 6f 77 6e 43 68 61 6e Channel downChan
4590: 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 = Tls_GetParent
45a0: 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 (statePtr, TLS_T
45b0: 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 CL_FASTPATH);.
45c0: 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f Tcl_DriverGetO
45d0: 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 ptionProc *getOp
45e0: 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 67 tionProc;.. g
45f0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 etOptionProc = T
4600: 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 cl_ChannelGetOpt
4610: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 ionProc(Tcl_GetC
4620: 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 hannelType(downC
4630: 68 61 6e 29 29 3b 0a 20 20 20 20 69 66 20 28 67 han));. if (g
4640: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 etOptionProc !=
4650: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
4660: 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 (*getOptionProc)
4670: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 (Tcl_GetChannelI
4680: 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e nstanceData(down
4690: 43 68 61 6e 29 2c 20 69 6e 74 65 72 70 2c 20 6f Chan), interp, o
46a0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f ptionName, optio
46b0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 nValue);. } e
46c0: 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 lse if (optionNa
46d0: 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 me == (char*) NU
46e0: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 LL) {../*.. * Re
46f0: 71 75 65 73 74 20 69 73 20 71 75 65 72 79 20 66 quest is query f
4700: 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 or all options,
4710: 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f this is ok... */
4720: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b ..return TCL_OK;
4730: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 . }. /*.
4740: 20 20 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 * Request for
4750: 20 61 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 a specific opti
4760: 6f 6e 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 on has to fail,
4770: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e we don't have an
4780: 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 y.. */. r
4790: 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 eturn Tcl_BadCha
47a0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
47b0: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 p, optionName, "
47c0: 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ");.}../*. *----
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4810: 20 2a 0a 20 2a 20 54 6c 73 57 61 74 63 68 50 72 *. * TlsWatchPr
4820: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 49 oc --. *. * I
4830: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f nitialize the no
4840: 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 tifier to watch
4850: 54 63 6c 5f 46 69 6c 65 73 20 66 72 6f 6d 20 74 Tcl_Files from t
4860: 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a his channel.. *.
4870: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 * Results:. *
4880: 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 None.. *. * Si
4890: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 de effects:. *
48a0: 20 20 53 65 74 73 20 75 70 20 74 68 65 20 6e 6f Sets up the no
48b0: 74 69 66 69 65 72 20 73 6f 20 74 68 61 74 20 61 tifier so that a
48c0: 20 66 75 74 75 72 65 20 65 76 65 6e 74 20 6f 6e future event on
48d0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 20 the channel. *
48e0: 20 20 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 will be seen
48f0: 62 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d by Tcl.. *. *---
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4940: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 . */.static void
4950: 0a 54 6c 73 57 61 74 63 68 50 72 6f 63 28 43 6c .TlsWatchProc(Cl
4960: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
4970: 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 eData, /* The
4980: 20 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a socket state. *
4990: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 /. int mask).
49a0: 09 09 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 ../* Events of i
49b0: 6e 74 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 nterest; an OR-e
49c0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 d combination of
49d0: 0a 09 09 09 09 20 2a 20 54 43 4c 5f 52 45 41 44 ..... * TCL_READ
49e0: 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 ABLE, TCL_WRITAB
49f0: 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 LE and TCL_EXCEP
4a00: 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 TION. */.{. T
4a10: 63 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64 cl_Channel d
4a20: 6f 77 6e 43 68 61 6e 3b 0a 20 20 20 20 53 74 61 ownChan;. Sta
4a30: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
4a40: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
4a50: 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 eData;.. dpri
4a60: 6e 74 66 28 22 54 6c 73 57 61 74 63 68 50 72 6f ntf("TlsWatchPro
4a70: 63 28 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b c(0x%x)", mask);
4a80: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 .. /* Pretend
4a90: 20 74 6f 20 62 65 20 64 65 61 64 20 61 73 20 6c to be dead as l
4aa0: 6f 6e 67 20 61 73 20 74 68 65 20 76 65 72 69 66 ong as the verif
4ab0: 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 y callback is ru
4ac0: 6e 6e 69 6e 67 2e 0a 20 20 20 20 20 2a 20 4f 74 nning.. * Ot
4ad0: 68 65 72 77 69 73 65 20 74 68 61 74 20 63 61 6c herwise that cal
4ae0: 6c 62 61 63 6b 20 63 6f 75 6c 64 20 62 65 20 69 lback could be i
4af0: 6e 76 6f 6b 65 64 20 72 65 63 75 72 73 69 76 65 nvoked recursive
4b00: 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ly. */. if (s
4b10: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
4b20: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 TLS_TCL_CALLBAC
4b30: 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 K) {..dprintf("C
4b40: 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67 6f allback is on-go
4b50: 69 6e 67 2c 20 64 6f 69 6e 67 20 6e 6f 74 68 69 ing, doing nothi
4b60: 6e 67 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 ng");..return;.
4b70: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
4b80: 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 3b Flags(statePtr);
4b90: 0a 0a 20 20 20 20 64 6f 77 6e 43 68 61 6e 20 3d .. downChan =
4ba0: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 Tls_GetParent(s
4bb0: 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c tatePtr, TLS_TCL
4bc0: 5f 46 41 53 54 50 41 54 48 29 3b 0a 0a 20 20 20 _FASTPATH);..
4bd0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 if (statePtr->f
4be0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 48 lags & TLS_TCL_H
4bf0: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 29 ANDSHAKE_FAILED)
4c00: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b {..dprintf("Ask
4c10: 65 64 20 74 6f 20 77 61 74 63 68 20 61 20 73 6f ed to watch a so
4c20: 63 6b 65 74 20 77 69 74 68 20 61 20 66 61 69 6c cket with a fail
4c30: 65 64 20 68 61 6e 64 73 68 61 6b 65 20 2d 2d 20 ed handshake --
4c40: 6e 6f 74 68 69 6e 67 20 63 61 6e 20 68 61 70 70 nothing can happ
4c50: 65 6e 20 68 65 72 65 22 29 3b 0a 09 64 70 72 69 en here");..dpri
4c60: 6e 74 66 28 22 55 6e 72 65 67 69 73 74 65 72 69 ntf("Unregisteri
4c70: 6e 67 20 69 6e 74 65 72 65 73 74 20 69 6e 20 74 ng interest in t
4c80: 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c he lower channel
4c90: 22 29 3b 0a 0a 09 28 54 63 6c 5f 47 65 74 43 68 ");...(Tcl_GetCh
4ca0: 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 annelType(downCh
4cb0: 61 6e 29 29 2d 3e 77 61 74 63 68 50 72 6f 63 28 an))->watchProc(
4cc0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
4cd0: 73 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 stanceData(downC
4ce0: 68 61 6e 29 2c 20 30 29 3b 0a 09 73 74 61 74 65 han), 0);..state
4cf0: 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d Ptr->watchMask =
4d00: 20 30 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 0;..return;.
4d10: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 }.. statePtr
4d20: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 ->watchMask = ma
4d30: 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 sk;.. /* No c
4d40: 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 hannel handlers
4d50: 61 6e 79 20 6d 6f 72 65 2e 20 57 65 20 77 69 6c any more. We wil
4d60: 6c 20 62 65 20 6e 6f 74 69 66 69 65 64 20 61 75 l be notified au
4d70: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 20 20 tomatically.
4d80: 20 2a 20 61 62 6f 75 74 20 65 76 65 6e 74 73 20 * about events
4d90: 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 on the channel b
4da0: 65 6c 6f 77 20 76 69 61 20 61 20 63 61 6c 6c 20 elow via a call
4db0: 74 6f 20 6f 75 72 0a 20 20 20 20 20 2a 20 27 54 to our. * 'T
4dc0: 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 79 50 72 ransformNotifyPr
4dd0: 6f 63 27 2e 20 42 75 74 20 77 65 20 68 61 76 65 oc'. But we have
4de0: 20 74 6f 20 70 61 73 73 20 74 68 65 20 69 6e 74 to pass the int
4df0: 65 72 65 73 74 20 64 6f 77 6e 20 6e 6f 77 2e 0a erest down now..
4e00: 20 20 20 20 20 2a 20 57 65 20 61 72 65 20 61 6c * We are al
4e10: 6c 6f 77 65 64 20 74 6f 20 61 64 64 20 61 64 64 lowed to add add
4e20: 69 74 69 6f 6e 61 6c 20 27 69 6e 74 65 72 65 73 itional 'interes
4e30: 74 27 20 74 6f 20 74 68 65 20 6d 61 73 6b 20 69 t' to the mask i
4e40: 66 20 77 65 20 77 61 6e 74 0a 20 20 20 20 20 2a f we want. *
4e50: 20 74 6f 2e 20 42 75 74 20 74 68 69 73 20 74 72 to. But this tr
4e60: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 ansformation has
4e70: 20 6e 6f 20 73 75 63 68 20 69 6e 74 65 72 65 73 no such interes
4e80: 74 2e 20 49 74 20 6a 75 73 74 20 70 61 73 73 65 t. It just passe
4e90: 73 0a 20 20 20 20 20 2a 20 74 68 65 20 72 65 71 s. * the req
4ea0: 75 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61 uest down, uncha
4eb0: 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 nged.. */.
4ec0: 20 20 64 70 72 69 6e 74 66 28 22 52 65 67 69 73 dprintf("Regis
4ed0: 74 65 72 69 6e 67 20 6f 75 72 20 69 6e 74 65 72 tering our inter
4ee0: 65 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 est in the lower
4ef0: 20 63 68 61 6e 6e 65 6c 20 28 63 68 61 6e 3d 25 channel (chan=%
4f00: 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 64 6f p)", (void *) do
4f10: 77 6e 43 68 61 6e 29 3b 0a 20 20 20 20 28 54 63 wnChan);. (Tc
4f20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
4f30: 28 64 6f 77 6e 43 68 61 6e 29 29 2d 3e 77 61 74 (downChan))->wat
4f40: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 chProc(Tcl_GetCh
4f50: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
4f60: 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 6d 61 73 a(downChan), mas
4f70: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 k);.. /*.
4f80: 20 2a 20 4d 61 6e 61 67 65 6d 65 6e 74 20 6f 66 * Management of
4f90: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74 69 the internal ti
4fa0: 6d 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 mer.. */.
4fb0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 if (statePtr->t
4fc0: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d imer != (Tcl_Tim
4fd0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b erToken) NULL) {
4fe0: 0a 09 64 70 72 69 6e 74 66 28 22 41 20 74 69 6d ..dprintf("A tim
4ff0: 65 72 20 77 61 73 20 66 6f 75 6e 64 2c 20 64 65 er was found, de
5000: 6c 65 74 69 6e 67 20 69 74 22 29 3b 0a 09 54 63 leting it");..Tc
5010: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e l_DeleteTimerHan
5020: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 dler(statePtr->t
5030: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 imer);..statePtr
5040: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 ->timer = (Tcl_T
5050: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b imerToken) NULL;
5060: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
5070: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 (mask & TCL_READ
5080: 41 42 4c 45 29 20 26 26 0a 09 28 28 54 63 6c 5f ABLE) &&..((Tcl_
5090: 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 InputBuffered(st
50a0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 atePtr->self) >
50b0: 30 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72 6c 5f 0) || (BIO_ctrl_
50c0: 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 pending(statePtr
50d0: 2d 3e 62 69 6f 29 20 3e 20 30 29 29 29 20 7b 0a ->bio) > 0))) {.
50e0: 09 2f 2a 0a 09 20 2a 20 54 68 65 72 65 20 69 73 ./*.. * There is
50f0: 20 69 6e 74 65 72 65 73 74 20 69 6e 20 72 65 61 interest in rea
5100: 64 61 62 6c 65 20 65 76 65 6e 74 73 20 61 6e 64 dable events and
5110: 20 77 65 20 61 63 74 75 61 6c 6c 79 20 68 61 76 we actually hav
5120: 65 0a 09 20 2a 20 64 61 74 61 20 77 61 69 74 69 e.. * data waiti
5130: 6e 67 2c 20 73 6f 20 67 65 6e 65 72 61 74 65 20 ng, so generate
5140: 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 a timer to flush
5150: 20 74 68 61 74 2e 0a 09 20 2a 2f 0a 09 64 70 72 that... */..dpr
5160: 69 6e 74 66 28 22 43 72 65 61 74 69 6e 67 20 61 intf("Creating a
5170: 20 6e 65 77 20 74 69 6d 65 72 20 73 69 6e 63 65 new timer since
5180: 20 64 61 74 61 20 61 70 70 65 61 72 73 20 74 6f data appears to
5190: 20 62 65 20 77 61 69 74 69 6e 67 22 29 3b 0a 09 be waiting");..
51a0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
51b0: 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 = Tcl_CreateTime
51c0: 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c rHandler(TLS_TCL
51d0: 5f 44 45 4c 41 59 2c 20 54 6c 73 43 68 61 6e 6e _DELAY, TlsChann
51e0: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 elHandlerTimer,
51f0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
5200: 74 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a tePtr);. }.}.
5210: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
5260: 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 TlsGetHandleProc
5270: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 43 61 6c --. *. * Cal
5280: 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 led from Tcl_Get
5290: 43 68 61 6e 6e 65 6c 46 69 6c 65 20 74 6f 20 72 ChannelFile to r
52a0: 65 74 72 69 65 76 65 20 6f 2f 73 20 66 69 6c 65 etrieve o/s file
52b0: 20 68 61 6e 64 6c 65 72 0a 20 2a 20 20 20 20 66 handler. * f
52c0: 72 6f 6d 20 74 68 65 20 53 53 4c 20 73 6f 63 6b rom the SSL sock
52d0: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
52e0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
52f0: 0a 20 2a 20 20 20 20 54 68 65 20 61 70 70 72 6f . * The appro
5300: 70 72 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 20 priate Tcl_File
5310: 68 61 6e 64 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 handle or NULL i
5320: 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 f none.. *. * Si
5330: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 de effects:. *
5340: 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d None.. *. *---
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
53a0: 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 TlsGetHandleProc
53b0: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
53c0: 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 anceData, /*
53d0: 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f Socket state. */
53e0: 0a 20 20 20 20 69 6e 74 20 64 69 72 65 63 74 69 . int directi
53f0: 6f 6e 2c 09 09 2f 2a 20 54 43 4c 5f 52 45 41 44 on,../* TCL_READ
5400: 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 ABLE or TCL_WRIT
5410: 41 42 4c 45 20 2a 2f 0a 20 20 20 20 43 6c 69 65 ABLE */. Clie
5420: 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 ntData *handlePt
5430: 72 29 09 2f 2a 20 48 61 6e 64 6c 65 20 61 73 73 r)./* Handle ass
5440: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
5450: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 channel */.{.
5460: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
5470: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e r = (State *) in
5480: 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 stanceData;..
5490: 20 72 65 74 75 72 6e 28 54 63 6c 5f 47 65 74 43 return(Tcl_GetC
54a0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 6c 73 hannelHandle(Tls
54b0: 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 _GetParent(state
54c0: 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 Ptr, TLS_TCL_FAS
54d0: 54 50 41 54 48 29 2c 20 64 69 72 65 63 74 69 6f TPATH), directio
54e0: 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 29 3b 0a n, handlePtr));.
54f0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5540: 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 * TlsNotifyProc
5550: 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 48 61 6e 64 --. *. * Hand
5560: 6c 65 72 20 63 61 6c 6c 65 64 20 62 79 20 54 63 ler called by Tc
5570: 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f l to inform us o
5580: 66 20 61 63 74 69 76 69 74 79 0a 20 2a 20 20 20 f activity. *
5590: 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 on the underlyi
55a0: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 ng channel.. *.
55b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 * Results:. *
55c0: 20 54 79 70 65 20 6f 66 20 65 76 65 6e 74 20 6f Type of event o
55d0: 72 20 30 20 69 66 20 66 61 69 6c 65 64 0a 20 2a r 0 if failed. *
55e0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
55f0: 3a 0a 20 2a 20 20 20 20 4d 61 79 20 70 72 6f 63 :. * May proc
5600: 65 73 73 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 ess the incoming
5610: 20 65 76 65 6e 74 20 62 79 20 69 74 73 65 6c 66 event by itself
5620: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
5670: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4e 6f 74 tatic int TlsNot
5680: 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 ifyProc(ClientDa
5690: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c ta instanceData,
56a0: 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 /* Socket st
56b0: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ate. */. int
56c0: 6d 61 73 6b 29 09 09 09 2f 2a 20 74 79 70 65 20 mask).../* type
56d0: 6f 66 20 65 76 65 6e 74 20 74 68 61 74 20 6f 63 of event that oc
56e0: 63 75 72 72 65 64 3a 0a 09 09 09 09 20 2a 20 4f curred:..... * O
56f0: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e R-ed combination
5700: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 of TCL_READABLE
5710: 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 or TCL_WRITABLE
5720: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 */.{. State
5730: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5740: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 te *) instanceDa
5750: 74 61 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 6f ta;. int erro
5760: 72 43 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 0a 20 rCode;.. /*.
5770: 20 20 20 20 2a 20 41 6e 20 65 76 65 6e 74 20 6f * An event o
5780: 63 63 75 72 72 65 64 20 69 6e 20 74 68 65 20 75 ccurred in the u
5790: 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 nderlying channe
57a0: 6c 2e 20 20 54 68 69 73 0a 20 20 20 20 20 2a 20 l. This. *
57b0: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 64 transformation d
57c0: 6f 65 73 6e 27 74 20 70 72 6f 63 65 73 73 20 73 oesn't process s
57d0: 75 63 68 20 65 76 65 6e 74 73 20 74 68 75 73 20 uch events thus
57e0: 72 65 74 75 72 6e 73 20 74 68 65 0a 20 20 20 20 returns the.
57f0: 20 2a 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 6b * incoming mask
5800: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 unchanged..
5810: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
5820: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
5830: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
5840: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 NULL) {../*.. *
5850: 44 65 6c 65 74 65 20 61 6e 20 65 78 69 73 74 69 Delete an existi
5860: 6e 67 20 74 69 6d 65 72 2e 20 49 74 20 77 61 73 ng timer. It was
5870: 20 6e 6f 74 20 66 69 72 65 64 2c 20 79 65 74 20 not fired, yet
5880: 77 65 20 61 72 65 0a 09 20 2a 20 68 65 72 65 2c we are.. * here,
5890: 20 73 6f 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 so the channel
58a0: 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 64 20 below generated
58b0: 73 75 63 68 20 61 6e 20 65 76 65 6e 74 20 61 6e such an event an
58c0: 64 20 77 65 0a 09 20 2a 20 64 6f 6e 27 74 20 68 d we.. * don't h
58d0: 61 76 65 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 ave to. The rene
58e0: 77 61 6c 20 6f 66 20 74 68 65 20 69 6e 74 65 72 wal of the inter
58f0: 65 73 74 20 61 66 74 65 72 20 74 68 65 0a 09 20 est after the..
5900: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 * execution of c
5910: 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 hannel handlers
5920: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 will eventually
5930: 63 61 75 73 65 20 75 73 20 74 6f 0a 09 20 2a 20 cause us to.. *
5940: 72 65 63 72 65 61 74 65 20 74 68 65 20 74 69 6d recreate the tim
5950: 65 72 20 28 69 6e 20 57 61 74 63 68 50 72 6f 63 er (in WatchProc
5960: 29 2e 0a 09 20 2a 2f 0a 09 54 63 6c 5f 44 65 6c )... */..Tcl_Del
5970: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
5980: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
5990: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
59a0: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
59b0: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 oken) NULL;.
59c0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
59d0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
59e0: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b _TCL_CALLBACK) {
59f0: 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 ..dprintf("Retur
5a00: 6e 69 6e 67 20 30 20 64 75 65 20 74 6f 20 63 61 ning 0 due to ca
5a10: 6c 6c 62 61 63 6b 22 29 3b 0a 09 72 65 74 75 72 llback");..retur
5a20: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 n 0;. }..
5a30: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 dprintf("Calling
5a40: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
5a50: 65 63 74 22 29 3b 0a 20 20 20 20 65 72 72 6f 72 ect");. error
5a60: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 Code = 0;. if
5a70: 20 28 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e (Tls_WaitForCon
5a80: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 nect(statePtr, &
5a90: 65 72 72 6f 72 43 6f 64 65 2c 20 31 29 20 3c 20 errorCode, 1) <
5aa0: 30 29 20 7b 0a 09 54 6c 73 5f 45 72 72 6f 72 28 0) {..Tls_Error(
5ab0: 73 74 61 74 65 50 74 72 2c 20 73 74 72 65 72 72 statePtr, strerr
5ac0: 6f 72 28 65 72 72 6f 72 43 6f 64 65 29 29 3b 0a or(errorCode));.
5ad0: 09 69 66 20 28 65 72 72 6f 72 43 6f 64 65 20 3d .if (errorCode =
5ae0: 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 20 20 20 = EAGAIN) {..
5af0: 20 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 dprintf("Async
5b00: 66 6c 61 67 20 63 6f 75 6c 64 20 62 65 20 73 65 flag could be se
5b10: 74 20 28 64 69 64 6e 27 74 20 63 68 65 63 6b 29 t (didn't check)
5b20: 20 61 6e 64 20 65 72 72 6f 72 43 6f 64 65 20 3d and errorCode =
5b30: 3d 20 45 41 47 41 49 4e 3a 20 20 52 65 74 75 72 = EAGAIN: Retur
5b40: 6e 69 6e 67 20 30 22 29 3b 0a 0a 09 20 20 20 20 ning 0");...
5b50: 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09 64 return 0;..}...d
5b60: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 printf("Tls_Wait
5b70: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 ForConnect retur
5b80: 6e 65 64 20 61 6e 20 65 72 72 6f 72 22 29 3b 0a ned an error");.
5b90: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
5ba0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 tf("Returning %i
5bb0: 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 72 ", mask);.. r
5bc0: 65 74 75 72 6e 28 6d 61 73 6b 29 3b 0a 7d 0a 0a eturn(mask);.}..
5bd0: 23 69 66 20 30 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d #if 0./*. *-----
5be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c10: 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 54 6c -*. *. * Tl
5c20: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 sChannelHandler
5c30: 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 20 20 2d 2d --. *. * --
5c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
5c70: 20 2a 20 20 20 20 20 20 48 61 6e 64 6c 65 72 20 * Handler
5c80: 63 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 61 73 called by Tcl as
5c90: 20 61 20 72 65 73 75 6c 74 20 6f 66 0a 20 2a 20 a result of. *
5ca0: 20 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 Tcl_CreateC
5cb0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 20 hannelHandler -
5cc0: 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 to inform us of
5cd0: 61 63 74 69 76 69 74 79 0a 20 2a 20 20 20 20 20 activity. *
5ce0: 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 on the underlyi
5cf0: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20 ng channel.. *
5d00: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d30: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 ----*. *. *
5d40: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5d50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d * M
5d60: 61 79 20 67 65 6e 65 72 61 74 65 20 73 75 62 73 ay generate subs
5d70: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a equent calls to.
5d80: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
5d90: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
5da0: 6c 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 20 52 65 l.. *. * Re
5db0: 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20 20 sult:. *
5dc0: 20 20 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 None.. *.
5dd0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e00: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 -------*. */.sta
5e10: 74 69 63 20 76 6f 69 64 0a 54 6c 73 43 68 61 6e tic void.TlsChan
5e20: 6e 65 6c 48 61 6e 64 6c 65 72 28 43 6c 69 65 6e nelHandler(Clien
5e30: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
5e40: 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20 , int mask) {.
5e50: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
5e60: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6c r = (State *) cl
5e70: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
5e80: 70 72 69 6e 74 66 28 22 48 41 4e 44 4c 45 52 28 printf("HANDLER(
5e90: 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b 0a 20 0x%x)", mask);.
5ea0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
5eb0: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74 (ClientData)stat
5ec0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
5ed0: 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 mask & TCL_READA
5ee0: 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 65 74 5f BLE) {..BIO_set_
5ef0: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e flags(statePtr->
5f00: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 p_bio, BIO_FLAGS
5f10: 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 20 65 6c _READ);. } el
5f20: 73 65 20 7b 0a 09 42 49 4f 5f 63 6c 65 61 72 5f se {..BIO_clear_
5f30: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e flags(statePtr->
5f40: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 p_bio, BIO_FLAGS
5f50: 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 _READ);. }..
5f60: 20 20 20 69 66 20 28 6d 61 73 6b 20 26 20 54 43 if (mask & TC
5f70: 4c 5f 57 52 49 54 41 42 4c 45 29 20 7b 0a 09 42 L_WRITABLE) {..B
5f80: 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 73 74 61 IO_set_flags(sta
5f90: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 tePtr->p_bio, BI
5fa0: 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a O_FLAGS_WRITE);.
5fb0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 } else {..BI
5fc0: 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 73 28 73 74 O_clear_flags(st
5fd0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 atePtr->p_bio, B
5fe0: 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b IO_FLAGS_WRITE);
5ff0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 73 6b . }.. mask
6000: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 42 49 = 0;. if (BI
6010: 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 O_wpending(state
6020: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 Ptr->bio)) {..ma
6030: 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 sk |= TCL_WRITAB
6040: 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LE;. }. if
6050: 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 (BIO_pending(st
6060: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
6070: 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 .mask |= TCL_REA
6080: 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 DABLE;. }..
6090: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 /*. * The
60a0: 66 6f 6c 6c 6f 77 69 6e 67 20 4e 6f 74 69 66 79 following Notify
60b0: 43 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 73 65 Channel calls se
60c0: 65 6d 73 20 74 6f 20 62 65 20 69 6d 70 6f 72 74 ems to be import
60d0: 61 6e 74 2c 20 62 75 74 0a 20 20 20 20 20 2a 20 ant, but. *
60e0: 77 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 77 68 we don't know wh
60f0: 79 2e 20 20 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b y. It looks lik
6100: 65 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 e if the mask is
6110: 20 65 76 65 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 20 ever non-zero.
6120: 20 20 20 20 2a 20 74 68 61 74 20 69 74 20 77 69 * that it wi
6130: 6c 6c 20 65 6e 74 65 72 20 61 6e 20 69 6e 66 69 ll enter an infi
6140: 6e 69 74 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 nite loop..
6150: 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 69 66 79 20 *. * Notify
6160: 74 68 65 20 75 70 70 65 72 20 63 68 61 6e 6e 65 the upper channe
6170: 6c 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 l of the current
6180: 20 42 49 4f 20 73 74 61 74 65 20 73 6f 20 74 68 BIO state so th
6190: 65 20 65 76 65 6e 74 0a 20 20 20 20 20 2a 20 63 e event. * c
61a0: 6f 6e 74 69 6e 75 65 73 20 74 6f 20 70 72 6f 70 ontinues to prop
61b0: 61 67 61 74 65 20 75 70 20 74 68 65 20 63 68 61 agate up the cha
61c0: 69 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 in.. *.
61d0: 2a 20 73 74 61 6e 74 6f 6e 3a 20 49 74 20 6c 6f * stanton: It lo
61e0: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 20 63 6f oks like this co
61f0: 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 61 6e uld result in an
6200: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 69 infinite loop i
6210: 66 0a 20 20 20 20 20 2a 20 74 68 65 20 75 70 70 f. * the upp
6220: 65 72 20 63 68 61 6e 6e 65 6c 20 64 6f 65 73 6e er channel doesn
6230: 27 74 20 63 61 75 73 65 20 43 68 61 6e 6e 65 6c 't cause Channel
6240: 48 61 6e 64 6c 65 72 20 74 6f 20 62 65 20 72 65 Handler to be re
6250: 6d 6f 76 65 64 0a 20 20 20 20 20 2a 20 62 65 66 moved. * bef
6260: 6f 72 65 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 ore Tcl_NotifyCh
6270: 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 63 68 61 6e annel calls chan
6280: 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 6f 6e 20 nel handlers on
6290: 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 the lower channe
62a0: 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 l.. */. T
62b0: 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c cl_NotifyChannel
62c0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c (statePtr->self,
62d0: 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 69 66 20 mask);.. if
62e0: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
62f0: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f != (Tcl_TimerTo
6300: 6b 65 6e 29 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c ken)NULL) {..Tcl
6310: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
6320: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
6330: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
6340: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
6350: 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b 0a 20 merToken)NULL;.
6360: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6d 61 }. if ((ma
6370: 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c sk & TCL_READABL
6380: 45 29 20 26 26 20 54 63 6c 5f 49 6e 70 75 74 42 E) && Tcl_InputB
6390: 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 uffered(statePtr
63a0: 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20 7b 0a 09 ->self) > 0) {..
63b0: 2f 2a 0a 09 20 2a 20 44 61 74 61 20 69 73 20 77 /*.. * Data is w
63c0: 61 69 74 69 6e 67 2c 20 66 6c 75 73 68 20 69 74 aiting, flush it
63d0: 20 6f 75 74 20 69 6e 20 73 68 6f 72 74 20 74 69 out in short ti
63e0: 6d 65 0a 09 20 2a 2f 0a 09 73 74 61 74 65 50 74 me.. */..statePt
63f0: 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 r->timer = Tcl_C
6400: 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 reateTimerHandle
6410: 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c r(TLS_TCL_DELAY,
6420: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c TlsChannelHandl
6430: 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 65 6e 74 erTimer, (Client
6440: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
6450: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 . }. Tcl_R
6460: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
6470: 74 61 29 73 74 61 74 65 50 74 72 29 3b 0a 7d 0a ta)statePtr);.}.
6480: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d #endif../*. *---
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64c0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 54 6c ---*. *. * Tl
64d0: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 sChannelHandlerT
64e0: 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 imer --. *. *
64f0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6520: 2d 2a 0a 20 2a 20 20 20 20 43 61 6c 6c 65 64 20 -*. * Called
6530: 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 by the notifier
6540: 28 2d 3e 20 74 69 6d 65 72 29 20 74 6f 20 66 6c (-> timer) to fl
6550: 75 73 68 20 6f 75 74 0a 20 2a 20 20 20 20 69 6e ush out. * in
6560: 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 74 69 6e formation waitin
6570: 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 62 75 66 g in channel buf
6580: 66 65 72 73 2e 0a 20 2a 20 20 20 20 2d 2d 2d 2d fers.. * ----
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
65c0: 0a 20 2a 20 20 20 20 53 69 64 65 20 65 66 66 65 . * Side effe
65d0: 63 74 73 3a 0a 20 2a 20 20 20 20 20 20 20 20 41 cts:. * A
65e0: 73 20 6f 66 20 27 54 6c 73 43 68 61 6e 6e 65 6c s of 'TlsChannel
65f0: 48 61 6e 64 6c 65 72 27 2e 0a 20 2a 0a 20 2a 20 Handler'.. *. *
6600: 20 20 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 Result:. *
6610: 20 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a None.. *. *
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6650: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 ------*. */.stat
6660: 69 63 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e ic void TlsChann
6670: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 28 43 elHandlerTimer(C
6680: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
6690: 44 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 Data) {. Stat
66a0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
66b0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
66c0: 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b ta;. int mask
66d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
66e0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
66f0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d statePtr->tim
6700: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
6710: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 oken) NULL;..
6720: 20 69 66 20 28 42 49 4f 5f 77 70 65 6e 64 69 6e if (BIO_wpendin
6730: 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 g(statePtr->bio)
6740: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 ) {..dprintf("[c
6750: 68 61 6e 3d 25 70 5d 20 42 49 4f 20 77 72 69 74 han=%p] BIO writ
6760: 61 62 6c 65 22 2c 20 73 74 61 74 65 50 74 72 2d able", statePtr-
6770: 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c >self);...mask |
6780: 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a = TCL_WRITABLE;.
6790: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 42 }.. if (B
67a0: 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 IO_pending(state
67b0: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70 Ptr->bio)) {..dp
67c0: 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d rintf("[chan=%p]
67d0: 20 42 49 4f 20 72 65 61 64 61 62 6c 65 22 2c 20 BIO readable",
67e0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b statePtr->self);
67f0: 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 ...mask |= TCL_R
6800: 45 41 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a EADABLE;. }..
6810: 20 20 20 20 64 70 72 69 6e 74 66 28 22 4e 6f 74 dprintf("Not
6820: 69 66 79 69 6e 67 20 6f 75 72 73 65 6c 76 65 73 ifying ourselves
6830: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 ");. Tcl_Noti
6840: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 fyChannel(stateP
6850: 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b tr->self, mask);
6860: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
6870: 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 20 20 20 eturning");..
6880: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 54 63 6c 5f return;.}..Tcl_
6890: 43 68 61 6e 6e 65 6c 20 54 6c 73 5f 47 65 74 50 Channel Tls_GetP
68a0: 61 72 65 6e 74 28 53 74 61 74 65 20 2a 73 74 61 arent(State *sta
68b0: 74 65 50 74 72 2c 20 69 6e 74 20 6d 61 73 6b 46 tePtr, int maskF
68c0: 6c 61 67 73 29 20 7b 0a 20 20 20 20 64 70 72 69 lags) {. dpri
68d0: 6e 74 66 28 22 52 65 71 75 65 73 74 65 64 20 74 ntf("Requested t
68e0: 6f 20 67 65 74 20 70 61 72 65 6e 74 20 6f 66 20 o get parent of
68f0: 63 68 61 6e 6e 65 6c 20 25 70 22 2c 20 73 74 61 channel %p", sta
6900: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 20 tePtr->self);..
6910: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 if ((statePtr
6920: 2d 3e 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 46 ->flags & ~maskF
6930: 6c 61 67 73 29 20 26 20 54 4c 53 5f 54 43 4c 5f lags) & TLS_TCL_
6940: 46 41 53 54 50 41 54 48 29 20 7b 0a 09 64 70 72 FASTPATH) {..dpr
6950: 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 67 intf("Asked to g
6960: 65 74 20 74 68 65 20 70 61 72 65 6e 74 20 63 68 et the parent ch
6970: 61 6e 6e 65 6c 20 77 68 69 6c 65 20 77 65 20 61 annel while we a
6980: 72 65 20 75 73 69 6e 67 20 46 61 73 74 50 61 74 re using FastPat
6990: 68 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 4e h -- returning N
69a0: 55 4c 4c 22 29 3b 0a 09 72 65 74 75 72 6e 28 4e ULL");..return(N
69b0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ULL);. }.
69c0: 72 65 74 75 72 6e 28 54 63 6c 5f 47 65 74 53 74 return(Tcl_GetSt
69d0: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 ackedChannel(sta
69e0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 7d tePtr->self));.}
69f0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
6a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
6a40: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
6a50: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 52 65 74 --. *. * Ret
6a60: 75 72 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 urn the correct
6a70: 54 4c 53 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 TLS channel driv
6a80: 65 72 20 69 6e 66 6f 0a 20 2a 0a 20 2a 20 52 65 er info. *. * Re
6a90: 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54 68 65 sults:. * The
6aa0: 20 63 6f 72 72 65 63 74 20 63 68 61 6e 6e 65 6c correct channel
6ab0: 20 64 72 69 76 65 72 20 66 6f 72 20 74 68 65 20 driver for the
6ac0: 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 current version
6ad0: 6f 66 20 54 63 6c 2e 0a 20 2a 0a 20 2a 20 53 69 of Tcl.. *. * Si
6ae0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 de effects:. *
6af0: 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d None.. *. *---
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b40: 0a 20 2a 2f 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c . */.Tcl_Channel
6b50: 54 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 Type *Tls_Channe
6b60: 6c 54 79 70 65 28 76 6f 69 64 29 20 7b 0a 20 20 lType(void) {.
6b70: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 unsigned int s
6b80: 69 7a 65 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 ize;.. /*.
6b90: 20 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 * Initialize t
6ba0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 20 he channel type
6bb0: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 20 if necessary.
6bc0: 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6c 73 */. if (tls
6bd0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 3d 20 4e ChannelType == N
6be0: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 41 ULL) {../*.. * A
6bf0: 6c 6c 6f 63 61 74 65 20 6e 65 77 20 63 68 61 6e llocate new chan
6c00: 6e 65 6c 74 79 70 65 20 73 74 72 75 63 74 75 72 neltype structur
6c10: 65 0a 09 20 2a 2f 0a 09 73 69 7a 65 20 3d 20 73 e.. */..size = s
6c20: 69 7a 65 6f 66 28 54 63 6c 5f 43 68 61 6e 6e 65 izeof(Tcl_Channe
6c30: 6c 54 79 70 65 29 3b 20 2f 2a 20 42 61 73 65 20 lType); /* Base
6c40: 73 69 7a 65 20 2a 2f 0a 0a 09 74 6c 73 43 68 61 size */...tlsCha
6c50: 6e 6e 65 6c 54 79 70 65 20 3d 20 28 54 63 6c 5f nnelType = (Tcl_
6c60: 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 29 20 63 ChannelType *) c
6c70: 6b 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 09 6d kalloc(size);..m
6c80: 65 6d 73 65 74 28 28 76 6f 69 64 20 2a 29 20 74 emset((void *) t
6c90: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 30 lsChannelType, 0
6ca0: 2c 20 73 69 7a 65 29 3b 0a 0a 09 74 6c 73 43 68 , size);...tlsCh
6cb0: 61 6e 6e 65 6c 54 79 70 65 2d 3e 74 79 70 65 4e annelType->typeN
6cc0: 61 6d 65 09 3d 20 22 74 6c 73 22 3b 0a 23 69 66 ame.= "tls";.#if
6cd0: 64 65 66 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f def TCL_CHANNEL_
6ce0: 56 45 52 53 49 4f 4e 5f 35 0a 09 74 6c 73 43 68 VERSION_5..tlsCh
6cf0: 61 6e 6e 65 6c 54 79 70 65 2d 3e 76 65 72 73 69 annelType->versi
6d00: 6f 6e 09 09 3d 20 54 43 4c 5f 43 48 41 4e 4e 45 on..= TCL_CHANNE
6d10: 4c 5f 56 45 52 53 49 4f 4e 5f 35 3b 0a 09 74 6c L_VERSION_5;..tl
6d20: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 63 6c sChannelType->cl
6d30: 6f 73 65 50 72 6f 63 09 3d 20 54 6c 73 43 6c 6f oseProc.= TlsClo
6d40: 73 65 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e seProc;..tlsChan
6d50: 6e 65 6c 54 79 70 65 2d 3e 69 6e 70 75 74 50 72 nelType->inputPr
6d60: 6f 63 09 3d 20 54 6c 73 49 6e 70 75 74 50 72 6f oc.= TlsInputPro
6d70: 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 c;..tlsChannelTy
6d80: 70 65 2d 3e 6f 75 74 70 75 74 50 72 6f 63 09 3d pe->outputProc.=
6d90: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 3b 0a TlsOutputProc;.
6da0: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d .tlsChannelType-
6db0: 3e 73 65 65 6b 50 72 6f 63 09 3d 20 4e 55 4c 4c >seekProc.= NULL
6dc0: 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 ;..tlsChannelTyp
6dd0: 65 2d 3e 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 e->setOptionProc
6de0: 09 3d 20 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50 .= TlsSetOptionP
6df0: 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c roc;..tlsChannel
6e00: 54 79 70 65 2d 3e 67 65 74 4f 70 74 69 6f 6e 50 Type->getOptionP
6e10: 72 6f 63 09 3d 20 54 6c 73 47 65 74 4f 70 74 69 roc.= TlsGetOpti
6e20: 6f 6e 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e onProc;..tlsChan
6e30: 6e 65 6c 54 79 70 65 2d 3e 77 61 74 63 68 50 72 nelType->watchPr
6e40: 6f 63 09 3d 20 54 6c 73 57 61 74 63 68 50 72 6f oc.= TlsWatchPro
6e50: 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 c;..tlsChannelTy
6e60: 70 65 2d 3e 67 65 74 48 61 6e 64 6c 65 50 72 6f pe->getHandlePro
6e70: 63 09 3d 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 c.= TlsGetHandle
6e80: 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 Proc;..tlsChanne
6e90: 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 32 50 72 6f lType->close2Pro
6ea0: 63 09 3d 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 c.= TlsCloseProc
6eb0: 32 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 2;..tlsChannelTy
6ec0: 70 65 2d 3e 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f pe->blockModePro
6ed0: 63 09 3d 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 c.= TlsBlockMode
6ee0: 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 Proc;..tlsChanne
6ef0: 6c 54 79 70 65 2d 3e 66 6c 75 73 68 50 72 6f 63 lType->flushProc
6f00: 09 3d 20 4e 55 4c 4c 3b 0a 09 74 6c 73 43 68 61 .= NULL;..tlsCha
6f10: 6e 6e 65 6c 54 79 70 65 2d 3e 68 61 6e 64 6c 65 nnelType->handle
6f20: 72 50 72 6f 63 09 3d 20 54 6c 73 4e 6f 74 69 66 rProc.= TlsNotif
6f30: 79 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e yProc;..tlsChann
6f40: 65 6c 54 79 70 65 2d 3e 77 69 64 65 53 65 65 6b elType->wideSeek
6f50: 50 72 6f 63 09 3d 20 4e 55 4c 4c 3b 0a 09 74 6c Proc.= NULL;..tl
6f60: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 74 68 sChannelType->th
6f70: 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 3d readActionProc =
6f80: 20 4e 55 4c 4c 3b 0a 09 74 6c 73 43 68 61 6e 6e NULL;..tlsChann
6f90: 65 6c 54 79 70 65 2d 3e 74 72 75 6e 63 61 74 65 elType->truncate
6fa0: 50 72 6f 63 09 3d 20 4e 55 4c 4c 3b 0a 23 65 6c Proc.= NULL;.#el
6fb0: 73 65 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 se..tlsChannelTy
6fc0: 70 65 2d 3e 76 65 72 73 69 6f 6e 09 09 3d 20 54 pe->version..= T
6fd0: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 CL_CHANNEL_VERSI
6fe0: 4f 4e 5f 32 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 ON_2;..tlsChanne
6ff0: 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 50 72 6f 63 lType->closeProc
7000: 09 3d 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 3b .= TlsCloseProc;
7010: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 ..tlsChannelType
7020: 2d 3e 69 6e 70 75 74 50 72 6f 63 09 3d 20 54 6c ->inputProc.= Tl
7030: 73 49 6e 70 75 74 50 72 6f 63 3b 0a 09 74 6c 73 sInputProc;..tls
7040: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 6f 75 74 ChannelType->out
7050: 70 75 74 50 72 6f 63 09 3d 20 54 6c 73 4f 75 74 putProc.= TlsOut
7060: 70 75 74 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 putProc;..tlsCha
7070: 6e 6e 65 6c 54 79 70 65 2d 3e 73 65 65 6b 50 72 nnelType->seekPr
7080: 6f 63 09 3d 20 4e 55 4c 4c 3b 0a 09 74 6c 73 43 oc.= NULL;..tlsC
7090: 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 73 65 74 4f hannelType->setO
70a0: 70 74 69 6f 6e 50 72 6f 63 09 3d 20 54 6c 73 53 ptionProc.= TlsS
70b0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 09 74 etOptionProc;..t
70c0: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 67 lsChannelType->g
70d0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 09 3d 20 54 etOptionProc.= T
70e0: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b lsGetOptionProc;
70f0: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 ..tlsChannelType
7100: 2d 3e 77 61 74 63 68 50 72 6f 63 09 3d 20 54 6c ->watchProc.= Tl
7110: 73 57 61 74 63 68 50 72 6f 63 3b 0a 09 74 6c 73 sWatchProc;..tls
7120: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 67 65 74 ChannelType->get
7130: 48 61 6e 64 6c 65 50 72 6f 63 09 3d 20 54 6c 73 HandleProc.= Tls
7140: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 3b 0a 09 GetHandleProc;..
7150: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e tlsChannelType->
7160: 63 6c 6f 73 65 32 50 72 6f 63 09 3d 20 4e 55 4c close2Proc.= NUL
7170: 4c 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 L;..tlsChannelTy
7180: 70 65 2d 3e 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f pe->blockModePro
7190: 63 09 3d 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 c.= TlsBlockMode
71a0: 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 Proc;..tlsChanne
71b0: 6c 54 79 70 65 2d 3e 66 6c 75 73 68 50 72 6f 63 lType->flushProc
71c0: 09 3d 20 4e 55 4c 4c 3b 0a 09 74 6c 73 43 68 61 .= NULL;..tlsCha
71d0: 6e 6e 65 6c 54 79 70 65 2d 3e 68 61 6e 64 6c 65 nnelType->handle
71e0: 72 50 72 6f 63 09 3d 20 54 6c 73 4e 6f 74 69 66 rProc.= TlsNotif
71f0: 79 50 72 6f 63 3b 0a 23 65 6e 64 69 66 0a 20 20 yProc;.#endif.
7200: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28 74 }. return(t
7210: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 29 3b 0a lsChannelType);.
7220: 7d 0a }.