Hex Artifact Content

Artifact 8569dadd68802cfb25d7af9a7e2dfedd4870a1a2:


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