Hex Artifact Content

Artifact 0145d832d0ce025a75f6a129cfed3779aa79c40a:


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 37 2e 32 2e 32 20 32 30 30  .c,v 1.7.2.2 200
0090: 30 2f 30 37 2f 31 32 20 30 31 3a 35 34 3a 32 36  0/07/12 01:54:26
00a0: 20 68 6f 62 62 73 20 45 78 70 20 24 0a 20 2a 0a   hobbs Exp $. *.
00b0: 20 2a 20 54 4c 53 20 28 61 6b 61 20 53 53 4c 29   * TLS (aka SSL)
00c0: 20 43 68 61 6e 6e 65 6c 20 2d 20 63 61 6e 20 62   Channel - can b
00d0: 65 20 6c 61 79 65 72 65 64 20 6f 6e 20 61 6e 79  e layered on any
00e0: 20 62 69 2d 64 69 72 65 63 74 69 6f 6e 61 6c 0a   bi-directional.
00f0: 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 28   * Tcl_Channel (
0100: 4e 6f 74 65 3a 20 52 65 71 75 69 72 65 73 20 54  Note: Requires T
0110: 72 66 20 43 6f 72 65 20 50 61 74 63 68 29 0a 20  rf Core Patch). 
0120: 2a 0a 20 2a 20 54 68 69 73 20 77 61 73 20 62 75  *. * This was bu
0130: 69 6c 74 20 66 72 6f 6d 20 73 63 72 61 74 63 68  ilt from scratch
0140: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
0150: 72 76 61 74 69 6f 6e 20 6f 66 20 4f 70 65 6e 53  rvation of OpenS
0160: 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a 20 2a 20  SL 0.9.2B. *. * 
0170: 41 64 64 69 74 69 6f 6e 20 63 72 65 64 69 74 20  Addition credit 
0180: 69 73 20 64 75 65 20 66 6f 72 20 41 6e 64 72 65  is due for Andre
0190: 61 73 20 4b 75 70 72 69 65 73 20 28 61 2e 6b 75  as Kupries (a.ku
01a0: 70 72 69 65 73 40 77 65 73 74 65 6e 64 2e 63 6f  pries@westend.co
01b0: 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 69  m), for. * provi
01c0: 64 69 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 70  ding the Tcl_Rep
01d0: 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 68  laceChannel mech
01e0: 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 6e  anism and workin
01f0: 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 6d  g closely with m
0200: 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 20  e. * to enhance 
0210: 69 74 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75  it to support fu
0220: 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 73 65 6d  ll fileevent sem
0230: 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c  antics.. *. * Al
0240: 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 20  so work done by 
0250: 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c  the follow peopl
0260: 65 20 70 72 6f 76 69 64 65 64 20 74 68 65 20 69  e provided the i
0270: 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 74 68 69  mpetus to do thi
0280: 73 20 22 72 69 67 68 74 22 3a 0a 20 2a 09 74 63  s "right":. *.tc
0290: 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d 63 43 6f  lSSL (Colin McCo
02a0: 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 20 54 65  rmack, Shared Te
02b0: 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 53 53 4c  chnology). *.SSL
02c0: 74 63 6c 20 28 50 65 74 65 72 20 41 6e 74 6d 61  tcl (Peter Antma
02d0: 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c  n). *. */..#incl
02e0: 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 0a  ude "tlsInt.h"..
02f0: 2f 2a 0a 20 2a 20 45 78 74 65 72 6e 61 6c 20 66  /*. * External f
0300: 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a  unctions. */../*
0310: 0a 20 2a 20 4c 6f 63 61 6c 20 44 65 66 69 6e 65  . * Local Define
0320: 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72  s. */../*. * For
0330: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
0340: 73 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  s. */..static in
0350: 74 09 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72  t.TlsBlockModePr
0360: 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28  oc _ANSI_ARGS_((
0370: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
0380: 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 6e 74 20  nceData,....int 
0390: 6d 6f 64 65 29 29 3b 0a 73 74 61 74 69 63 20 69  mode));.static i
03a0: 6e 74 09 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20  nt.TlsCloseProc 
03b0: 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c  _ANSI_ARGS_ ((Cl
03c0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
03d0: 65 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e  eData,....Tcl_In
03e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 29 3b 0a  terp *interp));.
03f0: 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 49 6e  static int.TlsIn
0400: 70 75 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52  putProc _ANSI_AR
0410: 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20  GS_((ClientData 
0420: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09  instanceData,...
0430: 09 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20  .char *buf, int 
0440: 62 75 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 72  bufSize, int *er
0450: 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 73 74  rorCodePtr));.st
0460: 61 74 69 63 20 69 6e 74 09 54 6c 73 4f 75 74 70  atic int.TlsOutp
0470: 75 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47  utProc _ANSI_ARG
0480: 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69  S_((ClientData i
0490: 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09  nstanceData,....
04a0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74  char *buf, int t
04b0: 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72  oWrite, int *err
04c0: 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 73 74 61  orCodePtr));.sta
04d0: 74 69 63 20 69 6e 74 09 54 6c 73 47 65 74 4f 70  tic int.TlsGetOp
04e0: 74 69 6f 6e 50 72 6f 63 20 5f 41 4e 53 49 5f 41  tionProc _ANSI_A
04f0: 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74  RGS_ ((ClientDat
0500: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a  a instanceData,.
0510: 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ...Tcl_Interp *i
0520: 6e 74 65 72 70 2c 20 63 68 61 72 20 2a 6f 70 74  nterp, char *opt
0530: 69 6f 6e 4e 61 6d 65 2c 0a 09 09 09 54 63 6c 5f  ionName,....Tcl_
0540: 44 53 74 72 69 6e 67 20 2a 64 73 50 74 72 29 29  DString *dsPtr))
0550: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 54 6c  ;.static void.Tl
0560: 73 57 61 74 63 68 50 72 6f 63 20 5f 41 4e 53 49  sWatchProc _ANSI
0570: 5f 41 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 61  _ARGS_((ClientDa
0580: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
0590: 20 69 6e 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61   int mask));.sta
05a0: 74 69 63 20 69 6e 74 09 54 6c 73 47 65 74 48 61  tic int.TlsGetHa
05b0: 6e 64 6c 65 50 72 6f 63 20 5f 41 4e 53 49 5f 41  ndleProc _ANSI_A
05c0: 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74  RGS_ ((ClientDat
05d0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a  a instanceData,.
05e0: 09 09 09 69 6e 74 20 64 69 72 65 63 74 69 6f 6e  ...int direction
05f0: 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61  , ClientData *ha
0600: 6e 64 6c 65 50 74 72 29 29 3b 0a 73 74 61 74 69  ndlePtr));.stati
0610: 63 20 69 6e 74 09 54 6c 73 4e 6f 74 69 66 79 50  c int.TlsNotifyP
0620: 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20  roc _ANSI_ARGS_ 
0630: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  ((ClientData ins
0640: 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 6e  tanceData,....in
0650: 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63  t mask));.static
0660: 20 76 6f 69 64 09 54 6c 73 43 68 61 6e 6e 65 6c   void.TlsChannel
0670: 48 61 6e 64 6c 65 72 20 5f 41 4e 53 49 5f 41 52  Handler _ANSI_AR
0680: 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61  GS_ ((ClientData
0690: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09   clientData,....
06a0: 69 6e 74 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74  int mask));.stat
06b0: 69 63 20 76 6f 69 64 09 54 6c 73 43 68 61 6e 6e  ic void.TlsChann
06c0: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20 5f  elHandlerTimer _
06d0: 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69  ANSI_ARGS_ ((Cli
06e0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
06f0: 74 61 29 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 69  ta));../*. * Thi
0700: 73 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63  s structure desc
0710: 72 69 62 65 73 20 74 68 65 20 63 68 61 6e 6e 65  ribes the channe
0720: 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72 65  l type structure
0730: 20 66 6f 72 20 54 43 50 20 73 6f 63 6b 65 74 0a   for TCP socket.
0740: 20 2a 20 62 61 73 65 64 20 49 4f 3a 0a 20 2a 2f   * based IO:. */
0750: 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 48 41 4e  .#ifdef TCL_CHAN
0760: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 73 74  NEL_VERSION_2.st
0770: 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  atic Tcl_Channel
0780: 54 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54  Type tlsChannelT
0790: 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 74 6c 73  ype = {.    "tls
07a0: 22 2c 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65  ",../* Type name
07b0: 2e 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41  . */.    TCL_CHA
07c0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 09  NNEL_VERSION_2,.
07d0: 2f 2a 20 41 20 4e 47 20 63 68 61 6e 6e 65 6c 20  /* A NG channel 
07e0: 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 50  */.    TlsCloseP
07f0: 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70  roc,../* Close p
0800: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 49  roc. */.    TlsI
0810: 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e  nputProc,../* In
0820: 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20  put proc. */.   
0830: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2c 09   TlsOutputProc,.
0840: 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 2e  ./* Output proc.
0850: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f   */.    NULL,../
0860: 2a 20 53 65 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a  * Seek proc. */.
0870: 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65      NULL,../* Se
0880: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a  t option proc. *
0890: 2f 0a 20 20 20 20 54 6c 73 47 65 74 4f 70 74 69  /.    TlsGetOpti
08a0: 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f  onProc,./* Get o
08b0: 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20  ption proc. */. 
08c0: 20 20 20 54 6c 73 57 61 74 63 68 50 72 6f 63 2c     TlsWatchProc,
08d0: 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
08e0: 6e 6f 74 69 66 69 65 72 2e 20 2a 2f 0a 20 20 20  notifier. */.   
08f0: 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f   TlsGetHandlePro
0900: 63 2c 09 2f 2a 20 47 65 74 20 66 69 6c 65 20 68  c,./* Get file h
0910: 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 63 68 61  andle out of cha
0920: 6e 6e 65 6c 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c  nnel. */.    NUL
0930: 4c 2c 09 09 2f 2a 20 43 6c 6f 73 65 32 50 72 6f  L,../* Close2Pro
0940: 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 42 6c 6f  c. */.    TlsBlo
0950: 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53  ckModeProc,./* S
0960: 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62  et blocking/nonb
0970: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a  locking mode.*/.
0980: 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 46 6c      NULL,../* Fl
0990: 75 73 68 50 72 6f 63 2e 20 2a 2f 0a 20 20 20 20  ushProc. */.    
09a0: 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 2c 09 2f  TlsNotifyProc,./
09b0: 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63 2e 20 2a  * handlerProc. *
09c0: 2f 0a 7d 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69  /.};.#else.stati
09d0: 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70  c Tcl_ChannelTyp
09e0: 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  e tlsChannelType
09f0: 20 3d 20 7b 0a 20 20 20 20 22 74 6c 73 22 2c 09   = {.    "tls",.
0a00: 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a  ./* Type name. *
0a10: 2f 0a 20 20 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f  /.    TlsBlockMo
0a20: 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 62  deProc,./* Set b
0a30: 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b  locking/nonblock
0a40: 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20  ing mode.*/.    
0a50: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f  TlsCloseProc,../
0a60: 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a 2f  * Close proc. */
0a70: 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 50 72 6f  .    TlsInputPro
0a80: 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f  c,../* Input pro
0a90: 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4f 75 74  c. */.    TlsOut
0aa0: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74  putProc,../* Out
0ab0: 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20  put proc. */.   
0ac0: 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b 20   NULL,../* Seek 
0ad0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c  proc. */.    NUL
0ae0: 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f  L,../* Set optio
0af0: 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54  n proc. */.    T
0b00: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c  lsGetOptionProc,
0b10: 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70  ./* Get option p
0b20: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 57  roc. */.    TlsW
0b30: 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e  atchProc,../* In
0b40: 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65  itialize notifie
0b50: 72 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74  r. */.    TlsGet
0b60: 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47  HandleProc,./* G
0b70: 65 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f  et file handle o
0b80: 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a  ut of channel. *
0b90: 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 54 63 6c  /.};.#endif..Tcl
0ba0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 54 6c  _ChannelType *Tl
0bb0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 0a  s_ChannelType().
0bc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 74 6c  {.    return &tl
0bd0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d 0a  sChannelType;.}.
0be0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0c30: 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f   TlsBlockModePro
0c40: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
0c50: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
0c60: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  oked by the gene
0c70: 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20  ric IO level. * 
0c80: 20 20 20 20 20 20 74 6f 20 73 65 74 20 62 6c 6f        to set blo
0c90: 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f  cking and nonblo
0ca0: 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 20 2a 20 52  cking modes. * R
0cb0: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20  esults:. *.0 if 
0cc0: 73 75 63 63 65 73 73 66 75 6c 2c 20 65 72 72 6e  successful, errn
0cd0: 6f 20 77 68 65 6e 20 66 61 69 6c 65 64 2e 0a 20  o when failed.. 
0ce0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0cf0: 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64  s:. *.Sets the d
0d00: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b  evice into block
0d10: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69  ing or nonblocki
0d20: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d  ng mode.. *. *--
0d30: 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
0d80: 74 0a 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72  t.TlsBlockModePr
0d90: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  oc(ClientData in
0da0: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53  stanceData,./* S
0db0: 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a  ocket state. */.
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 20 69 6e 74 20 6d 6f 64 65 29 09 09 09 2f 2a 20   int mode).../* 
0de0: 54 68 65 20 6d 6f 64 65 20 74 6f 20 73 65 74 2e  The mode to set.
0df0: 20 43 61 6e 20 62 65 20 6f 6e 65 20 6f 66 0a 09   Can be one of..
0e00: 09 09 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 5f  .....* TCL_MODE_
0e10: 42 4c 4f 43 4b 49 4e 47 20 6f 72 0a 09 09 09 09  BLOCKING or.....
0e20: 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e  ..* TCL_MODE_NON
0e30: 42 4c 4f 43 4b 49 4e 47 2e 20 2a 2f 0a 7b 0a 20  BLOCKING. */.{. 
0e40: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
0e50: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69  tr = (State *) i
0e60: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
0e70: 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43    if (mode == TC
0e80: 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49  L_MODE_NONBLOCKI
0e90: 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  NG) {..statePtr-
0ea0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
0eb0: 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65  L_ASYNC;.    } e
0ec0: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  lse {..statePtr-
0ed0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
0ee0: 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20  TCL_ASYNC);.    
0ef0: 7d 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 48 41  }.#ifdef TCL_CHA
0f00: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 20  NNEL_VERSION_2. 
0f10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c     return 0;.#el
0f20: 73 65 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63  se.    return Tc
0f30: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
0f40: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  on(statePtr->int
0f50: 65 72 70 2c 20 54 6c 73 5f 47 65 74 50 61 72 65  erp, Tls_GetPare
0f60: 6e 74 28 73 74 61 74 65 50 74 72 29 2c 0a 09 09  nt(statePtr),...
0f70: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 28 6d 6f  "-blocking", (mo
0f80: 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e  de == TCL_MODE_N
0f90: 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 3f 20 22 30  ONBLOCKING) ? "0
0fa0: 22 20 3a 20 22 31 22 29 3b 0a 23 65 6e 64 69 66  " : "1");.#endif
0fb0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
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 0a 20 2a  -------------. *
1000: 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63  . * TlsCloseProc
1010: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
1020: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
1030: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  ked by the gener
1040: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70  ic IO level to p
1050: 65 72 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65  erform. *.channe
1060: 6c 2d 74 79 70 65 2d 73 70 65 63 69 66 69 63 20  l-type-specific 
1070: 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 61 20 53  cleanup when a S
1080: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
1090: 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c  channel. *.is cl
10a0: 6f 73 65 64 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65  osed.. *. *.Note
10b0: 3a 20 77 65 20 6c 65 61 76 65 20 74 68 65 20 75  : we leave the u
10c0: 6e 64 65 72 6c 79 69 6e 67 20 73 6f 63 6b 65 74  nderlying socket
10d0: 20 61 6c 6f 6e 65 2c 20 69 73 20 74 68 69 73 20   alone, is this 
10e0: 72 69 67 68 74 3f 0a 20 2a 0a 20 2a 20 52 65 73  right?. *. * Res
10f0: 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75  ults:. *.0 if su
1100: 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 76 61  ccessful, the va
1110: 6c 75 65 20 6f 66 20 54 63 6c 5f 47 65 74 45 72  lue of Tcl_GetEr
1120: 72 6e 6f 28 29 20 69 66 20 66 61 69 6c 65 64 2e  rno() if failed.
1130: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
1140: 63 74 73 3a 0a 20 2a 09 43 6c 6f 73 65 73 20 74  cts:. *.Closes t
1150: 68 65 20 73 6f 63 6b 65 74 20 6f 66 20 74 68 65  he socket of the
1160: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
1170: 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
11c0: 74 0a 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 43  t.TlsCloseProc(C
11d0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
11e0: 63 65 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 73  ceData,./* The s
11f0: 6f 63 6b 65 74 20 74 6f 20 63 6c 6f 73 65 2e 20  ocket to close. 
1200: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1210: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1220: 72 70 29 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72  rp)./* For error
1230: 20 72 65 70 6f 72 74 69 6e 67 20 2d 20 75 6e 75   reporting - unu
1240: 73 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74  sed. */.{.    St
1250: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
1260: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e  (State *) instan
1270: 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ceData;..    dpr
1280: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e 54  intf(stderr,"\nT
1290: 6c 73 43 6c 6f 73 65 50 72 6f 63 28 30 78 25 78  lsCloseProc(0x%x
12a0: 29 22 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  )", statePtr);..
12b0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65      /*.     * Re
12c0: 6d 6f 76 65 20 65 76 65 6e 74 20 68 61 6e 64 6c  move event handl
12d0: 65 72 20 74 6f 20 75 6e 64 65 72 6c 79 69 6e 67  er to underlying
12e0: 20 63 68 61 6e 6e 65 6c 2c 20 74 68 69 73 20 63   channel, this c
12f0: 6f 75 6c 64 0a 20 20 20 20 20 2a 20 62 65 20 62  ould.     * be b
1300: 65 63 61 75 73 65 20 77 65 20 61 72 65 20 63 6c  ecause we are cl
1310: 6f 73 69 6e 67 20 66 6f 72 20 72 65 61 6c 2c 20  osing for real, 
1320: 6f 72 20 62 65 69 6e 67 20 22 75 6e 73 74 61 63  or being "unstac
1330: 6b 65 64 22 2e 0a 20 20 20 20 20 2a 2f 0a 23 69  ked"..     */.#i
1340: 66 6e 64 65 66 20 54 43 4c 5f 43 48 41 4e 4e 45  fndef TCL_CHANNE
1350: 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 20 20 20 20  L_VERSION_2.    
1360: 54 63 6c 5f 44 65 6c 65 74 65 43 68 61 6e 6e 65  Tcl_DeleteChanne
1370: 6c 48 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 74  lHandler(Tls_Get
1380: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29  Parent(statePtr)
1390: 2c 0a 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e  ,..TlsChannelHan
13a0: 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74  dler, (ClientDat
13b0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 23 65  a) statePtr);.#e
13c0: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 73 74 61  ndif.    if (sta
13d0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
13e0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
13f0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
1400: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 20  eteTimerHandler 
1410: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
1420: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
1430: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72  mer = (Tcl_Timer
1440: 54 6f 6b 65 6e 29 4e 55 4c 4c 3b 0a 20 20 20 20  Token)NULL;.    
1450: 7d 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e  }..    Tls_Clean
1460: 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  (statePtr);.    
1470: 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72  Tcl_EventuallyFr
1480: 65 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29  ee( (ClientData)
1490: 73 74 61 74 65 50 74 72 2c 20 54 6c 73 5f 46 72  statePtr, Tls_Fr
14a0: 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ee);.    return 
14b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
14c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 49 6e  ----. *. * TlsIn
1510: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  putProc --. *. *
1520: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
1530: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
1540: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76  e generic IO lev
1550: 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 72  el. *       to r
1560: 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61  ead input from a
1570: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
1580: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  d channel.. *. *
1590: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65   Results:. *.The
15a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
15b0: 20 72 65 61 64 20 69 73 20 72 65 74 75 72 6e 65   read is returne
15c0: 64 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72  d or -1 on error
15d0: 2e 20 41 6e 20 6f 75 74 70 75 74 0a 20 2a 09 61  . An output. *.a
15e0: 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
15f0: 20 74 68 65 20 50 4f 53 49 58 20 65 72 72 6f 72   the POSIX error
1600: 20 63 6f 64 65 20 6f 6e 20 65 72 72 6f 72 2c 20   code on error, 
1610: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a 20 2a  or zero if no. *
1620: 09 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2e  .error occurred.
1630: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
1640: 63 74 73 3a 0a 20 2a 09 52 65 61 64 73 20 69 6e  cts:. *.Reads in
1650: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  put from the inp
1660: 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 68 65  ut device of the
1670: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
16d0: 6e 74 0a 54 6c 73 49 6e 70 75 74 50 72 6f 63 28  nt.TlsInputProc(
16e0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
16f0: 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b  nceData,./* Sock
1700: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20  et state. */.   
1710: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1720: 62 75 66 2c 09 09 09 2f 2a 20 57 68 65 72 65 20  buf,.../* Where 
1730: 74 6f 20 73 74 6f 72 65 20 64 61 74 61 20 72 65  to store data re
1740: 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ad. */.         
1750: 20 20 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c      int bufSize,
1760: 09 09 2f 2a 20 48 6f 77 20 6d 75 63 68 20 73 70  ../* How much sp
1770: 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
1780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 20 20 2a 20 69 6e 20 74            * in t
17b0: 68 65 20 62 75 66 66 65 72 3f 20 2a 2f 0a 20 20  he buffer? */.  
17c0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a             int *
17d0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 09 2f  errorCodePtr)../
17e0: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65  * Where to store
17f0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a   error code. */.
1800: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
1810: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
1820: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
1830: 20 20 20 20 69 6e 74 20 62 79 74 65 73 52 65 61      int bytesRea
1840: 64 3b 09 09 09 2f 2a 20 48 6f 77 20 6d 61 6e 79  d;.../* How many
1850: 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
1860: 3f 20 2a 2f 0a 0a 20 20 20 20 2a 65 72 72 6f 72  ? */..    *error
1870: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20  CodePtr = 0;..  
1880: 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72    dprintf(stderr
1890: 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 28 25 64 29  ,"\nBIO_read(%d)
18a0: 22 2c 20 62 75 66 53 69 7a 65 29 3b 0a 0a 20 20  ", bufSize);..  
18b0: 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e    if (!SSL_is_in
18c0: 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74  it_finished(stat
18d0: 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 62  ePtr->ssl)) {..b
18e0: 79 74 65 73 52 65 61 64 20 3d 20 54 6c 73 5f 57  ytesRead = Tls_W
18f0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
1900: 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64  atePtr, errorCod
1910: 65 50 74 72 29 3b 0a 09 69 66 20 28 62 79 74 65  ePtr);..if (byte
1920: 73 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 20  sRead <= 0) {.. 
1930: 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a 09     goto input;..
1940: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
1950: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
1960: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20  & TLS_TCL_INIT) 
1970: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  {..statePtr->fla
1980: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
1990: 49 4e 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20  INIT);.    }.   
19a0: 20 62 79 74 65 73 52 65 61 64 20 3d 20 42 49 4f   bytesRead = BIO
19b0: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e  _read(statePtr->
19c0: 62 69 6f 2c 20 62 75 66 2c 20 62 75 66 53 69 7a  bio, buf, bufSiz
19d0: 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  e);.    dprintf(
19e0: 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 72 65  stderr,"\nBIO_re
19f0: 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73  ad -> %d", bytes
1a00: 52 65 61 64 29 3b 0a 0a 20 20 20 20 69 66 20 28  Read);..    if (
1a10: 62 79 74 65 73 52 65 61 64 20 3c 20 30 29 20 7b  bytesRead < 0) {
1a20: 0a 09 69 6e 74 20 65 72 72 20 3d 20 53 53 4c 5f  ..int err = SSL_
1a30: 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50  get_error(stateP
1a40: 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65  tr->ssl, bytesRe
1a50: 61 64 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 3d  ad);...if (err =
1a60: 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 29  = SSL_ERROR_SSL)
1a70: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f   {..    Tls_Erro
1a80: 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f  r(statePtr, SSL_
1a90: 45 52 52 4f 52 28 73 74 61 74 65 50 74 72 2d 3e  ERROR(statePtr->
1aa0: 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 29 29  ssl, bytesRead))
1ab0: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
1ac0: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
1ad0: 54 45 44 3b 0a 09 20 20 20 20 67 6f 74 6f 20 69  TED;..    goto i
1ae0: 6e 70 75 74 3b 0a 09 7d 20 65 6c 73 65 20 69 66  nput;..} else if
1af0: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74   (BIO_should_ret
1b00: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ry(statePtr->bio
1b10: 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  )) {..    dprint
1b20: 66 28 73 74 64 65 72 72 2c 22 52 45 21 20 22 29  f(stderr,"RE! ")
1b30: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
1b40: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09  ePtr = EAGAIN;..
1b50: 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a      goto input;.
1b60: 09 7d 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 45  .}..if (Tcl_GetE
1b70: 72 72 6e 6f 28 29 20 3d 3d 20 45 43 4f 4e 4e 52  rrno() == ECONNR
1b80: 45 53 45 54 29 20 7b 0a 09 20 20 20 20 2f 2a 20  ESET) {..    /* 
1b90: 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 20 20 20  Soft EOF */..   
1ba0: 20 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a   bytesRead = 0;.
1bb0: 09 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b  .    goto input;
1bc0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
1bd0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1be0: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a  Tcl_GetErrno();.
1bf0: 09 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b  .    goto input;
1c00: 0a 09 7d 0a 20 20 20 20 7d 0a 69 6e 70 75 74 3a  ..}.    }.input:
1c10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64  .    dprintf(std
1c20: 65 72 72 2c 20 22 5c 6e 49 6e 70 75 74 28 25 64  err, "\nInput(%d
1c30: 29 20 2d 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62  ) -> %d [%d]", b
1c40: 75 66 53 69 7a 65 2c 20 62 79 74 65 73 52 65 61  ufSize, bytesRea
1c50: 64 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  d, *errorCodePtr
1c60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 79  );.    return by
1c70: 74 65 73 52 65 61 64 3b 0a 7d 0a 0c 0a 2f 2a 0a  tesRead;.}.../*.
1c80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f  -----. *. * TlsO
1cd0: 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a  utputProc --. *.
1ce0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
1cf0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  e is invoked by 
1d00: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
1d10: 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f  evel. *       to
1d20: 20 77 72 69 74 65 20 6f 75 74 70 75 74 20 74 6f   write output to
1d30: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
1d40: 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  sed channel.. *.
1d50: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
1d60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1d70: 65 73 20 77 72 69 74 74 65 6e 20 69 73 20 72 65  es written is re
1d80: 74 75 72 6e 65 64 2e 20 41 6e 20 6f 75 74 70 75  turned. An outpu
1d90: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 2a  t argument is. *
1da0: 09 73 65 74 20 74 6f 20 61 20 50 4f 53 49 58 20  .set to a POSIX 
1db0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
1dc0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
1dd0: 20 6f 72 20 7a 65 72 6f 2e 0a 20 2a 0a 20 2a 20   or zero.. *. * 
1de0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
1df0: 09 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 6f  .Writes output o
1e00: 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 65 76  n the output dev
1e10: 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e  ice of the chann
1e20: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
1e70: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73  ..static int.Tls
1e80: 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e  OutputProc(Clien
1e90: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
1ea0: 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74  ta,./* Socket st
1eb0: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
1ec0: 20 20 20 20 20 20 63 68 61 72 20 2a 62 75 66 2c        char *buf,
1ed0: 09 09 09 2f 2a 20 54 68 65 20 64 61 74 61 20 62  .../* The data b
1ee0: 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  uffer. */.      
1ef0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 57 72          int toWr
1f00: 69 74 65 2c 09 09 2f 2a 20 48 6f 77 20 6d 61 6e  ite,../* How man
1f10: 79 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  y bytes to write
1f20: 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ? */.           
1f30: 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64     int *errorCod
1f40: 65 50 74 72 29 09 2f 2a 20 57 68 65 72 65 20 74  ePtr)./* Where t
1f50: 6f 20 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f  o store error co
1f60: 64 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61  de. */.{.    Sta
1f70: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1f80: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
1f90: 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77  eData;.    int w
1fa0: 72 69 74 74 65 6e 2c 20 65 72 72 3b 0a 0a 20 20  ritten, err;..  
1fb0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
1fc0: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
1fd0: 66 28 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f  f(stderr,"\nBIO_
1fe0: 77 72 69 74 65 28 25 64 29 22 2c 20 74 6f 57 72  write(%d)", toWr
1ff0: 69 74 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 21  ite);..    if (!
2000: 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69  SSL_is_init_fini
2010: 73 68 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73  shed(statePtr->s
2020: 73 6c 29 29 20 7b 0a 09 77 72 69 74 74 65 6e 20  sl)) {..written 
2030: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  = Tls_WaitForCon
2040: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65  nect(statePtr, e
2050: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 69  rrorCodePtr);..i
2060: 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29  f (written <= 0)
2070: 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 6f 75 74   {..    goto out
2080: 70 75 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  put;..}.    }.  
2090: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
20a0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
20b0: 49 4e 49 54 29 20 7b 0a 09 73 74 61 74 65 50 74  INIT) {..statePt
20c0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c  r->flags &= ~(TL
20d0: 53 5f 54 43 4c 5f 49 4e 49 54 29 3b 0a 20 20 20  S_TCL_INIT);.   
20e0: 20 7d 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69   }.    if (toWri
20f0: 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 72 69  te == 0) {..dpri
2100: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7a 65 72  ntf(stderr, "zer
2110: 6f 2d 77 72 69 74 65 5c 6e 22 29 3b 0a 09 42 49  o-write\n");..BI
2120: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72  O_flush(statePtr
2130: 2d 3e 62 69 6f 29 3b 0a 09 77 72 69 74 74 65 6e  ->bio);..written
2140: 20 3d 20 30 3b 0a 09 67 6f 74 6f 20 6f 75 74 70   = 0;..goto outp
2150: 75 74 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ut;.    } else {
2160: 0a 09 77 72 69 74 74 65 6e 20 3d 20 42 49 4f 5f  ..written = BIO_
2170: 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e  write(statePtr->
2180: 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69 74  bio, buf, toWrit
2190: 65 29 3b 0a 09 64 70 72 69 6e 74 66 28 73 74 64  e);..dprintf(std
21a0: 65 72 72 2c 22 5c 6e 42 49 4f 5f 77 72 69 74 65  err,"\nBIO_write
21b0: 28 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 74  (%d) -> [%d]", t
21c0: 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29  oWrite, written)
21d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
21e0: 77 72 69 74 74 65 6e 20 3c 20 30 20 7c 7c 20 77  written < 0 || w
21f0: 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  ritten == 0) {..
2200: 73 77 69 74 63 68 20 28 28 65 72 72 20 3d 20 53  switch ((err = S
2210: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61  SL_get_error(sta
2220: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74  tePtr->ssl, writ
2230: 74 65 6e 29 29 29 20 7b 0a 09 63 61 73 65 20 53  ten))) {..case S
2240: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09  SL_ERROR_NONE:..
2250: 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e 20      if (written 
2260: 3c 3d 20 30 29 20 7b 0a 09 09 77 72 69 74 74 65  <= 0) {...writte
2270: 6e 20 3d 20 30 3b 0a 09 09 67 6f 74 6f 20 6f 75  n = 0;...goto ou
2280: 74 70 75 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20  tput;..    }..  
2290: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53    break;..case S
22a0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52  SL_ERROR_WANT_WR
22b0: 49 54 45 3a 0a 09 20 20 20 20 64 70 72 69 6e 74  ITE:..    dprint
22c0: 66 28 73 74 64 65 72 72 2c 22 77 72 69 74 65 20  f(stderr,"write 
22d0: 57 20 42 4c 4f 43 4b 5c 6e 22 29 3b 0a 09 20 20  W BLOCK\n");..  
22e0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53    break;..case S
22f0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45  SL_ERROR_WANT_RE
2300: 41 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66  AD:..    dprintf
2310: 28 73 74 64 65 72 72 2c 22 77 72 69 74 65 20 52  (stderr,"write R
2320: 20 42 4c 4f 43 4b 5c 6e 22 29 3b 0a 09 20 20 20   BLOCK\n");..   
2330: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53   break;..case SS
2340: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30  L_ERROR_WANT_X50
2350: 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 64  9_LOOKUP:..    d
2360: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 77  printf(stderr,"w
2370: 72 69 74 65 20 58 20 42 4c 4f 43 4b 5c 6e 22 29  rite X BLOCK\n")
2380: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
2390: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45  ase SSL_ERROR_ZE
23a0: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20  RO_RETURN:..    
23b0: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  dprintf(stderr,"
23c0: 63 6c 6f 73 65 64 5c 6e 22 29 3b 0a 09 20 20 20  closed\n");..   
23d0: 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20   written = 0;.. 
23e0: 20 20 20 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a     goto output;.
23f0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f  .case SSL_ERROR_
2400: 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2a 65  SYSCALL:..    *e
2410: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63  rrorCodePtr = Tc
2420: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 20  l_GetErrno();.. 
2430: 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72     dprintf(stder
2440: 72 2c 22 5b 25 64 5d 20 73 79 73 63 61 6c 6c 20  r,"[%d] syscall 
2450: 65 72 72 72 3a 20 25 64 5c 6e 22 2c 20 77 72 69  errr: %d\n", wri
2460: 74 74 65 6e 2c 20 54 63 6c 5f 47 65 74 45 72 72  tten, Tcl_GetErr
2470: 6e 6f 28 29 29 3b 0a 09 20 20 20 20 77 72 69 74  no());..    writ
2480: 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 67  ten = -1;..    g
2490: 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 09 63 61 73  oto output;..cas
24a0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a  e SSL_ERROR_SSL:
24b0: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28  ..    Tls_Error(
24c0: 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52  statePtr, SSL_ER
24d0: 52 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ROR(statePtr->ss
24e0: 6c 2c 20 77 72 69 74 74 65 6e 29 29 3b 0a 09 20  l, written));.. 
24f0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
2500: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b   = ECONNABORTED;
2510: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20  ..    written = 
2520: 2d 31 3b 0a 09 20 20 20 20 67 6f 74 6f 20 6f 75  -1;..    goto ou
2530: 74 70 75 74 3b 0a 09 64 65 66 61 75 6c 74 3a 0a  tput;..default:.
2540: 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64  .    dprintf(std
2550: 65 72 72 2c 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  err,"unknown err
2560: 3a 20 25 64 5c 6e 22 2c 20 65 72 72 29 3b 0a 09  : %d\n", err);..
2570: 7d 0a 20 20 20 20 7d 0a 6f 75 74 70 75 74 3a 0a  }.    }.output:.
2580: 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65      dprintf(stde
2590: 72 72 2c 20 22 5c 6e 4f 75 74 70 75 74 28 25 64  rr, "\nOutput(%d
25a0: 29 20 2d 3e 20 25 64 22 2c 20 74 6f 57 72 69 74  ) -> %d", toWrit
25b0: 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 20  e, written);.   
25c0: 20 72 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b   return written;
25d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2620: 0a 20 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e  . * TlsGetOption
2630: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f  Proc --. *. *.Co
2640: 6d 70 75 74 65 73 20 61 6e 20 6f 70 74 69 6f 6e  mputes an option
2650: 20 76 61 6c 75 65 20 66 6f 72 20 61 20 53 53 4c   value for a SSL
2660: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
2670: 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a 20 2a 09 6c  annel, or a. *.l
2680: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f  ist of all optio
2690: 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c  ns and their val
26a0: 75 65 73 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a  ues.. *. *.Note:
26b0: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61   This code is ba
26c0: 73 65 64 20 6f 6e 20 63 6f 64 65 20 63 6f 6e 74  sed on code cont
26d0: 72 69 62 75 74 65 64 20 62 79 20 4a 6f 68 6e 20  ributed by John 
26e0: 48 61 78 62 79 2e 0a 20 2a 0a 20 2a 20 52 65 73  Haxby.. *. * Res
26f0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
2700: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20  ard Tcl result. 
2710: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
2720: 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 69 6f   specified optio
2730: 6e 20 6f 72 20 61 0a 20 2a 09 6c 69 73 74 20 6f  n or a. *.list o
2740: 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e  f all options an
2750: 64 09 74 68 65 69 72 20 76 61 6c 75 65 73 20 69  d.their values i
2760: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  s returned in th
2770: 65 0a 20 2a 09 73 75 70 70 6c 69 65 64 20 44 53  e. *.supplied DS
2780: 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64  tring.. *. * Sid
2790: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
27a0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
27f0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 47  .static int.TlsG
2800: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69  etOptionProc(Cli
2810: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2820: 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20  Data,./* Socket 
2830: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  state. */.      
2840: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
2850: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
2860: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20  /* For errors - 
2870: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  can be NULL. */.
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d   char *optionNam
28a0: 65 2c 09 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,../* Name of t
28b0: 68 65 20 6f 70 74 69 6f 6e 20 74 6f 0a 20 20 20  he option to.   
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20                * 
28f0: 72 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c  retrieve the val
2900: 75 65 20 66 6f 72 2c 20 6f 72 0a 20 20 20 20 20  ue for, or.     
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 4e 55              * NU
2940: 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70  LL to get all op
2950: 74 69 6f 6e 73 20 61 6e 64 0a 20 20 20 20 20 20  tions and.      
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 20 20 20 20 20 20 2a 20 74 68 65             * the
2990: 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20  ir values. */.  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
29b0: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 74  cl_DString *dsPt
29c0: 72 29 09 20 20 20 20 20 20 20 20 20 2f 2a 20 57  r).         /* W
29d0: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68  here to store th
29e0: 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65  e computed value
29f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64     * initialized
2a30: 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b   by caller. */.{
2a40: 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 48 41 4e  .#ifdef TCL_CHAN
2a50: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 0a 20 20  NEL_VERSION_2.  
2a60: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
2a70: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e  r = (State *) in
2a80: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20  stanceData;.    
2a90: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 6e  Tcl_Channel down
2aa0: 43 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61  Chan = Tls_GetPa
2ab0: 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 3b 0a  rent(statePtr);.
2ac0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65      Tcl_DriverGe
2ad0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74  tOptionProc *get
2ae0: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20  OptionProc;..   
2af0: 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d   getOptionProc =
2b00: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f   Tcl_ChannelGetO
2b10: 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65  ptionProc(Tcl_Ge
2b20: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77  tChannelType(dow
2b30: 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 69 66 20  nChan));.    if 
2b40: 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21  (getOptionProc !
2b50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
2b60: 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f  n (*getOptionPro
2b70: 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  c)(Tcl_GetChanne
2b80: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f  lInstanceData(do
2b90: 77 6e 43 68 61 6e 29 2c 0a 09 09 69 6e 74 65 72  wnChan),...inter
2ba0: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 64  p, optionName, d
2bb0: 73 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73  sPtr);.    } els
2bc0: 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65  e if (optionName
2bd0: 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c   == (char*) NULL
2be0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75  ) {../*.. * Requ
2bf0: 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72  est is query for
2c00: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68   all options, th
2c10: 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09  is is ok... */..
2c20: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
2c30: 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20     }.    /*.    
2c40: 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 61   * Request for a
2c50: 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e   specific option
2c60: 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65   has to fail, we
2c70: 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e   don't have any.
2c80: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  .     */.    ret
2c90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
2ca0: 65 6c 73 65 0a 20 20 20 20 53 74 61 74 65 20 2a  else.    State *
2cb0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
2cc0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
2cd0: 61 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65  a;.    size_t le
2ce0: 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28  n = 0;..    if (
2cf0: 6f 70 74 69 6f 6e 4e 61 6d 65 20 21 3d 20 28 63  optionName != (c
2d00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 20  har *) NULL) {. 
2d10: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72         len = str
2d20: 6c 65 6e 28 6f 70 74 69 6f 6e 4e 61 6d 65 29 3b  len(optionName);
2d30: 0a 20 20 20 20 7d 0a 23 69 66 20 30 0a 20 20 20  .    }.#if 0.   
2d40: 20 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30 29 20   if ((len == 0) 
2d50: 7c 7c 0a 20 20 20 20 20 20 20 20 28 28 6c 65 6e  ||.        ((len
2d60: 20 3e 20 31 29 20 26 26 20 28 6f 70 74 69 6f 6e   > 1) && (option
2d70: 4e 61 6d 65 5b 31 5d 20 3d 3d 20 27 63 27 29 20  Name[1] == 'c') 
2d80: 26 26 0a 20 20 20 20 20 20 20 20 20 28 73 74 72  &&.         (str
2d90: 6e 63 6d 70 28 6f 70 74 69 6f 6e 4e 61 6d 65 2c  ncmp(optionName,
2da0: 20 22 2d 63 69 70 68 65 72 22 2c 20 6c 65 6e 29   "-cipher", len)
2db0: 20 3d 3d 20 30 29 29 29 20 7b 0a 20 20 20 20 20   == 0))) {.     
2dc0: 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29     if (len == 0)
2dd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54   {.            T
2de0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
2df0: 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 22  Element(dsPtr, "
2e00: 2d 63 69 70 68 65 72 22 29 3b 0a 20 20 20 20 20  -cipher");.     
2e10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c     }.        Tcl
2e20: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
2e30: 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 53 53 4c  ement(dsPtr, SSL
2e40: 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74  _get_cipher(stat
2e50: 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 20 20 20  ePtr->ssl));.   
2e60: 20 20 20 20 20 69 66 20 28 6c 65 6e 29 20 7b 0a       if (len) {.
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2e80: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20  rn TCL_OK;.     
2e90: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
2ea0: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  f.    return TCL
2eb0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0c 0a  _OK;.#endif.}...
2ec0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2f10: 6c 73 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20  lsWatchProc --. 
2f20: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20  *. *.Initialize 
2f30: 74 68 65 20 6e 6f 74 69 66 69 65 72 20 74 6f 20  the notifier to 
2f40: 77 61 74 63 68 20 54 63 6c 5f 46 69 6c 65 73 20  watch Tcl_Files 
2f50: 66 72 6f 6d 20 74 68 69 73 20 63 68 61 6e 6e 65  from this channe
2f60: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  l.. *. * Results
2f70: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
2f80: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2f90: 2a 09 53 65 74 73 20 75 70 20 74 68 65 20 6e 6f  *.Sets up the no
2fa0: 74 69 66 69 65 72 20 73 6f 20 74 68 61 74 20 61  tifier so that a
2fb0: 20 66 75 74 75 72 65 20 65 76 65 6e 74 20 6f 6e   future event on
2fc0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09   the channel. *.
2fd0: 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20  will be seen by 
2fe0: 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  Tcl.. *. *------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3030: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54  /..static void.T
3040: 6c 73 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65  lsWatchProc(Clie
3050: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
3060: 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b  ata,./* The sock
3070: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20  et state. */.   
3080: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61            int ma
3090: 73 6b 29 09 09 09 2f 2a 20 45 76 65 6e 74 73 20  sk).../* Events 
30a0: 6f 66 20 69 6e 74 65 72 65 73 74 3b 20 61 6e 20  of interest; an 
30b0: 4f 52 2d 65 64 0a 20 20 20 20 20 20 20 20 20 20  OR-ed.          
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
30e0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
30f0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 0a 20 20  TCL_READABLE,.  
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 20 20 20 20 2a 20 54 43 4c 5f 57 52 49         * TCL_WRI
3130: 54 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58  TABLE and TCL_EX
3140: 43 45 50 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20  CEPTION. */.{.  
3150: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
3160: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e  r = (State *) in
3170: 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 23 69 66  stanceData;..#if
3180: 64 65 66 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f  def TCL_CHANNEL_
3190: 56 45 52 53 49 4f 4e 5f 32 0a 20 20 20 20 54 63  VERSION_2.    Tc
31a0: 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64 6f  l_Channel     do
31b0: 77 6e 43 68 61 6e 3b 0a 0a 20 20 20 20 73 74 61  wnChan;..    sta
31c0: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
31d0: 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a   = mask;..    /*
31e0: 20 4e 6f 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64   No channel hand
31f0: 6c 65 72 73 20 61 6e 79 20 6d 6f 72 65 2e 20 57  lers any more. W
3200: 65 20 77 69 6c 6c 20 62 65 20 6e 6f 74 69 66 69  e will be notifi
3210: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
3220: 0a 20 20 20 20 20 2a 20 61 62 6f 75 74 20 65 76  .     * about ev
3230: 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e  ents on the chan
3240: 6e 65 6c 20 62 65 6c 6f 77 20 76 69 61 20 61 20  nel below via a 
3250: 63 61 6c 6c 20 74 6f 20 6f 75 72 0a 20 20 20 20  call to our.    
3260: 20 2a 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74   * 'TransformNot
3270: 69 66 79 50 72 6f 63 27 2e 20 42 75 74 20 77 65  ifyProc'. But we
3280: 20 68 61 76 65 20 74 6f 20 70 61 73 73 20 74 68   have to pass th
3290: 65 20 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20  e interest down 
32a0: 6e 6f 77 2e 0a 20 20 20 20 20 2a 20 57 65 20 61  now..     * We a
32b0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64  re allowed to ad
32c0: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 27 69 6e  d additional 'in
32d0: 74 65 72 65 73 74 27 20 74 6f 20 74 68 65 20 6d  terest' to the m
32e0: 61 73 6b 20 69 66 20 77 65 20 77 61 6e 74 0a 20  ask if we want. 
32f0: 20 20 20 20 2a 20 74 6f 2e 20 42 75 74 20 74 68      * to. But th
3300: 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  is transformatio
3310: 6e 20 68 61 73 20 6e 6f 20 73 75 63 68 20 69 6e  n has no such in
3320: 74 65 72 65 73 74 2e 20 49 74 20 6a 75 73 74 20  terest. It just 
3330: 70 61 73 73 65 73 0a 20 20 20 20 20 2a 20 74 68  passes.     * th
3340: 65 20 72 65 71 75 65 73 74 20 64 6f 77 6e 2c 20  e request down, 
3350: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  unchanged..     
3360: 2a 2f 0a 0a 20 20 20 20 64 6f 77 6e 43 68 61 6e  */..    downChan
3370: 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74   = Tls_GetParent
3380: 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  (statePtr);..   
3390: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
33a0: 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 0a  Type(downChan)).
33b0: 09 2d 3e 77 61 74 63 68 50 72 6f 63 28 54 63 6c  .->watchProc(Tcl
33c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
33d0: 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e  nceData(downChan
33e0: 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f  ), mask);..    /
33f0: 2a 0a 20 20 20 20 20 2a 20 4d 61 6e 61 67 65 6d  *.     * Managem
3400: 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72  ent of the inter
3410: 6e 61 6c 20 74 69 6d 65 72 2e 0a 20 20 20 20 20  nal timer..     
3420: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  */..    if (stat
3430: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
3440: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
3450: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20  NULL) {.        
3460: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
3470: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
3480: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
3490: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
34a0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
34b0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
34c0: 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41  ((mask & TCL_REA
34d0: 44 41 42 4c 45 29 20 26 26 20 54 63 6c 5f 49 6e  DABLE) && Tcl_In
34e0: 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74  putBuffered(stat
34f0: 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29  ePtr->self) > 0)
3500: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 09 20   {.        /*.. 
3510: 2a 20 54 68 65 72 65 20 69 73 20 69 6e 74 65 72  * There is inter
3520: 65 73 74 20 69 6e 20 72 65 61 64 61 62 6c 65 20  est in readable 
3530: 65 76 65 6e 74 73 20 61 6e 64 20 77 65 20 61 63  events and we ac
3540: 74 75 61 6c 6c 79 20 68 61 76 65 0a 09 20 2a 20  tually have.. * 
3550: 64 61 74 61 20 77 61 69 74 69 6e 67 2c 20 73 6f  data waiting, so
3560: 20 67 65 6e 65 72 61 74 65 20 61 20 74 69 6d 65   generate a time
3570: 72 20 74 6f 20 66 6c 75 73 68 20 74 68 61 74 2e  r to flush that.
3580: 0a 09 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  .. */..statePtr-
3590: 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65  >timer = Tcl_Cre
35a0: 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  ateTimerHandler(
35b0: 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c 0a 09  TLS_TCL_DELAY,..
35c0: 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c  .TlsChannelHandl
35d0: 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 65 6e 74  erTimer, (Client
35e0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
35f0: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
3600: 20 69 66 20 28 6d 61 73 6b 20 3d 3d 20 73 74 61   if (mask == sta
3610: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
3620: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
3630: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 77 61  if (statePtr->wa
3640: 74 63 68 4d 61 73 6b 29 20 7b 0a 09 2f 2a 0a 09  tchMask) {../*..
3650: 20 2a 20 52 65 6d 6f 76 65 20 65 76 65 6e 74 20   * Remove event 
3660: 68 61 6e 64 6c 65 72 20 74 6f 20 75 6e 64 65 72  handler to under
3670: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2c 20 74  lying channel, t
3680: 68 69 73 20 63 6f 75 6c 64 0a 09 20 2a 20 62 65  his could.. * be
3690: 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
36a0: 63 6c 6f 73 69 6e 67 20 66 6f 72 20 72 65 61 6c  closing for real
36b0: 2c 20 6f 72 20 62 65 69 6e 67 20 22 75 6e 73 74  , or being "unst
36c0: 61 63 6b 65 64 22 2e 0a 09 20 2a 2f 0a 0a 09 54  acked"... */...T
36d0: 63 6c 5f 44 65 6c 65 74 65 43 68 61 6e 6e 65 6c  cl_DeleteChannel
36e0: 48 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 74 50  Handler(Tls_GetP
36f0: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 2c  arent(statePtr),
3700: 0a 09 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e  ...TlsChannelHan
3710: 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74  dler, (ClientDat
3720: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  a) statePtr);.  
3730: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72    }.    statePtr
3740: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61  ->watchMask = ma
3750: 73 6b 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  sk;.    if (stat
3760: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29  ePtr->watchMask)
3770: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 65 74 75 70   {../*.. * Setup
3780: 20 61 63 74 69 76 65 20 6d 6f 6e 69 74 6f 72 20   active monitor 
3790: 66 6f 72 20 65 76 65 6e 74 73 20 6f 6e 20 75 6e  for events on un
37a0: 64 65 72 6c 79 69 6e 67 20 43 68 61 6e 6e 65 6c  derlying Channel
37b0: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 72 65  ... */...Tcl_Cre
37c0: 61 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  ateChannelHandle
37d0: 72 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28  r(Tls_GetParent(
37e0: 73 74 61 74 65 50 74 72 29 2c 0a 09 09 73 74 61  statePtr),...sta
37f0: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
3800: 2c 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64  , TlsChannelHand
3810: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  ler, (ClientData
3820: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
3830: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0c 0a 2f 2a   }.#endif.}.../*
3840: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
3890: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d  GetHandleProc --
38a0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72  . *. *.Called fr
38b0: 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  om Tcl_GetChanne
38c0: 6c 46 69 6c 65 20 74 6f 20 72 65 74 72 69 65 76  lFile to retriev
38d0: 65 20 6f 2f 73 20 66 69 6c 65 20 68 61 6e 64 6c  e o/s file handl
38e0: 65 72 0a 20 2a 09 66 72 6f 6d 20 74 68 65 20 53  er. *.from the S
38f0: 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
3900: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52  channel.. *. * R
3910: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61  esults:. *.The a
3920: 70 70 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46  ppropriate Tcl_F
3930: 69 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  ile or NULL if n
3940: 6f 74 20 70 72 65 73 65 6e 74 2e 20 0a 20 2a 0a  ot present. . *.
3950: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3960: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39b0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
39c0: 74 0a 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72  t.TlsGetHandlePr
39d0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  oc(ClientData in
39e0: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54  stanceData,./* T
39f0: 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 65 2e  he socket state.
3a00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
3a10: 20 20 20 20 20 69 6e 74 20 64 69 72 65 63 74 69       int directi
3a20: 6f 6e 2c 09 09 2f 2a 20 57 68 69 63 68 20 54 63  on,../* Which Tc
3a30: 6c 5f 46 69 6c 65 20 74 6f 20 72 65 74 72 69 65  l_File to retrie
3a40: 76 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ve? */.         
3a50: 20 20 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61          ClientDa
3a60: 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f  ta *handlePtr)./
3a70: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65  * Where to store
3a80: 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 20 2a 2f   the handle.  */
3a90: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
3aa0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
3ab0: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
3ac0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  ..    return Tcl
3ad0: 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c  _GetChannelHandl
3ae0: 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28  e(Tls_GetParent(
3af0: 73 74 61 74 65 50 74 72 29 2c 20 64 69 72 65 63  statePtr), direc
3b00: 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29  tion, handlePtr)
3b10: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3b60: 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72  *. * TlsNotifyPr
3b70: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64  oc --. *. *.Hand
3b80: 6c 65 72 20 63 61 6c 6c 65 64 20 62 79 20 54 63  ler called by Tc
3b90: 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f  l to inform us o
3ba0: 66 20 61 63 74 69 76 69 74 79 0a 20 2a 09 6f 6e  f activity. *.on
3bb0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
3bc0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52  channel.. *. * R
3bd0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
3be0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3bf0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 70 72 6f 63  cts:. *.May proc
3c00: 65 73 73 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67  ess the incoming
3c10: 20 65 76 65 6e 74 20 62 79 20 69 74 73 65 6c 66   event by itself
3c20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
3c70: 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 4e 6f  static int.TlsNo
3c80: 74 69 66 79 50 72 6f 63 28 69 6e 73 74 61 6e 63  tifyProc(instanc
3c90: 65 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20  eData, mask).   
3ca0: 20 43 6c 69 65 6e 74 44 61 74 61 09 20 20 20 69   ClientData.   i
3cb0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 20 2f 2a 20  nstanceData; /* 
3cc0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
3cd0: 20 6e 6f 74 69 66 69 65 64 20 74 72 61 6e 73 66   notified transf
3ce0: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
3cf0: 69 6e 74 09 09 20 20 20 6d 61 73 6b 3b 20 20 20  int..   mask;   
3d00: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 73 6b 20      /* The mask 
3d10: 6f 66 20 6f 63 63 75 72 69 6e 67 20 65 76 65 6e  of occuring even
3d20: 74 73 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74  ts */.{.    Stat
3d30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
3d40: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65  tate *) instance
3d50: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Data;..    /*.  
3d60: 20 20 20 2a 20 41 6e 20 65 76 65 6e 74 20 6f 63     * An event oc
3d70: 63 75 72 65 64 20 69 6e 20 74 68 65 20 75 6e 64  cured in the und
3d80: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e  erlying channel.
3d90: 20 20 54 68 69 73 0a 20 20 20 20 20 2a 20 74 72    This.     * tr
3da0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 64 6f 65  ansformation doe
3db0: 73 6e 27 74 20 70 72 6f 63 65 73 73 20 73 75 63  sn't process suc
3dc0: 68 20 65 76 65 6e 74 73 20 74 68 75 73 20 72 65  h events thus re
3dd0: 74 75 72 6e 73 20 74 68 65 0a 20 20 20 20 20 2a  turns the.     *
3de0: 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 6b 20 75   incoming mask u
3df0: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a  nchanged..     *
3e00: 2f 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  /..    if (state
3e10: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54  Ptr->timer != (T
3e20: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
3e30: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44  ULL) {../*.. * D
3e40: 65 6c 65 74 65 20 61 6e 20 65 78 69 73 74 69 6e  elete an existin
3e50: 67 20 74 69 6d 65 72 2e 20 49 74 20 77 61 73 20  g timer. It was 
3e60: 6e 6f 74 20 66 69 72 65 64 2c 20 79 65 74 20 77  not fired, yet w
3e70: 65 20 61 72 65 0a 09 20 2a 20 68 65 72 65 2c 20  e are.. * here, 
3e80: 73 6f 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62  so the channel b
3e90: 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 64 20 73  elow generated s
3ea0: 75 63 68 20 61 6e 20 65 76 65 6e 74 20 61 6e 64  uch an event and
3eb0: 20 77 65 0a 09 20 2a 20 64 6f 6e 27 74 20 68 61   we.. * don't ha
3ec0: 76 65 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77  ve to. The renew
3ed0: 61 6c 20 6f 66 20 74 68 65 20 69 6e 74 65 72 65  al of the intere
3ee0: 73 74 20 61 66 74 65 72 20 74 68 65 0a 09 20 2a  st after the.. *
3ef0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 68   execution of ch
3f00: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 77  annel handlers w
3f10: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
3f20: 61 75 73 65 20 75 73 20 74 6f 0a 09 20 2a 20 72  ause us to.. * r
3f30: 65 63 72 65 61 74 65 20 74 68 65 20 74 69 6d 65  ecreate the time
3f40: 72 20 28 69 6e 20 57 61 74 63 68 50 72 6f 63 29  r (in WatchProc)
3f50: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 65 6c  ... */...Tcl_Del
3f60: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
3f70: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
3f80: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
3f90: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
3fa0: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
3fb0: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61  }..    return ma
3fc0: 73 6b 3b 0a 7d 0a 0c 0a 23 69 66 6e 64 65 66 20  sk;.}...#ifndef 
3fd0: 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TCL_CHANNEL_VERS
3fe0: 49 4f 4e 5f 32 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ION_2./*. *-----
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 54 6c  -*. *. *      Tl
4030: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20  sChannelHandler 
4040: 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 20 20 2d 2d  --. *. *      --
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
4080: 20 2a 20 20 20 20 20 20 48 61 6e 64 6c 65 72 20   *      Handler 
4090: 63 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 61 73  called by Tcl as
40a0: 20 61 20 72 65 73 75 6c 74 20 6f 66 0a 20 2a 20   a result of. * 
40b0: 20 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43       Tcl_CreateC
40c0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 20  hannelHandler - 
40d0: 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20  to inform us of 
40e0: 61 63 74 69 76 69 74 79 0a 20 2a 20 20 20 20 20  activity. *     
40f0: 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69   on the underlyi
4100: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20  ng channel.. *  
4110: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20  ----*. *. *     
4150: 20 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a   Sideeffects:. *
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 61                Ma
4170: 79 20 67 65 6e 65 72 61 74 65 20 73 75 62 73 65  y generate subse
4180: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 20  quent calls to. 
4190: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  *              T
41a0: 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c  cl_NotifyChannel
41b0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 20 52 65 73  .. *. *      Res
41c0: 75 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20 20 20  ult:. *         
41d0: 20 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a       None.. *. *
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4210: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61  ------*. */..sta
4220: 74 69 63 20 76 6f 69 64 0a 54 6c 73 43 68 61 6e  tic void.TlsChan
4230: 6e 65 6c 48 61 6e 64 6c 65 72 20 28 63 6c 69 65  nelHandler (clie
4240: 6e 74 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20  ntData, mask).  
4250: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 20 20 20    ClientData    
4260: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
4270: 20 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20   int            
4280: 6d 61 73 6b 3b 0a 7b 0a 20 20 20 20 53 74 61 74  mask;.{.    Stat
4290: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
42a0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
42b0: 74 61 3b 0a 0a 64 70 72 69 6e 74 66 28 73 74 64  ta;..dprintf(std
42c0: 65 72 72 2c 20 22 48 41 4e 44 4c 45 52 28 30 78  err, "HANDLER(0x
42d0: 25 78 29 5c 6e 22 2c 20 6d 61 73 6b 29 3b 0a 20  %x)\n", mask);. 
42e0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
42f0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61   (ClientData)sta
4300: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20  tePtr);..    if 
4310: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44  (mask & TCL_READ
4320: 41 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 65 74  ABLE) {..BIO_set
4330: 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d  _flags(statePtr-
4340: 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47  >p_bio, BIO_FLAG
4350: 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 20 65  S_READ);.    } e
4360: 6c 73 65 20 7b 0a 09 42 49 4f 5f 63 6c 65 61 72  lse {..BIO_clear
4370: 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d  _flags(statePtr-
4380: 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47  >p_bio, BIO_FLAG
4390: 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 0a 0a  S_READ);.    }..
43a0: 20 20 20 20 69 66 20 28 6d 61 73 6b 20 26 20 54      if (mask & T
43b0: 43 4c 5f 57 52 49 54 41 42 4c 45 29 20 7b 0a 09  CL_WRITABLE) {..
43c0: 42 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 73 74  BIO_set_flags(st
43d0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42  atePtr->p_bio, B
43e0: 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b  IO_FLAGS_WRITE);
43f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42  .    } else {..B
4400: 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 73 28 73  IO_clear_flags(s
4410: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20  tatePtr->p_bio, 
4420: 42 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29  BIO_FLAGS_WRITE)
4430: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 73  ;.    }..    mas
4440: 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 42  k = 0;.    if (B
4450: 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74  IO_wpending(stat
4460: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d  ePtr->bio)) {..m
4470: 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41  ask |= TCL_WRITA
4480: 42 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  BLE;.    }.    i
4490: 66 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73  f (BIO_pending(s
44a0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b  tatePtr->bio)) {
44b0: 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45  ..mask |= TCL_RE
44c0: 41 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20  ADABLE;.    }.. 
44d0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65     /*.     * The
44e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 4e 6f 74 69 66   following Notif
44f0: 79 43 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 73  yChannel calls s
4500: 65 65 6d 73 20 74 6f 20 62 65 20 69 6d 70 6f 72  eems to be impor
4510: 74 61 6e 74 2c 20 62 75 74 0a 20 20 20 20 20 2a  tant, but.     *
4520: 20 77 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 77   we don't know w
4530: 68 79 2e 20 20 49 74 20 6c 6f 6f 6b 73 20 6c 69  hy.  It looks li
4540: 6b 65 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ke if the mask i
4550: 73 20 65 76 65 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  s ever non-zero.
4560: 20 20 20 20 20 2a 20 74 68 61 74 20 69 74 20 77       * that it w
4570: 69 6c 6c 20 65 6e 74 65 72 20 61 6e 20 69 6e 66  ill enter an inf
4580: 69 6e 69 74 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  inite loop..    
4590: 20 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 69 66 79   *.     * Notify
45a0: 20 74 68 65 20 75 70 70 65 72 20 63 68 61 6e 6e   the upper chann
45b0: 65 6c 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  el of the curren
45c0: 74 20 42 49 4f 20 73 74 61 74 65 20 73 6f 20 74  t BIO state so t
45d0: 68 65 20 65 76 65 6e 74 0a 20 20 20 20 20 2a 20  he event.     * 
45e0: 63 6f 6e 74 69 6e 75 65 73 20 74 6f 20 70 72 6f  continues to pro
45f0: 70 61 67 61 74 65 20 75 70 20 74 68 65 20 63 68  pagate up the ch
4600: 61 69 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  ain..     *.    
4610: 20 2a 20 73 74 61 6e 74 6f 6e 3a 20 49 74 20 6c   * stanton: It l
4620: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 20 63  ooks like this c
4630: 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 61  ould result in a
4640: 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20  n infinite loop 
4650: 69 66 0a 20 20 20 20 20 2a 20 74 68 65 20 75 70  if.     * the up
4660: 70 65 72 20 63 68 61 6e 6e 65 6c 20 64 6f 65 73  per channel does
4670: 6e 27 74 20 63 61 75 73 65 20 43 68 61 6e 6e 65  n't cause Channe
4680: 6c 48 61 6e 64 6c 65 72 20 74 6f 20 62 65 20 72  lHandler to be r
4690: 65 6d 6f 76 65 64 0a 20 20 20 20 20 2a 20 62 65  emoved.     * be
46a0: 66 6f 72 65 20 54 63 6c 5f 4e 6f 74 69 66 79 43  fore Tcl_NotifyC
46b0: 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 63 68 61  hannel calls cha
46c0: 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 6f 6e  nnel handlers on
46d0: 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e   the lower chann
46e0: 65 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  el..     */.    
46f0: 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43  .    Tcl_NotifyC
4700: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d  hannel(statePtr-
4710: 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 20 20  >self, mask);.  
4720: 20 20 0a 20 20 20 20 69 66 20 28 73 74 61 74 65    .    if (state
4730: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54  Ptr->timer != (T
4740: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55  cl_TimerToken)NU
4750: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
4760: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
4770: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
4780: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
4790: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b   = (Tcl_TimerTok
47a0: 65 6e 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  en)NULL;.    }. 
47b0: 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54     if ((mask & T
47c0: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20  CL_READABLE) && 
47d0: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65  Tcl_InputBuffere
47e0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  d(statePtr->self
47f0: 29 20 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a  ) > 0) {../*.. *
4800: 20 44 61 74 61 20 69 73 20 77 61 69 74 69 6e 67   Data is waiting
4810: 2c 20 66 6c 75 73 68 20 69 74 20 6f 75 74 20 69  , flush it out i
4820: 6e 20 73 68 6f 72 74 20 74 69 6d 65 0a 09 20 2a  n short time.. *
4830: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  /..statePtr->tim
4840: 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54  er = Tcl_CreateT
4850: 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f  imerHandler(TLS_
4860: 54 43 4c 5f 44 45 4c 41 59 2c 0a 09 09 54 6c 73  TCL_DELAY,...Tls
4870: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69  ChannelHandlerTi
4880: 6d 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  mer, (ClientData
4890: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
48a0: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
48b0: 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29  se( (ClientData)
48c0: 73 74 61 74 65 50 74 72 29 3b 0a 7d 0a 23 65 6e  statePtr);.}.#en
48d0: 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  dif.../*. *-----
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4910: 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 43 68 61 6e  -*. *. *.TlsChan
4920: 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 20  nelHandlerTimer 
4930: 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  --. *. *.-------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 43 61  ---------*. *.Ca
4970: 6c 6c 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69  lled by the noti
4980: 66 69 65 72 20 28 2d 3e 20 74 69 6d 65 72 29 20  fier (-> timer) 
4990: 74 6f 20 66 6c 75 73 68 20 6f 75 74 0a 20 2a 09  to flush out. *.
49a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 74  information wait
49b0: 69 6e 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 62  ing in channel b
49c0: 75 66 66 65 72 73 2e 0a 20 2a 09 2d 2d 2d 2d 2d  uffers.. *.-----
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
4a00: 20 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a   *.Sideeffects:.
4a10: 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 43 68   *..As of 'TlsCh
4a20: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 27 2e 0a 20  annelHandler'.. 
4a30: 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09  *. *.Result:. *.
4a40: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a80: 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  --*. */..static 
4a90: 76 6f 69 64 0a 54 6c 73 43 68 61 6e 6e 65 6c 48  void.TlsChannelH
4aa0: 61 6e 64 6c 65 72 54 69 6d 65 72 20 28 63 6c 69  andlerTimer (cli
4ab0: 65 6e 74 44 61 74 61 29 0a 43 6c 69 65 6e 74 44  entData).ClientD
4ac0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 20  ata clientData; 
4ad0: 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 61 74 69 6f  /* Transformatio
4ae0: 6e 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 7b 0a  n to query */.{.
4af0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
4b00: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
4b10: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
4b20: 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 0a 20  int mask = 0;.. 
4b30: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d     statePtr->tim
4b40: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
4b50: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20  oken) NULL;..   
4b60: 20 69 66 20 28 42 49 4f 5f 77 70 65 6e 64 69 6e   if (BIO_wpendin
4b70: 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  g(statePtr->bio)
4b80: 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c  ) {..mask |= TCL
4b90: 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d  _WRITABLE;.    }
4ba0: 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 70 65 6e  .    if (BIO_pen
4bb0: 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62  ding(statePtr->b
4bc0: 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c 3d 20  io)) {..mask |= 
4bd0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20  TCL_READABLE;.  
4be0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69    }.    Tcl_Noti
4bf0: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50  fyChannel(stateP
4c00: 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b  tr->self, mask);
4c10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c50: 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 57 61 69 74  *. *. *.Tls_Wait
4c60: 46 6f 72 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a  ForConnect --. *
4c70: 0a 20 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a  . *.Sideeffects:
4c80: 0a 20 2a 09 09 49 73 73 75 65 73 20 53 53 4c 5f  . *..Issues SSL_
4c90: 61 63 63 65 70 74 20 6f 72 20 53 53 4c 5f 63 6f  accept or SSL_co
4ca0: 6e 6e 65 63 74 0a 20 2a 0a 20 2a 09 52 65 73 75  nnect. *. *.Resu
4cb0: 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a  lt:. *..None.. *
4cc0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 69  ---------*. */.i
4d00: 6e 74 0a 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  nt.Tls_WaitForCo
4d10: 6e 6e 65 63 74 28 20 73 74 61 74 65 50 74 72 2c  nnect( statePtr,
4d20: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 29 0a 20   errorCodePtr). 
4d30: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
4d40: 74 72 3b 0a 20 20 20 20 69 6e 74 20 2a 65 72 72  tr;.    int *err
4d50: 6f 72 43 6f 64 65 50 74 72 3b 09 09 2f 2a 20 57  orCodePtr;../* W
4d60: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 65 72  here to store er
4d70: 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 7b 0a 20  ror code. */.{. 
4d80: 20 20 20 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20     int err;..   
4d90: 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   dprintf(stderr,
4da0: 22 5c 6e 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  "\nWaitForConnec
4db0: 74 28 30 78 25 78 29 22 2c 20 73 74 61 74 65 50  t(0x%x)", stateP
4dc0: 74 72 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 3b  tr);..    for (;
4dd0: 3b 29 20 7b 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69  ;) {../* Not ini
4de0: 74 69 61 6c 69 7a 65 64 20 79 65 74 21 20 2a 2f  tialized yet! */
4df0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
4e00: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
4e10: 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 65  SERVER) {..    e
4e20: 72 72 20 3d 20 53 53 4c 5f 61 63 63 65 70 74 28  rr = SSL_accept(
4e30: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
4e40: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 65  .} else {..    e
4e50: 72 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65 63 74  rr = SSL_connect
4e60: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
4e70: 0a 09 7d 0a 09 2f 2a 53 53 4c 5f 77 72 69 74 65  ..}../*SSL_write
4e80: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
4e90: 28 63 68 61 72 2a 29 26 65 72 72 2c 20 30 29 3b  (char*)&err, 0);
4ea0: 09 48 41 43 4b 21 21 21 20 2a 2f 0a 09 69 66 20  .HACK!!! */..if 
4eb0: 28 65 72 72 20 3e 20 30 29 0a 09 20 20 20 20 42  (err > 0)..    B
4ec0: 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74  IO_flush(statePt
4ed0: 72 2d 3e 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65  r->bio);...if (e
4ee0: 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  rr <= 0) {..    
4ef0: 69 6e 74 20 72 63 20 3d 20 53 53 4c 5f 67 65 74  int rc = SSL_get
4f00: 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d  _error(statePtr-
4f10: 3e 73 73 6c 2c 20 65 72 72 29 3b 0a 0a 09 20 20  >ssl, err);...  
4f20: 20 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f    if (rc == SSL_
4f30: 45 52 52 4f 52 5f 53 53 4c 29 20 7b 0a 09 09 54  ERROR_SSL) {...T
4f40: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
4f50: 72 2c 20 28 63 68 61 72 2a 29 45 52 52 5f 72 65  r, (char*)ERR_re
4f60: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
4f70: 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28  g(ERR_get_error(
4f80: 29 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64  )));...*errorCod
4f90: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
4fa0: 54 45 44 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31  TED;...return -1
4fb0: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
4fc0: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74   (BIO_should_ret
4fd0: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ry(statePtr->bio
4fe0: 29 29 20 7b 0a 09 09 69 66 20 28 73 74 61 74 65  )) {...if (state
4ff0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
5000: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09  _TCL_ASYNC) {...
5010: 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65      dprintf(stde
5020: 72 72 2c 22 45 21 20 22 29 3b 0a 09 09 20 20 20  rr,"E! ");...   
5030: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
5040: 20 45 41 47 41 49 4e 3b 0a 09 09 20 20 20 20 72   EAGAIN;...    r
5050: 65 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 20 65 6c  eturn -1;...} el
5060: 73 65 20 7b 0a 09 09 20 20 20 20 63 6f 6e 74 69  se {...    conti
5070: 6e 75 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20  nue;...}..    } 
5080: 65 6c 73 65 20 69 66 20 28 65 72 72 20 3d 3d 20  else if (err == 
5090: 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 73  0) {...dprintf(s
50a0: 74 64 65 72 72 2c 22 43 52 21 20 22 29 3b 0a 09  tderr,"CR! ");..
50b0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
50c0: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 72   ECONNRESET;...r
50d0: 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d  eturn -1;..    }
50e0: 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
50f0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
5100: 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 09  TCL_SERVER) {...
5110: 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65  err = SSL_get_ve
5120: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
5130: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 09 69 66  ePtr->ssl);...if
5140: 20 28 65 72 72 20 21 3d 20 58 35 30 39 5f 56 5f   (err != X509_V_
5150: 4f 4b 29 20 7b 0a 09 09 20 20 20 20 54 6c 73 5f  OK) {...    Tls_
5160: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
5170: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69  (char*)X509_veri
5180: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
5190: 72 69 6e 67 28 65 72 72 29 29 3b 0a 09 09 20 20  ring(err));...  
51a0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
51b0: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a  = ECONNABORTED;.
51c0: 09 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
51d0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20  ...}..    }..   
51e0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
51f0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b   Tcl_GetErrno();
5200: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73 74  ..    dprintf(st
5210: 64 65 72 72 2c 22 45 52 52 28 25 64 2c 20 25 64  derr,"ERR(%d, %d
5220: 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 43  ) ", rc, *errorC
5230: 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  odePtr);..    re
5240: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 64 70 72  turn -1;..}..dpr
5250: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 52 30 21  intf(stderr,"R0!
5260: 20 22 29 3b 0a 09 72 65 74 75 72 6e 20 31 3b 0a   ");..return 1;.
5270: 20 20 20 20 7d 0a 7d 0a 0a 54 63 6c 5f 43 68 61      }.}..Tcl_Cha
5280: 6e 6e 65 6c 0a 54 6c 73 5f 47 65 74 50 61 72 65  nnel.Tls_GetPare
5290: 6e 74 28 20 73 74 61 74 65 50 74 72 20 29 0a 20  nt( statePtr ). 
52a0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
52b0: 74 72 3b 0a 7b 0a 23 69 66 64 65 66 20 54 43 4c  tr;.{.#ifdef TCL
52c0: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
52d0: 5f 32 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63  _2.    return Tc
52e0: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e  l_GetStackedChan
52f0: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65  nel(statePtr->se
5300: 6c 66 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 54  lf);.#else.#if T
5310: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
5320: 20 3d 3d 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e   == 8 && TCL_MIN
5330: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 32 0a 20  OR_VERSION < 2. 
5340: 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 50     return stateP
5350: 74 72 2d 3e 70 61 72 65 6e 74 3b 0a 23 65 6c 73  tr->parent;.#els
5360: 65 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61  e.    /* The rea
5370: 73 6f 6e 20 66 6f 72 20 74 68 65 20 65 78 69 73  son for the exis
5380: 74 65 6e 63 65 20 6f 66 20 74 68 69 73 20 70 72  tence of this pr
5390: 6f 63 65 64 75 72 65 20 69 73 0a 20 20 20 20 20  ocedure is.     
53a0: 2a 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  * the fact that 
53b0: 73 74 61 63 6b 69 6e 67 20 61 20 74 72 61 6e 73  stacking a trans
53c0: 66 6f 72 6d 20 6f 76 65 72 20 61 6e 6f 74 68 65  form over anothe
53d0: 72 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f  r.     * transfo
53e0: 72 6d 20 77 69 6c 6c 20 6c 65 61 76 65 20 6f 75  rm will leave ou
53f0: 72 20 69 6e 74 65 72 6e 61 6c 20 70 6f 69 6e 74  r internal point
5400: 65 72 20 75 6e 63 68 61 6e 67 65 64 2c 0a 20 20  er unchanged,.  
5410: 20 20 20 2a 20 61 6e 64 20 74 68 75 73 20 70 6f     * and thus po
5420: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
5430: 77 20 74 72 61 6e 73 66 6f 72 6d 2c 20 61 6e 64  w transform, and
5440: 20 6e 6f 74 20 74 68 65 0a 20 20 20 20 20 2a 20   not the.     * 
5450: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
5460: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
5470: 20 73 61 76 65 64 20 73 74 61 74 65 20 6f 66 20   saved state of 
5480: 74 68 69 73 0a 20 20 20 20 20 2a 20 74 72 61 6e  this.     * tran
5490: 73 66 6f 72 6d 2e 20 54 68 69 73 20 69 73 20 74  sform. This is t
54a0: 68 65 20 70 72 69 63 65 20 74 6f 20 70 61 79 20  he price to pay 
54b0: 66 6f 72 20 6c 65 61 76 69 6e 67 0a 20 20 20 20  for leaving.    
54c0: 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 72   * Tcl_Channel r
54d0: 65 66 65 72 65 6e 63 65 73 20 69 6e 74 61 63 74  eferences intact
54e0: 2e 20 54 68 65 20 6f 6e 6c 79 20 6f 74 68 65 72  . The only other
54f0: 20 73 6f 6c 75 74 69 6f 6e 0a 20 20 20 20 20 2a   solution.     *
5500: 20 69 73 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e   is an extension
5510: 20 6f 66 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54   of Tcl_ChannelT
5520: 79 70 65 20 77 69 74 68 20 61 6e 6f 74 68 65 72  ype with another
5530: 20 64 72 69 76 65 72 0a 20 20 20 20 20 2a 20 70   driver.     * p
5540: 72 6f 63 65 64 75 72 65 20 74 6f 20 6e 6f 74 69  rocedure to noti
5550: 66 79 20 61 20 43 68 61 6e 6e 65 6c 20 61 62 6f  fy a Channel abo
5560: 75 74 20 74 68 65 20 28 75 6e 29 73 74 61 63 6b  ut the (un)stack
5570: 69 6e 67 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  ing..     *.    
5580: 20 2a 20 49 74 20 77 61 6c 6b 73 20 74 68 65 20   * It walks the 
5590: 63 68 61 69 6e 20 6f 66 20 43 68 61 6e 6e 65 6c  chain of Channel
55a0: 20 73 74 72 75 63 74 75 72 65 73 20 75 6e 74 69   structures unti
55b0: 6c 20 69 74 0a 20 20 20 20 20 2a 20 66 69 6e 64  l it.     * find
55c0: 73 20 74 68 65 20 6f 6e 65 20 70 6f 69 6e 74 69  s the one pointi
55d0: 6e 67 20 68 61 76 69 6e 67 20 27 63 74 72 6c 27  ng having 'ctrl'
55e0: 20 61 73 20 69 6e 73 74 61 6e 63 65 44 61 74 61   as instanceData
55f0: 0a 20 20 20 20 20 2a 20 61 6e 64 20 74 68 65 6e  .     * and then
5600: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 75 70   returns the sup
5610: 65 72 63 65 64 69 6e 67 20 63 68 61 6e 6e 65 6c  erceding channel
5620: 20 74 6f 20 74 68 61 74 2e 20 28 41 4b 29 0a 20   to that. (AK). 
5630: 20 20 20 20 2a 2f 0a 20 0a 20 20 20 20 54 63 6c      */. .    Tcl
5640: 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 20 3d 20  _Channel self = 
5650: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a  statePtr->self;.
5660: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
5670: 6e 65 78 74 3b 0a 0a 20 20 20 20 77 68 69 6c 65  next;..    while
5680: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73   ((ClientData) s
5690: 74 61 74 65 50 74 72 20 21 3d 20 54 63 6c 5f 47  tatePtr != Tcl_G
56a0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
56b0: 65 44 61 74 61 20 28 73 65 6c 66 29 29 20 7b 0a  eData (self)) {.
56c0: 09 6e 65 78 74 20 3d 20 54 63 6c 5f 47 65 74 53  .next = Tcl_GetS
56d0: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 20 28 73  tackedChannel (s
56e0: 65 6c 66 29 3b 0a 09 69 66 20 28 6e 65 78 74 20  elf);..if (next 
56f0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
5700: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
5710: 20 30 39 2f 32 34 2f 31 39 39 39 20 55 6e 73 74   09/24/1999 Unst
5720: 61 63 6b 69 6e 67 20 62 75 67 2c 0a 09 20 20 20  acking bug,..   
5730: 20 20 2a 20 66 6f 75 6e 64 20 62 79 20 4d 61 74    * found by Mat
5740: 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 73  t Newman <matt@s
5750: 65 6e 73 75 73 2e 6f 72 67 3e 2e 0a 09 20 20 20  ensus.org>...   
5760: 20 20 2a 0a 09 20 20 20 20 20 2a 20 57 65 20 77    *..     * We w
5770: 65 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 69  ere unable to fi
5780: 6e 64 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 73  nd the channel s
5790: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69  tructure for thi
57a0: 73 0a 09 20 20 20 20 20 2a 20 74 72 61 6e 73 66  s..     * transf
57b0: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
57c0: 63 68 61 69 6e 20 6f 66 20 73 74 61 63 6b 65 64  chain of stacked
57d0: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 0a 09   channel. This..
57e0: 20 20 20 20 20 2a 20 6d 65 61 6e 73 20 74 68 61       * means tha
57f0: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
5800: 6c 79 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73  ly in the proces
5810: 73 20 6f 66 20 75 6e 73 74 61 63 6b 69 6e 67 0a  s of unstacking.
5820: 09 20 20 20 20 20 2a 20 69 74 20 2a 61 6e 64 2a  .     * it *and*
5830: 20 74 68 65 72 65 20 77 65 72 65 20 73 6f 6d 65   there were some
5840: 20 62 79 74 65 73 20 77 61 69 74 69 6e 67 20 77   bytes waiting w
5850: 68 69 63 68 20 61 72 65 20 6e 6f 77 0a 09 20 20  hich are now..  
5860: 20 20 20 2a 20 66 6c 75 73 68 65 64 2e 20 49 6e     * flushed. In
5870: 20 74 68 69 73 20 73 69 74 75 61 74 69 6f 6e 20   this situation 
5880: 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  the pointer to t
5890: 68 65 20 63 68 61 6e 6e 65 6c 0a 09 20 20 20 20  he channel..    
58a0: 20 2a 20 69 74 73 65 6c 66 20 61 6c 72 65 61 64   * itself alread
58b0: 79 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20  y refers to the 
58c0: 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 77  parent channel w
58d0: 65 20 68 61 76 65 20 74 6f 0a 09 20 20 20 20 20  e have to..     
58e0: 2a 20 77 72 69 74 65 20 74 68 65 20 62 79 74 65  * write the byte
58f0: 73 20 69 6e 74 6f 2c 20 73 6f 20 77 65 20 72 65  s into, so we re
5900: 74 75 72 6e 20 74 68 61 74 2e 0a 09 20 20 20 20  turn that...    
5910: 20 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 20   */..    return 
5920: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a  statePtr->self;.
5930: 09 7d 0a 09 73 65 6c 66 20 3d 20 6e 65 78 74 3b  .}..self = next;
5940: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
5950: 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65  rn Tcl_GetStacke
5960: 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29 3b  dChannel (self);
5970: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 7d  .#endif.#endif.}
5980: 0a                                               .