Hex Artifact Content

Artifact 31b270211d18650c56d9507b89def428dcc9896a:


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 32 20  /tlsIO.c,v 1.12 
00b0: 32 30 30 30 2f 30 39 2f 30 37 20 32 31 3a 31 36  2000/09/07 21:16
00c0: 3a 31 39 20 68 6f 62 62 73 20 45 78 70 20 24 0a  :19 hobbs Exp $.
00d0: 20 2a 0a 20 2a 20 54 4c 53 20 28 61 6b 61 20 53   *. * TLS (aka S
00e0: 53 4c 29 20 43 68 61 6e 6e 65 6c 20 2d 20 63 61  SL) Channel - ca
00f0: 6e 20 62 65 20 6c 61 79 65 72 65 64 20 6f 6e 20  n be layered on 
0100: 61 6e 79 20 62 69 2d 64 69 72 65 63 74 69 6f 6e  any bi-direction
0110: 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65  al. * Tcl_Channe
0120: 6c 20 28 4e 6f 74 65 3a 20 52 65 71 75 69 72 65  l (Note: Require
0130: 73 20 54 72 66 20 43 6f 72 65 20 50 61 74 63 68  s Trf Core Patch
0140: 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 77 61 73  ). *. * This was
0150: 20 62 75 69 6c 74 20 66 72 6f 6d 20 73 63 72 61   built from scra
0160: 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e 20 6f  tch based upon o
0170: 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 20 4f 70  bservation of Op
0180: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
0190: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01a0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01b0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01c0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
01d0: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
01e0: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
01f0: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0200: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0210: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0220: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0230: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0240: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0250: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0260: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
0270: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
0280: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
0290: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02a0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02b0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02c0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
02d0: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
02e0: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
02f0: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0300: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0310: 22 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  "../*. * Forward
0320: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0330: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c  /..static int.Tl
0340: 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 5f  sBlockModeProc _
0350: 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c 69 65  ANSI_ARGS_((Clie
0360: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
0370: 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 6f 64 65  ata,....int mode
0380: 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 54  ));.static int.T
0390: 6c 73 43 6c 6f 73 65 50 72 6f 63 20 5f 41 4e 53  lsCloseProc _ANS
03a0: 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74  I_ARGS_ ((Client
03b0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
03c0: 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70  a,....Tcl_Interp
03d0: 20 2a 69 6e 74 65 72 70 29 29 3b 0a 73 74 61 74   *interp));.stat
03e0: 69 63 20 69 6e 74 09 54 6c 73 49 6e 70 75 74 50  ic int.TlsInputP
03f0: 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28  roc _ANSI_ARGS_(
0400: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
0410: 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 63 68 61  anceData,....cha
0420: 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 53  r *buf, int bufS
0430: 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43  ize, int *errorC
0440: 6f 64 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63  odePtr));.static
0450: 20 69 6e 74 09 54 6c 73 4f 75 74 70 75 74 50 72   int.TlsOutputPr
0460: 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28  oc _ANSI_ARGS_((
0470: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
0480: 6e 63 65 44 61 74 61 2c 0a 09 09 09 63 68 61 72  nceData,....char
0490: 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69   *buf, int toWri
04a0: 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  te, int *errorCo
04b0: 64 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20  dePtr));.static 
04c0: 69 6e 74 09 54 6c 73 47 65 74 4f 70 74 69 6f 6e  int.TlsGetOption
04d0: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f  Proc _ANSI_ARGS_
04e0: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e   ((ClientData in
04f0: 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 54  stanceData,....T
0500: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0510: 70 2c 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e  p, char *optionN
0520: 61 6d 65 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72  ame,....Tcl_DStr
0530: 69 6e 67 20 2a 64 73 50 74 72 29 29 3b 0a 73 74  ing *dsPtr));.st
0540: 61 74 69 63 20 76 6f 69 64 09 54 6c 73 57 61 74  atic void.TlsWat
0550: 63 68 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47  chProc _ANSI_ARG
0560: 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69  S_((ClientData i
0570: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
0580: 20 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20   mask));.static 
0590: 69 6e 74 09 54 6c 73 47 65 74 48 61 6e 64 6c 65  int.TlsGetHandle
05a0: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f  Proc _ANSI_ARGS_
05b0: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e   ((ClientData in
05c0: 73 74 61 6e 63 65 44 61 74 61 2c 0a 09 09 09 69  stanceData,....i
05d0: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c  nt direction, Cl
05e0: 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65  ientData *handle
05f0: 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 69 6e  Ptr));.static in
0600: 74 09 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20  t.TlsNotifyProc 
0610: 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c  _ANSI_ARGS_ ((Cl
0620: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
0630: 65 44 61 74 61 2c 0a 09 09 09 69 6e 74 20 6d 61  eData,....int ma
0640: 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  sk));.static voi
0650: 64 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64  d.TlsChannelHand
0660: 6c 65 72 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20  ler _ANSI_ARGS_ 
0670: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  ((ClientData cli
0680: 65 6e 74 44 61 74 61 2c 0a 09 09 09 69 6e 74 20  entData,....int 
0690: 6d 61 73 6b 29 29 3b 0a 73 74 61 74 69 63 20 76  mask));.static v
06a0: 6f 69 64 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61  oid.TlsChannelHa
06b0: 6e 64 6c 65 72 54 69 6d 65 72 20 5f 41 4e 53 49  ndlerTimer _ANSI
06c0: 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44  _ARGS_ ((ClientD
06d0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 29  ata clientData))
06e0: 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74  ;../*. * This st
06f0: 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65  ructure describe
0700: 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79  s the channel ty
0710: 70 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  pe structure for
0720: 20 54 43 50 20 73 6f 63 6b 65 74 0a 20 2a 20 62   TCP socket. * b
0730: 61 73 65 64 20 49 4f 2e 20 20 54 68 65 73 65 20  ased IO.  These 
0740: 61 72 65 20 77 68 61 74 20 74 68 65 20 73 74 72  are what the str
0750: 75 63 74 75 72 65 73 20 73 68 6f 75 6c 64 20 6c  uctures should l
0760: 6f 6f 6b 20 6c 69 6b 65 2c 20 62 75 74 20 77 65  ook like, but we
0770: 0a 20 2a 20 68 61 76 65 20 74 6f 20 62 75 69 6c  . * have to buil
0780: 64 20 74 68 65 6d 20 75 70 20 61 74 20 72 75 6e  d them up at run
0790: 74 69 6d 65 20 74 6f 20 62 65 20 63 6f 72 72 65  time to be corre
07a0: 63 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ct depending on 
07b0: 77 68 65 74 68 65 72 0a 20 2a 20 77 65 20 61 72  whether. * we ar
07c0: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 6e  e loaded into an
07d0: 20 38 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72 20   8.2.0-8.3.1 or 
07e0: 38 2e 33 2e 32 2b 20 54 63 6c 20 69 6e 74 65 72  8.3.2+ Tcl inter
07f0: 70 72 65 74 65 72 2e 0a 20 2a 2f 0a 23 69 66 64  preter.. */.#ifd
0800: 65 66 20 54 4c 53 5f 53 54 41 54 49 43 5f 53 54  ef TLS_STATIC_ST
0810: 52 55 43 54 55 52 45 53 5f 4e 4f 54 5f 55 53 45  RUCTURES_NOT_USE
0820: 44 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61  D.static Tcl_Cha
0830: 6e 6e 65 6c 54 79 70 65 20 74 6c 73 43 68 61 6e  nnelType tlsChan
0840: 6e 65 6c 54 79 70 65 32 20 3d 20 7b 0a 20 20 20  nelType2 = {.   
0850: 20 22 74 6c 73 22 2c 09 09 2f 2a 20 54 79 70 65   "tls",../* Type
0860: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 43   name. */.    TC
0870: 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f  L_CHANNEL_VERSIO
0880: 4e 5f 32 2c 09 2f 2a 20 41 20 76 32 20 63 68 61  N_2,./* A v2 cha
0890: 6e 6e 65 6c 20 28 38 2e 33 2e 32 2b 29 20 2a 2f  nnel (8.3.2+) */
08a0: 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f  .    TlsClosePro
08b0: 63 2c 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63  c,./* Close proc
08c0: 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75  . */.    TlsInpu
08d0: 74 50 72 6f 63 2c 09 2f 2a 20 49 6e 70 75 74 20  tProc,./* Input 
08e0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73  proc. */.    Tls
08f0: 4f 75 74 70 75 74 50 72 6f 63 2c 09 2f 2a 20 4f  OutputProc,./* O
0900: 75 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20  utput proc. */. 
0910: 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 65     NULL,../* See
0920: 6b 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 4e  k proc. */.    N
0930: 55 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74  ULL,../* Set opt
0940: 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20  ion proc. */.   
0950: 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f   TlsGetOptionPro
0960: 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e  c,./* Get option
0970: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c   proc. */.    Tl
0980: 73 57 61 74 63 68 50 72 6f 63 2c 09 2f 2a 20 49  sWatchProc,./* I
0990: 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69  nitialize notifi
09a0: 65 72 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65  er. */.    TlsGe
09b0: 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20  tHandleProc,./* 
09c0: 47 65 74 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  Get file handle 
09d0: 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20  out of channel. 
09e0: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a  */.    NULL,../*
09f0: 20 43 6c 6f 73 65 32 50 72 6f 63 2e 20 2a 2f 0a   Close2Proc. */.
0a00: 20 20 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65      TlsBlockMode
0a10: 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f  Proc,./* Set blo
0a20: 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e  cking/nonblockin
0a30: 67 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20 4e 55  g mode.*/.    NU
0a40: 4c 4c 2c 09 09 2f 2a 20 46 6c 75 73 68 50 72 6f  LL,../* FlushPro
0a50: 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 4e 6f 74  c. */.    TlsNot
0a60: 69 66 79 50 72 6f 63 2c 09 2f 2a 20 68 61 6e 64  ifyProc,./* hand
0a70: 6c 65 72 50 72 6f 63 2e 20 2a 2f 0a 7d 3b 0a 0a  lerProc. */.};..
0a80: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e  static Tcl_Chann
0a90: 65 6c 54 79 70 65 20 74 6c 73 43 68 61 6e 6e 65  elType tlsChanne
0aa0: 6c 54 79 70 65 31 20 3d 20 7b 0a 20 20 20 20 22  lType1 = {.    "
0ab0: 74 6c 73 22 2c 09 09 2f 2a 20 54 79 70 65 20 6e  tls",../* Type n
0ac0: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 42  ame. */.    TlsB
0ad0: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a  lockModeProc,./*
0ae0: 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f   Set blocking/no
0af0: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 2a  nblocking mode.*
0b00: 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72  /.    TlsClosePr
0b10: 6f 63 2c 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f  oc,./* Close pro
0b20: 63 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70  c. */.    TlsInp
0b30: 75 74 50 72 6f 63 2c 09 2f 2a 20 49 6e 70 75 74  utProc,./* Input
0b40: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 6c   proc. */.    Tl
0b50: 73 4f 75 74 70 75 74 50 72 6f 63 2c 09 2f 2a 20  sOutputProc,./* 
0b60: 4f 75 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a  Output proc. */.
0b70: 20 20 20 20 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65      NULL,../* Se
0b80: 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20  ek proc. */.    
0b90: 4e 55 4c 4c 2c 09 09 2f 2a 20 53 65 74 20 6f 70  NULL,../* Set op
0ba0: 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20  tion proc. */.  
0bb0: 20 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72    TlsGetOptionPr
0bc0: 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f  oc,./* Get optio
0bd0: 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54  n proc. */.    T
0be0: 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 2f 2a 20  lsWatchProc,./* 
0bf0: 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66  Initialize notif
0c00: 69 65 72 2e 20 2a 2f 0a 20 20 20 20 54 6c 73 47  ier. */.    TlsG
0c10: 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a  etHandleProc,./*
0c20: 20 47 65 74 20 66 69 6c 65 20 68 61 6e 64 6c 65   Get file handle
0c30: 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e   out of channel.
0c40: 20 2a 2f 0a 7d 3b 0a 23 65 6c 73 65 0a 73 74 61   */.};.#else.sta
0c50: 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54  tic Tcl_ChannelT
0c60: 79 70 65 20 2a 74 6c 73 43 68 61 6e 6e 65 6c 54  ype *tlsChannelT
0c70: 79 70 65 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  ype = NULL;.#end
0c80: 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  if../*. *-------
0c90: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a  ------------. *.
0cd0: 20 2a 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79   * Tls_ChannelTy
0ce0: 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75  pe --. *. *.Retu
0cf0: 72 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 54  rn the correct T
0d00: 4c 53 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65  LS channel drive
0d10: 72 20 69 6e 66 6f 0a 20 2a 0a 20 2a 20 52 65 73  r info. *. * Res
0d20: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 63 6f 72  ults:. *.The cor
0d30: 72 65 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69  rect channel dri
0d40: 76 65 72 20 66 6f 72 20 74 68 65 20 63 75 72 72  ver for the curr
0d50: 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54  ent version of T
0d60: 63 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  cl.. *. * Side e
0d70: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
0d80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
0d90: 2d 2d 2d 2d 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 0a 20 2a 2f 0a 54 63  ---------. */.Tc
0dd0: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 54  l_ChannelType *T
0de0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
0df0: 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  .{.    /*.     *
0e00: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
0e10: 63 68 61 6e 6e 65 6c 20 74 79 70 65 20 69 66 20  channel type if 
0e20: 6e 65 63 65 73 73 61 72 79 0a 20 20 20 20 20 2a  necessary.     *
0e30: 2f 0a 20 20 20 20 69 66 20 28 74 6c 73 43 68 61  /.    if (tlsCha
0e40: 6e 6e 65 6c 54 79 70 65 20 3d 3d 20 4e 55 4c 4c  nnelType == NULL
0e50: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 41 6c 6c 6f  ) {../*.. * Allo
0e60: 63 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20  cation of a new 
0e70: 63 68 61 6e 6e 65 6c 74 79 70 65 20 73 74 72 75  channeltype stru
0e80: 63 74 75 72 65 20 69 73 20 6e 6f 74 20 65 61 73  cture is not eas
0e90: 79 2c 20 62 65 63 61 75 73 65 20 6f 66 0a 09 20  y, because of.. 
0ea0: 2a 20 74 68 65 20 76 61 72 69 6f 75 73 20 76 65  * the various ve
0eb0: 72 73 6f 6e 20 6f 66 20 74 68 65 20 63 6f 72 65  rson of the core
0ec0: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
0ed0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 09  changes to the..
0ee0: 20 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68   * structure. Th
0ef0: 65 20 6d 61 69 6e 20 63 68 61 6c 6c 65 6e 67 65  e main challenge
0f00: 20 69 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20   is to allocate 
0f10: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f  enough memory fo
0f20: 72 0a 09 20 2a 20 6f 64 65 72 6e 20 76 65 72 73  r.. * odern vers
0f30: 69 6f 6e 73 20 65 76 65 6e 20 69 66 20 74 68 69  ions even if thi
0f40: 73 20 65 78 74 79 65 6e 73 69 6f 6e 20 69 73 20  s extyension is 
0f50: 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74  compiled against
0f60: 20 6f 6e 65 0a 09 20 2a 20 6f 66 20 74 68 65 20   one.. * of the 
0f70: 6f 6c 64 65 72 20 76 61 72 69 61 6e 74 21 0a 09  older variant!..
0f80: 20 2a 0a 09 20 2a 20 28 31 29 20 56 65 72 73 69   *.. * (1) Versi
0f90: 6f 6e 73 20 62 65 66 6f 72 65 20 73 74 75 62 73  ons before stubs
0fa0: 20 28 38 2e 30 2e 78 29 20 61 72 65 20 73 69 6d   (8.0.x) are sim
0fb0: 70 6c 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ple, because the
0fc0: 79 20 61 72 65 0a 09 20 2a 20 20 20 20 20 73 75  y are.. *     su
0fd0: 70 70 6f 72 74 65 64 20 6f 6e 6c 79 20 69 66 20  pported only if 
0fe0: 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73  the extension is
0ff0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
1000: 74 20 65 78 61 63 74 6c 79 0a 09 20 2a 20 20 20  t exactly.. *   
1010: 20 20 74 68 61 74 20 76 65 72 73 69 6f 6e 20 6f    that version o
1020: 66 20 74 68 65 20 63 6f 72 65 2e 0a 09 20 2a 0a  f the core... *.
1030: 09 20 2a 20 28 32 29 20 57 69 74 68 20 73 74 75  . * (2) With stu
1040: 62 73 20 77 65 20 6a 75 73 74 20 64 65 74 65 72  bs we just deter
1050: 6d 69 6e 65 20 74 68 65 20 64 69 66 66 65 72 65  mine the differe
1060: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
1070: 6f 6c 64 65 72 0a 09 20 2a 20 20 20 20 20 61 6e  older.. *     an
1080: 64 20 6d 6f 64 65 72 6e 20 76 61 72 69 61 6e 74  d modern variant
1090: 20 61 6e 64 20 6f 76 65 72 61 6c 6c 6f 63 61 74   and overallocat
10a0: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 69 66  e accordingly if
10b0: 20 63 6f 6d 70 69 6c 65 64 0a 09 20 2a 20 20 20   compiled.. *   
10c0: 20 20 61 67 61 69 6e 73 74 20 61 6e 20 6f 6c 64    against an old
10d0: 65 72 20 76 61 72 69 61 6e 74 2e 0a 09 20 2a 2f  er variant... */
10e0: 0a 0a 09 69 6e 74 20 73 69 7a 65 20 3d 20 73 69  ...int size = si
10f0: 7a 65 6f 66 28 54 63 6c 5f 43 68 61 6e 6e 65 6c  zeof(Tcl_Channel
1100: 54 79 70 65 29 3b 20 2f 2a 20 42 61 73 65 20 73  Type); /* Base s
1110: 69 7a 65 20 2a 2f 0a 0a 09 2f 2a 0a 09 20 2a 20  ize */.../*.. * 
1120: 53 69 7a 65 20 6f 66 20 61 20 70 72 6f 63 65 64  Size of a proced
1130: 75 72 65 20 70 6f 69 6e 74 65 72 2e 20 57 65 20  ure pointer. We 
1140: 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20  assume that all 
1150: 70 72 6f 63 65 64 75 72 65 0a 09 20 2a 20 70 6f  procedure.. * po
1160: 69 6e 74 65 72 73 20 61 72 65 20 6f 66 20 74 68  inters are of th
1170: 65 20 73 61 6d 65 20 73 69 7a 65 2c 20 72 65 67  e same size, reg
1180: 61 72 64 6c 65 73 73 20 6f 66 20 65 78 61 63 74  ardless of exact
1190: 20 74 79 70 65 0a 09 20 2a 20 28 61 72 67 75 6d   type.. * (argum
11a0: 65 6e 74 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ents and return 
11b0: 76 61 6c 75 65 73 29 2e 0a 09 20 2a 0a 09 20 2a  values)... *.. *
11c0: 20 38 2e 32 2e 20 20 20 46 69 72 73 74 20 76 65   8.2.   First ve
11d0: 72 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  rsion containing
11e0: 20 63 6c 6f 73 65 32 70 72 6f 63 2e 20 42 61 73   close2proc. Bas
11f0: 65 6c 69 6e 65 2e 0a 09 20 2a 20 38 2e 33 2e 32  eline... * 8.3.2
1200: 20 20 54 68 72 65 65 20 61 64 64 69 74 69 6f 6e    Three addition
1210: 61 6c 20 76 65 63 74 6f 72 73 2e 20 4d 6f 76 65  al vectors. Move
1220: 64 20 62 6c 6f 63 6b 4d 6f 64 65 2c 20 6e 65 77  d blockMode, new
1230: 20 66 6c 75 73 68 2d 20 61 6e 64 0a 09 20 2a 20   flush- and.. * 
1240: 20 20 20 20 20 20 20 68 61 6e 64 6c 65 72 50 72         handlerPr
1250: 6f 63 27 73 2e 0a 09 20 2a 0a 09 20 2a 20 3d 3e  oc's... *.. * =>
1260: 20 43 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 67 61   Compilation aga
1270: 69 6e 73 74 20 65 61 72 6c 69 65 72 20 76 65 72  inst earlier ver
1280: 73 69 6f 6e 20 68 61 73 20 74 6f 20 6f 76 65 72  sion has to over
1290: 61 6c 6c 6f 63 61 74 65 20 74 68 72 65 65 0a 09  allocate three..
12a0: 20 2a 20 20 20 20 70 72 6f 63 65 64 75 72 65 20   *    procedure 
12b0: 70 6f 69 6e 74 65 72 73 2e 0a 09 20 2a 2f 0a 0a  pointers... */..
12c0: 23 69 66 64 65 66 20 45 4d 55 4c 41 54 45 5f 43  #ifdef EMULATE_C
12d0: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32  HANNEL_VERSION_2
12e0: 0a 09 73 69 7a 65 20 2b 3d 20 33 20 2a 20 70 72  ..size += 3 * pr
12f0: 6f 63 50 74 72 53 69 7a 65 3b 0a 23 65 6e 64 69  ocPtrSize;.#endi
1300: 66 0a 0a 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79  f...tlsChannelTy
1310: 70 65 20 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  pe = (Tcl_Channe
1320: 6c 54 79 70 65 20 2a 29 20 63 6b 61 6c 6c 6f 63  lType *) ckalloc
1330: 28 73 69 7a 65 29 3b 0a 09 6d 65 6d 73 65 74 28  (size);..memset(
1340: 28 56 4f 49 44 20 2a 29 20 74 6c 73 43 68 61 6e  (VOID *) tlsChan
1350: 6e 65 6c 54 79 70 65 2c 20 30 2c 20 73 69 7a 65  nelType, 0, size
1360: 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6d 6d  );.../*.. * Comm
1370: 6f 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  on elements of t
1380: 68 65 20 73 74 72 75 63 74 75 72 65 20 28 6e 6f  he structure (no
1390: 20 63 68 61 6e 67 65 73 20 69 6e 20 6c 6f 63 61   changes in loca
13a0: 74 69 6f 6e 20 6f 72 20 6e 61 6d 65 29 0a 09 20  tion or name).. 
13b0: 2a 20 63 6c 6f 73 65 32 50 72 6f 63 2c 20 73 65  * close2Proc, se
13c0: 65 6b 50 72 6f 63 2c 20 73 65 74 4f 70 74 69 6f  ekProc, setOptio
13d0: 6e 50 72 6f 63 20 73 74 61 79 20 4e 55 4c 4c 2e  nProc stay NULL.
13e0: 0a 09 20 2a 2f 0a 0a 09 74 6c 73 43 68 61 6e 6e  .. */...tlsChann
13f0: 65 6c 54 79 70 65 2d 3e 74 79 70 65 4e 61 6d 65  elType->typeName
1400: 09 3d 20 22 74 6c 73 22 3b 0a 09 74 6c 73 43 68  .= "tls";..tlsCh
1410: 61 6e 6e 65 6c 54 79 70 65 2d 3e 63 6c 6f 73 65  annelType->close
1420: 50 72 6f 63 09 3d 20 54 6c 73 43 6c 6f 73 65 50  Proc.= TlsCloseP
1430: 72 6f 63 3b 0a 09 74 6c 73 43 68 61 6e 6e 65 6c  roc;..tlsChannel
1440: 54 79 70 65 2d 3e 69 6e 70 75 74 50 72 6f 63 09  Type->inputProc.
1450: 3d 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 3b 0a  = TlsInputProc;.
1460: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d  .tlsChannelType-
1470: 3e 6f 75 74 70 75 74 50 72 6f 63 09 3d 20 54 6c  >outputProc.= Tl
1480: 73 4f 75 74 70 75 74 50 72 6f 63 3b 0a 09 74 6c  sOutputProc;..tl
1490: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 67 65  sChannelType->ge
14a0: 74 4f 70 74 69 6f 6e 50 72 6f 63 09 3d 20 54 6c  tOptionProc.= Tl
14b0: 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a  sGetOptionProc;.
14c0: 09 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d  .tlsChannelType-
14d0: 3e 77 61 74 63 68 50 72 6f 63 09 3d 20 54 6c 73  >watchProc.= Tls
14e0: 57 61 74 63 68 50 72 6f 63 3b 0a 09 74 6c 73 43  WatchProc;..tlsC
14f0: 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 67 65 74 48  hannelType->getH
1500: 61 6e 64 6c 65 50 72 6f 63 09 3d 20 54 6c 73 47  andleProc.= TlsG
1510: 65 74 48 61 6e 64 6c 65 50 72 6f 63 3b 0a 0a 09  etHandleProc;...
1520: 2f 2a 0a 09 20 2a 20 62 6c 6f 63 6b 4d 6f 64 65  /*.. * blockMode
1530: 50 72 6f 63 20 69 73 20 61 20 74 77 69 73 74 65  Proc is a twiste
1540: 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 6d  r.  We have to m
1550: 61 6b 65 20 73 6f 6d 65 20 72 75 6e 74 69 6d 65  ake some runtime
1560: 2d 63 68 6f 69 63 65 73 2c 0a 09 20 2a 20 64 65  -choices,.. * de
1570: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
1580: 65 72 73 69 6f 6e 20 77 65 20 63 6f 6d 70 69 6c  ersion we compil
1590: 65 64 20 61 67 61 69 6e 73 74 2e 0a 09 20 2a 2f  ed against... */
15a0: 0a 0a 23 69 66 64 65 66 20 45 4d 55 4c 41 54 45  ..#ifdef EMULATE
15b0: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
15c0: 5f 32 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 61 72  _2../*.. * We ar
15d0: 65 20 63 6f 6d 70 69 6c 69 6e 67 20 61 67 61 69  e compiling agai
15e0: 6e 73 74 20 61 6e 20 38 2e 33 2e 31 2d 20 63 6f  nst an 8.3.1- co
15f0: 72 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  re.  We have to 
1600: 63 72 65 61 74 65 20 73 6f 6d 65 0a 09 20 2a 20  create some.. * 
1610: 64 65 66 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20  definitions for 
1620: 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 73  the new elements
1630: 20 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   as the compiler
1640: 20 64 6f 65 73 20 6e 6f 74 20 6b 6e 6f 77 20 74   does not know t
1650: 68 65 6d 0a 09 20 2a 20 62 79 20 6e 61 6d 65 2e  hem.. * by name.
1660: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 63 68 61 6e  .. */...if (chan
1670: 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d  nelTypeVersion =
1680: 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45  = TLS_CHANNEL_VE
1690: 52 53 49 4f 4e 5f 31 29 20 7b 0a 09 20 20 20 20  RSION_1) {..    
16a0: 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20 27  /*..     * The '
16b0: 76 65 72 73 69 6f 6e 27 20 65 6c 65 6d 65 6e 74  version' element
16c0: 20 6f 66 20 38 2e 33 2e 32 20 69 73 20 69 6e 20   of 8.3.2 is in 
16d0: 74 68 65 20 74 68 65 20 70 6c 61 63 65 20 6f 66  the the place of
16e0: 20 74 68 65 0a 09 20 20 20 20 20 2a 20 62 6c 6f   the..     * blo
16f0: 63 6b 4d 6f 64 65 50 72 6f 63 2e 20 46 6f 72 20  ckModeProc. For 
1700: 38 2e 32 2e 30 2d 38 2e 33 2e 31 20 77 65 20 68  8.2.0-8.3.1 we h
1710: 61 76 65 20 74 6f 20 73 65 74 20 6f 75 72 20 62  ave to set our b
1720: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 0a 09 20 20  lockModeProc..  
1730: 20 20 20 2a 20 69 6e 74 6f 20 74 68 69 73 20 70     * into this p
1740: 6c 61 63 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 09  lace...     */..
1750: 20 20 20 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79      tlsChannelTy
1760: 70 65 2d 3e 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f  pe->blockModePro
1770: 63 20 3d 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65  c = TlsBlockMode
1780: 50 72 6f 63 3b 0a 09 7d 20 65 6c 73 65 20 2f 2a  Proc;..} else /*
1790: 20 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73   channelTypeVers
17a0: 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e  ion == TLS_CHANN
17b0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 20 2a 2f 20  EL_VERSION_2 */ 
17c0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  {..    /*..     
17d0: 2a 20 46 6f 72 20 74 68 65 20 38 2e 33 2e 32 20  * For the 8.3.2 
17e0: 63 6f 72 65 20 77 65 20 70 72 65 73 65 6e 74 20  core we present 
17f0: 6f 75 72 73 65 6c 76 65 73 20 61 73 20 61 20 76  ourselves as a v
1800: 65 72 73 69 6f 6e 20 32 0a 09 20 20 20 20 20 2a  ersion 2..     *
1810: 20 64 72 69 76 65 72 2e 20 54 68 69 73 20 6d 65   driver. This me
1820: 61 6e 73 20 61 20 73 70 65 63 69 61 6c 20 76 61  ans a special va
1830: 6c 75 65 20 69 6e 20 76 65 72 73 69 6f 6e 20 28  lue in version (
1840: 65 78 0a 09 20 20 20 20 20 2a 20 62 6c 6f 63 6b  ex..     * block
1850: 4d 6f 64 65 50 72 6f 63 29 2c 20 62 6c 6f 63 6b  ModeProc), block
1860: 4d 6f 64 65 50 72 6f 63 20 69 6e 20 61 20 64 69  ModeProc in a di
1870: 66 66 65 72 65 6e 74 20 70 6c 61 63 65 20 61 6e  fferent place an
1880: 64 20 6f 66 0a 09 20 20 20 20 20 2a 20 63 6f 75  d of..     * cou
1890: 72 73 65 20 75 73 61 67 65 20 6f 66 20 74 68 65  rse usage of the
18a0: 20 68 61 6e 64 6c 65 72 50 72 6f 63 2e 20 20 54   handlerProc.  T
18b0: 68 65 20 6c 61 73 74 20 74 77 6f 20 68 61 76 65  he last two have
18c0: 20 74 6f 0a 09 20 20 20 20 20 2a 20 72 65 66 65   to..     * refe
18d0: 72 65 6e 63 65 64 20 77 69 74 68 20 70 6f 69 6e  renced with poin
18e0: 74 65 72 20 6d 61 67 69 63 20 62 65 63 61 75 73  ter magic becaus
18f0: 65 20 74 68 65 79 20 61 72 65 6e 27 74 20 64 65  e they aren't de
1900: 66 69 6e 65 64 0a 09 20 20 20 20 20 2a 20 6f 74  fined..     * ot
1910: 68 65 72 77 69 73 65 2e 0a 09 20 20 20 20 20 2a  herwise...     *
1920: 2f 0a 0a 09 20 20 20 20 74 6c 73 43 68 61 6e 6e  /...    tlsChann
1930: 65 6c 54 79 70 65 2d 3e 62 6c 6f 63 6b 4d 6f 64  elType->blockMod
1940: 65 50 72 6f 63 20 3d 0a 09 09 28 54 63 6c 5f 44  eProc =...(Tcl_D
1950: 72 69 76 65 72 42 6c 6f 63 6b 4d 6f 64 65 50 72  riverBlockModePr
1960: 6f 63 2a 29 20 54 4c 53 5f 43 48 41 4e 4e 45 4c  oc*) TLS_CHANNEL
1970: 5f 56 45 52 53 49 4f 4e 5f 32 3b 0a 09 20 20 20  _VERSION_2;..   
1980: 20 28 2a 28 28 54 63 6c 5f 44 72 69 76 65 72 42   (*((Tcl_DriverB
1990: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2a 2a 29 28  lockModeProc**)(
19a0: 26 28 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65  &(tlsChannelType
19b0: 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 29 2b 31 29  ->close2Proc)+1)
19c0: 29 29 0a 09 09 3d 20 54 6c 73 42 6c 6f 63 6b 4d  ))...= TlsBlockM
19d0: 6f 64 65 50 72 6f 63 3b 0a 09 20 20 20 20 28 2a  odeProc;..    (*
19e0: 28 28 54 6c 73 44 72 69 76 65 72 48 61 6e 64 6c  ((TlsDriverHandl
19f0: 65 72 50 72 6f 63 2a 2a 29 28 26 28 74 6c 73 43  erProc**)(&(tlsC
1a00: 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 63 6c 6f 73  hannelType->clos
1a10: 65 32 50 72 6f 63 29 2b 33 29 29 29 0a 09 09 3d  e2Proc)+3)))...=
1a20: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 3b 0a   TlsNotifyProc;.
1a30: 09 7d 0a 23 65 6c 73 65 0a 09 2f 2a 0a 09 20 2a  .}.#else../*.. *
1a40: 20 43 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   Compiled agains
1a50: 74 20 38 2e 33 2e 32 2b 2e 20 44 69 72 65 63 74  t 8.3.2+. Direct
1a60: 20 61 63 63 65 73 73 20 74 6f 20 61 6c 6c 20 65   access to all e
1a70: 6c 65 6d 65 6e 74 73 20 70 6f 73 73 69 62 6c 65  lements possible
1a80: 2e 20 55 73 65 0a 09 20 2a 20 63 68 61 6e 6e 65  . Use.. * channe
1a90: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 69 6e 66  lTypeVersion inf
1aa0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 6c 65  ormation to sele
1ab0: 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
1ac0: 20 75 73 65 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20   use... */...if 
1ad0: 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73  (channelTypeVers
1ae0: 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e  ion == TLS_CHANN
1af0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 29 20 7b 0a  EL_VERSION_1) {.
1b00: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
1b10: 54 68 65 20 27 76 65 72 73 69 6f 6e 27 20 65 6c  The 'version' el
1b20: 65 6d 65 6e 74 20 6f 66 20 38 2e 33 2e 32 20 69  ement of 8.3.2 i
1b30: 73 20 69 6e 20 74 68 65 20 74 68 65 20 70 6c 61  s in the the pla
1b40: 63 65 20 6f 66 20 74 68 65 0a 09 20 20 20 20 20  ce of the..     
1b50: 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2e  * blockModeProc.
1b60: 20 46 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   For the origina
1b70: 6c 20 70 61 74 63 68 20 69 6e 20 38 2e 31 2e 78  l patch in 8.1.x
1b80: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 6c 79   and the firstly
1b90: 0a 09 20 20 20 20 20 2a 20 69 6e 63 6c 75 64 65  ..     * include
1ba0: 64 20 28 38 2e 32 29 20 77 65 20 68 61 76 65 20  d (8.2) we have 
1bb0: 74 6f 20 73 65 74 20 6f 75 72 20 62 6c 6f 63 6b  to set our block
1bc0: 4d 6f 64 65 50 72 6f 63 20 69 6e 74 6f 20 74 68  ModeProc into th
1bd0: 69 73 0a 09 20 20 20 20 20 2a 20 70 6c 61 63 65  is..     * place
1be0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 20  ...     */..    
1bf0: 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e  tlsChannelType->
1c00: 76 65 72 73 69 6f 6e 20 3d 20 28 54 63 6c 5f 43  version = (Tcl_C
1c10: 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f  hannelTypeVersio
1c20: 6e 29 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72  n)TlsBlockModePr
1c30: 6f 63 3b 0a 09 7d 20 65 6c 73 65 20 2f 2a 20 63  oc;..} else /* c
1c40: 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f  hannelTypeVersio
1c50: 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c  n == TLS_CHANNEL
1c60: 5f 56 45 52 53 49 4f 4e 5f 32 20 2a 2f 20 7b 0a  _VERSION_2 */ {.
1c70: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
1c80: 46 6f 72 20 74 68 65 20 38 2e 33 2e 32 20 63 6f  For the 8.3.2 co
1c90: 72 65 20 77 65 20 70 72 65 73 65 6e 74 20 6f 75  re we present ou
1ca0: 72 73 65 6c 76 65 73 20 61 73 20 61 20 76 65 72  rselves as a ver
1cb0: 73 69 6f 6e 20 32 0a 09 20 20 20 20 20 2a 20 64  sion 2..     * d
1cc0: 72 69 76 65 72 2e 20 54 68 69 73 20 6d 65 61 6e  river. This mean
1cd0: 73 20 61 20 73 70 65 63 69 61 6c 20 76 61 6c 75  s a special valu
1ce0: 65 20 69 6e 20 76 65 72 73 69 6f 6e 20 28 65 78  e in version (ex
1cf0: 0a 09 20 20 20 20 20 2a 20 62 6c 6f 63 6b 4d 6f  ..     * blockMo
1d00: 64 65 50 72 6f 63 29 2c 20 62 6c 6f 63 6b 4d 6f  deProc), blockMo
1d10: 64 65 50 72 6f 63 20 69 6e 20 61 20 64 69 66 66  deProc in a diff
1d20: 65 72 65 6e 74 20 70 6c 61 63 65 20 61 6e 64 20  erent place and 
1d30: 6f 66 0a 09 20 20 20 20 20 2a 20 63 6f 75 72 73  of..     * cours
1d40: 65 20 75 73 61 67 65 20 6f 66 20 74 68 65 20 68  e usage of the h
1d50: 61 6e 64 6c 65 72 50 72 6f 63 2e 0a 09 20 20 20  andlerProc...   
1d60: 20 20 2a 2f 0a 0a 09 20 20 20 20 74 6c 73 43 68    */...    tlsCh
1d70: 61 6e 6e 65 6c 54 79 70 65 2d 3e 76 65 72 73 69  annelType->versi
1d80: 6f 6e 20 20 20 20 20 20 20 3d 20 54 43 4c 5f 43  on       = TCL_C
1d90: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32  HANNEL_VERSION_2
1da0: 3b 0a 09 20 20 20 20 74 6c 73 43 68 61 6e 6e 65  ;..    tlsChanne
1db0: 6c 54 79 70 65 2d 3e 62 6c 6f 63 6b 4d 6f 64 65  lType->blockMode
1dc0: 50 72 6f 63 20 3d 20 54 6c 73 42 6c 6f 63 6b 4d  Proc = TlsBlockM
1dd0: 6f 64 65 50 72 6f 63 3b 0a 09 20 20 20 20 74 6c  odeProc;..    tl
1de0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 68 61  sChannelType->ha
1df0: 6e 64 6c 65 72 50 72 6f 63 20 20 20 3d 20 54 6c  ndlerProc   = Tl
1e00: 73 4e 6f 74 69 66 79 50 72 6f 63 3b 0a 09 7d 0a  sNotifyProc;..}.
1e10: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
1e20: 20 72 65 74 75 72 6e 20 74 6c 73 43 68 61 6e 6e   return tlsChann
1e30: 65 6c 54 79 70 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  elType;.}.../*. 
1e40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 42 6c  ----. *. * TlsBl
1e90: 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20  ockModeProc --. 
1ea0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
1eb0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ure is invoked b
1ec0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
1ed0: 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20   level. *       
1ee0: 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20  to set blocking 
1ef0: 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20  and nonblocking 
1f00: 6d 6f 64 65 73 0a 20 2a 20 52 65 73 75 6c 74 73  modes. * Results
1f10: 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 73  :. *.0 if succes
1f20: 73 66 75 6c 2c 20 65 72 72 6e 6f 20 77 68 65 6e  sful, errno when
1f30: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53   failed.. *. * S
1f40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1f50: 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65 20  Sets the device 
1f60: 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72  into blocking or
1f70: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64   nonblocking mod
1f80: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1fd0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 42  .static int.TlsB
1fe0: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69  lockModeProc(Cli
1ff0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2000: 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20  Data,./* Socket 
2010: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  state. */.      
2020: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d             int m
2030: 6f 64 65 29 09 09 09 2f 2a 20 54 68 65 20 6d 6f  ode).../* The mo
2040: 64 65 20 74 6f 20 73 65 74 2e 20 43 61 6e 20 62  de to set. Can b
2050: 65 20 6f 6e 65 20 6f 66 0a 09 09 09 09 09 09 2a  e one of.......*
2060: 20 54 43 4c 5f 4d 4f 44 45 5f 42 4c 4f 43 4b 49   TCL_MODE_BLOCKI
2070: 4e 47 20 6f 72 0a 09 09 09 09 09 09 2a 20 54 43  NG or.......* TC
2080: 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49  L_MODE_NONBLOCKI
2090: 4e 47 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61  NG. */.{.    Sta
20a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
20b0: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
20c0: 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28  eData;..    if (
20d0: 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45  mode == TCL_MODE
20e0: 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a  _NONBLOCKING) {.
20f0: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  .statePtr->flags
2100: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e   |= TLS_TCL_ASYN
2110: 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  C;.    } else {.
2120: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  .statePtr->flags
2130: 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53   &= ~(TLS_TCL_AS
2140: 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  YNC);.    }.    
2150: 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56  if (channelTypeV
2160: 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48  ersion == TLS_CH
2170: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29  ANNEL_VERSION_2)
2180: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20   {..return 0;.  
2190: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74 75    } else {..retu
21a0: 72 6e 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65  rn Tcl_SetChanne
21b0: 6c 4f 70 74 69 6f 6e 28 73 74 61 74 65 50 74 72  lOption(statePtr
21c0: 2d 3e 69 6e 74 65 72 70 2c 20 54 6c 73 5f 47 65  ->interp, Tls_Ge
21d0: 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72  tParent(statePtr
21e0: 29 2c 0a 09 09 22 2d 62 6c 6f 63 6b 69 6e 67 22  ),..."-blocking"
21f0: 2c 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d  , (mode == TCL_M
2200: 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29  ODE_NONBLOCKING)
2210: 20 3f 20 22 30 22 20 3a 20 22 31 22 29 3b 0a 20   ? "0" : "1");. 
2220: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d     }.}.../*. *--
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65  -. *. * TlsClose
2280: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
2290: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
22a0: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67  invoked by the g
22b0: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20  eneric IO level 
22c0: 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 63 68  to perform. *.ch
22d0: 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 63 69  annel-type-speci
22e0: 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e  fic cleanup when
22f0: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
2300: 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
2310: 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20 2a 09  s closed.. *. *.
2320: 4e 6f 74 65 3a 20 77 65 20 6c 65 61 76 65 20 74  Note: we leave t
2330: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 6f  he underlying so
2340: 63 6b 65 74 20 61 6c 6f 6e 65 2c 20 69 73 20 74  cket alone, is t
2350: 68 69 73 20 72 69 67 68 74 3f 0a 20 2a 0a 20 2a  his right?. *. *
2360: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69   Results:. *.0 i
2370: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
2380: 65 20 76 61 6c 75 65 20 6f 66 20 54 63 6c 5f 47  e value of Tcl_G
2390: 65 74 45 72 72 6e 6f 28 29 20 69 66 20 66 61 69  etErrno() if fai
23a0: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  led.. *. * Side 
23b0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6c 6f 73  effects:. *.Clos
23c0: 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f 66  es the socket of
23d0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a   the channel.. *
23e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
2430: 63 20 69 6e 74 0a 54 6c 73 43 6c 6f 73 65 50 72  c int.TlsClosePr
2440: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  oc(ClientData in
2450: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54  stanceData,./* T
2460: 68 65 20 73 6f 63 6b 65 74 20 74 6f 20 63 6c 6f  he socket to clo
2470: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
2480: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
2490: 69 6e 74 65 72 70 29 09 2f 2a 20 46 6f 72 20 65  interp)./* For e
24a0: 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20 2d  rror reporting -
24b0: 20 75 6e 75 73 65 64 2e 20 2a 2f 0a 7b 0a 20 20   unused. */.{.  
24c0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
24d0: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e  r = (State *) in
24e0: 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20  stanceData;..   
24f0: 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   dprintf(stderr,
2500: 22 5c 6e 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28  "\nTlsCloseProc(
2510: 30 78 25 78 29 22 2c 20 28 75 6e 73 69 67 6e 65  0x%x)", (unsigne
2520: 64 20 69 6e 74 29 20 73 74 61 74 65 50 74 72 29  d int) statePtr)
2530: 3b 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e  ;..    if (chann
2540: 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d  elTypeVersion ==
2550: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TLS_CHANNEL_VER
2560: 53 49 4f 4e 5f 31 29 20 7b 0a 09 2f 2a 0a 09 20  SION_1) {../*.. 
2570: 2a 20 52 65 6d 6f 76 65 20 65 76 65 6e 74 20 68  * Remove event h
2580: 61 6e 64 6c 65 72 20 74 6f 20 75 6e 64 65 72 6c  andler to underl
2590: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2c 20 74 68  ying channel, th
25a0: 69 73 20 63 6f 75 6c 64 0a 09 20 2a 20 62 65 20  is could.. * be 
25b0: 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 63  because we are c
25c0: 6c 6f 73 69 6e 67 20 66 6f 72 20 72 65 61 6c 2c  losing for real,
25d0: 20 6f 72 20 62 65 69 6e 67 20 22 75 6e 73 74 61   or being "unsta
25e0: 63 6b 65 64 22 2e 0a 09 20 2a 2f 0a 0a 09 54 63  cked"... */...Tc
25f0: 6c 5f 44 65 6c 65 74 65 43 68 61 6e 6e 65 6c 48  l_DeleteChannelH
2600: 61 6e 64 6c 65 72 28 54 6c 73 5f 47 65 74 50 61  andler(Tls_GetPa
2610: 72 65 6e 74 28 73 74 61 74 65 50 74 72 29 2c 0a  rent(statePtr),.
2620: 09 09 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64  ..TlsChannelHand
2630: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  ler, (ClientData
2640: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
2650: 20 7d 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61   }..    Tls_Clea
2660: 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  n(statePtr);.   
2670: 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46   Tcl_EventuallyF
2680: 72 65 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ree((ClientData)
2690: 73 74 61 74 65 50 74 72 2c 20 54 6c 73 5f 46 72  statePtr, Tls_Fr
26a0: 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ee);.    return 
26b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
26c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 49 6e  ----. *. * TlsIn
2710: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  putProc --. *. *
2720: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
2730: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
2740: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76  e generic IO lev
2750: 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 72  el. *       to r
2760: 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61  ead input from a
2770: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
2780: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  d channel.. *. *
2790: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65   Results:. *.The
27a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
27b0: 20 72 65 61 64 20 69 73 20 72 65 74 75 72 6e 65   read is returne
27c0: 64 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72  d or -1 on error
27d0: 2e 20 41 6e 20 6f 75 74 70 75 74 0a 20 2a 09 61  . An output. *.a
27e0: 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
27f0: 20 74 68 65 20 50 4f 53 49 58 20 65 72 72 6f 72   the POSIX error
2800: 20 63 6f 64 65 20 6f 6e 20 65 72 72 6f 72 2c 20   code on error, 
2810: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a 20 2a  or zero if no. *
2820: 09 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2e  .error occurred.
2830: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2840: 63 74 73 3a 0a 20 2a 09 52 65 61 64 73 20 69 6e  cts:. *.Reads in
2850: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  put from the inp
2860: 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 68 65  ut device of the
2870: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
28d0: 6e 74 0a 54 6c 73 49 6e 70 75 74 50 72 6f 63 28  nt.TlsInputProc(
28e0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
28f0: 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b  nceData,./* Sock
2900: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 09 63 68  et state. */..ch
2910: 61 72 20 2a 62 75 66 2c 09 09 09 2f 2a 20 57 68  ar *buf,.../* Wh
2920: 65 72 65 20 74 6f 20 73 74 6f 72 65 20 64 61 74  ere to store dat
2930: 61 20 72 65 61 64 2e 20 2a 2f 0a 09 69 6e 74 20  a read. */..int 
2940: 62 75 66 53 69 7a 65 2c 09 09 09 2f 2a 20 48 6f  bufSize,.../* Ho
2950: 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2960: 61 76 61 69 6c 61 62 6c 65 0a 09 09 09 09 09 20  available...... 
2970: 2a 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 3f  * in the buffer?
2980: 20 2a 2f 0a 09 69 6e 74 20 2a 65 72 72 6f 72 43   */..int *errorC
2990: 6f 64 65 50 74 72 29 09 09 2f 2a 20 57 68 65 72  odePtr)../* Wher
29a0: 65 20 74 6f 20 73 74 6f 72 65 20 65 72 72 6f 72  e to store error
29b0: 20 63 6f 64 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20   code. */.{.    
29c0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
29d0: 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74  = (State *) inst
29e0: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e  anceData;.    in
29f0: 74 20 62 79 74 65 73 52 65 61 64 3b 09 09 09 2f  t bytesRead;.../
2a00: 2a 20 48 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  * How many bytes
2a10: 20 77 65 72 65 20 72 65 61 64 3f 20 2a 2f 0a 0a   were read? */..
2a20: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2a30: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  r = 0;..    dpri
2a40: 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e 42 49  ntf(stderr,"\nBI
2a50: 4f 5f 72 65 61 64 28 25 64 29 22 2c 20 62 75 66  O_read(%d)", buf
2a60: 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 20 28  Size);..    if (
2a70: 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e  !SSL_is_init_fin
2a80: 69 73 68 65 64 28 73 74 61 74 65 50 74 72 2d 3e  ished(statePtr->
2a90: 73 73 6c 29 29 20 7b 0a 09 62 79 74 65 73 52 65  ssl)) {..bytesRe
2aa0: 61 64 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  ad = Tls_WaitFor
2ab0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
2ac0: 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b  , errorCodePtr);
2ad0: 0a 09 69 66 20 28 62 79 74 65 73 52 65 61 64 20  ..if (bytesRead 
2ae0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 67 6f 74  <= 0) {..    got
2af0: 6f 20 69 6e 70 75 74 3b 0a 09 7d 0a 20 20 20 20  o input;..}.    
2b00: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
2b10: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
2b20: 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 73 74 61  TCL_INIT) {..sta
2b30: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20  tePtr->flags &= 
2b40: 7e 28 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 3b  ~(TLS_TCL_INIT);
2b50: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20  .    }.    /*.  
2b60: 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20     * We need to 
2b70: 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65 72  clear the SSL er
2b80: 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62 65  ror stack now be
2b90: 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69 6d  cause we sometim
2ba0: 65 73 20 72 65 61 63 68 0a 20 20 20 20 20 2a 20  es reach.     * 
2bb0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2bc0: 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f  th leftover erro
2bd0: 72 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b 2e  rs in the stack.
2be0: 20 20 49 66 20 42 49 4f 5f 72 65 61 64 0a 20 20    If BIO_read.  
2bf0: 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d 31 20     * returns -1 
2c00: 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41 47 41  and intends EAGA
2c10: 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61 20 6c  IN, there is a l
2c20: 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c 20 69  eftover error, i
2c30: 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 2a  t will be.     *
2c40: 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20 61 73   misconstrued as
2c50: 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20 45   an error, not E
2c60: 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a 20 20  AGAIN..     *.  
2c70: 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 65     * Alternative
2c80: 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e 74 20  ly, we may want 
2c90: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 3c 30  to handle the <0
2ca0: 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 66 72   return codes fr
2cb0: 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f 72 65  om.     * BIO_re
2cc0: 61 64 20 73 70 65 63 69 61 6c 6c 79 20 28 61 73  ad specially (as
2cd0: 20 61 64 76 69 73 65 64 20 69 6e 20 74 68 65 20   advised in the 
2ce0: 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c 53 27  RSA docs).  TLS'
2cf0: 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 20 42 49  s lower level BI
2d00: 4f 0a 20 20 20 20 20 2a 20 66 75 6e 63 74 69 6f  O.     * functio
2d10: 6e 73 20 70 6c 61 79 20 77 69 74 68 20 74 68 65  ns play with the
2d20: 20 72 65 74 72 79 20 66 6c 61 67 73 20 74 68 6f   retry flags tho
2d30: 75 67 68 2c 20 61 6e 64 20 74 68 69 73 20 73 65  ugh, and this se
2d40: 65 6d 73 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ems to work.    
2d50: 20 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53   * correctly.  S
2d60: 69 6d 69 6c 61 72 20 66 69 78 20 69 6e 20 54 6c  imilar fix in Tl
2d70: 73 4f 75 74 70 75 74 50 72 6f 63 2e 20 2d 20 68  sOutputProc. - h
2d80: 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20  obbs.     */.   
2d90: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
2da0: 28 29 3b 0a 20 20 20 20 62 79 74 65 73 52 65 61  ();.    bytesRea
2db0: 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73 74 61  d = BIO_read(sta
2dc0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c  tePtr->bio, buf,
2dd0: 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20 20 64   bufSize);.    d
2de0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c  printf(stderr,"\
2df0: 6e 42 49 4f 5f 72 65 61 64 20 2d 3e 20 25 64 22  nBIO_read -> %d"
2e00: 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a 0a 20  , bytesRead);.. 
2e10: 20 20 20 69 66 20 28 62 79 74 65 73 52 65 61 64     if (bytesRead
2e20: 20 3c 20 30 29 20 7b 0a 09 69 6e 74 20 65 72 72   < 0) {..int err
2e30: 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72   = SSL_get_error
2e40: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
2e50: 62 79 74 65 73 52 65 61 64 29 3b 0a 0a 09 69 66  bytesRead);...if
2e60: 20 28 65 72 72 20 3d 3d 20 53 53 4c 5f 45 52 52   (err == SSL_ERR
2e70: 4f 52 5f 53 53 4c 29 20 7b 0a 09 20 20 20 20 54  OR_SSL) {..    T
2e80: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74  ls_Error(statePt
2e90: 72 2c 20 53 53 4c 5f 45 52 52 4f 52 28 73 74 61  r, SSL_ERROR(sta
2ea0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65  tePtr->ssl, byte
2eb0: 73 52 65 61 64 29 29 3b 0a 09 20 20 20 20 2a 65  sRead));..    *e
2ec0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
2ed0: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 7d 20 65  ONNABORTED;..} e
2ee0: 6c 73 65 20 69 66 20 28 42 49 4f 5f 73 68 6f 75  lse if (BIO_shou
2ef0: 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74  ld_retry(statePt
2f00: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20  r->bio)) {..    
2f10: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  dprintf(stderr,"
2f20: 52 45 21 20 22 29 3b 0a 09 20 20 20 20 2a 65 72  RE! ");..    *er
2f30: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47  rorCodePtr = EAG
2f40: 41 49 4e 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  AIN;..} else {..
2f50: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2f60: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  r = Tcl_GetErrno
2f70: 28 29 3b 0a 09 20 20 20 20 69 66 20 28 2a 65 72  ();..    if (*er
2f80: 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43  rorCodePtr == EC
2f90: 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 2f 2a  ONNRESET) {.../*
2fa0: 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 09 2a   Soft EOF */...*
2fb0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
2fc0: 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20  ;...bytesRead = 
2fd0: 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  0;..    }..}.   
2fe0: 20 7d 0a 20 20 20 20 69 6e 70 75 74 3a 0a 20 20   }.    input:.  
2ff0: 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72    dprintf(stderr
3000: 2c 20 22 5c 6e 49 6e 70 75 74 28 25 64 29 20 2d  , "\nInput(%d) -
3010: 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53  > %d [%d]", bufS
3020: 69 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20  ize, bytesRead, 
3030: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a  *errorCodePtr);.
3040: 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73      return bytes
3050: 52 65 61 64 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Read;.}.../*. *-
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70  --. *. * TlsOutp
30b0: 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  utProc --. *. *.
30c0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
30d0: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  s invoked by the
30e0: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65   generic IO leve
30f0: 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 77 72  l. *       to wr
3100: 69 74 65 20 6f 75 74 70 75 74 20 74 6f 20 61 20  ite output to a 
3110: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
3120: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20   channel.. *. * 
3130: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20  Results:. *.The 
3140: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
3150: 77 72 69 74 74 65 6e 20 69 73 20 72 65 74 75 72  written is retur
3160: 6e 65 64 2e 20 41 6e 20 6f 75 74 70 75 74 20 61  ned. An output a
3170: 72 67 75 6d 65 6e 74 20 69 73 0a 20 2a 09 73 65  rgument is. *.se
3180: 74 20 74 6f 20 61 20 50 4f 53 49 58 20 65 72 72  t to a POSIX err
3190: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
31a0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 6f 72  ror occurred, or
31b0: 20 7a 65 72 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64   zero.. *. * Sid
31c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 72  e effects:. *.Wr
31d0: 69 74 65 73 20 6f 75 74 70 75 74 20 6f 6e 20 74  ites output on t
31e0: 68 65 20 6f 75 74 70 75 74 20 64 65 76 69 63 65  he output device
31f0: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e   of the channel.
3200: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 0a 73  ---------. */..s
3250: 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 4f 75 74  tatic int.TlsOut
3260: 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  putProc(ClientDa
3270: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
3280: 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65  ./* Socket state
3290: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
32a0: 20 20 20 63 68 61 72 20 2a 62 75 66 2c 09 09 2f     char *buf,../
32b0: 2a 20 54 68 65 20 64 61 74 61 20 62 75 66 66 65  * The data buffe
32c0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
32d0: 20 20 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c      int toWrite,
32e0: 09 09 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 62 79  ../* How many by
32f0: 74 65 73 20 74 6f 20 77 72 69 74 65 3f 20 2a 2f  tes to write? */
3300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
3310: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  nt *errorCodePtr
3320: 29 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74  )./* Where to st
3330: 6f 72 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ore error code. 
3340: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
3350: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
3360: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74  e *) instanceDat
3370: 61 3b 0a 20 20 20 20 69 6e 74 20 77 72 69 74 74  a;.    int writt
3380: 65 6e 2c 20 65 72 72 3b 0a 0a 20 20 20 20 2a 65  en, err;..    *e
3390: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
33a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74  ..    dprintf(st
33b0: 64 65 72 72 2c 22 5c 6e 42 49 4f 5f 77 72 69 74  derr,"\nBIO_writ
33c0: 65 28 30 78 25 78 2c 20 25 64 29 22 2c 20 28 75  e(0x%x, %d)", (u
33d0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 61  nsigned int) sta
33e0: 74 65 50 74 72 2c 20 74 6f 57 72 69 74 65 29 3b  tePtr, toWrite);
33f0: 0a 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 69  ..    if (!SSL_i
3400: 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28  s_init_finished(
3410: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20  statePtr->ssl)) 
3420: 7b 0a 09 77 72 69 74 74 65 6e 20 3d 20 54 6c 73  {..written = Tls
3430: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28  _WaitForConnect(
3440: 73 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43  statePtr, errorC
3450: 6f 64 65 50 74 72 29 3b 0a 09 69 66 20 28 77 72  odePtr);..if (wr
3460: 69 74 74 65 6e 20 3c 3d 20 30 29 20 7b 0a 09 20  itten <= 0) {.. 
3470: 20 20 20 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a     goto output;.
3480: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .}.    }.    if 
3490: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
34a0: 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29   & TLS_TCL_INIT)
34b0: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c   {..statePtr->fl
34c0: 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c  ags &= ~(TLS_TCL
34d0: 5f 49 4e 49 54 29 3b 0a 20 20 20 20 7d 0a 20 20  _INIT);.    }.  
34e0: 20 20 69 66 20 28 74 6f 57 72 69 74 65 20 3d 3d    if (toWrite ==
34f0: 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 73   0) {..dprintf(s
3500: 74 64 65 72 72 2c 20 22 7a 65 72 6f 2d 77 72 69  tderr, "zero-wri
3510: 74 65 5c 6e 22 29 3b 0a 09 42 49 4f 5f 66 6c 75  te\n");..BIO_flu
3520: 73 68 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  sh(statePtr->bio
3530: 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 30 3b  );..written = 0;
3540: 0a 09 67 6f 74 6f 20 6f 75 74 70 75 74 3b 0a 20  ..goto output;. 
3550: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a     } else {../*.
3560: 09 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 63  . * We need to c
3570: 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65 72 72  lear the SSL err
3580: 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62 65 63  or stack now bec
3590: 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69 6d 65  ause we sometime
35a0: 73 20 72 65 61 63 68 0a 09 20 2a 20 74 68 69 73  s reach.. * this
35b0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c   function with l
35c0: 65 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69  eftover errors i
35d0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66  n the stack.  If
35e0: 20 42 49 4f 5f 77 72 69 74 65 0a 09 20 2a 20 72   BIO_write.. * r
35f0: 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e  eturns -1 and in
3600: 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68  tends EAGAIN, th
3610: 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65  ere is a leftove
3620: 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c  r error, it will
3630: 20 62 65 0a 09 20 2a 20 6d 69 73 63 6f 6e 73 74   be.. * misconst
3640: 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72  rued as an error
3650: 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 09 20  , not EAGAIN... 
3660: 2a 0a 09 20 2a 20 41 6c 74 65 72 6e 61 74 69 76  *.. * Alternativ
3670: 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e 74  ely, we may want
3680: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 3c   to handle the <
3690: 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 66  0 return codes f
36a0: 72 6f 6d 0a 09 20 2a 20 42 49 4f 5f 77 72 69 74  rom.. * BIO_writ
36b0: 65 20 73 70 65 63 69 61 6c 6c 79 20 28 61 73 20  e specially (as 
36c0: 61 64 76 69 73 65 64 20 69 6e 20 74 68 65 20 52  advised in the R
36d0: 53 41 20 64 6f 63 73 29 2e 20 20 54 4c 53 27 73  SA docs).  TLS's
36e0: 20 6c 6f 77 65 72 20 6c 65 76 65 6c 0a 09 20 2a   lower level.. *
36f0: 20 42 49 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70   BIO functions p
3700: 6c 61 79 20 77 69 74 68 20 74 68 65 20 72 65 74  lay with the ret
3710: 72 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c  ry flags though,
3720: 20 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20   and this seems 
3730: 74 6f 0a 09 20 2a 20 77 6f 72 6b 20 63 6f 72 72  to.. * work corr
3740: 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20  ectly.  Similar 
3750: 66 69 78 20 69 6e 20 54 6c 73 49 6e 70 75 74 50  fix in TlsInputP
3760: 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 09 20 2a  roc. - hobbs.. *
3770: 2f 0a 09 45 52 52 5f 63 6c 65 61 72 5f 65 72 72  /..ERR_clear_err
3780: 6f 72 28 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d  or();..written =
3790: 20 42 49 4f 5f 77 72 69 74 65 28 73 74 61 74 65   BIO_write(state
37a0: 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74  Ptr->bio, buf, t
37b0: 6f 57 72 69 74 65 29 3b 0a 09 64 70 72 69 6e 74  oWrite);..dprint
37c0: 66 28 73 74 64 65 72 72 2c 22 5c 6e 42 49 4f 5f  f(stderr,"\nBIO_
37d0: 77 72 69 74 65 28 30 78 25 78 2c 20 25 64 29 20  write(0x%x, %d) 
37e0: 2d 3e 20 5b 25 64 5d 22 2c 0a 09 09 28 75 6e 73  -> [%d]",...(uns
37f0: 69 67 6e 65 64 20 69 6e 74 29 20 73 74 61 74 65  igned int) state
3800: 50 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72  Ptr, toWrite, wr
3810: 69 74 74 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  itten);.    }.  
3820: 20 20 69 66 20 28 77 72 69 74 74 65 6e 20 3c 3d    if (written <=
3830: 20 30 29 20 7b 0a 09 73 77 69 74 63 68 20 28 28   0) {..switch ((
3840: 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72  err = SSL_get_er
3850: 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ror(statePtr->ss
3860: 6c 2c 20 77 72 69 74 74 65 6e 29 29 29 20 7b 0a  l, written))) {.
3870: 09 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52  .    case SSL_ER
3880: 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 09 69 66 20 28  ROR_NONE:...if (
3890: 77 72 69 74 74 65 6e 20 3c 20 30 29 20 7b 0a 09  written < 0) {..
38a0: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30  .    written = 0
38b0: 3b 0a 09 09 7d 0a 09 09 62 72 65 61 6b 3b 0a 09  ;...}...break;..
38c0: 20 20 20 20 63 61 73 65 20 53 53 4c 5f 45 52 52      case SSL_ERR
38d0: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09  OR_WANT_WRITE:..
38e0: 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .dprintf(stderr,
38f0: 22 20 77 72 69 74 65 20 57 20 42 4c 4f 43 4b 22  " write W BLOCK"
3900: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  );...break;..   
3910: 20 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f   case SSL_ERROR_
3920: 57 41 4e 54 5f 52 45 41 44 3a 0a 09 09 64 70 72  WANT_READ:...dpr
3930: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 77 72  intf(stderr," wr
3940: 69 74 65 20 52 20 42 4c 4f 43 4b 22 29 3b 0a 09  ite R BLOCK");..
3950: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
3960: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54  e SSL_ERROR_WANT
3970: 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 09  _X509_LOOKUP:...
3980: 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  dprintf(stderr,"
3990: 20 77 72 69 74 65 20 58 20 42 4c 4f 43 4b 22 29   write X BLOCK")
39a0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
39b0: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a  case SSL_ERROR_Z
39c0: 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 09 64 70  ERO_RETURN:...dp
39d0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 63  rintf(stderr," c
39e0: 6c 6f 73 65 64 5c 6e 22 29 3b 0a 09 09 77 72 69  losed\n");...wri
39f0: 74 74 65 6e 20 3d 20 30 3b 0a 09 09 62 72 65 61  tten = 0;...brea
3a00: 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 53 53 4c  k;..    case SSL
3a10: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a  _ERROR_SYSCALL:.
3a20: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
3a30: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  = Tcl_GetErrno()
3a40: 3b 0a 09 09 64 70 72 69 6e 74 66 28 73 74 64 65  ;...dprintf(stde
3a50: 72 72 2c 22 20 5b 25 64 5d 20 73 79 73 63 61 6c  rr," [%d] syscal
3a60: 6c 20 65 72 72 72 3a 20 25 64 22 2c 0a 09 09 09  l errr: %d",....
3a70: 77 72 69 74 74 65 6e 2c 20 2a 65 72 72 6f 72 43  written, *errorC
3a80: 6f 64 65 50 74 72 29 3b 0a 09 09 77 72 69 74 74  odePtr);...writt
3a90: 65 6e 20 3d 20 2d 31 3b 0a 09 09 62 72 65 61 6b  en = -1;...break
3aa0: 3b 0a 09 20 20 20 20 63 61 73 65 20 53 53 4c 5f  ;..    case SSL_
3ab0: 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 09 54 6c 73  ERROR_SSL:...Tls
3ac0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
3ad0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 74 61 74 65   SSL_ERROR(state
3ae0: 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65  Ptr->ssl, writte
3af0: 6e 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64  n));...*errorCod
3b00: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
3b10: 54 45 44 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d  TED;...written =
3b20: 20 2d 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20   -1;...break;.. 
3b30: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 64 70     default:...dp
3b40: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 20 75  rintf(stderr," u
3b50: 6e 6b 6e 6f 77 6e 20 65 72 72 3a 20 25 64 5c 6e  nknown err: %d\n
3b60: 22 2c 20 65 72 72 29 3b 0a 09 09 62 72 65 61 6b  ", err);...break
3b70: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ;..}.    }.    o
3b80: 75 74 70 75 74 3a 0a 20 20 20 20 64 70 72 69 6e  utput:.    dprin
3b90: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 4f 75  tf(stderr, "\nOu
3ba0: 74 70 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c  tput(%d) -> %d",
3bb0: 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65   toWrite, writte
3bc0: 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  n);.    return w
3bd0: 72 69 74 74 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ritten;.}.../*. 
3be0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 54 6c 73 47 65  ----. *. * TlsGe
3c30: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20  tOptionProc --. 
3c40: 2a 0a 20 2a 09 43 6f 6d 70 75 74 65 73 20 61 6e  *. *.Computes an
3c50: 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f   option value fo
3c60: 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  r a SSL socket b
3c70: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72  ased channel, or
3c80: 20 61 0a 20 2a 09 6c 69 73 74 20 6f 66 20 61 6c   a. *.list of al
3c90: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68  l options and th
3ca0: 65 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20  eir values.. *. 
3cb0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
3cc0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
3cd0: 75 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 20 6f  ult. The value o
3ce0: 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
3cf0: 6f 70 74 69 6f 6e 20 6f 72 20 61 0a 20 2a 09 6c  option or a. *.l
3d00: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f  ist of all optio
3d10: 6e 73 20 61 6e 64 09 74 68 65 69 72 20 76 61 6c  ns and.their val
3d20: 75 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 20  ues is returned 
3d30: 69 6e 20 74 68 65 0a 20 2a 09 73 75 70 70 6c 69  in the. *.suppli
3d40: 65 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20  ed DString.. *. 
3d50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3d60: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
3d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
3dc0: 0a 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f  .TlsGetOptionPro
3dd0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
3de0: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f  tanceData,./* So
3df0: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 09  cket state. */..
3e00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3e10: 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f  rp,../* For erro
3e20: 72 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c  rs - can be NULL
3e30: 2e 20 2a 2f 0a 09 63 68 61 72 20 2a 6f 70 74 69  . */..char *opti
3e40: 6f 6e 4e 61 6d 65 2c 09 09 2f 2a 20 4e 61 6d 65  onName,../* Name
3e50: 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74   of the option t
3e60: 6f 0a 09 09 09 09 09 20 2a 20 72 65 74 72 69 65  o...... * retrie
3e70: 76 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ve the value for
3e80: 2c 20 6f 72 0a 09 09 09 09 09 20 2a 20 4e 55 4c  , or...... * NUL
3e90: 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 74  L to get all opt
3ea0: 69 6f 6e 73 20 61 6e 64 0a 09 09 09 09 09 20 2a  ions and...... *
3eb0: 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20 2a   their values. *
3ec0: 2f 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a  /..Tcl_DString *
3ed0: 64 73 50 74 72 29 09 09 2f 2a 20 57 68 65 72 65  dsPtr)../* Where
3ee0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
3ef0: 6d 70 75 74 65 64 20 76 61 6c 75 65 0a 09 09 09  mputed value....
3f00: 09 09 20 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64  .. * initialized
3f10: 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b   by caller. */.{
3f20: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
3f30: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
3f40: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a   instanceData;..
3f50: 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 54      if (channelT
3f60: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c  ypeVersion == TL
3f70: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f  S_CHANNEL_VERSIO
3f80: 4e 5f 32 29 20 7b 0a 09 54 63 6c 5f 43 68 61 6e  N_2) {..Tcl_Chan
3f90: 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54  nel downChan = T
3fa0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61  ls_GetParent(sta
3fb0: 74 65 50 74 72 29 3b 0a 09 54 63 6c 5f 44 72 69  tePtr);..Tcl_Dri
3fc0: 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  verGetOptionProc
3fd0: 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b   *getOptionProc;
3fe0: 0a 0a 09 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63  ...getOptionProc
3ff0: 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65   = Tcl_ChannelGe
4000: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f  tOptionProc(Tcl_
4010: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64  GetChannelType(d
4020: 6f 77 6e 43 68 61 6e 29 29 3b 0a 09 69 66 20 28  ownChan));..if (
4030: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d  getOptionProc !=
4040: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65   NULL) {..    re
4050: 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e  turn (*getOption
4060: 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61  Proc)(Tcl_GetCha
4070: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
4080: 28 64 6f 77 6e 43 68 61 6e 29 2c 0a 09 09 20 20  (downChan),...  
4090: 20 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e    interp, option
40a0: 4e 61 6d 65 2c 20 64 73 50 74 72 29 3b 0a 09 7d  Name, dsPtr);..}
40b0: 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e   else if (option
40c0: 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20  Name == (char*) 
40d0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 0a  NULL) {..    /*.
40e0: 09 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 20  .     * Request 
40f0: 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c  is query for all
4100: 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69   options, this i
4110: 73 20 6f 6b 2e 0a 09 20 20 20 20 20 2a 2f 0a 09  s ok...     */..
4120: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
4130: 4b 3b 0a 09 7d 0a 09 2f 2a 0a 09 20 2a 20 52 65  K;..}../*.. * Re
4140: 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65 63  quest for a spec
4150: 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 20  ific option has 
4160: 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27  to fail, we don'
4170: 74 20 68 61 76 65 20 61 6e 79 2e 0a 09 20 2a 2f  t have any... */
4180: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
4190: 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OR;.    } else {
41a0: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 20 3d 20 30  ..size_t len = 0
41b0: 3b 0a 0a 09 69 66 20 28 6f 70 74 69 6f 6e 4e 61  ;...if (optionNa
41c0: 6d 65 20 21 3d 20 28 63 68 61 72 20 2a 29 20 4e  me != (char *) N
41d0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20  ULL) {..    len 
41e0: 3d 20 73 74 72 6c 65 6e 28 6f 70 74 69 6f 6e 4e  = strlen(optionN
41f0: 61 6d 65 29 3b 0a 09 7d 0a 23 69 66 20 30 0a 09  ame);..}.#if 0..
4200: 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30 29 20 7c  if ((len == 0) |
4210: 7c 20 28 28 6c 65 6e 20 3e 20 31 29 20 26 26 20  | ((len > 1) && 
4220: 28 6f 70 74 69 6f 6e 4e 61 6d 65 5b 31 5d 20 3d  (optionName[1] =
4230: 3d 20 27 63 27 29 20 26 26 0a 09 09 28 73 74 72  = 'c') &&...(str
4240: 6e 63 6d 70 28 6f 70 74 69 6f 6e 4e 61 6d 65 2c  ncmp(optionName,
4250: 20 22 2d 63 69 70 68 65 72 22 2c 20 6c 65 6e 29   "-cipher", len)
4260: 20 3d 3d 20 30 29 29 29 20 7b 0a 09 20 20 20 20   == 0))) {..    
4270: 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  if (len == 0) {.
4280: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70  ..Tcl_DStringApp
4290: 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 50 74 72  endElement(dsPtr
42a0: 2c 20 22 2d 63 69 70 68 65 72 22 29 3b 0a 09 20  , "-cipher");.. 
42b0: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
42c0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
42d0: 6e 74 28 64 73 50 74 72 2c 20 53 53 4c 5f 67 65  nt(dsPtr, SSL_ge
42e0: 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74  t_cipher(statePt
42f0: 72 2d 3e 73 73 6c 29 29 3b 0a 09 20 20 20 20 69  r->ssl));..    i
4300: 66 20 28 6c 65 6e 29 20 7b 0a 09 09 72 65 74 75  f (len) {...retu
4310: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20 20 20 20  rn TCL_OK;..    
4320: 7d 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 72 65 74  }..}.#endif..ret
4330: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
4340: 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  }.}.../*. *-----
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4390: 2a 0a 20 2a 20 54 6c 73 57 61 74 63 68 50 72 6f  *. * TlsWatchPro
43a0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69  c --. *. *.Initi
43b0: 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69 66 69  alize the notifi
43c0: 65 72 20 74 6f 20 77 61 74 63 68 20 54 63 6c 5f  er to watch Tcl_
43d0: 46 69 6c 65 73 20 66 72 6f 6d 20 74 68 69 73 20  Files from this 
43e0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52  channel.. *. * R
43f0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
4400: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4410: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 75 70 20  cts:. *.Sets up 
4420: 74 68 65 20 6e 6f 74 69 66 69 65 72 20 73 6f 20  the notifier so 
4430: 74 68 61 74 20 61 20 66 75 74 75 72 65 20 65 76  that a future ev
4440: 65 6e 74 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e  ent on the chann
4450: 65 6c 0a 20 2a 09 77 69 6c 6c 20 62 65 20 73 65  el. *.will be se
4460: 65 6e 20 62 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a  en by Tcl.. *. *
4470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44b0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
44c0: 76 6f 69 64 0a 54 6c 73 57 61 74 63 68 50 72 6f  void.TlsWatchPro
44d0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
44e0: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54 68  tanceData,./* Th
44f0: 65 20 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 20  e socket state. 
4500: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
4510: 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 45  int mask).../* E
4520: 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 72 65 73  vents of interes
4530: 74 3b 20 61 6e 20 4f 52 2d 65 64 0a 20 20 20 20  t; an OR-ed.    
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 20 20 20 2a 20 63 6f 6d 62 69 6e 61 74 69       * combinati
4570: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42  on of TCL_READAB
4580: 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LE,.            
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 54               * T
45b0: 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64 20  CL_WRITABLE and 
45c0: 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 2e 20 2a  TCL_EXCEPTION. *
45d0: 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  /.{.    State *s
45e0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
45f0: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
4600: 3b 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e  ;..    if (chann
4610: 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d  elTypeVersion ==
4620: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TLS_CHANNEL_VER
4630: 53 49 4f 4e 5f 32 29 20 7b 0a 09 54 63 6c 5f 43  SION_2) {..Tcl_C
4640: 68 61 6e 6e 65 6c 20 20 20 20 20 64 6f 77 6e 43  hannel     downC
4650: 68 61 6e 3b 0a 0a 09 73 74 61 74 65 50 74 72 2d  han;...statePtr-
4660: 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73  >watchMask = mas
4670: 6b 3b 0a 0a 09 2f 2a 20 4e 6f 20 63 68 61 6e 6e  k;.../* No chann
4680: 65 6c 20 68 61 6e 64 6c 65 72 73 20 61 6e 79 20  el handlers any 
4690: 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c 20 62 65  more. We will be
46a0: 20 6e 6f 74 69 66 69 65 64 20 61 75 74 6f 6d 61   notified automa
46b0: 74 69 63 61 6c 6c 79 0a 09 20 2a 20 61 62 6f 75  tically.. * abou
46c0: 74 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 20  t events on the 
46d0: 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69  channel below vi
46e0: 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f 75 72 0a  a a call to our.
46f0: 09 20 2a 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f  . * 'TransformNo
4700: 74 69 66 79 50 72 6f 63 27 2e 20 42 75 74 20 77  tifyProc'. But w
4710: 65 20 68 61 76 65 20 74 6f 20 70 61 73 73 20 74  e have to pass t
4720: 68 65 20 69 6e 74 65 72 65 73 74 20 64 6f 77 6e  he interest down
4730: 20 6e 6f 77 2e 0a 09 20 2a 20 57 65 20 61 72 65   now... * We are
4740: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64 20   allowed to add 
4750: 61 64 64 69 74 69 6f 6e 61 6c 20 27 69 6e 74 65  additional 'inte
4760: 72 65 73 74 27 20 74 6f 20 74 68 65 20 6d 61 73  rest' to the mas
4770: 6b 20 69 66 20 77 65 20 77 61 6e 74 0a 09 20 2a  k if we want.. *
4780: 20 74 6f 2e 20 42 75 74 20 74 68 69 73 20 74 72   to. But this tr
4790: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73  ansformation has
47a0: 20 6e 6f 20 73 75 63 68 20 69 6e 74 65 72 65 73   no such interes
47b0: 74 2e 20 49 74 20 6a 75 73 74 20 70 61 73 73 65  t. It just passe
47c0: 73 0a 09 20 2a 20 74 68 65 20 72 65 71 75 65 73  s.. * the reques
47d0: 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61 6e 67 65  t down, unchange
47e0: 64 2e 0a 09 20 2a 2f 0a 0a 09 64 6f 77 6e 43 68  d... */...downCh
47f0: 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65  an = Tls_GetPare
4800: 6e 74 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 09  nt(statePtr);...
4810: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
4820: 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 0a 09  ype(downChan))..
4830: 20 20 20 20 2d 3e 77 61 74 63 68 50 72 6f 63 28      ->watchProc(
4840: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
4850: 73 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43  stanceData(downC
4860: 68 61 6e 29 2c 20 6d 61 73 6b 29 3b 0a 0a 09 2f  han), mask);.../
4870: 2a 0a 09 20 2a 20 4d 61 6e 61 67 65 6d 65 6e 74  *.. * Management
4880: 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   of the internal
4890: 20 74 69 6d 65 72 2e 0a 09 20 2a 2f 0a 0a 09 69   timer... */...i
48a0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
48b0: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
48c0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
48d0: 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 54 69      Tcl_DeleteTi
48e0: 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65  merHandler(state
48f0: 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 20 20  Ptr->timer);..  
4900: 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65    statePtr->time
4910: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f  r = (Tcl_TimerTo
4920: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 69  ken) NULL;..}..i
4930: 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52  f ((mask & TCL_R
4940: 45 41 44 41 42 4c 45 29 20 26 26 20 54 63 6c 5f  EADABLE) && Tcl_
4950: 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74  InputBuffered(st
4960: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20  atePtr->self) > 
4970: 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  0) {..    /*..  
4980: 20 20 20 2a 20 54 68 65 72 65 20 69 73 20 69 6e     * There is in
4990: 74 65 72 65 73 74 20 69 6e 20 72 65 61 64 61 62  terest in readab
49a0: 6c 65 20 65 76 65 6e 74 73 20 61 6e 64 20 77 65  le events and we
49b0: 20 61 63 74 75 61 6c 6c 79 20 68 61 76 65 0a 09   actually have..
49c0: 20 20 20 20 20 2a 20 64 61 74 61 20 77 61 69 74       * data wait
49d0: 69 6e 67 2c 20 73 6f 20 67 65 6e 65 72 61 74 65  ing, so generate
49e0: 20 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 73   a timer to flus
49f0: 68 20 74 68 61 74 2e 0a 09 20 20 20 20 20 2a 2f  h that...     */
4a00: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
4a10: 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61  timer = Tcl_Crea
4a20: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 54  teTimerHandler(T
4a30: 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c 0a 09 09  LS_TCL_DELAY,...
4a40: 20 20 20 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61      TlsChannelHa
4a50: 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 6c 69  ndlerTimer, (Cli
4a60: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
4a70: 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  r);..}.    } els
4a80: 65 20 7b 0a 09 69 66 20 28 6d 61 73 6b 20 3d 3d  e {..if (mask ==
4a90: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68   statePtr->watch
4aa0: 4d 61 73 6b 29 0a 09 20 20 20 20 72 65 74 75 72  Mask)..    retur
4ab0: 6e 3b 0a 0a 09 69 66 20 28 73 74 61 74 65 50 74  n;...if (statePt
4ac0: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 29 20 7b 0a  r->watchMask) {.
4ad0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
4ae0: 52 65 6d 6f 76 65 20 65 76 65 6e 74 20 68 61 6e  Remove event han
4af0: 64 6c 65 72 20 74 6f 20 75 6e 64 65 72 6c 79 69  dler to underlyi
4b00: 6e 67 20 63 68 61 6e 6e 65 6c 2c 20 74 68 69 73  ng channel, this
4b10: 20 63 6f 75 6c 64 0a 09 20 20 20 20 20 2a 20 62   could..     * b
4b20: 65 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  e because we are
4b30: 20 63 6c 6f 73 69 6e 67 20 66 6f 72 20 72 65 61   closing for rea
4b40: 6c 2c 20 6f 72 20 62 65 69 6e 67 20 22 75 6e 73  l, or being "uns
4b50: 74 61 63 6b 65 64 22 2e 0a 09 20 20 20 20 20 2a  tacked"...     *
4b60: 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 44 65 6c 65  /...    Tcl_Dele
4b70: 74 65 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72  teChannelHandler
4b80: 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73  (Tls_GetParent(s
4b90: 74 61 74 65 50 74 72 29 2c 0a 09 09 20 20 20 20  tatePtr),...    
4ba0: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  TlsChannelHandle
4bb0: 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  r, (ClientData) 
4bc0: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 09 73  statePtr);..}..s
4bd0: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61  tatePtr->watchMa
4be0: 73 6b 20 3d 20 6d 61 73 6b 3b 0a 09 69 66 20 28  sk = mask;..if (
4bf0: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d  statePtr->watchM
4c00: 61 73 6b 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  ask) {..    /*..
4c10: 20 20 20 20 20 2a 20 53 65 74 75 70 20 61 63 74       * Setup act
4c20: 69 76 65 20 6d 6f 6e 69 74 6f 72 20 66 6f 72 20  ive monitor for 
4c30: 65 76 65 6e 74 73 20 6f 6e 20 75 6e 64 65 72 6c  events on underl
4c40: 79 69 6e 67 20 43 68 61 6e 6e 65 6c 2e 0a 09 20  ying Channel... 
4c50: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c      */...    Tcl
4c60: 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 48 61  _CreateChannelHa
4c70: 6e 64 6c 65 72 28 54 6c 73 5f 47 65 74 50 61 72  ndler(Tls_GetPar
4c80: 65 6e 74 28 73 74 61 74 65 50 74 72 29 2c 0a 09  ent(statePtr),..
4c90: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77  .    statePtr->w
4ca0: 61 74 63 68 4d 61 73 6b 2c 20 54 6c 73 43 68 61  atchMask, TlsCha
4cb0: 6e 6e 65 6c 48 61 6e 64 6c 65 72 2c 0a 09 09 20  nnelHandler,... 
4cc0: 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20     (ClientData) 
4cd0: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 20 20  statePtr);..}.  
4ce0: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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: 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 48 61 6e  . *. * TlsGetHan
4d40: 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  dleProc --. *. *
4d50: 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c  .Called from Tcl
4d60: 5f 47 65 74 43 68 61 6e 6e 65 6c 46 69 6c 65 20  _GetChannelFile 
4d70: 74 6f 20 72 65 74 72 69 65 76 65 20 6f 2f 73 20  to retrieve o/s 
4d80: 66 69 6c 65 20 68 61 6e 64 6c 65 72 0a 20 2a 09  file handler. *.
4d90: 66 72 6f 6d 20 74 68 65 20 53 53 4c 20 73 6f 63  from the SSL soc
4da0: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
4db0: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  l.. *. * Results
4dc0: 3a 0a 20 2a 09 54 68 65 20 61 70 70 72 6f 70 72  :. *.The appropr
4dd0: 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 20 6f 72  iate Tcl_File or
4de0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 70 72 65   NULL if not pre
4df0: 73 65 6e 74 2e 20 0a 20 2a 0a 20 2a 20 53 69 64  sent. . *. * Sid
4e00: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
4e10: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f  ------------. */
4e60: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 47  .static int.TlsG
4e70: 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69  etHandleProc(Cli
4e80: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
4e90: 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63  Data,./* The soc
4ea0: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ket state. */.  
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4ec0: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 09 09 2f  nt direction,../
4ed0: 2a 20 57 68 69 63 68 20 54 63 6c 5f 46 69 6c 65  * Which Tcl_File
4ee0: 20 74 6f 20 72 65 74 72 69 65 76 65 3f 20 2a 2f   to retrieve? */
4ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f00: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61    ClientData *ha
4f10: 6e 64 6c 65 50 74 72 29 09 2f 2a 20 57 68 65 72  ndlePtr)./* Wher
4f20: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 68  e to store the h
4f30: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 7b 0a 20 20 20  andle.  */.{.   
4f40: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
4f50: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73   = (State *) ins
4f60: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20  tanceData;..    
4f70: 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68  return Tcl_GetCh
4f80: 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 6c 73 5f  annelHandle(Tls_
4f90: 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50  GetParent(stateP
4fa0: 74 72 29 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20  tr), direction, 
4fb0: 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0c 0a  handlePtr);.}...
4fc0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fe0: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54  --------. *. * T
5010: 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a  lsNotifyProc --.
5020: 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20 63 61   *. *.Handler ca
5030: 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 6f 20 69  lled by Tcl to i
5040: 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69  nform us of acti
5050: 76 69 74 79 0a 20 2a 09 6f 6e 20 74 68 65 20 75  vity. *.on the u
5060: 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65  nderlying channe
5070: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  l.. *. * Results
5080: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
5090: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
50a0: 2a 09 4d 61 79 20 70 72 6f 63 65 73 73 20 74 68  *.May process th
50b0: 65 20 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e 74  e incoming event
50c0: 20 62 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a 20   by itself.. *. 
50d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
5120: 20 69 6e 74 0a 54 6c 73 4e 6f 74 69 66 79 50 72   int.TlsNotifyPr
5130: 6f 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  oc(instanceData,
5140: 20 6d 61 73 6b 29 0a 20 20 20 20 43 6c 69 65 6e   mask).    Clien
5150: 74 44 61 74 61 09 20 20 20 69 6e 73 74 61 6e 63  tData.   instanc
5160: 65 44 61 74 61 3b 20 2f 2a 20 54 68 65 20 73 74  eData; /* The st
5170: 61 74 65 20 6f 66 20 74 68 65 20 6e 6f 74 69 66  ate of the notif
5180: 69 65 64 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  ied transformati
5190: 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 20  on */.    int.. 
51a0: 20 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 2f 2a    mask;       /*
51b0: 20 54 68 65 20 6d 61 73 6b 20 6f 66 20 6f 63 63   The mask of occ
51c0: 75 72 69 6e 67 20 65 76 65 6e 74 73 20 2a 2f 0a  uring events */.
51d0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
51e0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
51f0: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
5200: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41  .    /*.     * A
5210: 6e 20 65 76 65 6e 74 20 6f 63 63 75 72 65 64 20  n event occured 
5220: 69 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  in the underlyin
5230: 67 20 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73  g channel.  This
5240: 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72  .     * transfor
5250: 6d 61 74 69 6f 6e 20 64 6f 65 73 6e 27 74 20 70  mation doesn't p
5260: 72 6f 63 65 73 73 20 73 75 63 68 20 65 76 65 6e  rocess such even
5270: 74 73 20 74 68 75 73 20 72 65 74 75 72 6e 73 20  ts thus returns 
5280: 74 68 65 0a 20 20 20 20 20 2a 20 69 6e 63 6f 6d  the.     * incom
5290: 69 6e 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e 67  ing mask unchang
52a0: 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ed..     */..   
52b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
52c0: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
52d0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
52e0: 0a 09 2f 2a 0a 09 20 2a 20 44 65 6c 65 74 65 20  ../*.. * Delete 
52f0: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 69 6d 65  an existing time
5300: 72 2e 20 49 74 20 77 61 73 20 6e 6f 74 20 66 69  r. It was not fi
5310: 72 65 64 2c 20 79 65 74 20 77 65 20 61 72 65 0a  red, yet we are.
5320: 09 20 2a 20 68 65 72 65 2c 20 73 6f 20 74 68 65  . * here, so the
5330: 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 67   channel below g
5340: 65 6e 65 72 61 74 65 64 20 73 75 63 68 20 61 6e  enerated such an
5350: 20 65 76 65 6e 74 20 61 6e 64 20 77 65 0a 09 20   event and we.. 
5360: 2a 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 2e  * don't have to.
5370: 20 54 68 65 20 72 65 6e 65 77 61 6c 20 6f 66 20   The renewal of 
5380: 74 68 65 20 69 6e 74 65 72 65 73 74 20 61 66 74  the interest aft
5390: 65 72 20 74 68 65 0a 09 20 2a 20 65 78 65 63 75  er the.. * execu
53a0: 74 69 6f 6e 20 6f 66 20 63 68 61 6e 6e 65 6c 20  tion of channel 
53b0: 68 61 6e 64 6c 65 72 73 20 77 69 6c 6c 20 65 76  handlers will ev
53c0: 65 6e 74 75 61 6c 6c 79 20 63 61 75 73 65 20 75  entually cause u
53d0: 73 20 74 6f 0a 09 20 2a 20 72 65 63 72 65 61 74  s to.. * recreat
53e0: 65 20 74 68 65 20 74 69 6d 65 72 20 28 69 6e 20  e the timer (in 
53f0: 57 61 74 63 68 50 72 6f 63 29 2e 0a 09 20 2a 2f  WatchProc)... */
5400: 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  ...Tcl_DeleteTim
5410: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
5420: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
5430: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28  tePtr->timer = (
5440: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
5450: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
5460: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
5470: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
54b0: 2a 0a 20 2a 20 20 20 20 20 20 54 6c 73 43 68 61  *. *      TlsCha
54c0: 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 2d 0a 20  nnelHandler --. 
54d0: 2a 0a 20 2a 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d  *. *      ------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 20 20  ----------*. *  
5510: 20 20 20 20 48 61 6e 64 6c 65 72 20 63 61 6c 6c      Handler call
5520: 65 64 20 62 79 20 54 63 6c 20 61 73 20 61 20 72  ed by Tcl as a r
5530: 65 73 75 6c 74 20 6f 66 0a 20 2a 20 20 20 20 20  esult of. *     
5540: 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e   Tcl_CreateChann
5550: 65 6c 48 61 6e 64 6c 65 72 20 2d 20 74 6f 20 69  elHandler - to i
5560: 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69  nform us of acti
5570: 76 69 74 79 0a 20 2a 20 20 20 20 20 20 6f 6e 20  vity. *      on 
5580: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  the underlying c
5590: 68 61 6e 6e 65 6c 2e 0a 20 2a 20 20 20 20 20 20  hannel.. *      
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 53 69 64  *. *. *      Sid
55e0: 65 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20  eeffects:. *    
55f0: 20 20 20 20 20 20 20 20 20 20 4d 61 79 20 67 65            May ge
5600: 6e 65 72 61 74 65 20 73 75 62 73 65 71 75 65 6e  nerate subsequen
5610: 74 20 63 61 6c 6c 73 20 74 6f 0a 20 2a 20 20 20  t calls to. *   
5620: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e             Tcl_N
5630: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 2e 0a 20 2a  otifyChannel.. *
5640: 0a 20 2a 20 20 20 20 20 20 52 65 73 75 6c 74 3a  . *      Result:
5650: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
5660: 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   None.. *. *----
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56a0: 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  --*. */..static 
56b0: 76 6f 69 64 0a 54 6c 73 43 68 61 6e 6e 65 6c 48  void.TlsChannelH
56c0: 61 6e 64 6c 65 72 20 28 63 6c 69 65 6e 74 44 61  andler (clientDa
56d0: 74 61 2c 20 6d 61 73 6b 29 0a 20 20 20 20 43 6c  ta, mask).    Cl
56e0: 69 65 6e 74 44 61 74 61 20 20 20 20 20 63 6c 69  ientData     cli
56f0: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74  entData;.    int
5700: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b              mask
5710: 3b 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ;.{.    State *s
5720: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
5730: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
5740: 0a 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .dprintf(stderr,
5750: 20 22 48 41 4e 44 4c 45 52 28 30 78 25 78 29 5c   "HANDLER(0x%x)\
5760: 6e 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 54  n", mask);.    T
5770: 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c  cl_Preserve( (Cl
5780: 69 65 6e 74 44 61 74 61 29 73 74 61 74 65 50 74  ientData)statePt
5790: 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d 61 73  r);..    if (mas
57a0: 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  k & TCL_READABLE
57b0: 29 20 7b 0a 09 42 49 4f 5f 73 65 74 5f 66 6c 61  ) {..BIO_set_fla
57c0: 67 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  gs(statePtr->p_b
57d0: 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 45  io, BIO_FLAGS_RE
57e0: 41 44 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  AD);.    } else 
57f0: 7b 0a 09 42 49 4f 5f 63 6c 65 61 72 5f 66 6c 61  {..BIO_clear_fla
5800: 67 73 28 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  gs(statePtr->p_b
5810: 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 52 45  io, BIO_FLAGS_RE
5820: 41 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  AD);.    }..    
5830: 69 66 20 28 6d 61 73 6b 20 26 20 54 43 4c 5f 57  if (mask & TCL_W
5840: 52 49 54 41 42 4c 45 29 20 7b 0a 09 42 49 4f 5f  RITABLE) {..BIO_
5850: 73 65 74 5f 66 6c 61 67 73 28 73 74 61 74 65 50  set_flags(stateP
5860: 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f 46  tr->p_bio, BIO_F
5870: 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 20 20  LAGS_WRITE);.   
5880: 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f 63   } else {..BIO_c
5890: 6c 65 61 72 5f 66 6c 61 67 73 28 73 74 61 74 65  lear_flags(state
58a0: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 42 49 4f 5f  Ptr->p_bio, BIO_
58b0: 46 4c 41 47 53 5f 57 52 49 54 45 29 3b 0a 20 20  FLAGS_WRITE);.  
58c0: 20 20 7d 0a 0a 20 20 20 20 6d 61 73 6b 20 3d 20    }..    mask = 
58d0: 30 3b 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 77  0;.    if (BIO_w
58e0: 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72  pending(statePtr
58f0: 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20  ->bio)) {..mask 
5900: 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b  |= TCL_WRITABLE;
5910: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 42  .    }.    if (B
5920: 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65  IO_pending(state
5930: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61  Ptr->bio)) {..ma
5940: 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42  sk |= TCL_READAB
5950: 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LE;.    }..    /
5960: 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 66 6f 6c  *.     * The fol
5970: 6c 6f 77 69 6e 67 20 4e 6f 74 69 66 79 43 68 61  lowing NotifyCha
5980: 6e 6e 65 6c 20 63 61 6c 6c 73 20 73 65 65 6d 73  nnel calls seems
5990: 20 74 6f 20 62 65 20 69 6d 70 6f 72 74 61 6e 74   to be important
59a0: 2c 20 62 75 74 0a 20 20 20 20 20 2a 20 77 65 20  , but.     * we 
59b0: 64 6f 6e 27 74 20 6b 6e 6f 77 20 77 68 79 2e 20  don't know why. 
59c0: 20 49 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 69   It looks like i
59d0: 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 76  f the mask is ev
59e0: 65 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 20 20 20 20  er non-zero.    
59f0: 20 2a 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20   * that it will 
5a00: 65 6e 74 65 72 20 61 6e 20 69 6e 66 69 6e 69 74  enter an infinit
5a10: 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 2a 0a 20  e loop..     *. 
5a20: 20 20 20 20 2a 20 4e 6f 74 69 66 79 20 74 68 65      * Notify the
5a30: 20 75 70 70 65 72 20 63 68 61 6e 6e 65 6c 20 6f   upper channel o
5a40: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 42 49  f the current BI
5a50: 4f 20 73 74 61 74 65 20 73 6f 20 74 68 65 20 65  O state so the e
5a60: 76 65 6e 74 0a 20 20 20 20 20 2a 20 63 6f 6e 74  vent.     * cont
5a70: 69 6e 75 65 73 20 74 6f 20 70 72 6f 70 61 67 61  inues to propaga
5a80: 74 65 20 75 70 20 74 68 65 20 63 68 61 69 6e 2e  te up the chain.
5a90: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 73  .     *.     * s
5aa0: 74 61 6e 74 6f 6e 3a 20 49 74 20 6c 6f 6f 6b 73  tanton: It looks
5ab0: 20 6c 69 6b 65 20 74 68 69 73 20 63 6f 75 6c 64   like this could
5ac0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
5ad0: 66 69 6e 69 74 65 20 6c 6f 6f 70 20 69 66 0a 20  finite loop if. 
5ae0: 20 20 20 20 2a 20 74 68 65 20 75 70 70 65 72 20      * the upper 
5af0: 63 68 61 6e 6e 65 6c 20 64 6f 65 73 6e 27 74 20  channel doesn't 
5b00: 63 61 75 73 65 20 43 68 61 6e 6e 65 6c 48 61 6e  cause ChannelHan
5b10: 64 6c 65 72 20 74 6f 20 62 65 20 72 65 6d 6f 76  dler to be remov
5b20: 65 64 0a 20 20 20 20 20 2a 20 62 65 66 6f 72 65  ed.     * before
5b30: 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e   Tcl_NotifyChann
5b40: 65 6c 20 63 61 6c 6c 73 20 63 68 61 6e 6e 65 6c  el calls channel
5b50: 20 68 61 6e 64 6c 65 72 73 20 6f 6e 20 74 68 65   handlers on the
5b60: 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 2e 0a   lower channel..
5b70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 0a 20 20 20       */.    .   
5b80: 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e   Tcl_NotifyChann
5b90: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
5ba0: 66 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 0a 20  f, mask);.    . 
5bb0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
5bc0: 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54  >timer != (Tcl_T
5bd0: 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 29 20  imerToken)NULL) 
5be0: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
5bf0: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
5c00: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
5c10: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28  tePtr->timer = (
5c20: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e  Tcl_TimerToken)N
5c30: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
5c40: 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52  f ((mask & TCL_R
5c50: 45 41 44 41 42 4c 45 29 20 26 26 20 54 63 6c 5f  EADABLE) && Tcl_
5c60: 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74  InputBuffered(st
5c70: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20  atePtr->self) > 
5c80: 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 61 74  0) {../*.. * Dat
5c90: 61 20 69 73 20 77 61 69 74 69 6e 67 2c 20 66 6c  a is waiting, fl
5ca0: 75 73 68 20 69 74 20 6f 75 74 20 69 6e 20 73 68  ush it out in sh
5cb0: 6f 72 74 20 74 69 6d 65 0a 09 20 2a 2f 0a 09 73  ort time.. */..s
5cc0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
5cd0: 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72   Tcl_CreateTimer
5ce0: 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f  Handler(TLS_TCL_
5cf0: 44 45 4c 41 59 2c 0a 09 09 54 6c 73 43 68 61 6e  DELAY,...TlsChan
5d00: 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c  nelHandlerTimer,
5d10: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
5d20: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20  atePtr);.    }. 
5d30: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20     Tcl_Release( 
5d40: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74  (ClientData)stat
5d50: 65 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ePtr);.}.../*. *
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c  ------*. *. *.Tl
5da0: 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54  sChannelHandlerT
5db0: 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  imer --. *. *.--
5dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
5df0: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65   *.Called by the
5e00: 20 6e 6f 74 69 66 69 65 72 20 28 2d 3e 20 74 69   notifier (-> ti
5e10: 6d 65 72 29 20 74 6f 20 66 6c 75 73 68 20 6f 75  mer) to flush ou
5e20: 74 0a 20 2a 09 69 6e 66 6f 72 6d 61 74 69 6f 6e  t. *.information
5e30: 20 77 61 69 74 69 6e 67 20 69 6e 20 63 68 61 6e   waiting in chan
5e40: 6e 65 6c 20 62 75 66 66 65 72 73 2e 0a 20 2a 09  nel buffers.. *.
5e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e80: 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65  *. *. *.Sideeffe
5e90: 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27  cts:. *..As of '
5ea0: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  TlsChannelHandle
5eb0: 72 27 2e 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74  r'.. *. *.Result
5ec0: 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  :. *..None.. *. 
5ed0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f00: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74  -------*. */..st
5f10: 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 43 68 61  atic void.TlsCha
5f20: 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72  nnelHandlerTimer
5f30: 20 28 63 6c 69 65 6e 74 44 61 74 61 29 0a 43 6c   (clientData).Cl
5f40: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
5f50: 61 74 61 3b 20 2f 2a 20 54 72 61 6e 73 66 6f 72  ata; /* Transfor
5f60: 6d 61 74 69 6f 6e 20 74 6f 20 71 75 65 72 79 20  mation to query 
5f70: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  */.{.    State *
5f80: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
5f90: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  e *) clientData;
5fa0: 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20  .    int mask = 
5fb0: 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72  0;..    statePtr
5fc0: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
5fd0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
5fe0: 0a 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 77 70  ..    if (BIO_wp
5ff0: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d  ending(statePtr-
6000: 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73 6b 20 7c  >bio)) {..mask |
6010: 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a  = TCL_WRITABLE;.
6020: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 42 49      }.    if (BI
6030: 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50  O_pending(stateP
6040: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 6d 61 73  tr->bio)) {..mas
6050: 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c  k |= TCL_READABL
6060: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  E;.    }.    Tcl
6070: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73  _NotifyChannel(s
6080: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 6d  tatePtr->self, m
6090: 61 73 6b 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  ask);.}.../*. *-
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73  -----*. *. *.Tls
60e0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
60f0: 2d 2d 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66  --. *. *.Sideeff
6100: 65 63 74 73 3a 0a 20 2a 09 09 49 73 73 75 65 73  ects:. *..Issues
6110: 20 53 53 4c 5f 61 63 63 65 70 74 20 6f 72 20 53   SSL_accept or S
6120: 53 4c 5f 63 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a  SL_connect. *. *
6130: 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e  .Result:. *..Non
6140: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
6180: 20 2a 2f 0a 69 6e 74 0a 54 6c 73 5f 57 61 69 74   */.int.Tls_Wait
6190: 46 6f 72 43 6f 6e 6e 65 63 74 28 20 73 74 61 74  ForConnect( stat
61a0: 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50  ePtr, errorCodeP
61b0: 74 72 29 0a 20 20 20 20 53 74 61 74 65 20 2a 73  tr).    State *s
61c0: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 69 6e 74  tatePtr;.    int
61d0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 3b 09   *errorCodePtr;.
61e0: 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f  ./* Where to sto
61f0: 72 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a  re error code. *
6200: 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b  /.{.    int err;
6210: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74  ..    dprintf(st
6220: 64 65 72 72 2c 22 5c 6e 57 61 69 74 46 6f 72 43  derr,"\nWaitForC
6230: 6f 6e 6e 65 63 74 28 30 78 25 78 29 22 2c 20 28  onnect(0x%x)", (
6240: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74  unsigned int) st
6250: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 66 6f  atePtr);..    fo
6260: 72 20 28 3b 3b 29 20 7b 0a 09 2f 2a 20 4e 6f 74  r (;;) {../* Not
6270: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 79 65 74   initialized yet
6280: 21 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50  ! */..if (stateP
6290: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
62a0: 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20  TCL_SERVER) {.. 
62b0: 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 61 63 63     err = SSL_acc
62c0: 65 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ept(statePtr->ss
62d0: 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  l);..} else {.. 
62e0: 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 63 6f 6e     err = SSL_con
62f0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73  nect(statePtr->s
6300: 73 6c 29 3b 0a 09 7d 0a 09 2f 2a 53 53 4c 5f 77  sl);..}../*SSL_w
6310: 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  rite(statePtr->s
6320: 73 6c 2c 20 28 63 68 61 72 2a 29 26 65 72 72 2c  sl, (char*)&err,
6330: 20 30 29 3b 09 48 41 43 4b 21 21 21 20 2a 2f 0a   0);.HACK!!! */.
6340: 09 69 66 20 28 65 72 72 20 3e 20 30 29 20 7b 0a  .if (err > 0) {.
6350: 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 73  .    BIO_flush(s
6360: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
6370: 7d 0a 0a 09 69 66 20 28 65 72 72 20 3c 3d 20 30  }...if (err <= 0
6380: 29 20 7b 0a 09 20 20 20 20 69 6e 74 20 72 63 20  ) {..    int rc 
6390: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28  = SSL_get_error(
63a0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65  statePtr->ssl, e
63b0: 72 72 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 72  rr);...    if (r
63c0: 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 53  c == SSL_ERROR_S
63d0: 53 4c 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f  SL) {...Tls_Erro
63e0: 72 28 73 74 61 74 65 50 74 72 2c 0a 09 09 09 28  r(statePtr,....(
63f0: 63 68 61 72 20 2a 29 45 52 52 5f 72 65 61 73 6f  char *)ERR_reaso
6400: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45  n_error_string(E
6410: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 29  RR_get_error()))
6420: 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  ;...*errorCodePt
6430: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44  r = ECONNABORTED
6440: 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09  ;...return -1;..
6450: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 42      } else if (B
6460: 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28  IO_should_retry(
6470: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20  statePtr->bio)) 
6480: 7b 0a 09 09 69 66 20 28 73 74 61 74 65 50 74 72  {...if (statePtr
6490: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
64a0: 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09 20 20 20  L_ASYNC) {...   
64b0: 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   dprintf(stderr,
64c0: 22 45 21 20 22 29 3b 0a 09 09 20 20 20 20 2a 65  "E! ");...    *e
64d0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
64e0: 47 41 49 4e 3b 0a 09 09 20 20 20 20 72 65 74 75  GAIN;...    retu
64f0: 72 6e 20 2d 31 3b 0a 09 09 7d 20 65 6c 73 65 20  rn -1;...} else 
6500: 7b 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e 75 65  {...    continue
6510: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73  ;...}..    } els
6520: 65 20 69 66 20 28 65 72 72 20 3d 3d 20 30 29 20  e if (err == 0) 
6530: 7b 0a 09 09 64 70 72 69 6e 74 66 28 73 74 64 65  {...dprintf(stde
6540: 72 72 2c 22 43 52 21 20 22 29 3b 0a 09 09 2a 65  rr,"CR! ");...*e
6550: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43  rrorCodePtr = EC
6560: 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 72 65 74 75  ONNRESET;...retu
6570: 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20  rn -1;..    }.. 
6580: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
6590: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
65a0: 5f 53 45 52 56 45 52 29 20 7b 0a 09 09 65 72 72  _SERVER) {...err
65b0: 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66   = SSL_get_verif
65c0: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
65d0: 72 2d 3e 73 73 6c 29 3b 0a 09 09 69 66 20 28 65  r->ssl);...if (e
65e0: 72 72 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29  rr != X509_V_OK)
65f0: 20 7b 0a 09 09 20 20 20 20 54 6c 73 5f 45 72 72   {...    Tls_Err
6600: 6f 72 28 73 74 61 74 65 50 74 72 2c 0a 09 09 09  or(statePtr,....
6610: 20 20 20 20 28 63 68 61 72 20 2a 29 58 35 30 39      (char *)X509
6620: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
6630: 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 29 3b  or_string(err));
6640: 0a 09 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ...    *errorCod
6650: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52  ePtr = ECONNABOR
6660: 54 45 44 3b 0a 09 09 20 20 20 20 72 65 74 75 72  TED;...    retur
6670: 6e 20 2d 31 3b 0a 09 09 7d 0a 09 20 20 20 20 7d  n -1;...}..    }
6680: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
6690: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72  Ptr = Tcl_GetErr
66a0: 6e 6f 28 29 3b 0a 09 20 20 20 20 64 70 72 69 6e  no();..    dprin
66b0: 74 66 28 73 74 64 65 72 72 2c 22 45 52 52 28 25  tf(stderr,"ERR(%
66c0: 64 2c 20 25 64 29 20 22 2c 20 72 63 2c 20 2a 65  d, %d) ", rc, *e
66d0: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 20  rrorCodePtr);.. 
66e0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d     return -1;..}
66f0: 0a 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..dprintf(stderr
6700: 2c 22 52 30 21 20 22 29 3b 0a 09 72 65 74 75 72  ,"R0! ");..retur
6710: 6e 20 31 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 54 63  n 1;.    }.}..Tc
6720: 6c 5f 43 68 61 6e 6e 65 6c 0a 54 6c 73 5f 47 65  l_Channel.Tls_Ge
6730: 74 50 61 72 65 6e 74 28 20 73 74 61 74 65 50 74  tParent( statePt
6740: 72 20 29 0a 20 20 20 20 53 74 61 74 65 20 2a 73  r ).    State *s
6750: 74 61 74 65 50 74 72 3b 0a 7b 0a 20 20 20 20 69  tatePtr;.{.    i
6760: 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65  f (channelTypeVe
6770: 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41  rsion == TLS_CHA
6780: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20  NNEL_VERSION_2) 
6790: 7b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 47 65  {..return Tcl_Ge
67a0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
67b0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
67c0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
67d0: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 66 6f 72  * The reason for
67e0: 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
67f0: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
6800: 20 69 73 0a 09 20 2a 20 74 68 65 20 66 61 63 74   is.. * the fact
6810: 20 74 68 61 74 20 73 74 61 63 6b 69 6e 67 20 61   that stacking a
6820: 20 74 72 61 6e 73 66 6f 72 6d 20 6f 76 65 72 20   transform over 
6830: 61 6e 6f 74 68 65 72 0a 09 20 2a 20 74 72 61 6e  another.. * tran
6840: 73 66 6f 72 6d 20 77 69 6c 6c 20 6c 65 61 76 65  sform will leave
6850: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 70 6f   our internal po
6860: 69 6e 74 65 72 20 75 6e 63 68 61 6e 67 65 64 2c  inter unchanged,
6870: 0a 09 20 2a 20 61 6e 64 20 74 68 75 73 20 70 6f  .. * and thus po
6880: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
6890: 77 20 74 72 61 6e 73 66 6f 72 6d 2c 20 61 6e 64  w transform, and
68a0: 20 6e 6f 74 20 74 68 65 0a 09 20 2a 20 43 68 61   not the.. * Cha
68b0: 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 63  nnel structure c
68c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61  ontaining the sa
68d0: 76 65 64 20 73 74 61 74 65 20 6f 66 20 74 68 69  ved state of thi
68e0: 73 0a 09 20 2a 20 74 72 61 6e 73 66 6f 72 6d 2e  s.. * transform.
68f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72 69   This is the pri
6900: 63 65 20 74 6f 20 70 61 79 20 66 6f 72 20 6c 65  ce to pay for le
6910: 61 76 69 6e 67 0a 09 20 2a 20 54 63 6c 5f 43 68  aving.. * Tcl_Ch
6920: 61 6e 6e 65 6c 20 72 65 66 65 72 65 6e 63 65 73  annel references
6930: 20 69 6e 74 61 63 74 2e 20 54 68 65 20 6f 6e 6c   intact. The onl
6940: 79 20 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  y other solution
6950: 0a 09 20 2a 20 69 73 20 61 6e 20 65 78 74 65 6e  .. * is an exten
6960: 73 69 6f 6e 20 6f 66 20 54 63 6c 5f 43 68 61 6e  sion of Tcl_Chan
6970: 6e 65 6c 54 79 70 65 20 77 69 74 68 20 61 6e 6f  nelType with ano
6980: 74 68 65 72 20 64 72 69 76 65 72 0a 09 20 2a 20  ther driver.. * 
6990: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 6e 6f 74  procedure to not
69a0: 69 66 79 20 61 20 43 68 61 6e 6e 65 6c 20 61 62  ify a Channel ab
69b0: 6f 75 74 20 74 68 65 20 28 75 6e 29 73 74 61 63  out the (un)stac
69c0: 6b 69 6e 67 2e 0a 09 20 2a 0a 09 20 2a 20 49 74  king... *.. * It
69d0: 20 77 61 6c 6b 73 20 74 68 65 20 63 68 61 69 6e   walks the chain
69e0: 20 6f 66 20 43 68 61 6e 6e 65 6c 20 73 74 72 75   of Channel stru
69f0: 63 74 75 72 65 73 20 75 6e 74 69 6c 20 69 74 0a  ctures until it.
6a00: 09 20 2a 20 66 69 6e 64 73 20 74 68 65 20 6f 6e  . * finds the on
6a10: 65 20 70 6f 69 6e 74 69 6e 67 20 68 61 76 69 6e  e pointing havin
6a20: 67 20 27 63 74 72 6c 27 20 61 73 20 69 6e 73 74  g 'ctrl' as inst
6a30: 61 6e 63 65 44 61 74 61 0a 09 20 2a 20 61 6e 64  anceData.. * and
6a40: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
6a50: 65 20 73 75 70 65 72 63 65 64 69 6e 67 20 63 68  e superceding ch
6a60: 61 6e 6e 65 6c 20 74 6f 20 74 68 61 74 2e 20 28  annel to that. (
6a70: 41 4b 29 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43  AK).. */...Tcl_C
6a80: 68 61 6e 6e 65 6c 20 73 65 6c 66 20 3d 20 73 74  hannel self = st
6a90: 61 74 65 50 74 72 2d 3e 73 65 6c 66 3b 0a 09 54  atePtr->self;..T
6aa0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 6e 65 78 74 3b  cl_Channel next;
6ab0: 0a 0a 09 77 68 69 6c 65 20 28 28 43 6c 69 65 6e  ...while ((Clien
6ac0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 20  tData) statePtr 
6ad0: 21 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  != Tcl_GetChanne
6ae0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 20 28 73  lInstanceData (s
6af0: 65 6c 66 29 29 20 7b 0a 09 20 20 20 20 6e 65 78  elf)) {..    nex
6b00: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b  t = Tcl_GetStack
6b10: 65 64 43 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29  edChannel (self)
6b20: 3b 0a 09 20 20 20 20 69 66 20 28 6e 65 78 74 20  ;..    if (next 
6b30: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
6b40: 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 30 39   NULL) {.../* 09
6b50: 2f 32 34 2f 31 39 39 39 20 55 6e 73 74 61 63 6b  /24/1999 Unstack
6b60: 69 6e 67 20 62 75 67 2c 0a 09 09 20 2a 20 66 6f  ing bug,... * fo
6b70: 75 6e 64 20 62 79 20 4d 61 74 74 20 4e 65 77 6d  und by Matt Newm
6b80: 61 6e 20 3c 6d 61 74 74 40 73 65 6e 73 75 73 2e  an <matt@sensus.
6b90: 6f 72 67 3e 2e 0a 09 09 20 2a 0a 09 09 20 2a 20  org>.... *... * 
6ba0: 57 65 20 77 65 72 65 20 75 6e 61 62 6c 65 20 74  We were unable t
6bb0: 6f 20 66 69 6e 64 20 74 68 65 20 63 68 61 6e 6e  o find the chann
6bc0: 65 6c 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  el structure for
6bd0: 20 74 68 69 73 0a 09 09 20 2a 20 74 72 61 6e 73   this... * trans
6be0: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
6bf0: 20 63 68 61 69 6e 20 6f 66 20 73 74 61 63 6b 65   chain of stacke
6c00: 64 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 0a  d channel. This.
6c10: 09 09 20 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  .. * means that 
6c20: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
6c30: 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   in the process 
6c40: 6f 66 20 75 6e 73 74 61 63 6b 69 6e 67 0a 09 09  of unstacking...
6c50: 20 2a 20 69 74 20 2a 61 6e 64 2a 20 74 68 65 72   * it *and* ther
6c60: 65 20 77 65 72 65 20 73 6f 6d 65 20 62 79 74 65  e were some byte
6c70: 73 20 77 61 69 74 69 6e 67 20 77 68 69 63 68 20  s waiting which 
6c80: 61 72 65 20 6e 6f 77 0a 09 09 20 2a 20 66 6c 75  are now... * flu
6c90: 73 68 65 64 2e 20 49 6e 20 74 68 69 73 20 73 69  shed. In this si
6ca0: 74 75 61 74 69 6f 6e 20 74 68 65 20 70 6f 69 6e  tuation the poin
6cb0: 74 65 72 20 74 6f 20 74 68 65 20 63 68 61 6e 6e  ter to the chann
6cc0: 65 6c 0a 09 09 20 2a 20 69 74 73 65 6c 66 20 61  el... * itself a
6cd0: 6c 72 65 61 64 79 20 72 65 66 65 72 73 20 74 6f  lready refers to
6ce0: 20 74 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e   the parent chan
6cf0: 6e 65 6c 20 77 65 20 68 61 76 65 20 74 6f 0a 09  nel we have to..
6d00: 09 20 2a 20 77 72 69 74 65 20 74 68 65 20 62 79  . * write the by
6d10: 74 65 73 20 69 6e 74 6f 2c 20 73 6f 20 77 65 20  tes into, so we 
6d20: 72 65 74 75 72 6e 20 74 68 61 74 2e 0a 09 09 20  return that.... 
6d30: 2a 2f 0a 09 09 72 65 74 75 72 6e 20 73 74 61 74  */...return stat
6d40: 65 50 74 72 2d 3e 73 65 6c 66 3b 0a 09 20 20 20  ePtr->self;..   
6d50: 20 7d 0a 09 20 20 20 20 73 65 6c 66 20 3d 20 6e   }..    self = n
6d60: 65 78 74 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ext;..}...return
6d70: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43   Tcl_GetStackedC
6d80: 68 61 6e 6e 65 6c 20 28 73 65 6c 66 29 3b 0a 20  hannel (self);. 
6d90: 20 20 20 7d 0a 7d 0a                                }.}.