Hex Artifact Content

Artifact 5817cb10fa73d31915a7f0d713af5ddcb43d4c99:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 4d 61  (C) 1997-2000 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32   Copyright (C) 2
0050: 30 30 30 20 41 6a 75 62 61 20 53 6f 6c 75 74 69  000 Ajuba Soluti
0060: 6f 6e 73 0a 20 2a 0a 20 2a 20 24 48 65 61 64 65  ons. *. * $Heade
0070: 72 3a 20 2f 68 6f 6d 65 2f 72 6b 65 65 6e 65 2f  r: /home/rkeene/
0080: 74 6d 70 2f 63 76 73 32 66 6f 73 73 69 6c 2f 2e  tmp/cvs2fossil/.
0090: 2e 2f 74 63 6c 74 6c 73 2f 74 6c 73 2f 74 6c 73  ./tcltls/tls/tls
00a0: 2f 74 6c 73 49 4f 2e 63 2c 76 20 31 2e 31 34 20  /tlsIO.c,v 1.14 
00b0: 32 30 30 34 2f 30 33 2f 32 34 20 30 35 3a 32 32  2004/03/24 05:22
00c0: 3a 35 33 20 72 61 7a 7a 65 6c 6c 20 45 78 70 20  :53 razzell Exp 
00d0: 24 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 6b 61  $. *. * TLS (aka
00e0: 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 2d 20   SSL) Channel - 
00f0: 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 20 6f  can be layered o
0100: 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 74 69  n any bi-directi
0110: 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 61 6e  onal. * Tcl_Chan
0120: 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 75 69  nel (Note: Requi
0130: 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 61 74  res Trf Core Pat
0140: 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 77  ch). *. * This w
0150: 61 73 20 62 75 69 6c 74 20 66 72 6f 6d 20 73 63  as built from sc
0160: 72 61 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e  ratch based upon
0170: 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 20   observation of 
0180: 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20  OpenSSL 0.9.2B. 
0190: 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72  *. * Addition cr
01a0: 65 64 69 74 20 69 73 20 64 75 65 20 66 6f 72 20  edit is due for 
01b0: 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73 20  Andreas Kupries 
01c0: 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65  (a.kupries@weste
01d0: 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20  nd.com), for. * 
01e0: 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63  providing the Tc
01f0: 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c  l_ReplaceChannel
0200: 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77   mechanism and w
0210: 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77  orking closely w
0220: 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68  ith me. * to enh
0230: 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f  ance it to suppo
0240: 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e  rt full fileeven
0250: 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a  t semantics.. *.
0260: 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e   * Also work don
0270: 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20  e by the follow 
0280: 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20  people provided 
0290: 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64  the impetus to d
02a0: 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a  o this "right":.
02b0: 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e   *.tclSSL (Colin
02c0: 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72   McCormack, Shar
02d0: 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20  ed Technology). 
02e0: 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20  *.SSLtcl (Peter 
02f0: 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a  Antman). *. */..
0300: 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74  #include "tlsInt
0310: 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61  .h"../*. * Forwa
0320: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a  rd declarations.
0330: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09   */..static int.
0340: 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63  TlsBlockModeProc
0350: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c   _ANSI_ARGS_((Cl
0360: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
0370: 65 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 6f  eData,....int mo
0380: 64 65 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  de));.static int
0390: 09 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 5f 41  .TlsCloseProc _A
03a0: 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65  NSI_ARGS_ ((Clie
03b0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
03c0: 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65  ata,....Tcl_Inte
03d0: 72 70 20 2a 69 6e 74 65 72 70 29 29 3b 0a 73 74  rp *interp));.st
03e0: 61 74 69 63 20 69 6e 74 09 54 6c 73 49 6e 70 75  atic int.TlsInpu
03f0: 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53  tProc _ANSI_ARGS
0400: 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  _((ClientData in
0410: 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 63  stanceData,....c
0420: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75  har *buf, int bu
0430: 66 53 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f  fSize, int *erro
0440: 72 43 6f 64 65 50 74 72 29 29 3b 0a 73 74 61 74  rCodePtr));.stat
0450: 69 63 20 69 6e 74 09 54 6c 73 4f 75 74 70 75 74  ic int.TlsOutput
0460: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f  Proc _ANSI_ARGS_
0470: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  ((ClientData ins
0480: 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 43 4f  tanceData,....CO
0490: 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 69  NST char *buf, i
04a0: 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20  nt toWrite, int 
04b0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b  *errorCodePtr));
04c0: 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 47  .static int.TlsG
04d0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 5f 41 4e  etOptionProc _AN
04e0: 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e  SI_ARGS_ ((Clien
04f0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
0500: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72  ta,....Tcl_Inter
0510: 70 20 2a 69 6e 74 65 72 70 2c 20 43 4f 4e 53 54  p *interp, CONST
0520: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d   char *optionNam
0530: 65 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 6e  e,....Tcl_DStrin
0540: 67 20 2a 64 73 50 74 72 29 29 3b 0a 73 74 61 74  g *dsPtr));.stat
0550: 69 63 20 76 6f 69 64 09 54 6c 73 57 61 74 63 68  ic void.TlsWatch
0560: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f  Proc _ANSI_ARGS_
0570: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  ((ClientData ins
0580: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d  tanceData, int m
0590: 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 69 6e  ask));.static in
05a0: 74 09 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72  t.TlsGetHandlePr
05b0: 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28  oc _ANSI_ARGS_ (
05c0: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
05d0: 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 69 6e 74  anceData,....int
05e0: 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65   direction, Clie
05f0: 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74  ntData *handlePt
0600: 72 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09  r));.static int.
0610: 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 5f 41  TlsNotifyProc _A
0620: 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65  NSI_ARGS_ ((Clie
0630: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
0640: 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 61 73 6b  ata,....int mask
0650: 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09  ));.static void.
0660: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  TlsChannelHandle
0670: 72 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28  r _ANSI_ARGS_ ((
0680: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
0690: 74 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 61  tData,....int ma
06a0: 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  sk));.static voi
06b0: 64 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64  d.TlsChannelHand
06c0: 6c 65 72 54 69 6d 65 72 20 5f 41 4e 53 49 5f 41  lerTimer _ANSI_A
06d0: 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74  RGS_ ((ClientDat
06e0: 61 20 63 6c 69 65 6e 74 44 61 74 61 29 29 3b 0a  a clientData));.
06f0: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75  ./*. * This stru
0700: 63 74 75 72 65 20 64 65 73 63 72 69 62 65 73 20  cture describes 
0710: 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 70 65  the channel type
0720: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 54   structure for T
0730: 43 50 20 73 6f 63 6b 65 74 0a 20 2a 20 62 61 73  CP socket. * bas
0740: 65 64 20 49 4f 2e 20 20 54 68 65 73 65 20 61 72  ed IO.  These ar
0750: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63  e what the struc
0760: 74 75 72 65 73 20 73 68 6f 75 6c 64 20 6c 6f 6f  tures should loo
0770: 6b 20 6c 69 6b 65 2c 20 62 75 74 20 77 65 0a 20  k like, but we. 
0780: 2a 20 68 61 76 65 20 74 6f 20 62 75 69 6c 64 20  * have to build 
0790: 74 68 65 6d 20 75 70 20 61 74 20 72 75 6e 74 69  them up at runti
07a0: 6d 65 20 74 6f 20 62 65 20 63 6f 72 72 65 63 74  me to be correct
07b0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
07c0: 65 74 68 65 72 0a 20 2a 20 77 65 20 61 72 65 20  ether. * we are 
07d0: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 6e 20 38  loaded into an 8
07e0: 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72 20 38 2e  .2.0-8.3.1 or 8.
07f0: 33 2e 32 2b 20 54 63 6c 20 69 6e 74 65 72 70 72  3.2+ Tcl interpr
0800: 65 74 65 72 2e 0a 20 2a 2f 0a 23 69 66 64 65 66  eter.. */.#ifdef
0810: 20 54 4c 53 5f 53 54 41 54 49 43 5f 53 54 52 55   TLS_STATIC_STRU
0820: 43 54 55 52 45 53 5f 4e 4f 54 5f 55 53 45 44 0a  CTURES_NOT_USED.
0830: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e  static Tcl_Chann
0840: 65 6c 54 79 70 65 20 74 6c 73 43 68 61 6e 6e 65  elType tlsChanne
0850: 6c 54 79 70 65 32 20 3d 20 7b 0a 20 20 20 20 22  lType2 = {.    "
0860: 74 6c 73 22 2c 09 09 2f 2a 20 54 79 70 65 20 6e  tls",../* Type n
0870: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 43 4c 5f  ame. */.    TCL_
0880: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f  CHANNEL_VERSION_
0890: 32 2c 09 2f 2a 20 41 20 76 32 20 63 68 61 6e 6e  2,./* A v2 chann
08a0: 65 6c 20 28 38 2e 33 2e 32 2b 29 20 2a 2f 0a 20  el (8.3.2+) */. 
08b0: 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c     TlsCloseProc,
08c0: 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20  ./* Close proc. 
08d0: 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 50  */.    TlsInputP
08e0: 72 6f 63 2c 09 2f 2a 20 49 6e 70 75 74 20 70 72  roc,./* Input pr
08f0: 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4f 75  oc. */.    TlsOu
0900: 74 70 75 74 50 72 6f 63 2c 09 2f 2a 20 4f 75 74  tputProc,./* Out
0910: 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20  put proc. */.   
0920: 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b 20   NULL,../* Seek 
0930: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c  proc. */.    NUL
0940: 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f  L,../* Set optio
0950: 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54  n proc. */.    T
0960: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c  lsGetOptionProc,
0970: 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70  ./* Get option p
0980: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 57  roc. */.    TlsW
0990: 61 74 63 68 50 72 6f 63 2c 09 2f 2a 20 49 6e 69  atchProc,./* Ini
09a0: 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72  tialize notifier
09b0: 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 48  . */.    TlsGetH
09c0: 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65  andleProc,./* Ge
09d0: 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f 75  t file handle ou
09e0: 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f  t of channel. */
09f0: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 43  .    NULL,../* C
0a00: 6c 6f 73 65 32 50 72 6f 63 2e 20 2a 2f 0a 20 20  lose2Proc. */.  
0a10: 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72    TlsBlockModePr
0a20: 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b  oc,./* Set block
0a30: 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20  ing/nonblocking 
0a40: 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20 4e 55 4c 4c  mode.*/.    NULL
0a50: 2c 09 09 2f 2a 20 46 6c 75 73 68 50 72 6f 63 2e  ,../* FlushProc.
0a60: 20 2a 2f 0a 20 20 20 20 54 6c 73 4e 6f 74 69 66   */.    TlsNotif
0a70: 79 50 72 6f 63 2c 09 2f 2a 20 68 61 6e 64 6c 65  yProc,./* handle
0a80: 72 50 72 6f 63 2e 20 2a 2f 0a 7d 3b 0a 0a 73 74  rProc. */.};..st
0a90: 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  atic Tcl_Channel
0aa0: 54 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54  Type tlsChannelT
0ab0: 79 70 65 31 20 3d 20 7b 0a 20 20 20 20 22 74 6c  ype1 = {.    "tl
0ac0: 73 22 2c 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d  s",../* Type nam
0ad0: 65 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 42 6c 6f  e. */.    TlsBlo
0ae0: 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53  ckModeProc,./* S
0af0: 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62  et blocking/nonb
0b00: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a  locking mode.*/.
0b10: 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63      TlsCloseProc
0b20: 2c 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e  ,./* Close proc.
0b30: 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74   */.    TlsInput
0b40: 50 72 6f 63 2c 09 2f 2a 20 49 6e 70 75 74 20 70  Proc,./* Input p
0b50: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4f  roc. */.    TlsO
0b60: 75 74 70 75 74 50 72 6f 63 2c 09 2f 2a 20 4f 75  utputProc,./* Ou
0b70: 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20  tput proc. */.  
0b80: 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65 6b    NULL,../* Seek
0b90: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e 55   proc. */.    NU
0ba0: 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69  LL,../* Set opti
0bb0: 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20  on proc. */.    
0bc0: 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  TlsGetOptionProc
0bd0: 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20  ,./* Get option 
0be0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73  proc. */.    Tls
0bf0: 57 61 74 63 68 50 72 6f 63 2c 09 2f 2a 20 49 6e  WatchProc,./* In
0c00: 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65  itialize notifie
0c10: 72 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74  r. */.    TlsGet
0c20: 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47  HandleProc,./* G
0c30: 65 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f  et file handle o
0c40: 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a  ut of channel. *
0c50: 2f 0a 7d 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69  /.};.#else.stati
0c60: 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70  c Tcl_ChannelTyp
0c70: 65 20 2a 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70  e *tlsChannelTyp
0c80: 65 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  e = NULL;.#endif
0c90: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0ce0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
0cf0: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
0d00: 20 74 68 65 20 63 6f 72 72 65 63 74 20 54 4c 53   the correct TLS
0d10: 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 20   channel driver 
0d20: 69 6e 66 6f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  info. *. * Resul
0d30: 74 73 3a 0a 20 2a 09 54 68 65 20 63 6f 72 72 65  ts:. *.The corre
0d40: 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65  ct channel drive
0d50: 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  r for the curren
0d60: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 63 6c  t version of Tcl
0d70: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
0d80: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
0d90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f  -------. */.Tcl_
0de0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 54 6c 73  ChannelType *Tls
0df0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 0a 7b  _ChannelType().{
0e00: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49  .    /*.     * I
0e10: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 68  nitialize the ch
0e20: 61 6e 6e 65 6c 20 74 79 70 65 20 69 66 20 6e 65  annel type if ne
0e30: 63 65 73 73 61 72 79 0a 20 20 20 20 20 2a 2f 0a  cessary.     */.
0e40: 20 20 20 20 69 66 20 28 74 6c 73 43 68 61 6e 6e      if (tlsChann
0e50: 65 6c 54 79 70 65 20 3d 3d 20 4e 55 4c 4c 29 20  elType == NULL) 
0e60: 7b 0a 09 2f 2a 0a 09 20 2a 20 41 6c 6c 6f 63 61  {../*.. * Alloca
0e70: 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 63 68  tion of a new ch
0e80: 61 6e 6e 65 6c 74 79 70 65 20 73 74 72 75 63 74  anneltype struct
0e90: 75 72 65 20 69 73 20 6e 6f 74 20 65 61 73 79 2c  ure is not easy,
0ea0: 20 62 65 63 61 75 73 65 20 6f 66 0a 09 20 2a 20   because of.. * 
0eb0: 74 68 65 20 76 61 72 69 6f 75 73 20 76 65 72 73  the various vers
0ec0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 72 65 20 61  on of the core a
0ed0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 63 68  nd subsequent ch
0ee0: 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 09 20 2a  anges to the.. *
0ef0: 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20   structure. The 
0f00: 6d 61 69 6e 20 63 68 61 6c 6c 65 6e 67 65 20 69  main challenge i
0f10: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 65 6e  s to allocate en
0f20: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 0a  ough memory for.
0f30: 09 20 2a 20 6f 64 65 72 6e 20 76 65 72 73 69 6f  . * odern versio
0f40: 6e 73 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  ns even if this 
0f50: 65 78 74 79 65 6e 73 69 6f 6e 20 69 73 20 63 6f  extyension is co
0f60: 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 6f  mpiled against o
0f70: 6e 65 0a 09 20 2a 20 6f 66 20 74 68 65 20 6f 6c  ne.. * of the ol
0f80: 64 65 72 20 76 61 72 69 61 6e 74 21 0a 09 20 2a  der variant!.. *
0f90: 0a 09 20 2a 20 28 31 29 20 56 65 72 73 69 6f 6e  .. * (1) Version
0fa0: 73 20 62 65 66 6f 72 65 20 73 74 75 62 73 20 28  s before stubs (
0fb0: 38 2e 30 2e 78 29 20 61 72 65 20 73 69 6d 70 6c  8.0.x) are simpl
0fc0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 79 20  e, because they 
0fd0: 61 72 65 0a 09 20 2a 20 20 20 20 20 73 75 70 70  are.. *     supp
0fe0: 6f 72 74 65 64 20 6f 6e 6c 79 20 69 66 20 74 68  orted only if th
0ff0: 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63  e extension is c
1000: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
1010: 65 78 61 63 74 6c 79 0a 09 20 2a 20 20 20 20 20  exactly.. *     
1020: 74 68 61 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  that version of 
1030: 74 68 65 20 63 6f 72 65 2e 0a 09 20 2a 0a 09 20  the core... *.. 
1040: 2a 20 28 32 29 20 57 69 74 68 20 73 74 75 62 73  * (2) With stubs
1050: 20 77 65 20 6a 75 73 74 20 64 65 74 65 72 6d 69   we just determi
1060: 6e 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ne the differenc
1070: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 6f 6c  e between the ol
1080: 64 65 72 0a 09 20 2a 20 20 20 20 20 61 6e 64 20  der.. *     and 
1090: 6d 6f 64 65 72 6e 20 76 61 72 69 61 6e 74 20 61  modern variant a
10a0: 6e 64 20 6f 76 65 72 61 6c 6c 6f 63 61 74 65 20  nd overallocate 
10b0: 61 63 63 6f 72 64 69 6e 67 6c 79 20 69 66 20 63  accordingly if c
10c0: 6f 6d 70 69 6c 65 64 0a 09 20 2a 20 20 20 20 20  ompiled.. *     
10d0: 61 67 61 69 6e 73 74 20 61 6e 20 6f 6c 64 65 72  against an older
10e0: 20 76 61 72 69 61 6e 74 2e 0a 09 20 2a 2f 0a 0a   variant... */..
10f0: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 69  .unsigned int si
1100: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 54 63 6c 5f  ze = sizeof(Tcl_
1110: 43 68 61 6e 6e 65 6c 54 79 70 65 29 3b 20 2f 2a  ChannelType); /*
1120: 20 42 61 73 65 20 73 69 7a 65 20 2a 2f 0a 0a 09   Base size */...
1130: 2f 2a 0a 09 20 2a 20 53 69 7a 65 20 6f 66 20 61  /*.. * Size of a
1140: 20 70 72 6f 63 65 64 75 72 65 20 70 6f 69 6e 74   procedure point
1150: 65 72 2e 20 57 65 20 61 73 73 75 6d 65 20 74 68  er. We assume th
1160: 61 74 20 61 6c 6c 20 70 72 6f 63 65 64 75 72 65  at all procedure
1170: 0a 09 20 2a 20 70 6f 69 6e 74 65 72 73 20 61 72  .. * pointers ar
1180: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 69  e of the same si
1190: 7a 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ze, regardless o
11a0: 66 20 65 78 61 63 74 20 74 79 70 65 0a 09 20 2a  f exact type.. *
11b0: 20 28 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20   (arguments and 
11c0: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 29 2e 0a  return values)..
11d0: 09 20 2a 0a 09 20 2a 20 38 2e 32 2e 20 20 20 46  . *.. * 8.2.   F
11e0: 69 72 73 74 20 76 65 72 73 69 6f 6e 20 63 6f 6e  irst version con
11f0: 74 61 69 6e 69 6e 67 20 63 6c 6f 73 65 32 70 72  taining close2pr
1200: 6f 63 2e 20 42 61 73 65 6c 69 6e 65 2e 0a 09 20  oc. Baseline... 
1210: 2a 20 38 2e 33 2e 32 20 20 54 68 72 65 65 20 61  * 8.3.2  Three a
1220: 64 64 69 74 69 6f 6e 61 6c 20 76 65 63 74 6f 72  dditional vector
1230: 73 2e 20 4d 6f 76 65 64 20 62 6c 6f 63 6b 4d 6f  s. Moved blockMo
1240: 64 65 2c 20 6e 65 77 20 66 6c 75 73 68 2d 20 61  de, new flush- a
1250: 6e 64 0a 09 20 2a 20 20 20 20 20 20 20 20 68 61  nd.. *        ha
1260: 6e 64 6c 65 72 50 72 6f 63 27 73 2e 0a 09 20 2a  ndlerProc's... *
1270: 0a 09 20 2a 20 3d 3e 20 43 6f 6d 70 69 6c 61 74  .. * => Compilat
1280: 69 6f 6e 20 61 67 61 69 6e 73 74 20 65 61 72 6c  ion against earl
1290: 69 65 72 20 76 65 72 73 69 6f 6e 20 68 61 73 20  ier version has 
12a0: 74 6f 20 6f 76 65 72 61 6c 6c 6f 63 61 74 65 20  to overallocate 
12b0: 74 68 72 65 65 0a 09 20 2a 20 20 20 20 70 72 6f  three.. *    pro
12c0: 63 65 64 75 72 65 20 70 6f 69 6e 74 65 72 73 2e  cedure pointers.
12d0: 0a 09 20 2a 2f 0a 0a 23 69 66 64 65 66 20 45 4d  .. */..#ifdef EM
12e0: 55 4c 41 54 45 5f 43 48 41 4e 4e 45 4c 5f 56 45  ULATE_CHANNEL_VE
12f0: 52 53 49 4f 4e 5f 32 0a 09 73 69 7a 65 20 2b 3d  RSION_2..size +=
1300: 20 33 20 2a 20 70 72 6f 63 50 74 72 53 69 7a 65   3 * procPtrSize
1310: 3b 0a 23 65 6e 64 69 66 0a 0a 09 74 6c 73 43 68  ;.#endif...tlsCh
1320: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 28 54 63 6c  annelType = (Tcl
1330: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 29 20  _ChannelType *) 
1340: 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 09  ckalloc(size);..
1350: 6d 65 6d 73 65 74 28 28 56 4f 49 44 20 2a 29 20  memset((VOID *) 
1360: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20  tlsChannelType, 
1370: 30 2c 20 73 69 7a 65 29 3b 0a 0a 09 2f 2a 0a 09  0, size);.../*..
1380: 20 2a 20 43 6f 6d 6d 6f 6e 20 65 6c 65 6d 65 6e   * Common elemen
1390: 74 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ts of the struct
13a0: 75 72 65 20 28 6e 6f 20 63 68 61 6e 67 65 73 20  ure (no changes 
13b0: 69 6e 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6e  in location or n
13c0: 61 6d 65 29 0a 09 20 2a 20 63 6c 6f 73 65 32 50  ame).. * close2P
13d0: 72 6f 63 2c 20 73 65 65 6b 50 72 6f 63 2c 20 73  roc, seekProc, s
13e0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 73 74 61  etOptionProc sta
13f0: 79 20 4e 55 4c 4c 2e 0a 09 20 2a 2f 0a 0a 09 74  y NULL... */...t
1400: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 74  lsChannelType->t
1410: 79 70 65 4e 61 6d 65 09 3d 20 22 74 6c 73 22 3b  ypeName.= "tls";
1420: 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  ..tlsChannelType
1430: 2d 3e 63 6c 6f 73 65 50 72 6f 63 09 3d 20 54 6c  ->closeProc.= Tl
1440: 73 43 6c 6f 73 65 50 72 6f 63 3b 0a 09 74 6c 73  sCloseProc;..tls
1450: 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 69 6e 70  ChannelType->inp
1460: 75 74 50 72 6f 63 09 3d 20 54 6c 73 49 6e 70 75  utProc.= TlsInpu
1470: 74 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e  tProc;..tlsChann
1480: 65 6c 54 79 70 65 2d 3e 6f 75 74 70 75 74 50 72  elType->outputPr
1490: 6f 63 09 3d 20 54 6c 73 4f 75 74 70 75 74 50 72  oc.= TlsOutputPr
14a0: 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54  oc;..tlsChannelT
14b0: 79 70 65 2d 3e 67 65 74 4f 70 74 69 6f 6e 50 72  ype->getOptionPr
14c0: 6f 63 09 3d 20 54 6c 73 47 65 74 4f 70 74 69 6f  oc.= TlsGetOptio
14d0: 6e 50 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e  nProc;..tlsChann
14e0: 65 6c 54 79 70 65 2d 3e 77 61 74 63 68 50 72 6f  elType->watchPro
14f0: 63 09 3d 20 54 6c 73 57 61 74 63 68 50 72 6f 63  c.= TlsWatchProc
1500: 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70  ;..tlsChannelTyp
1510: 65 2d 3e 67 65 74 48 61 6e 64 6c 65 50 72 6f 63  e->getHandleProc
1520: 09 3d 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50  .= TlsGetHandleP
1530: 72 6f 63 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 62 6c  roc;.../*.. * bl
1540: 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 69 73 20 61  ockModeProc is a
1550: 20 74 77 69 73 74 65 72 2e 20 20 57 65 20 68 61   twister.  We ha
1560: 76 65 20 74 6f 20 6d 61 6b 65 20 73 6f 6d 65 20  ve to make some 
1570: 72 75 6e 74 69 6d 65 2d 63 68 6f 69 63 65 73 2c  runtime-choices,
1580: 0a 09 20 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f  .. * depending o
1590: 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65  n the version we
15a0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
15b0: 74 2e 0a 09 20 2a 2f 0a 0a 23 69 66 64 65 66 20  t... */..#ifdef 
15c0: 45 4d 55 4c 41 54 45 5f 43 48 41 4e 4e 45 4c 5f  EMULATE_CHANNEL_
15d0: 56 45 52 53 49 4f 4e 5f 32 0a 09 2f 2a 0a 09 20  VERSION_2../*.. 
15e0: 2a 20 57 65 20 61 72 65 20 63 6f 6d 70 69 6c 69  * We are compili
15f0: 6e 67 20 61 67 61 69 6e 73 74 20 61 6e 20 38 2e  ng against an 8.
1600: 33 2e 31 2d 20 63 6f 72 65 2e 20 20 57 65 20 68  3.1- core.  We h
1610: 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 73 6f  ave to create so
1620: 6d 65 0a 09 20 2a 20 64 65 66 69 6e 69 74 69 6f  me.. * definitio
1630: 6e 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  ns for the new e
1640: 6c 65 6d 65 6e 74 73 20 61 73 20 74 68 65 20 63  lements as the c
1650: 6f 6d 70 69 6c 65 72 20 64 6f 65 73 20 6e 6f 74  ompiler does not
1660: 20 6b 6e 6f 77 20 74 68 65 6d 0a 09 20 2a 20 62   know them.. * b
1670: 79 20 6e 61 6d 65 2e 0a 09 20 2a 2f 0a 0a 09 69  y name... */...i
1680: 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65  f (channelTypeVe
1690: 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41  rsion == TLS_CHA
16a0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 29 20  NNEL_VERSION_1) 
16b0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  {..    /*..     
16c0: 2a 20 54 68 65 20 27 76 65 72 73 69 6f 6e 27 20  * The 'version' 
16d0: 65 6c 65 6d 65 6e 74 20 6f 66 20 38 2e 33 2e 32  element of 8.3.2
16e0: 20 69 73 20 69 6e 20 74 68 65 20 74 68 65 20 70   is in the the p
16f0: 6c 61 63 65 20 6f 66 20 74 68 65 0a 09 20 20 20  lace of the..   
1700: 20 20 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f    * blockModePro
1710: 63 2e 20 46 6f 72 20 38 2e 32 2e 30 2d 38 2e 33  c. For 8.2.0-8.3
1720: 2e 31 20 77 65 20 68 61 76 65 20 74 6f 20 73 65  .1 we have to se
1730: 74 20 6f 75 72 20 62 6c 6f 63 6b 4d 6f 64 65 50  t our blockModeP
1740: 72 6f 63 0a 09 20 20 20 20 20 2a 20 69 6e 74 6f  roc..     * into
1750: 20 74 68 69 73 20 70 6c 61 63 65 2e 0a 09 20 20   this place...  
1760: 20 20 20 2a 2f 0a 09 20 20 20 20 74 6c 73 43 68     */..    tlsCh
1770: 61 6e 6e 65 6c 54 79 70 65 2d 3e 62 6c 6f 63 6b  annelType->block
1780: 4d 6f 64 65 50 72 6f 63 20 3d 20 54 6c 73 42 6c  ModeProc = TlsBl
1790: 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a 09 7d 20  ockModeProc;..} 
17a0: 65 6c 73 65 20 2f 2a 20 63 68 61 6e 6e 65 6c 54  else /* channelT
17b0: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c  ypeVersion == TL
17c0: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f  S_CHANNEL_VERSIO
17d0: 4e 5f 32 20 2a 2f 20 7b 0a 09 20 20 20 20 2f 2a  N_2 */ {..    /*
17e0: 0a 09 20 20 20 20 20 2a 20 46 6f 72 20 74 68 65  ..     * For the
17f0: 20 38 2e 33 2e 32 20 63 6f 72 65 20 77 65 20 70   8.3.2 core we p
1800: 72 65 73 65 6e 74 20 6f 75 72 73 65 6c 76 65 73  resent ourselves
1810: 20 61 73 20 61 20 76 65 72 73 69 6f 6e 20 32 0a   as a version 2.
1820: 09 20 20 20 20 20 2a 20 64 72 69 76 65 72 2e 20  .     * driver. 
1830: 54 68 69 73 20 6d 65 61 6e 73 20 61 20 73 70 65  This means a spe
1840: 63 69 61 6c 20 76 61 6c 75 65 20 69 6e 20 76 65  cial value in ve
1850: 72 73 69 6f 6e 20 28 65 78 0a 09 20 20 20 20 20  rsion (ex..     
1860: 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 29  * blockModeProc)
1870: 2c 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20  , blockModeProc 
1880: 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  in a different p
1890: 6c 61 63 65 20 61 6e 64 20 6f 66 0a 09 20 20 20  lace and of..   
18a0: 20 20 2a 20 63 6f 75 72 73 65 20 75 73 61 67 65    * course usage
18b0: 20 6f 66 20 74 68 65 20 68 61 6e 64 6c 65 72 50   of the handlerP
18c0: 72 6f 63 2e 20 20 54 68 65 20 6c 61 73 74 20 74  roc.  The last t
18d0: 77 6f 20 68 61 76 65 20 74 6f 0a 09 20 20 20 20  wo have to..    
18e0: 20 2a 20 72 65 66 65 72 65 6e 63 65 64 20 77 69   * referenced wi
18f0: 74 68 20 70 6f 69 6e 74 65 72 20 6d 61 67 69 63  th pointer magic
1900: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72   because they ar
1910: 65 6e 27 74 20 64 65 66 69 6e 65 64 0a 09 20 20  en't defined..  
1920: 20 20 20 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a     * otherwise..
1930: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 74  .     */...    t
1940: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 62  lsChannelType->b
1950: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 3d 0a 09  lockModeProc =..
1960: 09 28 54 63 6c 5f 44 72 69 76 65 72 42 6c 6f 63  .(Tcl_DriverBloc
1970: 6b 4d 6f 64 65 50 72 6f 63 2a 29 20 54 4c 53 5f  kModeProc*) TLS_
1980: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f  CHANNEL_VERSION_
1990: 32 3b 0a 09 20 20 20 20 28 2a 28 28 54 63 6c 5f  2;..    (*((Tcl_
19a0: 44 72 69 76 65 72 42 6c 6f 63 6b 4d 6f 64 65 50  DriverBlockModeP
19b0: 72 6f 63 2a 2a 29 28 26 28 74 6c 73 43 68 61 6e  roc**)(&(tlsChan
19c0: 6e 65 6c 54 79 70 65 2d 3e 63 6c 6f 73 65 32 50  nelType->close2P
19d0: 72 6f 63 29 2b 31 29 29 29 0a 09 09 3d 20 54 6c  roc)+1)))...= Tl
19e0: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a  sBlockModeProc;.
19f0: 09 20 20 20 20 28 2a 28 28 54 6c 73 44 72 69 76  .    (*((TlsDriv
1a00: 65 72 48 61 6e 64 6c 65 72 50 72 6f 63 2a 2a 29  erHandlerProc**)
1a10: 28 26 28 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70  (&(tlsChannelTyp
1a20: 65 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 29 2b 33  e->close2Proc)+3
1a30: 29 29 29 0a 09 09 3d 20 54 6c 73 4e 6f 74 69 66  )))...= TlsNotif
1a40: 79 50 72 6f 63 3b 0a 09 7d 0a 23 65 6c 73 65 0a  yProc;..}.#else.
1a50: 09 2f 2a 0a 09 20 2a 20 43 6f 6d 70 69 6c 65 64  ./*.. * Compiled
1a60: 20 61 67 61 69 6e 73 74 20 38 2e 33 2e 32 2b 2e   against 8.3.2+.
1a70: 20 44 69 72 65 63 74 20 61 63 63 65 73 73 20 74   Direct access t
1a80: 6f 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 70  o all elements p
1a90: 6f 73 73 69 62 6c 65 2e 20 55 73 65 0a 09 20 2a  ossible. Use.. *
1aa0: 20 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73   channelTypeVers
1ab0: 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
1ac0: 74 6f 20 73 65 6c 65 63 74 20 74 68 65 20 76 61  to select the va
1ad0: 6c 75 65 73 20 74 6f 20 75 73 65 2e 0a 09 20 2a  lues to use... *
1ae0: 2f 0a 0a 09 69 66 20 28 63 68 61 6e 6e 65 6c 54  /...if (channelT
1af0: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c  ypeVersion == TL
1b00: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f  S_CHANNEL_VERSIO
1b10: 4e 5f 31 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  N_1) {..    /*..
1b20: 20 20 20 20 20 2a 20 54 68 65 20 27 76 65 72 73       * The 'vers
1b30: 69 6f 6e 27 20 65 6c 65 6d 65 6e 74 20 6f 66 20  ion' element of 
1b40: 38 2e 33 2e 32 20 69 73 20 69 6e 20 74 68 65 20  8.3.2 is in the 
1b50: 74 68 65 20 70 6c 61 63 65 20 6f 66 20 74 68 65  the place of the
1b60: 0a 09 20 20 20 20 20 2a 20 62 6c 6f 63 6b 4d 6f  ..     * blockMo
1b70: 64 65 50 72 6f 63 2e 20 46 6f 72 20 74 68 65 20  deProc. For the 
1b80: 6f 72 69 67 69 6e 61 6c 20 70 61 74 63 68 20 69  original patch i
1b90: 6e 20 38 2e 31 2e 78 20 61 6e 64 20 74 68 65 20  n 8.1.x and the 
1ba0: 66 69 72 73 74 6c 79 0a 09 20 20 20 20 20 2a 20  firstly..     * 
1bb0: 69 6e 63 6c 75 64 65 64 20 28 38 2e 32 29 20 77  included (8.2) w
1bc0: 65 20 68 61 76 65 20 74 6f 20 73 65 74 20 6f 75  e have to set ou
1bd0: 72 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20  r blockModeProc 
1be0: 69 6e 74 6f 20 74 68 69 73 0a 09 20 20 20 20 20  into this..     
1bf0: 2a 20 70 6c 61 63 65 2e 0a 09 20 20 20 20 20 2a  * place...     *
1c00: 2f 0a 09 20 20 20 20 74 6c 73 43 68 61 6e 6e 65  /..    tlsChanne
1c10: 6c 54 79 70 65 2d 3e 76 65 72 73 69 6f 6e 20 3d  lType->version =
1c20: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70   (Tcl_ChannelTyp
1c30: 65 56 65 72 73 69 6f 6e 29 54 6c 73 42 6c 6f 63  eVersion)TlsBloc
1c40: 6b 4d 6f 64 65 50 72 6f 63 3b 0a 09 7d 20 65 6c  kModeProc;..} el
1c50: 73 65 20 2f 2a 20 63 68 61 6e 6e 65 6c 54 79 70  se /* channelTyp
1c60: 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f  eVersion == TLS_
1c70: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f  CHANNEL_VERSION_
1c80: 32 20 2a 2f 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  2 */ {..    /*..
1c90: 20 20 20 20 20 2a 20 46 6f 72 20 74 68 65 20 38       * For the 8
1ca0: 2e 33 2e 32 20 63 6f 72 65 20 77 65 20 70 72 65  .3.2 core we pre
1cb0: 73 65 6e 74 20 6f 75 72 73 65 6c 76 65 73 20 61  sent ourselves a
1cc0: 73 20 61 20 76 65 72 73 69 6f 6e 20 32 0a 09 20  s a version 2.. 
1cd0: 20 20 20 20 2a 20 64 72 69 76 65 72 2e 20 54 68      * driver. Th
1ce0: 69 73 20 6d 65 61 6e 73 20 61 20 73 70 65 63 69  is means a speci
1cf0: 61 6c 20 76 61 6c 75 65 20 69 6e 20 76 65 72 73  al value in vers
1d00: 69 6f 6e 20 28 65 78 0a 09 20 20 20 20 20 2a 20  ion (ex..     * 
1d10: 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 29 2c 20  blockModeProc), 
1d20: 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 69 6e  blockModeProc in
1d30: 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 6c 61   a different pla
1d40: 63 65 20 61 6e 64 20 6f 66 0a 09 20 20 20 20 20  ce and of..     
1d50: 2a 20 63 6f 75 72 73 65 20 75 73 61 67 65 20 6f  * course usage o
1d60: 66 20 74 68 65 20 68 61 6e 64 6c 65 72 50 72 6f  f the handlerPro
1d70: 63 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  c...     */...  
1d80: 20 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65    tlsChannelType
1d90: 2d 3e 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20  ->version       
1da0: 3d 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45  = TCL_CHANNEL_VE
1db0: 52 53 49 4f 4e 5f 32 3b 0a 09 20 20 20 20 74 6c  RSION_2;..    tl
1dc0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 62 6c  sChannelType->bl
1dd0: 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 3d 20 54 6c  ockModeProc = Tl
1de0: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a  sBlockModeProc;.
1df0: 09 20 20 20 20 74 6c 73 43 68 61 6e 6e 65 6c 54  .    tlsChannelT
1e00: 79 70 65 2d 3e 68 61 6e 64 6c 65 72 50 72 6f 63  ype->handlerProc
1e10: 20 20 20 3d 20 54 6c 73 4e 6f 74 69 66 79 50 72     = TlsNotifyPr
1e20: 6f 63 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20  oc;..}.#endif.  
1e30: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 74    }.    return t
1e40: 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d  lsChannelType;.}
1e50: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
1ea0: 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72  * TlsBlockModePr
1eb0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  oc --. *. *.This
1ec0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
1ed0: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e  voked by the gen
1ee0: 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a  eric IO level. *
1ef0: 20 20 20 20 20 20 20 74 6f 20 73 65 74 20 62 6c         to set bl
1f00: 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c  ocking and nonbl
1f10: 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 20 2a 20  ocking modes. * 
1f20: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66  Results:. *.0 if
1f30: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 72 72   successful, err
1f40: 6e 6f 20 77 68 65 6e 20 66 61 69 6c 65 64 2e 0a  no when failed..
1f50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1f60: 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20  ts:. *.Sets the 
1f70: 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63  device into bloc
1f80: 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b  king or nonblock
1f90: 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d  ing mode.. *. *-
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
1ff0: 6e 74 0a 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50  nt.TlsBlockModeP
2000: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
2010: 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20  nstanceData,./* 
2020: 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f  Socket state. */
2030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2040: 20 20 69 6e 74 20 6d 6f 64 65 29 09 09 09 2f 2a    int mode).../*
2050: 20 54 68 65 20 6d 6f 64 65 20 74 6f 20 73 65 74   The mode to set
2060: 2e 20 43 61 6e 20 62 65 20 6f 6e 65 20 6f 66 0a  . Can be one of.
2070: 09 09 09 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 45  ......* TCL_MODE
2080: 5f 42 4c 4f 43 4b 49 4e 47 20 6f 72 0a 09 09 09  _BLOCKING or....
2090: 09 09 09 2a 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f  ...* TCL_MODE_NO
20a0: 4e 42 4c 4f 43 4b 49 4e 47 2e 20 2a 2f 0a 7b 0a  NBLOCKING. */.{.
20b0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
20c0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
20d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20  instanceData;.. 
20e0: 20 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54     if (mode == T
20f0: 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b  CL_MODE_NONBLOCK
2100: 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72  ING) {..statePtr
2110: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
2120: 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20  CL_ASYNC;.    } 
2130: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72  else {..statePtr
2140: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53  ->flags &= ~(TLS
2150: 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20  _TCL_ASYNC);.   
2160: 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e   }.    if (chann
2170: 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d  elTypeVersion ==
2180: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TLS_CHANNEL_VER
2190: 53 49 4f 4e 5f 32 29 20 7b 0a 09 72 65 74 75 72  SION_2) {..retur
21a0: 6e 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  n 0;.    } else 
21b0: 7b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 53 65  {..return Tcl_Se
21c0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 73  tChannelOption(s
21d0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
21e0: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73   Tls_GetParent(s
21f0: 74 61 74 65 50 74 72 29 2c 0a 09 09 22 2d 62 6c  tatePtr),..."-bl
2200: 6f 63 6b 69 6e 67 22 2c 20 28 6d 6f 64 65 20 3d  ocking", (mode =
2210: 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c  = TCL_MODE_NONBL
2220: 4f 43 4b 49 4e 47 29 20 3f 20 22 30 22 20 3a 20  OCKING) ? "0" : 
2230: 22 31 22 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  "1");.    }.}...
2240: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2290: 6c 73 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20  lsCloseProc --. 
22a0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
22b0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ure is invoked b
22c0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
22d0: 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72   level to perfor
22e0: 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70  m. *.channel-typ
22f0: 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e  e-specific clean
2300: 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f  up when a SSL so
2310: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
2320: 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 2e  el. *.is closed.
2330: 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a 20 77 65 20  . *. *.Note: we 
2340: 6c 65 61 76 65 20 74 68 65 20 75 6e 64 65 72 6c  leave the underl
2350: 79 69 6e 67 20 73 6f 63 6b 65 74 20 61 6c 6f 6e  ying socket alon
2360: 65 2c 20 69 73 20 74 68 69 73 20 72 69 67 68 74  e, is this right
2370: 3f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  ?. *. * Results:
2380: 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 73 73  . *.0 if success
2390: 66 75 6c 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  ful, the value o
23a0: 66 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  f Tcl_GetErrno()
23b0: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20   if failed.. *. 
23c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
23d0: 20 2a 09 43 6c 6f 73 65 73 20 74 68 65 20 73 6f   *.Closes the so
23e0: 63 6b 65 74 20 6f 66 20 74 68 65 20 63 68 61 6e  cket of the chan
23f0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73  /.static int.Tls
2450: 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74  CloseProc(Client
2460: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
2470: 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74  a,./* The socket
2480: 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 20 20   to close. */.  
2490: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
24a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 09 2f  nterp *interp)./
24b0: 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70 6f  * For error repo
24c0: 72 74 69 6e 67 20 2d 20 75 6e 75 73 65 64 2e 20  rting - unused. 
24d0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
24e0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
24f0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
2500: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
2510: 73 74 64 65 72 72 2c 22 5c 6e 54 6c 73 43 6c 6f  stderr,"\nTlsClo
2520: 73 65 50 72 6f 63 28 30 78 25 78 29 22 2c 20 28  seProc(0x%x)", (
2530: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74  unsigned int) st
2540: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66  atePtr);..    if
2550: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72   (channelTypeVer
2560: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e  sion == TLS_CHAN
2570: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 29 20 7b  NEL_VERSION_1) {
2580: 0a 09 2f 2a 0a 09 20 2a 20 52 65 6d 6f 76 65 20  ../*.. * Remove 
2590: 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 20 74 6f  event handler to
25a0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e   underlying chan
25b0: 6e 65 6c 2c 20 74 68 69 73 20 63 6f 75 6c 64 0a  nel, this could.
25c0: 09 20 2a 20 62 65 20 62 65 63 61 75 73 65 20 77  . * be because w
25d0: 65 20 61 72 65 20 63 6c 6f 73 69 6e 67 20 66 6f  e are closing fo
25e0: 72 20 72 65 61 6c 2c 20 6f 72 20 62 65 69 6e 67  r real, or being
25f0: 20 22 75 6e 73 74 61 63 6b 65 64 22 2e 0a 09 20   "unstacked"... 
2600: 2a 2f 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 43  */...Tcl_DeleteC
2610: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 6c  hannelHandler(Tl
2620: 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74  s_GetParent(stat
2630: 65 50 74 72 29 2c 0a 09 09 54 6c 73 43 68 61 6e  ePtr),...TlsChan
2640: 6e 65 6c 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69  nelHandler, (Cli
2650: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
2660: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  r);.    }..    T
2670: 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74  ls_Clean(statePt
2680: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e  r);.    Tcl_Even
2690: 74 75 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 65  tuallyFree((Clie
26a0: 6e 74 44 61 74 61 29 73 74 61 74 65 50 74 72 2c  ntData)statePtr,
26b0: 20 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 20   Tls_Free);.    
26c0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
26d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2720: 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d  * TlsInputProc -
2730: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
2740: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
2750: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
2760: 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20   IO level. *    
2770: 20 20 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74     to read input
2780: 20 66 72 6f 6d 20 61 20 53 53 4c 20 73 6f 63 6b   from a SSL sock
2790: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
27a0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
27b0: 0a 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f  . *.The number o
27c0: 66 20 62 79 74 65 73 20 72 65 61 64 20 69 73 20  f bytes read is 
27d0: 72 65 74 75 72 6e 65 64 20 6f 72 20 2d 31 20 6f  returned or -1 o
27e0: 6e 20 65 72 72 6f 72 2e 20 41 6e 20 6f 75 74 70  n error. An outp
27f0: 75 74 0a 20 2a 09 61 72 67 75 6d 65 6e 74 20 63  ut. *.argument c
2800: 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 4f 53 49  ontains the POSI
2810: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  X error code on 
2820: 65 72 72 6f 72 2c 20 6f 72 20 7a 65 72 6f 20 69  error, or zero i
2830: 66 20 6e 6f 0a 20 2a 09 65 72 72 6f 72 20 6f 63  f no. *.error oc
2840: 63 75 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 53 69  curred.. *. * Si
2850: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52  de effects:. *.R
2860: 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f 6d 20  eads input from 
2870: 74 68 65 20 69 6e 70 75 74 20 64 65 76 69 63 65  the input device
2880: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e   of the channel.
2890: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
28e0: 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 49 6e 70  tatic int.TlsInp
28f0: 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  utProc(ClientDat
2900: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09  a instanceData,.
2910: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e  /* Socket state.
2920: 20 2a 2f 0a 09 63 68 61 72 20 2a 62 75 66 2c 09   */..char *buf,.
2930: 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74  ../* Where to st
2940: 6f 72 65 20 64 61 74 61 20 72 65 61 64 2e 20 2a  ore data read. *
2950: 2f 0a 09 69 6e 74 20 62 75 66 53 69 7a 65 2c 09  /..int bufSize,.
2960: 09 09 2f 2a 20 48 6f 77 20 6d 75 63 68 20 73 70  ../* How much sp
2970: 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2980: 0a 09 09 09 09 09 20 2a 20 69 6e 20 74 68 65 20  ...... * in the 
2990: 62 75 66 66 65 72 3f 20 2a 2f 0a 09 69 6e 74 20  buffer? */..int 
29a0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 09  *errorCodePtr)..
29b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72  /* Where to stor
29c0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f  e error code. */
29d0: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
29e0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
29f0: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  *) instanceData;
2a00: 0a 20 20 20 20 69 6e 74 20 62 79 74 65 73 52 65  .    int bytesRe
2a10: 61 64 3b 09 09 09 2f 2a 20 48 6f 77 20 6d 61 6e  ad;.../* How man
2a20: 79 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  y bytes were rea
2a30: 64 3f 20 2a 2f 0a 0a 20 20 20 20 2a 65 72 72 6f  d? */..    *erro
2a40: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20  rCodePtr = 0;.. 
2a50: 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72     dprintf(stder
2a60: 72 2c 22 5c 6e 42 49 4f 5f 72 65 61 64 28 25 64  r,"\nBIO_read(%d
2a70: 29 22 2c 20 62 75 66 53 69 7a 65 29 3b 0a 0a 20  )", bufSize);.. 
2a80: 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69     if (!SSL_is_i
2a90: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61  nit_finished(sta
2aa0: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09  tePtr->ssl)) {..
2ab0: 62 79 74 65 73 52 65 61 64 20 3d 20 54 6c 73 5f  bytesRead = Tls_
2ac0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73  WaitForConnect(s
2ad0: 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f  tatePtr, errorCo
2ae0: 64 65 50 74 72 29 3b 0a 09 69 66 20 28 62 79 74  dePtr);..if (byt
2af0: 65 73 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09  esRead <= 0) {..
2b00: 20 20 20 20 67 6f 74 6f 20 69 6e 70 75 74 3b 0a      goto input;.
2b10: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .}.    }.    if 
2b20: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
2b30: 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29   & TLS_TCL_INIT)
2b40: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c   {..statePtr->fl
2b50: 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c  ags &= ~(TLS_TCL
2b60: 5f 49 4e 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20  _INIT);.    }.  
2b70: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e    /*.     * We n
2b80: 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65  eed to clear the
2b90: 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63 6b   SSL error stack
2ba0: 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65 20   now because we 
2bb0: 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68 0a  sometimes reach.
2bc0: 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e 63       * this func
2bd0: 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f 76  tion with leftov
2be0: 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  er errors in the
2bf0: 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f   stack.  If BIO_
2c00: 72 65 61 64 0a 20 20 20 20 20 2a 20 72 65 74 75  read.     * retu
2c10: 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e  rns -1 and inten
2c20: 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65  ds EAGAIN, there
2c30: 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65   is a leftover e
2c40: 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65  rror, it will be
2c50: 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74  .     * misconst
2c60: 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72  rued as an error
2c70: 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20  , not EAGAIN..  
2c80: 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65     *.     * Alte
2c90: 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61  rnatively, we ma
2ca0: 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65  y want to handle
2cb0: 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63   the <0 return c
2cc0: 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a  odes from.     *
2cd0: 20 42 49 4f 5f 72 65 61 64 20 73 70 65 63 69 61   BIO_read specia
2ce0: 6c 6c 79 20 28 61 73 20 61 64 76 69 73 65 64 20  lly (as advised 
2cf0: 69 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73 29  in the RSA docs)
2d00: 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c  .  TLS's lower l
2d10: 65 76 65 6c 20 42 49 4f 0a 20 20 20 20 20 2a 20  evel BIO.     * 
2d20: 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77  functions play w
2d30: 69 74 68 20 74 68 65 20 72 65 74 72 79 20 66 6c  ith the retry fl
2d40: 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20  ags though, and 
2d50: 74 68 69 73 20 73 65 65 6d 73 20 74 6f 20 77 6f  this seems to wo
2d60: 72 6b 0a 20 20 20 20 20 2a 20 63 6f 72 72 65 63  rk.     * correc
2d70: 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69  tly.  Similar fi
2d80: 78 20 69 6e 20 54 6c 73 4f 75 74 70 75 74 50 72  x in TlsOutputPr
2d90: 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 20  oc. - hobbs.    
2da0: 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   */.    ERR_clea
2db0: 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 62  r_error();.    b
2dc0: 79 74 65 73 52 65 61 64 20 3d 20 42 49 4f 5f 72  ytesRead = BIO_r
2dd0: 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ead(statePtr->bi
2de0: 6f 2c 20 62 75 66 2c 20 62 75 66 53 69 7a 65 29  o, buf, bufSize)
2df0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74  ;.    dprintf(st
2e00: 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 72 65 61 64  derr,"\nBIO_read
2e10: 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52 65   -> %d", bytesRe
2e20: 61 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 62 79  ad);..    if (by
2e30: 74 65 73 52 65 61 64 20 3c 20 30 29 20 7b 0a 09  tesRead < 0) {..
2e40: 69 6e 74 20 65 72 72 20 3d 20 53 53 4c 5f 67 65  int err = SSL_ge
2e50: 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72  t_error(statePtr
2e60: 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64  ->ssl, bytesRead
2e70: 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 3d 3d 20  );...if (err == 
2e80: 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 29 20 7b  SSL_ERROR_SSL) {
2e90: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28  ..    Tls_Error(
2ea0: 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52  statePtr, SSL_ER
2eb0: 52 4f 52 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ROR(statePtr->ss
2ec0: 6c 2c 20 62 79 74 65 73 52 65 61 64 29 29 3b 0a  l, bytesRead));.
2ed0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
2ee0: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45  tr = ECONNABORTE
2ef0: 44 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 42  D;..} else if (B
2f00: 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28  IO_should_retry(
2f10: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20  statePtr->bio)) 
2f20: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 73  {..    dprintf(s
2f30: 74 64 65 72 72 2c 22 52 45 21 20 22 29 3b 0a 09  tderr,"RE! ");..
2f40: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2f50: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 7d 20 65  r = EAGAIN;..} e
2f60: 6c 73 65 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f  lse {..    *erro
2f70: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
2f80: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20  etErrno();..    
2f90: 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 74  if (*errorCodePt
2fa0: 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29  r == ECONNRESET)
2fb0: 20 7b 0a 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46   {.../* Soft EOF
2fc0: 20 2a 2f 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65   */...*errorCode
2fd0: 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73  Ptr = 0;...bytes
2fe0: 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d  Read = 0;..    }
2ff0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e  ..}.    }.    in
3000: 70 75 74 3a 0a 20 20 20 20 64 70 72 69 6e 74 66  put:.    dprintf
3010: 28 73 74 64 65 72 72 2c 20 22 5c 6e 49 6e 70 75  (stderr, "\nInpu
3020: 74 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 64 5d  t(%d) -> %d [%d]
3030: 22 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 74 65  ", bufSize, byte
3040: 73 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 6f 64  sRead, *errorCod
3050: 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ePtr);.    retur
3060: 6e 20 62 79 74 65 73 52 65 61 64 3b 0a 7d 0a 0c  n bytesRead;.}..
3070: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
30c0: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d  TlsOutputProc --
30d0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
30e0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
30f0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
3100: 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20  IO level. *     
3110: 20 20 74 6f 20 77 72 69 74 65 20 6f 75 74 70 75    to write outpu
3120: 74 20 74 6f 20 61 20 53 53 4c 20 73 6f 63 6b 65  t to a SSL socke
3130: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e  t based channel.
3140: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
3150: 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f 66   *.The number of
3160: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 69   bytes written i
3170: 73 20 72 65 74 75 72 6e 65 64 2e 20 41 6e 20 6f  s returned. An o
3180: 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 69  utput argument i
3190: 73 0a 20 2a 09 73 65 74 20 74 6f 20 61 20 50 4f  s. *.set to a PO
31a0: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  SIX error code i
31b0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
31c0: 72 65 64 2c 20 6f 72 20 7a 65 72 6f 2e 0a 20 2a  red, or zero.. *
31d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
31e0: 3a 0a 20 2a 09 57 72 69 74 65 73 20 6f 75 74 70  :. *.Writes outp
31f0: 75 74 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74  ut on the output
3200: 20 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63   device of the c
3210: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
3270: 0a 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 28 43  .TlsOutputProc(C
3280: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
3290: 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65  ceData,./* Socke
32a0: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20  t state. */.    
32b0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 20            CONST 
32c0: 63 68 61 72 20 2a 62 75 66 2c 09 09 2f 2a 20 54  char *buf,../* T
32d0: 68 65 20 64 61 74 61 20 62 75 66 66 65 72 2e 20  he data buffer. 
32e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
32f0: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 09 09 2f   int toWrite,../
3300: 2a 20 48 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  * How many bytes
3310: 20 74 6f 20 77 72 69 74 65 3f 20 2a 2f 0a 20 20   to write? */.  
3320: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
3330: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 2f  *errorCodePtr)./
3340: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65  * Where to store
3350: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a   error code. */.
3360: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
3370: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
3380: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
3390: 20 20 20 20 69 6e 74 20 77 72 69 74 74 65 6e 2c      int written,
33a0: 20 65 72 72 3b 0a 0a 20 20 20 20 2a 65 72 72 6f   err;..    *erro
33b0: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20  rCodePtr = 0;.. 
33c0: 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72     dprintf(stder
33d0: 72 2c 22 5c 6e 42 49 4f 5f 77 72 69 74 65 28 30  r,"\nBIO_write(0
33e0: 78 25 78 2c 20 25 64 29 22 2c 20 28 75 6e 73 69  x%x, %d)", (unsi
33f0: 67 6e 65 64 20 69 6e 74 29 20 73 74 61 74 65 50  gned int) stateP
3400: 74 72 2c 20 74 6f 57 72 69 74 65 29 3b 0a 0a 20  tr, toWrite);.. 
3410: 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69     if (!SSL_is_i
3420: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61  nit_finished(sta
3430: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09  tePtr->ssl)) {..
3440: 77 72 69 74 74 65 6e 20 3d 20 54 6c 73 5f 57 61  written = Tls_Wa
3450: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61  itForConnect(sta
3460: 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65  tePtr, errorCode
3470: 50 74 72 29 3b 0a 09 69 66 20 28 77 72 69 74 74  Ptr);..if (writt
3480: 65 6e 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  en <= 0) {..    
3490: 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 09 7d 0a  goto output;..}.
34a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
34b0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
34c0: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a  TLS_TCL_INIT) {.
34d0: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  .statePtr->flags
34e0: 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 49 4e   &= ~(TLS_TCL_IN
34f0: 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  IT);.    }.    i
3500: 66 20 28 74 6f 57 72 69 74 65 20 3d 3d 20 30 29  f (toWrite == 0)
3510: 20 7b 0a 09 64 70 72 69 6e 74 66 28 73 74 64 65   {..dprintf(stde
3520: 72 72 2c 20 22 7a 65 72 6f 2d 77 72 69 74 65 5c  rr, "zero-write\
3530: 6e 22 29 3b 0a 09 42 49 4f 5f 66 6c 75 73 68 28  n");..BIO_flush(
3540: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
3550: 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 67  .written = 0;..g
3560: 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 20 20 20 20  oto output;.    
3570: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a  } else {../*.. *
3580: 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61   We need to clea
3590: 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20  r the SSL error 
35a0: 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73  stack now becaus
35b0: 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72  e we sometimes r
35c0: 65 61 63 68 0a 09 20 2a 20 74 68 69 73 20 66 75  each.. * this fu
35d0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74  nction with left
35e0: 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74  over errors in t
35f0: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49  he stack.  If BI
3600: 4f 5f 77 72 69 74 65 0a 09 20 2a 20 72 65 74 75  O_write.. * retu
3610: 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e  rns -1 and inten
3620: 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65  ds EAGAIN, there
3630: 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65   is a leftover e
3640: 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65  rror, it will be
3650: 0a 09 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65  .. * misconstrue
3660: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e  d as an error, n
3670: 6f 74 20 45 41 47 41 49 4e 2e 0a 09 20 2a 0a 09  ot EAGAIN... *..
3680: 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79   * Alternatively
3690: 2c 20 77 65 20 6d 61 79 20 77 61 6e 74 20 74 6f  , we may want to
36a0: 20 68 61 6e 64 6c 65 20 74 68 65 20 3c 30 20 72   handle the <0 r
36b0: 65 74 75 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d  eturn codes from
36c0: 0a 09 20 2a 20 42 49 4f 5f 77 72 69 74 65 20 73  .. * BIO_write s
36d0: 70 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76  pecially (as adv
36e0: 69 73 65 64 20 69 6e 20 74 68 65 20 52 53 41 20  ised in the RSA 
36f0: 64 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f  docs).  TLS's lo
3700: 77 65 72 20 6c 65 76 65 6c 0a 09 20 2a 20 42 49  wer level.. * BI
3710: 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79  O functions play
3720: 20 77 69 74 68 20 74 68 65 20 72 65 74 72 79 20   with the retry 
3730: 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e  flags though, an
3740: 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f 0a  d this seems to.
3750: 09 20 2a 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  . * work correct
3760: 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78  ly.  Similar fix
3770: 20 69 6e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63   in TlsInputProc
3780: 2e 20 2d 20 68 6f 62 62 73 0a 09 20 2a 2f 0a 09  . - hobbs.. */..
3790: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
37a0: 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 42 49  );..written = BI
37b0: 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72  O_write(statePtr
37c0: 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72  ->bio, buf, toWr
37d0: 69 74 65 29 3b 0a 09 64 70 72 69 6e 74 66 28 73  ite);..dprintf(s
37e0: 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 77 72 69  tderr,"\nBIO_wri
37f0: 74 65 28 30 78 25 78 2c 20 25 64 29 20 2d 3e 20  te(0x%x, %d) -> 
3800: 5b 25 64 5d 22 2c 0a 09 09 28 75 6e 73 69 67 6e  [%d]",...(unsign
3810: 65 64 20 69 6e 74 29 20 73 74 61 74 65 50 74 72  ed int) statePtr
3820: 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74  , toWrite, writt
3830: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  en);.    }.    i
3840: 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29  f (written <= 0)
3850: 20 7b 0a 09 73 77 69 74 63 68 20 28 28 65 72 72   {..switch ((err
3860: 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72   = SSL_get_error
3870: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
3880: 77 72 69 74 74 65 6e 29 29 29 20 7b 0a 09 20 20  written))) {..  
3890: 20 20 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52    case SSL_ERROR
38a0: 5f 4e 4f 4e 45 3a 0a 09 09 69 66 20 28 77 72 69  _NONE:...if (wri
38b0: 74 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09 20 20  tten < 0) {...  
38c0: 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09    written = 0;..
38d0: 09 7d 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  .}...break;..   
38e0: 20 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f   case SSL_ERROR_
38f0: 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 09 64 70  WANT_WRITE:...dp
3900: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 77  rintf(stderr," w
3910: 72 69 74 65 20 57 20 42 4c 4f 43 4b 22 29 3b 0a  rite W BLOCK");.
3920: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
3930: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e  se SSL_ERROR_WAN
3940: 54 5f 52 45 41 44 3a 0a 09 09 64 70 72 69 6e 74  T_READ:...dprint
3950: 66 28 73 74 64 65 72 72 2c 22 20 77 72 69 74 65  f(stderr," write
3960: 20 52 20 42 4c 4f 43 4b 22 29 3b 0a 09 09 62 72   R BLOCK");...br
3970: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 53  eak;..    case S
3980: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35  SL_ERROR_WANT_X5
3990: 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 09 64 70 72  09_LOOKUP:...dpr
39a0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 77 72  intf(stderr," wr
39b0: 69 74 65 20 58 20 42 4c 4f 43 4b 22 29 3b 0a 09  ite X BLOCK");..
39c0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
39d0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f  e SSL_ERROR_ZERO
39e0: 5f 52 45 54 55 52 4e 3a 0a 09 09 64 70 72 69 6e  _RETURN:...dprin
39f0: 74 66 28 73 74 64 65 72 72 2c 22 20 63 6c 6f 73  tf(stderr," clos
3a00: 65 64 5c 6e 22 29 3b 0a 09 09 77 72 69 74 74 65  ed\n");...writte
3a10: 6e 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a  n = 0;...break;.
3a20: 09 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52  .    case SSL_ER
3a30: 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 09 2a  ROR_SYSCALL:...*
3a40: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54  errorCodePtr = T
3a50: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09  cl_GetErrno();..
3a60: 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .dprintf(stderr,
3a70: 22 20 5b 25 64 5d 20 73 79 73 63 61 6c 6c 20 65  " [%d] syscall e
3a80: 72 72 72 3a 20 25 64 22 2c 0a 09 09 09 77 72 69  rrr: %d",....wri
3a90: 74 74 65 6e 2c 20 2a 65 72 72 6f 72 43 6f 64 65  tten, *errorCode
3aa0: 50 74 72 29 3b 0a 09 09 77 72 69 74 74 65 6e 20  Ptr);...written 
3ab0: 3d 20 2d 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  = -1;...break;..
3ac0: 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52 52      case SSL_ERR
3ad0: 4f 52 5f 53 53 4c 3a 0a 09 09 54 6c 73 5f 45 72  OR_SSL:...Tls_Er
3ae0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53 53  ror(statePtr, SS
3af0: 4c 5f 45 52 52 4f 52 28 73 74 61 74 65 50 74 72  L_ERROR(statePtr
3b00: 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 6e 29 29  ->ssl, written))
3b10: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ;...*errorCodePt
3b20: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44  r = ECONNABORTED
3b30: 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31  ;...written = -1
3b40: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
3b50: 64 65 66 61 75 6c 74 3a 0a 09 09 64 70 72 69 6e  default:...dprin
3b60: 74 66 28 73 74 64 65 72 72 2c 22 20 75 6e 6b 6e  tf(stderr," unkn
3b70: 6f 77 6e 20 65 72 72 3a 20 25 64 5c 6e 22 2c 20  own err: %d\n", 
3b80: 65 72 72 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  err);...break;..
3b90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70  }.    }.    outp
3ba0: 75 74 3a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ut:.    dprintf(
3bb0: 73 74 64 65 72 72 2c 20 22 5c 6e 4f 75 74 70 75  stderr, "\nOutpu
3bc0: 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f  t(%d) -> %d", to
3bd0: 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 3b  Write, written);
3be0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 72 69 74  .    return writ
3bf0: 74 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ten;.}.../*. *--
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c20: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 4f 70  -. *. * TlsGetOp
3c50: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tionProc --. *. 
3c60: 2a 09 43 6f 6d 70 75 74 65 73 20 61 6e 20 6f 70  *.Computes an op
3c70: 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  tion value for a
3c80: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
3c90: 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a  d channel, or a.
3ca0: 20 2a 09 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f   *.list of all o
3cb0: 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72  ptions and their
3cc0: 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a 20 52   values.. *. * R
3cd0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
3ce0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
3cf0: 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74  . The value of t
3d00: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 70 74  he specified opt
3d10: 69 6f 6e 20 6f 72 20 61 0a 20 2a 09 6c 69 73 74  ion or a. *.list
3d20: 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20   of all options 
3d30: 61 6e 64 09 74 68 65 69 72 20 76 61 6c 75 65 73  and.their values
3d40: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20   is returned in 
3d50: 74 68 65 0a 20 2a 09 73 75 70 70 6c 69 65 64 20  the. *.supplied 
3d60: 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53  DString.. *. * S
3d70: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3d80: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
3d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3dd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c  */.static int.Tl
3de0: 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43  sGetOptionProc(C
3df0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
3e00: 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65  ceData,./* Socke
3e10: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 09 54 63 6c  t state. */..Tcl
3e20: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3e30: 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20  ../* For errors 
3e40: 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a  - can be NULL. *
3e50: 2f 0a 09 43 4f 4e 53 54 20 63 68 61 72 20 2a 6f  /..CONST char *o
3e60: 70 74 69 6f 6e 4e 61 6d 65 2c 09 09 2f 2a 20 4e  ptionName,../* N
3e70: 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f  ame of the optio
3e80: 6e 20 74 6f 0a 09 09 09 09 09 20 2a 20 72 65 74  n to...... * ret
3e90: 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 65 20  rieve the value 
3ea0: 66 6f 72 2c 20 6f 72 0a 09 09 09 09 09 20 2a 20  for, or...... * 
3eb0: 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20  NULL to get all 
3ec0: 6f 70 74 69 6f 6e 73 20 61 6e 64 0a 09 09 09 09  options and.....
3ed0: 09 20 2a 20 74 68 65 69 72 20 76 61 6c 75 65 73  . * their values
3ee0: 2e 20 2a 2f 0a 09 54 63 6c 5f 44 53 74 72 69 6e  . */..Tcl_DStrin
3ef0: 67 20 2a 64 73 50 74 72 29 09 09 2f 2a 20 57 68  g *dsPtr)../* Wh
3f00: 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ere to store the
3f10: 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 0a   computed value.
3f20: 09 09 09 09 09 20 2a 20 69 6e 69 74 69 61 6c 69  ..... * initiali
3f30: 7a 65 64 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a  zed by caller. *
3f40: 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  /.{.    State *s
3f50: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
3f60: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
3f70: 3b 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e  ;..    if (chann
3f80: 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d  elTypeVersion ==
3f90: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TLS_CHANNEL_VER
3fa0: 53 49 4f 4e 5f 32 29 20 7b 0a 09 54 63 6c 5f 43  SION_2) {..Tcl_C
3fb0: 68 61 6e 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20  hannel downChan 
3fc0: 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28  = Tls_GetParent(
3fd0: 73 74 61 74 65 50 74 72 29 3b 0a 09 54 63 6c 5f  statePtr);..Tcl_
3fe0: 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e 50  DriverGetOptionP
3ff0: 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72  roc *getOptionPr
4000: 6f 63 3b 0a 0a 09 67 65 74 4f 70 74 69 6f 6e 50  oc;...getOptionP
4010: 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65  roc = Tcl_Channe
4020: 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54  lGetOptionProc(T
4030: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
4040: 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b 0a 09 69  e(downChan));..i
4050: 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63  f (getOptionProc
4060: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
4070: 20 72 65 74 75 72 6e 20 28 2a 67 65 74 4f 70 74   return (*getOpt
4080: 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74  ionProc)(Tcl_Get
4090: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
40a0: 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 0a 09  ata(downChan),..
40b0: 09 20 20 20 20 69 6e 74 65 72 70 2c 20 6f 70 74  .    interp, opt
40c0: 69 6f 6e 4e 61 6d 65 2c 20 64 73 50 74 72 29 3b  ionName, dsPtr);
40d0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74  ..} else if (opt
40e0: 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72  ionName == (char
40f0: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  *) NULL) {..    
4100: 2f 2a 0a 09 20 20 20 20 20 2a 20 52 65 71 75 65  /*..     * Reque
4110: 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20  st is query for 
4120: 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69  all options, thi
4130: 73 20 69 73 20 6f 6b 2e 0a 09 20 20 20 20 20 2a  s is ok...     *
4140: 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  /..    return TC
4150: 4c 5f 4f 4b 3b 0a 09 7d 0a 09 2f 2a 0a 09 20 2a  L_OK;..}../*.. *
4160: 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73   Request for a s
4170: 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68  pecific option h
4180: 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64  as to fail, we d
4190: 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 09  on't have any...
41a0: 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f   */..return TCL_
41b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73  ERROR;.    } els
41c0: 65 20 7b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 20  e {..size_t len 
41d0: 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 70 74 69 6f  = 0;...if (optio
41e0: 6e 4e 61 6d 65 20 21 3d 20 28 63 68 61 72 20 2a  nName != (char *
41f0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6c  ) NULL) {..    l
4200: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 70 74 69  en = strlen(opti
4210: 6f 6e 4e 61 6d 65 29 3b 0a 09 7d 0a 23 69 66 20  onName);..}.#if 
4220: 30 0a 09 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30  0..if ((len == 0
4230: 29 20 7c 7c 20 28 28 6c 65 6e 20 3e 20 31 29 20  ) || ((len > 1) 
4240: 26 26 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 5b 31  && (optionName[1
4250: 5d 20 3d 3d 20 27 63 27 29 20 26 26 0a 09 09 28  ] == 'c') &&...(
4260: 73 74 72 6e 63 6d 70 28 6f 70 74 69 6f 6e 4e 61  strncmp(optionNa
4270: 6d 65 2c 20 22 2d 63 69 70 68 65 72 22 2c 20 6c  me, "-cipher", l
4280: 65 6e 29 20 3d 3d 20 30 29 29 29 20 7b 0a 09 20  en) == 0))) {.. 
4290: 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29     if (len == 0)
42a0: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
42b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73  AppendElement(ds
42c0: 50 74 72 2c 20 22 2d 63 69 70 68 65 72 22 29 3b  Ptr, "-cipher");
42d0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
42e0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
42f0: 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 53 53 4c  ement(dsPtr, SSL
4300: 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74  _get_cipher(stat
4310: 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 09 20 20  ePtr->ssl));..  
4320: 20 20 69 66 20 28 6c 65 6e 29 20 7b 0a 09 09 72    if (len) {...r
4330: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20  eturn TCL_OK;.. 
4340: 20 20 20 7d 0a 09 7d 0a 23 65 6e 64 69 66 0a 09     }..}.#endif..
4350: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
4360: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d     }.}.../*. *--
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 61 74 63 68  -. *. * TlsWatch
43c0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e  Proc --. *. *.In
43d0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74  itialize the not
43e0: 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 54  ifier to watch T
43f0: 63 6c 5f 46 69 6c 65 73 20 66 72 6f 6d 20 74 68  cl_Files from th
4400: 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  is channel.. *. 
4410: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
4420: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
4430: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20  ffects:. *.Sets 
4440: 75 70 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  up the notifier 
4450: 73 6f 20 74 68 61 74 20 61 20 66 75 74 75 72 65  so that a future
4460: 20 65 76 65 6e 74 20 6f 6e 20 74 68 65 20 63 68   event on the ch
4470: 61 6e 6e 65 6c 0a 20 2a 09 77 69 6c 6c 20 62 65  annel. *.will be
4480: 20 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20 2a   seen by Tcl.. *
4490: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
44e0: 69 63 20 76 6f 69 64 0a 54 6c 73 57 61 74 63 68  ic void.TlsWatch
44f0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
4500: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a  instanceData,./*
4510: 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74   The socket stat
4520: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
4530: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f     int mask).../
4540: 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65  * Events of inte
4550: 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 0a 20  rest; an OR-ed. 
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 20 20 20 2a 20 63 6f 6d 62 69 6e          * combin
4590: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41  ation of TCL_REA
45a0: 44 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  DABLE,.         
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 2a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61  * TCL_WRITABLE a
45e0: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e  nd TCL_EXCEPTION
45f0: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65  . */.{.    State
4600: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
4610: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44  ate *) instanceD
4620: 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 63 68  ata;..    if (ch
4630: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e  annelTypeVersion
4640: 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f   == TLS_CHANNEL_
4650: 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 54 63  VERSION_2) {..Tc
4660: 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64 6f  l_Channel     do
4670: 77 6e 43 68 61 6e 3b 0a 0a 09 73 74 61 74 65 50  wnChan;...stateP
4680: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20  tr->watchMask = 
4690: 6d 61 73 6b 3b 0a 0a 09 2f 2a 20 4e 6f 20 63 68  mask;.../* No ch
46a0: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 61  annel handlers a
46b0: 6e 79 20 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c  ny more. We will
46c0: 20 62 65 20 6e 6f 74 69 66 69 65 64 20 61 75 74   be notified aut
46d0: 6f 6d 61 74 69 63 61 6c 6c 79 0a 09 20 2a 20 61  omatically.. * a
46e0: 62 6f 75 74 20 65 76 65 6e 74 73 20 6f 6e 20 74  bout events on t
46f0: 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77  he channel below
4700: 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f   via a call to o
4710: 75 72 0a 09 20 2a 20 27 54 72 61 6e 73 66 6f 72  ur.. * 'Transfor
4720: 6d 4e 6f 74 69 66 79 50 72 6f 63 27 2e 20 42 75  mNotifyProc'. Bu
4730: 74 20 77 65 20 68 61 76 65 20 74 6f 20 70 61 73  t we have to pas
4740: 73 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 64  s the interest d
4750: 6f 77 6e 20 6e 6f 77 2e 0a 09 20 2a 20 57 65 20  own now... * We 
4760: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61  are allowed to a
4770: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 27 69  dd additional 'i
4780: 6e 74 65 72 65 73 74 27 20 74 6f 20 74 68 65 20  nterest' to the 
4790: 6d 61 73 6b 20 69 66 20 77 65 20 77 61 6e 74 0a  mask if we want.
47a0: 09 20 2a 20 74 6f 2e 20 42 75 74 20 74 68 69 73  . * to. But this
47b0: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
47c0: 68 61 73 20 6e 6f 20 73 75 63 68 20 69 6e 74 65  has no such inte
47d0: 72 65 73 74 2e 20 49 74 20 6a 75 73 74 20 70 61  rest. It just pa
47e0: 73 73 65 73 0a 09 20 2a 20 74 68 65 20 72 65 71  sses.. * the req
47f0: 75 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61  uest down, uncha
4800: 6e 67 65 64 2e 0a 09 20 2a 2f 0a 0a 09 64 6f 77  nged... */...dow
4810: 6e 43 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50  nChan = Tls_GetP
4820: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 3b  arent(statePtr);
4830: 0a 0a 09 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  ...(Tcl_GetChann
4840: 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29  elType(downChan)
4850: 29 0a 09 20 20 20 20 2d 3e 77 61 74 63 68 50 72  )..    ->watchPr
4860: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  oc(Tcl_GetChanne
4870: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 6f  lInstanceData(do
4880: 77 6e 43 68 61 6e 29 2c 20 6d 61 73 6b 29 3b 0a  wnChan), mask);.
4890: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6e 61 67 65 6d  ../*.. * Managem
48a0: 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72  ent of the inter
48b0: 6e 61 6c 20 74 69 6d 65 72 2e 0a 09 20 2a 2f 0a  nal timer... */.
48c0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
48d0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
48e0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
48f0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 6c 65 74  {..    Tcl_Delet
4900: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
4910: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
4920: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74  .    statePtr->t
4930: 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65  imer = (Tcl_Time
4940: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 09 7d  rToken) NULL;..}
4950: 0a 09 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43  ..if ((mask & TC
4960: 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 54  L_READABLE) && T
4970: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
4980: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4990: 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a   > 0) {..    /*.
49a0: 09 20 20 20 20 20 2a 20 54 68 65 72 65 20 69 73  .     * There is
49b0: 20 69 6e 74 65 72 65 73 74 20 69 6e 20 72 65 61   interest in rea
49c0: 64 61 62 6c 65 20 65 76 65 6e 74 73 20 61 6e 64  dable events and
49d0: 20 77 65 20 61 63 74 75 61 6c 6c 79 20 68 61 76   we actually hav
49e0: 65 0a 09 20 20 20 20 20 2a 20 64 61 74 61 20 77  e..     * data w
49f0: 61 69 74 69 6e 67 2c 20 73 6f 20 67 65 6e 65 72  aiting, so gener
4a00: 61 74 65 20 61 20 74 69 6d 65 72 20 74 6f 20 66  ate a timer to f
4a10: 6c 75 73 68 20 74 68 61 74 2e 0a 09 20 20 20 20  lush that...    
4a20: 20 2a 2f 0a 09 20 20 20 20 73 74 61 74 65 50 74   */..    statePt
4a30: 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43  r->timer = Tcl_C
4a40: 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  reateTimerHandle
4a50: 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c  r(TLS_TCL_DELAY,
4a60: 0a 09 09 20 20 20 20 54 6c 73 43 68 61 6e 6e 65  ...    TlsChanne
4a70: 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28  lHandlerTimer, (
4a80: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
4a90: 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 20  ePtr);..}.    } 
4aa0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 6d 61 73 6b  else {..if (mask
4ab0: 20 3d 3d 20 73 74 61 74 65 50 74 72 2d 3e 77 61   == statePtr->wa
4ac0: 74 63 68 4d 61 73 6b 29 0a 09 20 20 20 20 72 65  tchMask)..    re
4ad0: 74 75 72 6e 3b 0a 0a 09 69 66 20 28 73 74 61 74  turn;...if (stat
4ae0: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29  ePtr->watchMask)
4af0: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20   {..    /*..    
4b00: 20 2a 20 52 65 6d 6f 76 65 20 65 76 65 6e 74 20   * Remove event 
4b10: 68 61 6e 64 6c 65 72 20 74 6f 20 75 6e 64 65 72  handler to under
4b20: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2c 20 74  lying channel, t
4b30: 68 69 73 20 63 6f 75 6c 64 0a 09 20 20 20 20 20  his could..     
4b40: 2a 20 62 65 20 62 65 63 61 75 73 65 20 77 65 20  * be because we 
4b50: 61 72 65 20 63 6c 6f 73 69 6e 67 20 66 6f 72 20  are closing for 
4b60: 72 65 61 6c 2c 20 6f 72 20 62 65 69 6e 67 20 22  real, or being "
4b70: 75 6e 73 74 61 63 6b 65 64 22 2e 0a 09 20 20 20  unstacked"...   
4b80: 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 44    */...    Tcl_D
4b90: 65 6c 65 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64  eleteChannelHand
4ba0: 6c 65 72 28 54 6c 73 5f 47 65 74 50 61 72 65 6e  ler(Tls_GetParen
4bb0: 74 28 73 74 61 74 65 50 74 72 29 2c 0a 09 09 20  t(statePtr),... 
4bc0: 20 20 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e     TlsChannelHan
4bd0: 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74  dler, (ClientDat
4be0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 7d  a) statePtr);..}
4bf0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63  ..statePtr->watc
4c00: 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 09 69  hMask = mask;..i
4c10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 77 61 74  f (statePtr->wat
4c20: 63 68 4d 61 73 6b 29 20 7b 0a 09 20 20 20 20 2f  chMask) {..    /
4c30: 2a 0a 09 20 20 20 20 20 2a 20 53 65 74 75 70 20  *..     * Setup 
4c40: 61 63 74 69 76 65 20 6d 6f 6e 69 74 6f 72 20 66  active monitor f
4c50: 6f 72 20 65 76 65 6e 74 73 20 6f 6e 20 75 6e 64  or events on und
4c60: 65 72 6c 79 69 6e 67 20 43 68 61 6e 6e 65 6c 2e  erlying Channel.
4c70: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
4c80: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65  Tcl_CreateChanne
4c90: 6c 48 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 74  lHandler(Tls_Get
4ca0: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 29  Parent(statePtr)
4cb0: 2c 0a 09 09 20 20 20 20 73 74 61 74 65 50 74 72  ,...    statePtr
4cc0: 2d 3e 77 61 74 63 68 4d 61 73 6b 2c 20 54 6c 73  ->watchMask, Tls
4cd0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 2c 0a  ChannelHandler,.
4ce0: 09 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74  ..    (ClientDat
4cf0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 7d  a) statePtr);..}
4d00: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74  ---. *. * TlsGet
4d60: 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a  HandleProc --. *
4d70: 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20  . *.Called from 
4d80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 46 69  Tcl_GetChannelFi
4d90: 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 6f  le to retrieve o
4da0: 2f 73 20 66 69 6c 65 20 68 61 6e 64 6c 65 72 0a  /s file handler.
4db0: 20 2a 09 66 72 6f 6d 20 74 68 65 20 53 53 4c 20   *.from the SSL 
4dc0: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
4dd0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nnel.. *. * Resu
4de0: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 70 70 72  lts:. *.The appr
4df0: 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69 6c 65  opriate Tcl_File
4e00: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20   or NULL if not 
4e10: 70 72 65 73 65 6e 74 2e 20 0a 20 2a 0a 20 2a 20  present. . *. * 
4e20: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4e30: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4e80: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54   */.static int.T
4e90: 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 28  lsGetHandleProc(
4ea0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
4eb0: 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54 68 65 20  nceData,./* The 
4ec0: 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f  socket state. */
4ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4ee0: 20 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c    int direction,
4ef0: 09 09 2f 2a 20 57 68 69 63 68 20 54 63 6c 5f 46  ../* Which Tcl_F
4f00: 69 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 3f  ile to retrieve?
4f10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
4f20: 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20       ClientData 
4f30: 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20 57  *handlePtr)./* W
4f40: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68  here to store th
4f50: 65 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 7b 0a  e handle.  */.{.
4f60: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
4f70: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
4f80: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20  instanceData;.. 
4f90: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65     return Tcl_Ge
4fa0: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54  tChannelHandle(T
4fb0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61  ls_GetParent(sta
4fc0: 74 65 50 74 72 29 2c 20 64 69 72 65 63 74 69 6f  tePtr), directio
4fd0: 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d  n, handlePtr);.}
4fe0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
5030: 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20  * TlsNotifyProc 
5040: 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72  --. *. *.Handler
5050: 20 63 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74   called by Tcl t
5060: 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61  o inform us of a
5070: 63 74 69 76 69 74 79 0a 20 2a 09 6f 6e 20 74 68  ctivity. *.on th
5080: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61  e underlying cha
5090: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nnel.. *. * Resu
50a0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  lts:. *.None.. *
50b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
50c0: 3a 0a 20 2a 09 4d 61 79 20 70 72 6f 63 65 73 73  :. *.May process
50d0: 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 65 76   the incoming ev
50e0: 65 6e 74 20 62 79 20 69 74 73 65 6c 66 2e 0a 20  ent by itself.. 
50f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
5140: 74 69 63 20 69 6e 74 0a 54 6c 73 4e 6f 74 69 66  tic int.TlsNotif
5150: 79 50 72 6f 63 28 69 6e 73 74 61 6e 63 65 44 61  yProc(instanceDa
5160: 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20 20 43 6c  ta, mask).    Cl
5170: 69 65 6e 74 44 61 74 61 09 20 20 20 69 6e 73 74  ientData.   inst
5180: 61 6e 63 65 44 61 74 61 3b 20 2f 2a 20 54 68 65  anceData; /* The
5190: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6e 6f   state of the no
51a0: 74 69 66 69 65 64 20 74 72 61 6e 73 66 6f 72 6d  tified transform
51b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
51c0: 09 09 20 20 20 6d 61 73 6b 3b 20 20 20 20 20 20  ..   mask;      
51d0: 20 2f 2a 20 54 68 65 20 6d 61 73 6b 20 6f 66 20   /* The mask of 
51e0: 6f 63 63 75 72 69 6e 67 20 65 76 65 6e 74 73 20  occuring events 
51f0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
5200: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
5210: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
5220: 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  a;..    /*.     
5230: 2a 20 41 6e 20 65 76 65 6e 74 20 6f 63 63 75 72  * An event occur
5240: 65 64 20 69 6e 20 74 68 65 20 75 6e 64 65 72 6c  ed in the underl
5250: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 20 54  ying channel.  T
5260: 68 69 73 0a 20 20 20 20 20 2a 20 74 72 61 6e 73  his.     * trans
5270: 66 6f 72 6d 61 74 69 6f 6e 20 64 6f 65 73 6e 27  formation doesn'
5280: 74 20 70 72 6f 63 65 73 73 20 73 75 63 68 20 65  t process such e
5290: 76 65 6e 74 73 20 74 68 75 73 20 72 65 74 75 72  vents thus retur
52a0: 6e 73 20 74 68 65 0a 20 20 20 20 20 2a 20 69 6e  ns the.     * in
52b0: 63 6f 6d 69 6e 67 20 6d 61 73 6b 20 75 6e 63 68  coming mask unch
52c0: 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a  anged..     */..
52d0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
52e0: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
52f0: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
5300: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 65 6c 65  ) {../*.. * Dele
5310: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  te an existing t
5320: 69 6d 65 72 2e 20 49 74 20 77 61 73 20 6e 6f 74  imer. It was not
5330: 20 66 69 72 65 64 2c 20 79 65 74 20 77 65 20 61   fired, yet we a
5340: 72 65 0a 09 20 2a 20 68 65 72 65 2c 20 73 6f 20  re.. * here, so 
5350: 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f  the channel belo
5360: 77 20 67 65 6e 65 72 61 74 65 64 20 73 75 63 68  w generated such
5370: 20 61 6e 20 65 76 65 6e 74 20 61 6e 64 20 77 65   an event and we
5380: 0a 09 20 2a 20 64 6f 6e 27 74 20 68 61 76 65 20  .. * don't have 
5390: 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 61 6c 20  to. The renewal 
53a0: 6f 66 20 74 68 65 20 69 6e 74 65 72 65 73 74 20  of the interest 
53b0: 61 66 74 65 72 20 74 68 65 0a 09 20 2a 20 65 78  after the.. * ex
53c0: 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 61 6e 6e  ecution of chann
53d0: 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 69 6c 6c  el handlers will
53e0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 75 73   eventually caus
53f0: 65 20 75 73 20 74 6f 0a 09 20 2a 20 72 65 63 72  e us to.. * recr
5400: 65 61 74 65 20 74 68 65 20 74 69 6d 65 72 20 28  eate the timer (
5410: 69 6e 20 57 61 74 63 68 50 72 6f 63 29 2e 0a 09  in WatchProc)...
5420: 20 2a 2f 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65   */...Tcl_Delete
5430: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61  TimerHandler(sta
5440: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09  tePtr->timer);..
5450: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
5460: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
5470: 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  n) NULL;.    }..
5480: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b      return mask;
5490: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54d0: 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 54 6c 73  *. *. *      Tls
54e0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d  ChannelHandler -
54f0: 2d 0a 20 2a 0a 20 2a 20 20 20 20 20 20 2d 2d 2d  -. *. *      ---
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
5530: 2a 20 20 20 20 20 20 48 61 6e 64 6c 65 72 20 63  *      Handler c
5540: 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 61 73 20  alled by Tcl as 
5550: 61 20 72 65 73 75 6c 74 20 6f 66 0a 20 2a 20 20  a result of. *  
5560: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 68      Tcl_CreateCh
5570: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 20 74  annelHandler - t
5580: 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61  o inform us of a
5590: 63 74 69 76 69 74 79 0a 20 2a 20 20 20 20 20 20  ctivity. *      
55a0: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  on the underlyin
55b0: 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20 20  g channel.. *   
55c0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55f0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20  ---*. *. *      
5600: 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 20  Sideeffects:. * 
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 79               May
5620: 20 67 65 6e 65 72 61 74 65 20 73 75 62 73 65 71   generate subseq
5630: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 20 2a  uent calls to. *
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
5650: 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 2e  l_NotifyChannel.
5660: 0a 20 2a 0a 20 2a 20 20 20 20 20 20 52 65 73 75  . *. *      Resu
5670: 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20 20 20 20  lt:. *          
5680: 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d      None.. *. *-
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56c0: 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74  -----*. */..stat
56d0: 69 63 20 76 6f 69 64 0a 54 6c 73 43 68 61 6e 6e  ic void.TlsChann
56e0: 65 6c 48 61 6e 64 6c 65 72 20 28 63 6c 69 65 6e  elHandler (clien
56f0: 74 44 61 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20  tData, mask).   
5700: 20 43 6c 69 65 6e 74 44 61 74 61 20 20 20 20 20   ClientData     
5710: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
5720: 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 6d  int            m
5730: 61 73 6b 3b 0a 7b 0a 20 20 20 20 53 74 61 74 65  ask;.{.    State
5740: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
5750: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
5760: 61 3b 0a 0a 64 70 72 69 6e 74 66 28 73 74 64 65  a;..dprintf(stde
5770: 72 72 2c 20 22 48 41 4e 44 4c 45 52 28 30 78 25  rr, "HANDLER(0x%
5780: 78 29 5c 6e 22 2c 20 6d 61 73 6b 29 3b 0a 20 20  x)\n", mask);.  
5790: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20    Tcl_Preserve( 
57a0: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74  (ClientData)stat
57b0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28  ePtr);..    if (
57c0: 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41  mask & TCL_READA
57d0: 42 4c 45 29 20 7b 0a 09 42 49 4f 5f 73 65 74 5f  BLE) {..BIO_set_
57e0: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e  flags(statePtr->
57f0: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53  p_bio, BIO_FLAGS
5800: 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 20 65 6c  _READ);.    } el
5810: 73 65 20 7b 0a 09 42 49 4f 5f 63 6c 65 61 72 5f  se {..BIO_clear_
5820: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e  flags(statePtr->
5830: 70 5f 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53  p_bio, BIO_FLAGS
5840: 5f 52 45 41 44 29 3b 0a 20 20 20 20 7d 0a 0a 20  _READ);.    }.. 
5850: 20 20 20 69 66 20 28 6d 61 73 6b 20 26 20 54 43     if (mask & TC
5860: 4c 5f 57 52 49 54 41 42 4c 45 29 20 7b 0a 09 42  L_WRITABLE) {..B
5870: 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 73 74 61  IO_set_flags(sta
5880: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49  tePtr->p_bio, BI
5890: 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a  O_FLAGS_WRITE);.
58a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49      } else {..BI
58b0: 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 73 28 73 74  O_clear_flags(st
58c0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42  atePtr->p_bio, B
58d0: 49 4f 5f 46 4c 41 47 53 5f 57 52 49 54 45 29 3b  IO_FLAGS_WRITE);
58e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 73 6b  .    }..    mask
58f0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 42 49   = 0;.    if (BI
5900: 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65  O_wpending(state
5910: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61  Ptr->bio)) {..ma
5920: 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42  sk |= TCL_WRITAB
5930: 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LE;.    }.    if
5940: 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74   (BIO_pending(st
5950: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a  atePtr->bio)) {.
5960: 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41  .mask |= TCL_REA
5970: 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  DABLE;.    }..  
5980: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20    /*.     * The 
5990: 66 6f 6c 6c 6f 77 69 6e 67 20 4e 6f 74 69 66 79  following Notify
59a0: 43 68 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 73 65  Channel calls se
59b0: 65 6d 73 20 74 6f 20 62 65 20 69 6d 70 6f 72 74  ems to be import
59c0: 61 6e 74 2c 20 62 75 74 0a 20 20 20 20 20 2a 20  ant, but.     * 
59d0: 77 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 77 68  we don't know wh
59e0: 79 2e 20 20 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b  y.  It looks lik
59f0: 65 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  e if the mask is
5a00: 20 65 76 65 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 20   ever non-zero. 
5a10: 20 20 20 20 2a 20 74 68 61 74 20 69 74 20 77 69      * that it wi
5a20: 6c 6c 20 65 6e 74 65 72 20 61 6e 20 69 6e 66 69  ll enter an infi
5a30: 6e 69 74 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20  nite loop..     
5a40: 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 69 66 79 20  *.     * Notify 
5a50: 74 68 65 20 75 70 70 65 72 20 63 68 61 6e 6e 65  the upper channe
5a60: 6c 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  l of the current
5a70: 20 42 49 4f 20 73 74 61 74 65 20 73 6f 20 74 68   BIO state so th
5a80: 65 20 65 76 65 6e 74 0a 20 20 20 20 20 2a 20 63  e event.     * c
5a90: 6f 6e 74 69 6e 75 65 73 20 74 6f 20 70 72 6f 70  ontinues to prop
5aa0: 61 67 61 74 65 20 75 70 20 74 68 65 20 63 68 61  agate up the cha
5ab0: 69 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  in..     *.     
5ac0: 2a 20 73 74 61 6e 74 6f 6e 3a 20 49 74 20 6c 6f  * stanton: It lo
5ad0: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 20 63 6f  oks like this co
5ae0: 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  uld result in an
5af0: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 69   infinite loop i
5b00: 66 0a 20 20 20 20 20 2a 20 74 68 65 20 75 70 70  f.     * the upp
5b10: 65 72 20 63 68 61 6e 6e 65 6c 20 64 6f 65 73 6e  er channel doesn
5b20: 27 74 20 63 61 75 73 65 20 43 68 61 6e 6e 65 6c  't cause Channel
5b30: 48 61 6e 64 6c 65 72 20 74 6f 20 62 65 20 72 65  Handler to be re
5b40: 6d 6f 76 65 64 0a 20 20 20 20 20 2a 20 62 65 66  moved.     * bef
5b50: 6f 72 65 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68  ore Tcl_NotifyCh
5b60: 61 6e 6e 65 6c 20 63 61 6c 6c 73 20 63 68 61 6e  annel calls chan
5b70: 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 6f 6e 20  nel handlers on 
5b80: 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65  the lower channe
5b90: 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 0a  l..     */.    .
5ba0: 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68      Tcl_NotifyCh
5bb0: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
5bc0: 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 20 20 20  self, mask);.   
5bd0: 20 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50   .    if (stateP
5be0: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
5bf0: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c  l_TimerToken)NUL
5c00: 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65  L) {..Tcl_Delete
5c10: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61  TimerHandler(sta
5c20: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09  tePtr->timer);..
5c30: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
5c40: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
5c50: 6e 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  n)NULL;.    }.  
5c60: 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43    if ((mask & TC
5c70: 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 54  L_READABLE) && T
5c80: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
5c90: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
5ca0: 20 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20   > 0) {../*.. * 
5cb0: 44 61 74 61 20 69 73 20 77 61 69 74 69 6e 67 2c  Data is waiting,
5cc0: 20 66 6c 75 73 68 20 69 74 20 6f 75 74 20 69 6e   flush it out in
5cd0: 20 73 68 6f 72 74 20 74 69 6d 65 0a 09 20 2a 2f   short time.. */
5ce0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
5cf0: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69  r = Tcl_CreateTi
5d00: 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54  merHandler(TLS_T
5d10: 43 4c 5f 44 45 4c 41 59 2c 0a 09 09 54 6c 73 43  CL_DELAY,...TlsC
5d20: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d  hannelHandlerTim
5d30: 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  er, (ClientData)
5d40: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
5d50: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  }.    Tcl_Releas
5d60: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 73  e( (ClientData)s
5d70: 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  tatePtr);.}.../*
5d80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
5dc0: 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c  .TlsChannelHandl
5dd0: 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a  erTimer --. *. *
5de0: 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
5df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e10: 2d 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20  -*. *.Called by 
5e20: 74 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d 3e  the notifier (->
5e30: 20 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 68   timer) to flush
5e40: 20 6f 75 74 0a 20 2a 09 69 6e 66 6f 72 6d 61 74   out. *.informat
5e50: 69 6f 6e 20 77 61 69 74 69 6e 67 20 69 6e 20 63  ion waiting in c
5e60: 68 61 6e 6e 65 6c 20 62 75 66 66 65 72 73 2e 0a  hannel buffers..
5e70: 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ea0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 65  ---*. *. *.Sidee
5eb0: 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f  ffects:. *..As o
5ec0: 66 20 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e  f 'TlsChannelHan
5ed0: 64 6c 65 72 27 2e 0a 20 2a 0a 20 2a 09 52 65 73  dler'.. *. *.Res
5ee0: 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20  ult:. *..None.. 
5ef0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
5f30: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 6c 73  .static void.Tls
5f40: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69  ChannelHandlerTi
5f50: 6d 65 72 20 28 63 6c 69 65 6e 74 44 61 74 61 29  mer (clientData)
5f60: 0a 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  .ClientData clie
5f70: 6e 74 44 61 74 61 3b 20 2f 2a 20 54 72 61 6e 73  ntData; /* Trans
5f80: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 71 75 65  formation to que
5f90: 72 79 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74  ry */.{.    Stat
5fa0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
5fb0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
5fc0: 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b  ta;.    int mask
5fd0: 20 3d 20 30 3b 0a 0a 20 20 20 20 73 74 61 74 65   = 0;..    state
5fe0: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63  Ptr->timer = (Tc
5ff0: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
6000: 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 42 49 4f  LL;..    if (BIO
6010: 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50  _wpending(stateP
6020: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73  tr->bio)) {..mas
6030: 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c  k |= TCL_WRITABL
6040: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
6050: 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61  (BIO_pending(sta
6060: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09  tePtr->bio)) {..
6070: 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44  mask |= TCL_READ
6080: 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ABLE;.    }.    
6090: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65  Tcl_NotifyChanne
60a0: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  l(statePtr->self
60b0: 2c 20 6d 61 73 6b 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  , mask);.}.../*.
60c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
6100: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
6110: 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09 53 69 64 65  ct --. *. *.Side
6120: 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 49 73 73  effects:. *..Iss
6130: 75 65 73 20 53 53 4c 5f 61 63 63 65 70 74 20 6f  ues SSL_accept o
6140: 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 0a 20 2a  r SSL_connect. *
6150: 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
6160: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61a0: 2d 2a 0a 20 2a 2f 0a 69 6e 74 0a 54 6c 73 5f 57  -*. */.int.Tls_W
61b0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 20 73  aitForConnect( s
61c0: 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f  tatePtr, errorCo
61d0: 64 65 50 74 72 29 0a 20 20 20 20 53 74 61 74 65  dePtr).    State
61e0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20   *statePtr;.    
61f0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
6200: 72 3b 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20  r;../* Where to 
6210: 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f 64 65  store error code
6220: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 65  . */.{.    int e
6230: 72 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  rr;..    dprintf
6240: 28 73 74 64 65 72 72 2c 22 5c 6e 57 61 69 74 46  (stderr,"\nWaitF
6250: 6f 72 43 6f 6e 6e 65 63 74 28 30 78 25 78 29 22  orConnect(0x%x)"
6260: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
6270: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
6280: 20 66 6f 72 20 28 3b 3b 29 20 7b 0a 09 2f 2a 20   for (;;) {../* 
6290: 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  Not initialized 
62a0: 79 65 74 21 20 2a 2f 0a 09 69 66 20 28 73 74 61  yet! */..if (sta
62b0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
62c0: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b  LS_TCL_SERVER) {
62d0: 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f  ..    err = SSL_
62e0: 61 63 63 65 70 74 28 73 74 61 74 65 50 74 72 2d  accept(statePtr-
62f0: 3e 73 73 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  >ssl);..} else {
6300: 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f  ..    err = SSL_
6310: 63 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  connect(statePtr
6320: 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 09 2f 2a 53 53  ->ssl);..}../*SS
6330: 4c 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72  L_write(statePtr
6340: 2d 3e 73 73 6c 2c 20 28 63 68 61 72 2a 29 26 65  ->ssl, (char*)&e
6350: 72 72 2c 20 30 29 3b 09 48 41 43 4b 21 21 21 20  rr, 0);.HACK!!! 
6360: 2a 2f 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29  */..if (err > 0)
6370: 20 7b 0a 09 20 20 20 20 42 49 4f 5f 66 6c 75 73   {..    BIO_flus
6380: 68 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  h(statePtr->bio)
6390: 3b 0a 09 7d 0a 0a 09 69 66 20 28 65 72 72 20 3c  ;..}...if (err <
63a0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 6e 74 20  = 0) {..    int 
63b0: 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72  rc = SSL_get_err
63c0: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  or(statePtr->ssl
63d0: 2c 20 65 72 72 29 3b 0a 0a 09 20 20 20 20 69 66  , err);...    if
63e0: 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f   (rc == SSL_ERRO
63f0: 52 5f 53 53 4c 29 20 7b 0a 09 09 54 6c 73 5f 45  R_SSL) {...Tls_E
6400: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 0a 09  rror(statePtr,..
6410: 09 09 28 63 68 61 72 20 2a 29 45 52 52 5f 72 65  ..(char *)ERR_re
6420: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
6430: 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28  g(ERR_get_error(
6440: 29 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64  )));...*errorCod
6450: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
6460: 54 45 44 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31  TED;...return -1
6470: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
6480: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74   (BIO_should_ret
6490: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ry(statePtr->bio
64a0: 29 29 20 7b 0a 09 09 69 66 20 28 73 74 61 74 65  )) {...if (state
64b0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
64c0: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09  _TCL_ASYNC) {...
64d0: 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 65      dprintf(stde
64e0: 72 72 2c 22 45 21 20 22 29 3b 0a 09 09 20 20 20  rr,"E! ");...   
64f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
6500: 20 45 41 47 41 49 4e 3b 0a 09 09 20 20 20 20 72   EAGAIN;...    r
6510: 65 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 20 65 6c  eturn -1;...} el
6520: 73 65 20 7b 0a 09 09 20 20 20 20 63 6f 6e 74 69  se {...    conti
6530: 6e 75 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20  nue;...}..    } 
6540: 65 6c 73 65 20 69 66 20 28 65 72 72 20 3d 3d 20  else if (err == 
6550: 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 73  0) {...dprintf(s
6560: 74 64 65 72 72 2c 22 43 52 21 20 22 29 3b 0a 09  tderr,"CR! ");..
6570: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
6580: 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 72   ECONNRESET;...r
6590: 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d  eturn -1;..    }
65a0: 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
65b0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
65c0: 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 09  TCL_SERVER) {...
65d0: 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65  err = SSL_get_ve
65e0: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
65f0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 09 69 66  ePtr->ssl);...if
6600: 20 28 65 72 72 20 21 3d 20 58 35 30 39 5f 56 5f   (err != X509_V_
6610: 4f 4b 29 20 7b 0a 09 09 20 20 20 20 54 6c 73 5f  OK) {...    Tls_
6620: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 0a  Error(statePtr,.
6630: 09 09 09 20 20 20 20 28 63 68 61 72 20 2a 29 58  ...    (char *)X
6640: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f  509_verify_cert_
6650: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72  error_string(err
6660: 29 29 3b 0a 09 09 20 20 20 20 2a 65 72 72 6f 72  ));...    *error
6670: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41  CodePtr = ECONNA
6680: 42 4f 52 54 45 44 3b 0a 09 09 20 20 20 20 72 65  BORTED;...    re
6690: 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 0a 09 20 20  turn -1;...}..  
66a0: 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 43    }..    *errorC
66b0: 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74  odePtr = Tcl_Get
66c0: 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20 64 70  Errno();..    dp
66d0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 52  rintf(stderr,"ER
66e0: 52 28 25 64 2c 20 25 64 29 20 22 2c 20 72 63 2c  R(%d, %d) ", rc,
66f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b   *errorCodePtr);
6700: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
6710: 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 73 74 64  ..}..dprintf(std
6720: 65 72 72 2c 22 52 30 21 20 22 29 3b 0a 09 72 65  err,"R0! ");..re
6730: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 7d 0a  turn 1;.    }.}.
6740: 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 0a 54 6c 73  .Tcl_Channel.Tls
6750: 5f 47 65 74 50 61 72 65 6e 74 28 20 73 74 61 74  _GetParent( stat
6760: 65 50 74 72 20 29 0a 20 20 20 20 53 74 61 74 65  ePtr ).    State
6770: 20 2a 73 74 61 74 65 50 74 72 3b 0a 7b 0a 20 20   *statePtr;.{.  
6780: 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70    if (channelTyp
6790: 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f  eVersion == TLS_
67a0: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f  CHANNEL_VERSION_
67b0: 32 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 63 6c  2) {..return Tcl
67c0: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
67d0: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
67e0: 66 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  f);.    } else {
67f0: 0a 09 2f 2a 20 54 68 65 20 72 65 61 73 6f 6e 20  ../* The reason 
6800: 66 6f 72 20 74 68 65 20 65 78 69 73 74 65 6e 63  for the existenc
6810: 65 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  e of this proced
6820: 75 72 65 20 69 73 0a 09 20 2a 20 74 68 65 20 66  ure is.. * the f
6830: 61 63 74 20 74 68 61 74 20 73 74 61 63 6b 69 6e  act that stackin
6840: 67 20 61 20 74 72 61 6e 73 66 6f 72 6d 20 6f 76  g a transform ov
6850: 65 72 20 61 6e 6f 74 68 65 72 0a 09 20 2a 20 74  er another.. * t
6860: 72 61 6e 73 66 6f 72 6d 20 77 69 6c 6c 20 6c 65  ransform will le
6870: 61 76 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ave our internal
6880: 20 70 6f 69 6e 74 65 72 20 75 6e 63 68 61 6e 67   pointer unchang
6890: 65 64 2c 0a 09 20 2a 20 61 6e 64 20 74 68 75 73  ed,.. * and thus
68a0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
68b0: 20 6e 65 77 20 74 72 61 6e 73 66 6f 72 6d 2c 20   new transform, 
68c0: 61 6e 64 20 6e 6f 74 20 74 68 65 0a 09 20 2a 20  and not the.. * 
68d0: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
68e0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
68f0: 20 73 61 76 65 64 20 73 74 61 74 65 20 6f 66 20   saved state of 
6900: 74 68 69 73 0a 09 20 2a 20 74 72 61 6e 73 66 6f  this.. * transfo
6910: 72 6d 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  rm. This is the 
6920: 70 72 69 63 65 20 74 6f 20 70 61 79 20 66 6f 72  price to pay for
6930: 20 6c 65 61 76 69 6e 67 0a 09 20 2a 20 54 63 6c   leaving.. * Tcl
6940: 5f 43 68 61 6e 6e 65 6c 20 72 65 66 65 72 65 6e  _Channel referen
6950: 63 65 73 20 69 6e 74 61 63 74 2e 20 54 68 65 20  ces intact. The 
6960: 6f 6e 6c 79 20 6f 74 68 65 72 20 73 6f 6c 75 74  only other solut
6970: 69 6f 6e 0a 09 20 2a 20 69 73 20 61 6e 20 65 78  ion.. * is an ex
6980: 74 65 6e 73 69 6f 6e 20 6f 66 20 54 63 6c 5f 43  tension of Tcl_C
6990: 68 61 6e 6e 65 6c 54 79 70 65 20 77 69 74 68 20  hannelType with 
69a0: 61 6e 6f 74 68 65 72 20 64 72 69 76 65 72 0a 09  another driver..
69b0: 20 2a 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20   * procedure to 
69c0: 6e 6f 74 69 66 79 20 61 20 43 68 61 6e 6e 65 6c  notify a Channel
69d0: 20 61 62 6f 75 74 20 74 68 65 20 28 75 6e 29 73   about the (un)s
69e0: 74 61 63 6b 69 6e 67 2e 0a 09 20 2a 0a 09 20 2a  tacking... *.. *
69f0: 20 49 74 20 77 61 6c 6b 73 20 74 68 65 20 63 68   It walks the ch
6a00: 61 69 6e 20 6f 66 20 43 68 61 6e 6e 65 6c 20 73  ain of Channel s
6a10: 74 72 75 63 74 75 72 65 73 20 75 6e 74 69 6c 20  tructures until 
6a20: 69 74 0a 09 20 2a 20 66 69 6e 64 73 20 74 68 65  it.. * finds the
6a30: 20 6f 6e 65 20 70 6f 69 6e 74 69 6e 67 20 68 61   one pointing ha
6a40: 76 69 6e 67 20 27 63 74 72 6c 27 20 61 73 20 69  ving 'ctrl' as i
6a50: 6e 73 74 61 6e 63 65 44 61 74 61 0a 09 20 2a 20  nstanceData.. * 
6a60: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 73  and then returns
6a70: 20 74 68 65 20 73 75 70 65 72 63 65 64 69 6e 67   the superceding
6a80: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 74 68 61 74   channel to that
6a90: 2e 20 28 41 4b 29 0a 09 20 2a 2f 0a 0a 09 54 63  . (AK).. */...Tc
6aa0: 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 20 3d  l_Channel self =
6ab0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b   statePtr->self;
6ac0: 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 6e 65  ..Tcl_Channel ne
6ad0: 78 74 3b 0a 0a 09 77 68 69 6c 65 20 28 28 43 6c  xt;...while ((Cl
6ae0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
6af0: 74 72 20 21 3d 20 54 63 6c 5f 47 65 74 43 68 61  tr != Tcl_GetCha
6b00: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
6b10: 20 28 73 65 6c 66 29 29 20 7b 0a 09 20 20 20 20   (self)) {..    
6b20: 6e 65 78 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  next = Tcl_GetSt
6b30: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 20 28 73 65  ackedChannel (se
6b40: 6c 66 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 65  lf);..    if (ne
6b50: 78 74 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  xt == (Tcl_Chann
6b60: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a  el) NULL) {.../*
6b70: 20 30 39 2f 32 34 2f 31 39 39 39 20 55 6e 73 74   09/24/1999 Unst
6b80: 61 63 6b 69 6e 67 20 62 75 67 2c 0a 09 09 20 2a  acking bug,... *
6b90: 20 66 6f 75 6e 64 20 62 79 20 4d 61 74 74 20 4e   found by Matt N
6ba0: 65 77 6d 61 6e 20 3c 6d 61 74 74 40 73 65 6e 73  ewman <matt@sens
6bb0: 75 73 2e 6f 72 67 3e 2e 0a 09 09 20 2a 0a 09 09  us.org>.... *...
6bc0: 20 2a 20 57 65 20 77 65 72 65 20 75 6e 61 62 6c   * We were unabl
6bd0: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 63 68  e to find the ch
6be0: 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20  annel structure 
6bf0: 66 6f 72 20 74 68 69 73 0a 09 09 20 2a 20 74 72  for this... * tr
6c00: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20  ansformation in 
6c10: 74 68 65 20 63 68 61 69 6e 20 6f 66 20 73 74 61  the chain of sta
6c20: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2e 20 54 68  cked channel. Th
6c30: 69 73 0a 09 09 20 2a 20 6d 65 61 6e 73 20 74 68  is... * means th
6c40: 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
6c50: 74 6c 79 20 69 6e 20 74 68 65 20 70 72 6f 63 65  tly in the proce
6c60: 73 73 20 6f 66 20 75 6e 73 74 61 63 6b 69 6e 67  ss of unstacking
6c70: 0a 09 09 20 2a 20 69 74 20 2a 61 6e 64 2a 20 74  ... * it *and* t
6c80: 68 65 72 65 20 77 65 72 65 20 73 6f 6d 65 20 62  here were some b
6c90: 79 74 65 73 20 77 61 69 74 69 6e 67 20 77 68 69  ytes waiting whi
6ca0: 63 68 20 61 72 65 20 6e 6f 77 0a 09 09 20 2a 20  ch are now... * 
6cb0: 66 6c 75 73 68 65 64 2e 20 49 6e 20 74 68 69 73  flushed. In this
6cc0: 20 73 69 74 75 61 74 69 6f 6e 20 74 68 65 20 70   situation the p
6cd0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68  ointer to the ch
6ce0: 61 6e 6e 65 6c 0a 09 09 20 2a 20 69 74 73 65 6c  annel... * itsel
6cf0: 66 20 61 6c 72 65 61 64 79 20 72 65 66 65 72 73  f already refers
6d00: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 63   to the parent c
6d10: 68 61 6e 6e 65 6c 20 77 65 20 68 61 76 65 20 74  hannel we have t
6d20: 6f 0a 09 09 20 2a 20 77 72 69 74 65 20 74 68 65  o... * write the
6d30: 20 62 79 74 65 73 20 69 6e 74 6f 2c 20 73 6f 20   bytes into, so 
6d40: 77 65 20 72 65 74 75 72 6e 20 74 68 61 74 2e 0a  we return that..
6d50: 09 09 20 2a 2f 0a 09 09 72 65 74 75 72 6e 20 73  .. */...return s
6d60: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a 09  tatePtr->self;..
6d70: 20 20 20 20 7d 0a 09 20 20 20 20 73 65 6c 66 20      }..    self 
6d80: 3d 20 6e 65 78 74 3b 0a 09 7d 0a 0a 09 72 65 74  = next;..}...ret
6d90: 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 6b  urn Tcl_GetStack
6da0: 65 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29  edChannel (self)
6db0: 3b 0a 20 20 20 20 7d 0a 7d 0a                    ;.    }.}.