Hex Artifact Content

Artifact 6da1a880679c80077c6b59c27d66f3b4752bd877:


0000: 23 20 43 6f 6d 6d 61 6e 64 73 20 74 65 73 74 65  # Commands teste
0010: 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 3a 20  d in this file: 
0020: 73 6f 63 6b 65 74 2e 0a 23 0a 23 20 54 68 69 73  socket..#.# This
0030: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61   file contains a
0040: 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 74   collection of t
0050: 65 73 74 73 20 66 6f 72 20 6f 6e 65 20 6f 72 20  ests for one or 
0060: 6d 6f 72 65 20 6f 66 20 74 68 65 20 54 63 6c 0a  more of the Tcl.
0070: 23 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6d 6d 61  # built-in comma
0080: 6e 64 73 2e 20 20 53 6f 75 72 63 69 6e 67 20 74  nds.  Sourcing t
0090: 68 69 73 20 66 69 6c 65 20 69 6e 74 6f 20 54 63  his file into Tc
00a0: 6c 20 72 75 6e 73 20 74 68 65 20 74 65 73 74 73  l runs the tests
00b0: 20 61 6e 64 0a 23 20 67 65 6e 65 72 61 74 65 73   and.# generates
00c0: 20 6f 75 74 70 75 74 20 66 6f 72 20 65 72 72 6f   output for erro
00d0: 72 73 2e 20 20 4e 6f 20 6f 75 74 70 75 74 20 6d  rs.  No output m
00e0: 65 61 6e 73 20 6e 6f 20 65 72 72 6f 72 73 20 77  eans no errors w
00f0: 65 72 65 20 66 6f 75 6e 64 2e 0a 23 0a 23 20 43  ere found..#.# C
0100: 6f 70 79 72 69 67 68 74 20 28 63 29 20 31 39 39  opyright (c) 199
0110: 34 2d 31 39 39 36 20 53 75 6e 20 4d 69 63 72 6f  4-1996 Sun Micro
0120: 73 79 73 74 65 6d 73 2c 20 49 6e 63 2e 0a 23 20  systems, Inc..# 
0130: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 31 39  Copyright (c) 19
0140: 39 38 2d 32 30 30 30 20 41 6a 75 62 61 20 53 6f  98-2000 Ajuba So
0150: 6c 75 74 69 6f 6e 73 2e 20 0a 23 0a 23 20 53 65  lutions. .#.# Se
0160: 65 20 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65  e the file "lice
0170: 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69  nse.terms" for i
0180: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73  nformation on us
0190: 61 67 65 20 61 6e 64 20 72 65 64 69 73 74 72 69  age and redistri
01a0: 62 75 74 69 6f 6e 0a 23 20 6f 66 20 74 68 69 73  bution.# of this
01b0: 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61   file, and for a
01c0: 20 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41   DISCLAIMER OF A
01d0: 4c 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 23  LL WARRANTIES..#
01e0: 0a 23 20 52 43 53 3a 20 40 28 23 29 20 24 49 64  .# RCS: @(#) $Id
01f0: 3a 20 74 6c 73 49 4f 2e 74 65 73 74 2c 76 20 31  : tlsIO.test,v 1
0200: 2e 31 31 20 32 30 30 30 2f 30 36 2f 30 36 20 32  .11 2000/06/06 2
0210: 32 3a 31 38 3a 31 30 20 61 62 6f 72 72 20 45 78  2:18:10 aborr Ex
0220: 70 20 24 0a 0a 23 20 52 75 6e 6e 69 6e 67 20 73  p $..# Running s
0230: 6f 63 6b 65 74 20 74 65 73 74 73 20 77 69 74 68  ocket tests with
0240: 20 61 20 72 65 6d 6f 74 65 20 73 65 72 76 65 72   a remote server
0250: 3a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  :.# ------------
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0280: 20 0a 23 20 53 6f 6d 65 20 74 65 73 74 73 20 69   .# Some tests i
0290: 6e 20 73 6f 63 6b 65 74 2e 74 65 73 74 20 64 65  n socket.test de
02a0: 70 65 6e 64 20 6f 6e 20 74 68 65 20 65 78 69 73  pend on the exis
02b0: 74 65 6e 63 65 20 6f 66 20 61 20 72 65 6d 6f 74  tence of a remot
02c0: 65 20 73 65 72 76 65 72 20 74 6f 0a 23 20 77 68  e server to.# wh
02d0: 69 63 68 20 74 68 65 79 20 63 6f 6e 6e 65 63 74  ich they connect
02e0: 2e 20 54 68 65 20 72 65 6d 6f 74 65 20 73 65 72  . The remote ser
02f0: 76 65 72 20 6d 75 73 74 20 62 65 20 61 6e 20 69  ver must be an i
0300: 6e 73 74 61 6e 63 65 20 6f 66 20 74 63 6c 74 65  nstance of tclte
0310: 73 74 20 61 6e 64 20 69 74 0a 23 20 6d 75 73 74  st and it.# must
0320: 20 72 75 6e 20 74 68 65 20 73 63 72 69 70 74 20   run the script 
0330: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 66 69 6c  found in the fil
0340: 65 20 22 72 65 6d 6f 74 65 2e 74 63 6c 22 20 69  e "remote.tcl" i
0350: 6e 20 74 68 69 73 20 64 69 72 65 63 74 6f 72 79  n this directory
0360: 2e 20 59 6f 75 0a 23 20 63 61 6e 20 73 74 61 72  . You.# can star
0370: 74 20 74 68 65 20 72 65 6d 6f 74 65 20 73 65 72  t the remote ser
0380: 76 65 72 20 6f 6e 20 61 6e 79 20 6d 61 63 68 69  ver on any machi
0390: 6e 65 20 72 65 61 63 68 61 62 6c 65 20 66 72 6f  ne reachable fro
03a0: 6d 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6f 6e  m the machine on
03b0: 0a 23 20 77 68 69 63 68 20 79 6f 75 20 77 61 6e  .# which you wan
03c0: 74 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 63  t to run the soc
03d0: 6b 65 74 20 74 65 73 74 73 2c 20 62 79 20 69 73  ket tests, by is
03e0: 73 75 69 6e 67 3a 0a 23 20 0a 23 20 20 20 20 20  suing:.# .#     
03f0: 74 63 6c 74 65 73 74 20 72 65 6d 6f 74 65 2e 74  tcltest remote.t
0400: 63 6c 20 2d 70 6f 72 74 20 38 30 34 38 09 23 20  cl -port 8048.# 
0410: 4f 72 20 63 68 6f 6f 73 65 20 61 6e 6f 74 68 65  Or choose anothe
0420: 72 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 23  r port number..#
0430: 20 0a 23 20 49 66 20 74 68 65 20 6d 61 63 68 69   .# If the machi
0440: 6e 65 20 79 6f 75 20 61 72 65 20 72 75 6e 6e 69  ne you are runni
0450: 6e 67 20 74 68 65 20 72 65 6d 6f 74 65 20 73 65  ng the remote se
0460: 72 76 65 72 20 6f 6e 20 68 61 73 20 73 65 76 65  rver on has seve
0470: 72 61 6c 20 49 50 0a 23 20 69 6e 74 65 72 66 61  ral IP.# interfa
0480: 63 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 68 6f  ces, you can cho
0490: 6f 73 65 20 77 68 69 63 68 20 69 6e 74 65 72 66  ose which interf
04a0: 61 63 65 20 74 68 65 20 73 65 72 76 65 72 20 6c  ace the server l
04b0: 69 73 74 65 6e 73 20 6f 6e 20 66 6f 72 0a 23 20  istens on for.# 
04c0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 62 79 20 73  connections by s
04d0: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 2d 61  pecifying the -a
04e0: 64 64 72 65 73 73 20 63 6f 6d 6d 61 6e 64 20 6c  ddress command l
04f0: 69 6e 65 20 66 6c 61 67 2c 20 73 6f 3a 0a 23 20  ine flag, so:.# 
0500: 0a 23 20 20 20 20 20 74 63 6c 74 65 73 74 20 72  .#     tcltest r
0510: 65 6d 6f 74 65 2e 74 63 6c 20 2d 61 64 64 72 65  emote.tcl -addre
0520: 73 73 20 79 6f 75 72 2e 6d 61 63 68 69 6e 65 2e  ss your.machine.
0530: 63 6f 6d 0a 23 20 0a 23 20 54 68 65 73 65 20 6f  com.# .# These o
0540: 70 74 69 6f 6e 73 20 63 61 6e 20 61 6c 73 6f 20  ptions can also 
0550: 62 65 20 73 65 74 20 62 79 20 65 6e 76 69 72 6f  be set by enviro
0560: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 2e  nment variables.
0570: 20 4f 6e 20 55 6e 69 78 2c 20 79 6f 75 20 63 61   On Unix, you ca
0580: 6e 0a 23 20 74 79 70 65 20 74 68 65 73 65 20 63  n.# type these c
0590: 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20 73  ommands to the s
05a0: 68 65 6c 6c 20 66 72 6f 6d 20 77 68 69 63 68 20  hell from which 
05b0: 74 68 65 20 72 65 6d 6f 74 65 20 73 65 72 76 65  the remote serve
05c0: 72 20 69 73 20 73 74 61 72 74 65 64 3a 0a 23 20  r is started:.# 
05d0: 0a 23 20 20 20 20 20 73 68 65 6c 6c 25 20 73 65  .#     shell% se
05e0: 74 65 6e 76 20 73 65 72 76 65 72 50 6f 72 74 20  tenv serverPort 
05f0: 38 30 34 38 0a 23 20 20 20 20 20 73 68 65 6c 6c  8048.#     shell
0600: 25 20 73 65 74 65 6e 76 20 73 65 72 76 65 72 41  % setenv serverA
0610: 64 64 72 65 73 73 20 79 6f 75 72 2e 6d 61 63 68  ddress your.mach
0620: 69 6e 65 2e 63 6f 6d 0a 23 20 0a 23 20 61 6e 64  ine.com.# .# and
0630: 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 79 6f   subsequently yo
0640: 75 20 63 61 6e 20 73 74 61 72 74 20 74 68 65 20  u can start the 
0650: 72 65 6d 6f 74 65 20 73 65 72 76 65 72 20 77 69  remote server wi
0660: 74 68 3a 0a 23 20 0a 23 20 20 20 20 20 74 63 6c  th:.# .#     tcl
0670: 74 65 73 74 20 72 65 6d 6f 74 65 2e 74 63 6c 0a  test remote.tcl.
0680: 23 20 0a 23 20 74 6f 20 68 61 76 65 20 69 74 20  # .# to have it 
0690: 6c 69 73 74 65 6e 20 6f 6e 20 70 6f 72 74 20 38  listen on port 8
06a0: 30 34 38 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  048 on the inter
06b0: 66 61 63 65 20 79 6f 75 72 2e 6d 61 63 68 69 6e  face your.machin
06c0: 65 2e 63 6f 6d 2e 0a 23 20 20 20 20 20 0a 23 20  e.com..#     .# 
06d0: 57 68 65 6e 20 74 68 65 20 73 65 72 76 65 72 20  When the server 
06e0: 73 74 61 72 74 73 2c 20 69 74 20 70 72 69 6e 74  starts, it print
06f0: 73 20 6f 75 74 20 61 20 64 65 74 61 69 6c 65 64  s out a detailed
0700: 20 6d 65 73 73 61 67 65 20 63 6f 6e 74 61 69 6e   message contain
0710: 69 6e 67 20 69 74 73 0a 23 20 63 6f 6e 66 69 67  ing its.# config
0720: 75 72 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  uration informat
0730: 69 6f 6e 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c  ion, and it will
0740: 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 6b 69 6c   block until kil
0750: 6c 65 64 20 77 69 74 68 20 61 20 43 74 72 6c 2d  led with a Ctrl-
0760: 43 2e 0a 23 20 4f 6e 63 65 20 74 68 65 20 72 65  C..# Once the re
0770: 6d 6f 74 65 20 73 65 72 76 65 72 20 65 78 69 73  mote server exis
0780: 74 73 2c 20 79 6f 75 20 63 61 6e 20 72 75 6e 20  ts, you can run 
0790: 74 68 65 20 74 65 73 74 73 20 69 6e 20 73 6f 63  the tests in soc
07a0: 6b 65 74 2e 74 65 73 74 20 77 69 74 68 0a 23 20  ket.test with.# 
07b0: 74 68 65 20 73 65 72 76 65 72 20 62 79 20 73 65  the server by se
07c0: 74 74 69 6e 67 20 74 77 6f 20 54 63 6c 20 76 61  tting two Tcl va
07d0: 72 69 61 62 6c 65 73 3a 0a 23 20 0a 23 20 20 20  riables:.# .#   
07e0: 20 20 25 20 73 65 74 20 72 65 6d 6f 74 65 53 65    % set remoteSe
07f0: 72 76 65 72 49 50 20 3c 6e 61 6d 65 20 6f 72 20  rverIP <name or 
0800: 61 64 64 72 65 73 73 20 6f 66 20 6d 61 63 68 69  address of machi
0810: 6e 65 20 6f 6e 20 77 68 69 63 68 20 73 65 72 76  ne on which serv
0820: 65 72 20 72 75 6e 73 3e 0a 23 20 20 20 20 20 25  er runs>.#     %
0830: 20 73 65 74 20 72 65 6d 6f 74 65 53 65 72 76 65   set remoteServe
0840: 72 50 6f 72 74 20 38 30 34 38 0a 23 20 0a 23 20  rPort 8048.# .# 
0850: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
0860: 61 72 65 20 61 6c 73 6f 20 73 65 74 74 61 62 6c  are also settabl
0870: 65 20 66 72 6f 6d 20 74 68 65 20 65 6e 76 69 72  e from the envir
0880: 6f 6e 6d 65 6e 74 2e 20 4f 6e 20 55 6e 69 78 2c  onment. On Unix,
0890: 20 79 6f 75 20 63 61 6e 3a 0a 23 20 0a 23 20 20   you can:.# .#  
08a0: 20 20 20 73 68 65 6c 6c 25 20 73 65 74 65 6e 76     shell% setenv
08b0: 20 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50 20   remoteServerIP 
08c0: 6d 61 63 68 69 6e 65 2e 77 68 65 72 65 2e 73 65  machine.where.se
08d0: 72 76 65 72 2e 72 75 6e 73 0a 23 20 20 20 20 20  rver.runs.#     
08e0: 73 68 65 6c 6c 25 20 73 65 6e 65 74 76 20 72 65  shell% senetv re
08f0: 6d 6f 74 65 53 65 72 76 65 72 50 6f 72 74 20 38  moteServerPort 8
0900: 30 34 38 0a 23 20 0a 23 20 54 68 65 20 70 72 65  048.# .# The pre
0910: 61 6d 62 6c 65 20 6f 66 20 74 68 65 20 73 6f 63  amble of the soc
0920: 6b 65 74 2e 74 65 73 74 20 66 69 6c 65 20 63 68  ket.test file ch
0930: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
0940: 68 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  he variables are
0950: 20 73 65 74 0a 23 20 65 69 74 68 65 72 20 69 6e   set.# either in
0960: 20 54 63 6c 20 6f 72 20 69 6e 20 74 68 65 20 65   Tcl or in the e
0970: 6e 76 69 72 6f 6e 6d 65 6e 74 3b 20 69 66 20 74  nvironment; if t
0980: 68 65 79 20 61 72 65 2c 20 69 74 20 61 74 74 65  hey are, it atte
0990: 6d 70 74 73 20 74 6f 20 63 6f 6e 6e 65 63 74 20  mpts to connect 
09a0: 74 6f 0a 23 20 74 68 65 20 73 65 72 76 65 72 2e  to.# the server.
09b0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
09c0: 6f 6e 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  on is successful
09d0: 2c 20 74 68 65 20 74 65 73 74 73 20 75 73 69 6e  , the tests usin
09e0: 67 20 74 68 65 20 72 65 6d 6f 74 65 0a 23 20 73  g the remote.# s
09f0: 65 72 76 65 72 20 77 69 6c 6c 20 62 65 20 70 65  erver will be pe
0a00: 72 66 6f 72 6d 65 64 3b 20 6f 74 68 65 72 77 69  rformed; otherwi
0a10: 73 65 2c 20 69 74 20 77 69 6c 6c 20 61 74 74 65  se, it will atte
0a20: 6d 70 74 20 74 6f 20 73 74 61 72 74 20 74 68 65  mpt to start the
0a30: 20 72 65 6d 6f 74 65 0a 23 20 73 65 72 76 65 72   remote.# server
0a40: 20 28 76 69 61 20 65 78 65 63 29 20 6f 6e 20 70   (via exec) on p
0a50: 6c 61 74 66 6f 72 6d 73 20 74 68 61 74 20 73 75  latforms that su
0a60: 70 70 6f 72 74 20 74 68 69 73 2c 20 6f 6e 20 74  pport this, on t
0a70: 68 65 20 6c 6f 63 61 6c 20 68 6f 73 74 2c 0a 23  he local host,.#
0a80: 20 6c 69 73 74 65 6e 69 6e 67 20 61 74 20 70 6f   listening at po
0a90: 72 74 20 38 30 34 38 2e 20 49 66 20 61 6c 6c 20  rt 8048. If all 
0aa0: 66 61 69 6c 73 2c 20 61 20 6d 65 73 73 61 67 65  fails, a message
0ab0: 20 69 73 20 70 72 69 6e 74 65 64 20 61 6e 64 20   is printed and 
0ac0: 74 68 65 20 74 65 73 74 73 0a 23 20 75 73 69 6e  the tests.# usin
0ad0: 67 20 74 68 65 20 72 65 6d 6f 74 65 20 73 65 72  g the remote ser
0ae0: 76 65 72 20 61 72 65 20 6e 6f 74 20 70 65 72 66  ver are not perf
0af0: 6f 72 6d 65 64 2e 0a 0a 69 66 20 7b 5b 6c 73 65  ormed...if {[lse
0b00: 61 72 63 68 20 5b 6e 61 6d 65 73 70 61 63 65 20  arch [namespace 
0b10: 63 68 69 6c 64 72 65 6e 5d 20 3a 3a 74 63 6c 74  children] ::tclt
0b20: 65 73 74 5d 20 3d 3d 20 2d 31 7d 20 7b 0a 20 20  est] == -1} {.  
0b30: 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
0b40: 65 20 74 63 6c 74 65 73 74 0a 20 20 20 20 6e 61  e tcltest.    na
0b50: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 2d  mespace import -
0b60: 66 6f 72 63 65 20 3a 3a 74 63 6c 74 65 73 74 3a  force ::tcltest:
0b70: 3a 2a 0a 7d 0a 0a 23 20 4c 6f 61 64 20 74 68 65  :*.}..# Load the
0b80: 20 74 6c 73 20 70 61 63 6b 61 67 65 0a 0a 70 61   tls package..pa
0b90: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 74 6c  ckage require tl
0ba0: 73 0a 0a 73 65 74 20 74 6c 73 53 65 72 76 65 72  s..set tlsServer
0bb0: 50 6f 72 74 20 38 30 34 38 0a 0a 73 65 74 20 63  Port 8048..set c
0bc0: 65 72 74 73 44 69 72 20 5b 66 69 6c 65 20 6a 6f  ertsDir [file jo
0bd0: 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  in [file dirname
0be0: 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20   [info script]] 
0bf0: 63 65 72 74 73 5d 20 0a 0a 73 65 74 20 73 65 72  certs] ..set ser
0c00: 76 65 72 43 65 72 74 20 5b 66 69 6c 65 20 6a 6f  verCert [file jo
0c10: 69 6e 20 24 63 65 72 74 73 44 69 72 20 73 65 72  in $certsDir ser
0c20: 76 65 72 2e 70 65 6d 5d 0a 73 65 74 20 63 6c 69  ver.pem].set cli
0c30: 65 6e 74 43 65 72 74 20 5b 66 69 6c 65 20 6a 6f  entCert [file jo
0c40: 69 6e 20 24 63 65 72 74 73 44 69 72 20 63 6c 69  in $certsDir cli
0c50: 65 6e 74 2e 70 65 6d 5d 0a 73 65 74 20 63 61 43  ent.pem].set caC
0c60: 65 72 74 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ert [file join $
0c70: 63 65 72 74 73 44 69 72 20 63 61 63 65 72 74 2e  certsDir cacert.
0c80: 70 65 6d 5d 0a 73 65 74 20 73 65 72 76 65 72 4b  pem].set serverK
0c90: 65 79 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 63  ey [file join $c
0ca0: 65 72 74 73 44 69 72 20 73 6b 65 79 2e 70 65 6d  ertsDir skey.pem
0cb0: 5d 0a 73 65 74 20 63 6c 69 65 6e 74 4b 65 79 20  ].set clientKey 
0cc0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 63 65 72 74  [file join $cert
0cd0: 73 44 69 72 20 63 6b 65 79 2e 70 65 6d 5d 0a 0a  sDir ckey.pem]..
0ce0: 23 20 53 6f 6d 65 20 74 65 73 74 73 20 72 65 71  # Some tests req
0cf0: 75 69 72 65 20 74 68 65 20 74 65 73 74 74 68 72  uire the testthr
0d00: 65 61 64 20 63 6f 6d 6d 61 6e 64 0a 0a 73 65 74  ead command..set
0d10: 20 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 65 73 74   ::tcltest::test
0d20: 43 6f 6e 73 74 72 61 69 6e 74 73 28 74 65 73 74  Constraints(test
0d30: 74 68 72 65 61 64 29 20 5c 0a 09 5b 65 78 70 72  thread) \..[expr
0d40: 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73   {[info commands
0d50: 20 74 65 73 74 74 68 72 65 61 64 5d 20 21 3d 20   testthread] != 
0d60: 7b 7d 7d 5d 0a 0a 23 0a 23 20 49 66 20 72 65 6d  {}}]..#.# If rem
0d70: 6f 74 65 53 65 72 76 65 72 49 50 20 6f 72 20 72  oteServerIP or r
0d80: 65 6d 6f 74 65 53 65 72 76 65 72 50 6f 72 74 20  emoteServerPort 
0d90: 61 72 65 20 6e 6f 74 20 73 65 74 2c 20 63 68 65  are not set, che
0da0: 63 6b 20 69 6e 20 74 68 65 0a 23 20 65 6e 76 69  ck in the.# envi
0db0: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
0dc0: 73 20 66 6f 72 20 65 78 74 65 72 6e 61 6c 6c 79  s for externally
0dd0: 20 73 65 74 20 76 61 6c 75 65 73 2e 0a 23 0a 0a   set values..#..
0de0: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
0df0: 73 20 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50  s remoteServerIP
0e00: 5d 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 69 6e  ]} {.    if {[in
0e10: 66 6f 20 65 78 69 73 74 73 20 65 6e 76 28 72 65  fo exists env(re
0e20: 6d 6f 74 65 53 65 72 76 65 72 49 50 29 5d 7d 20  moteServerIP)]} 
0e30: 7b 0a 09 73 65 74 20 72 65 6d 6f 74 65 53 65 72  {..set remoteSer
0e40: 76 65 72 49 50 20 24 65 6e 76 28 72 65 6d 6f 74  verIP $env(remot
0e50: 65 53 65 72 76 65 72 49 50 29 0a 20 20 20 20 7d  eServerIP).    }
0e60: 0a 7d 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .}.if {![info ex
0e70: 69 73 74 73 20 72 65 6d 6f 74 65 53 65 72 76 65  ists remoteServe
0e80: 72 50 6f 72 74 5d 7d 20 7b 0a 20 20 20 20 69 66  rPort]} {.    if
0e90: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 65   {[info exists e
0ea0: 6e 76 28 72 65 6d 6f 74 65 53 65 72 76 65 72 50  nv(remoteServerP
0eb0: 6f 72 74 29 5d 7d 20 7b 0a 09 73 65 74 20 72 65  ort)]} {..set re
0ec0: 6d 6f 74 65 53 65 72 76 65 72 50 6f 72 74 20 24  moteServerPort $
0ed0: 65 6e 76 28 72 65 6d 6f 74 65 53 65 72 76 65 72  env(remoteServer
0ee0: 50 6f 72 74 29 0a 20 20 20 20 7d 20 65 6c 73 65  Port).    } else
0ef0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b   {.        if {[
0f00: 69 6e 66 6f 20 65 78 69 73 74 73 20 72 65 6d 6f  info exists remo
0f10: 74 65 53 65 72 76 65 72 49 50 5d 7d 20 7b 0a 09  teServerIP]} {..
0f20: 20 20 20 20 73 65 74 20 72 65 6d 6f 74 65 53 65      set remoteSe
0f30: 72 76 65 72 50 6f 72 74 20 24 74 6c 73 53 65 72  rverPort $tlsSer
0f40: 76 65 72 50 6f 72 74 0a 20 20 20 20 20 20 20 20  verPort.        
0f50: 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 0a 23 20 43  }.    }.}..#.# C
0f60: 68 65 63 6b 20 69 66 20 77 65 27 72 65 20 73 75  heck if we're su
0f70: 70 70 6f 73 65 64 20 74 6f 20 64 6f 20 74 65 73  pposed to do tes
0f80: 74 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 72  ts against the r
0f90: 65 6d 6f 74 65 20 73 65 72 76 65 72 0a 23 0a 0a  emote server.#..
0fa0: 73 65 74 20 64 6f 54 65 73 74 73 57 69 74 68 52  set doTestsWithR
0fb0: 65 6d 6f 74 65 53 65 72 76 65 72 20 31 0a 69 66  emoteServer 1.if
0fc0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
0fd0: 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50 5d 20  remoteServerIP] 
0fe0: 26 26 20 28 24 74 63 6c 5f 70 6c 61 74 66 6f 72  && ($tcl_platfor
0ff0: 6d 28 70 6c 61 74 66 6f 72 6d 29 20 21 3d 20 22  m(platform) != "
1000: 6d 61 63 69 6e 74 6f 73 68 22 29 7d 20 7b 0a 20  macintosh")} {. 
1010: 20 20 20 73 65 74 20 72 65 6d 6f 74 65 53 65 72     set remoteSer
1020: 76 65 72 49 50 20 31 32 37 2e 30 2e 30 2e 31 0a  verIP 127.0.0.1.
1030: 7d 0a 69 66 20 7b 28 24 64 6f 54 65 73 74 73 57  }.if {($doTestsW
1040: 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72 20  ithRemoteServer 
1050: 3d 3d 20 31 29 20 26 26 20 28 21 5b 69 6e 66 6f  == 1) && (![info
1060: 20 65 78 69 73 74 73 20 72 65 6d 6f 74 65 53 65   exists remoteSe
1070: 72 76 65 72 50 6f 72 74 5d 29 7d 20 7b 0a 20 20  rverPort])} {.  
1080: 20 20 73 65 74 20 72 65 6d 6f 74 65 53 65 72 76    set remoteServ
1090: 65 72 50 6f 72 74 20 24 74 6c 73 53 65 72 76 65  erPort $tlsServe
10a0: 72 50 6f 72 74 0a 7d 0a 0a 23 20 41 74 74 65 6d  rPort.}..# Attem
10b0: 70 74 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  pt to connect to
10c0: 20 61 20 72 65 6d 6f 74 65 20 73 65 72 76 65 72   a remote server
10d0: 20 69 66 20 6f 6e 65 20 69 73 20 61 6c 72 65 61   if one is alrea
10e0: 64 79 20 72 75 6e 6e 69 6e 67 2e 20 49 66 20 69  dy running. If i
10f0: 74 0a 23 20 69 73 20 6e 6f 74 20 72 75 6e 6e 69  t.# is not runni
1100: 6e 67 20 6f 72 20 66 6f 72 20 73 6f 6d 65 20 6f  ng or for some o
1110: 74 68 65 72 20 72 65 61 73 6f 6e 20 74 68 65 20  ther reason the 
1120: 63 6f 6e 6e 65 63 74 20 66 61 69 6c 73 2c 20 61  connect fails, a
1130: 74 74 65 6d 70 74 20 74 6f 0a 23 20 73 74 61 72  ttempt to.# star
1140: 74 20 74 68 65 20 72 65 6d 6f 74 65 20 73 65 72  t the remote ser
1150: 76 65 72 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ver on the local
1160: 20 68 6f 73 74 20 6c 69 73 74 65 6e 69 6e 67 20   host listening 
1170: 6f 6e 20 70 6f 72 74 20 38 30 34 38 2e 20 54 68  on port 8048. Th
1180: 69 73 0a 23 20 69 73 20 6f 6e 6c 79 20 64 6f 6e  is.# is only don
1190: 65 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 74  e on platforms t
11a0: 68 61 74 20 73 75 70 70 6f 72 74 20 65 78 65 63  hat support exec
11b0: 20 28 69 2e 65 2e 20 6e 6f 74 20 6f 6e 20 74 68   (i.e. not on th
11c0: 65 20 4d 61 63 29 2e 20 4f 6e 0a 23 20 70 6c 61  e Mac). On.# pla
11d0: 74 66 6f 72 6d 73 20 74 68 61 74 20 64 6f 20 6e  tforms that do n
11e0: 6f 74 20 73 75 70 70 6f 72 74 20 65 78 65 63 2c  ot support exec,
11f0: 20 74 68 65 20 72 65 6d 6f 74 65 20 73 65 72 76   the remote serv
1200: 65 72 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  er must be start
1210: 65 64 0a 23 20 62 79 20 74 68 65 20 75 73 65 72  ed.# by the user
1220: 20 62 65 66 6f 72 65 20 72 75 6e 6e 69 6e 67 20   before running 
1230: 74 68 65 20 74 65 73 74 73 2e 0a 0a 73 65 74 20  the tests...set 
1240: 72 65 6d 6f 74 65 50 72 6f 63 43 68 61 6e 20 22  remoteProcChan "
1250: 22 0a 73 65 74 20 63 6f 6d 6d 61 6e 64 53 6f 63  ".set commandSoc
1260: 6b 65 74 20 22 22 0a 69 66 20 7b 24 64 6f 54 65  ket "".if {$doTe
1270: 73 74 73 57 69 74 68 52 65 6d 6f 74 65 53 65 72  stsWithRemoteSer
1280: 76 65 72 7d 20 7b 0a 20 20 20 20 63 61 74 63 68  ver} {.    catch
1290: 20 7b 63 6c 6f 73 65 20 24 63 6f 6d 6d 61 6e 64   {close $command
12a0: 53 6f 63 6b 65 74 7d 0a 20 20 20 20 69 66 20 7b  Socket}.    if {
12b0: 5b 63 61 74 63 68 20 7b 73 65 74 20 63 6f 6d 6d  [catch {set comm
12c0: 61 6e 64 53 6f 63 6b 65 74 20 5b 74 6c 73 3a 3a  andSocket [tls::
12d0: 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63  socket \..    -c
12e0: 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43  ertfile $clientC
12f0: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
1300: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c  ert -keyfile $cl
1310: 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 24  ientKey \..    $
1320: 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50 20 5c  remoteServerIP \
1330: 0a 09 20 20 20 20 24 72 65 6d 6f 74 65 53 65 72  ..    $remoteSer
1340: 76 65 72 50 6f 72 74 5d 7d 5d 20 21 3d 20 30 7d  verPort]}] != 0}
1350: 20 7b 0a 09 69 66 20 7b 5b 69 6e 66 6f 20 63 6f   {..if {[info co
1360: 6d 6d 61 6e 64 73 20 65 78 65 63 5d 20 3d 3d 20  mmands exec] == 
1370: 22 22 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 6e  ""} {..    set n
1380: 6f 52 65 6d 6f 74 65 54 65 73 74 52 65 61 73 6f  oRemoteTestReaso
1390: 6e 20 22 63 61 6e 27 74 20 65 78 65 63 22 0a 09  n "can't exec"..
13a0: 20 20 20 20 73 65 74 20 64 6f 54 65 73 74 73 57      set doTestsW
13b0: 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72 20  ithRemoteServer 
13c0: 30 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  0..} else {..   
13d0: 20 73 65 74 20 72 65 6d 6f 74 65 53 65 72 76 65   set remoteServe
13e0: 72 49 50 20 31 32 37 2e 30 2e 30 2e 31 0a 09 20  rIP 127.0.0.1.. 
13f0: 20 20 20 73 65 74 20 72 65 6d 6f 74 65 46 69 6c     set remoteFil
1400: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77  e [file join [pw
1410: 64 5d 20 72 65 6d 6f 74 65 2e 74 63 6c 5d 0a 09  d] remote.tcl]..
1420: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1430: 73 65 74 20 72 65 6d 6f 74 65 50 72 6f 63 43 68  set remoteProcCh
1440: 61 6e 20 5c 0a 09 09 09 09 5b 6f 70 65 6e 20 22  an \.....[open "
1450: 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74 65 73  |[list $::tcltes
1460: 74 3a 3a 74 63 6c 74 65 73 74 20 24 72 65 6d 6f  t::tcltest $remo
1470: 74 65 46 69 6c 65 20 5c 0a 09 09 09 09 09 2d 73  teFile \......-s
1480: 65 72 76 65 72 49 73 53 69 6c 65 6e 74 20 5c 0a  erverIsSilent \.
1490: 09 09 09 09 09 2d 70 6f 72 74 20 24 72 65 6d 6f  .....-port $remo
14a0: 74 65 53 65 72 76 65 72 50 6f 72 74 20 5c 0a 09  teServerPort \..
14b0: 09 09 09 09 2d 61 64 64 72 65 73 73 20 24 72 65  ....-address $re
14c0: 6d 6f 74 65 53 65 72 76 65 72 49 50 5d 22 20 5c  moteServerIP]" \
14d0: 0a 09 09 09 09 09 77 2b 5d 7d 20 5c 0a 09 09 20  ......w+]} \... 
14e0: 20 20 6d 73 67 5d 20 3d 3d 20 30 7d 20 7b 0a 09    msg] == 0} {..
14f0: 09 61 66 74 65 72 20 31 30 30 30 0a 09 09 69 66  .after 1000...if
1500: 20 7b 5b 63 61 74 63 68 20 7b 73 65 74 20 63 6f   {[catch {set co
1510: 6d 6d 61 6e 64 53 6f 63 6b 65 74 20 5b 74 6c 73  mmandSocket [tls
1520: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09 20 20 20  ::socket \...   
1530: 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65   -certfile $clie
1540: 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24  ntCert -cafile $
1550: 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20  caCert -keyfile 
1560: 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 09 09  $clientKey \....
1570: 09 24 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50  .$remoteServerIP
1580: 20 5c 0a 09 09 09 09 24 72 65 6d 6f 74 65 53 65   \.....$remoteSe
1590: 72 76 65 72 50 6f 72 74 5d 7d 20 6d 73 67 5d 20  rverPort]} msg] 
15a0: 3d 3d 20 30 7d 20 7b 0a 09 09 20 20 20 20 66 63  == 0} {...    fc
15b0: 6f 6e 66 69 67 75 72 65 20 24 63 6f 6d 6d 61 6e  onfigure $comman
15c0: 64 53 6f 63 6b 65 74 20 2d 74 72 61 6e 73 6c 61  dSocket -transla
15d0: 74 69 6f 6e 20 63 72 6c 66 20 2d 62 75 66 66 65  tion crlf -buffe
15e0: 72 69 6e 67 20 6c 69 6e 65 0a 09 09 7d 20 65 6c  ring line...} el
15f0: 73 65 20 7b 0a 09 09 20 20 20 20 73 65 74 20 6e  se {...    set n
1600: 6f 52 65 6d 6f 74 65 54 65 73 74 52 65 61 73 6f  oRemoteTestReaso
1610: 6e 20 24 6d 73 67 0a 09 09 20 20 20 20 73 65 74  n $msg...    set
1620: 20 64 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f   doTestsWithRemo
1630: 74 65 53 65 72 76 65 72 20 30 0a 09 09 7d 0a 09  teServer 0...}..
1640: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 73      } else {...s
1650: 65 74 20 6e 6f 52 65 6d 6f 74 65 54 65 73 74 52  et noRemoteTestR
1660: 65 61 73 6f 6e 20 22 24 6d 73 67 20 24 3a 3a 74  eason "$msg $::t
1670: 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73 74 22  cltest::tcltest"
1680: 0a 09 09 73 65 74 20 64 6f 54 65 73 74 73 57 69  ...set doTestsWi
1690: 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72 20 30  thRemoteServer 0
16a0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
16b0: 20 65 6c 73 65 20 7b 0a 09 66 63 6f 6e 66 69 67   else {..fconfig
16c0: 75 72 65 20 24 63 6f 6d 6d 61 6e 64 53 6f 63 6b  ure $commandSock
16d0: 65 74 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20  et -translation 
16e0: 63 72 6c 66 20 2d 62 75 66 66 65 72 69 6e 67 20  crlf -buffering 
16f0: 6c 69 6e 65 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20  line.    }.}..# 
1700: 53 6f 6d 65 20 74 65 73 74 73 20 61 72 65 20 72  Some tests are r
1710: 75 6e 20 6f 6e 6c 79 20 69 66 20 77 65 20 61 72  un only if we ar
1720: 65 20 64 6f 69 6e 67 20 74 65 73 74 69 6e 67 20  e doing testing 
1730: 61 67 61 69 6e 73 74 20 61 20 72 65 6d 6f 74 65  against a remote
1740: 20 73 65 72 76 65 72 2e 0a 73 65 74 20 3a 3a 74   server..set ::t
1750: 63 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f 6e 73  cltest::testCons
1760: 74 72 61 69 6e 74 73 28 64 6f 54 65 73 74 73 57  traints(doTestsW
1770: 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72 29  ithRemoteServer)
1780: 20 24 64 6f 54 65 73 74 73 57 69 74 68 52 65 6d   $doTestsWithRem
1790: 6f 74 65 53 65 72 76 65 72 0a 69 66 20 7b 24 64  oteServer.if {$d
17a0: 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65  oTestsWithRemote
17b0: 53 65 72 76 65 72 20 3d 3d 20 30 7d 20 7b 0a 20  Server == 0} {. 
17c0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 66     if {[string f
17d0: 69 72 73 74 20 73 20 24 3a 3a 74 63 6c 74 65 73  irst s $::tcltes
17e0: 74 3a 3a 76 65 72 62 6f 73 65 5d 20 21 3d 20 2d  t::verbose] != -
17f0: 31 7d 20 7b 0a 20 20 20 20 09 70 75 74 73 20 22  1} {.    .puts "
1800: 53 6b 69 70 70 69 6e 67 20 74 65 73 74 73 20 77  Skipping tests w
1810: 69 74 68 20 72 65 6d 6f 74 65 20 73 65 72 76 65  ith remote serve
1820: 72 2e 20 53 65 65 20 74 65 73 74 73 2f 73 6f 63  r. See tests/soc
1830: 6b 65 74 2e 74 65 73 74 20 66 6f 72 22 0a 09 70  ket.test for"..p
1840: 75 74 73 20 22 69 6e 66 6f 72 6d 61 74 69 6f 6e  uts "information
1850: 20 6f 6e 20 68 6f 77 20 74 6f 20 72 75 6e 20 72   on how to run r
1860: 65 6d 6f 74 65 20 73 65 72 76 65 72 2e 22 0a 09  emote server."..
1870: 70 75 74 73 20 22 52 65 61 73 6f 6e 20 66 6f 72  puts "Reason for
1880: 20 6e 6f 74 20 64 6f 69 6e 67 20 72 65 6d 6f 74   not doing remot
1890: 65 20 74 65 73 74 73 3a 20 24 6e 6f 52 65 6d 6f  e tests: $noRemo
18a0: 74 65 54 65 73 74 52 65 61 73 6f 6e 22 0a 20 20  teTestReason".  
18b0: 20 20 7d 0a 7d 0a 0a 23 0a 23 20 49 66 20 77 65    }.}..#.# If we
18c0: 20 64 6f 20 74 68 65 20 74 65 73 74 73 2c 20 64   do the tests, d
18d0: 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e 64 20  efine a command 
18e0: 74 6f 20 73 65 6e 64 20 61 20 63 6f 6d 6d 61 6e  to send a comman
18f0: 64 20 74 6f 20 74 68 65 0a 23 20 72 65 6d 6f 74  d to the.# remot
1900: 65 20 73 65 72 76 65 72 2e 0a 23 0a 0a 69 66 20  e server..#..if 
1910: 7b 24 64 6f 54 65 73 74 73 57 69 74 68 52 65 6d  {$doTestsWithRem
1920: 6f 74 65 53 65 72 76 65 72 20 3d 3d 20 31 7d 20  oteServer == 1} 
1930: 7b 0a 20 20 20 20 70 72 6f 63 20 73 65 6e 64 43  {.    proc sendC
1940: 6f 6d 6d 61 6e 64 20 7b 63 7d 20 7b 0a 09 67 6c  ommand {c} {..gl
1950: 6f 62 61 6c 20 63 6f 6d 6d 61 6e 64 53 6f 63 6b  obal commandSock
1960: 65 74 0a 0a 09 69 66 20 7b 5b 65 6f 66 20 24 63  et...if {[eof $c
1970: 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 5d 7d 20 7b  ommandSocket]} {
1980: 0a 09 20 20 20 20 65 72 72 6f 72 20 22 72 65 6d  ..    error "rem
1990: 6f 74 65 20 73 65 72 76 65 72 20 64 69 73 61 70  ote server disap
19a0: 70 65 61 72 65 64 22 0a 09 7d 0a 0a 09 69 66 20  peared"..}...if 
19b0: 7b 5b 63 61 74 63 68 20 7b 70 75 74 73 20 24 63  {[catch {puts $c
19c0: 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 20 24 63 7d  ommandSocket $c}
19d0: 20 6d 73 67 5d 7d 20 7b 0a 09 20 20 20 20 65 72   msg]} {..    er
19e0: 72 6f 72 20 22 72 65 6d 6f 74 65 20 73 65 72 76  ror "remote serv
19f0: 65 72 20 64 69 73 61 70 70 61 65 72 65 64 3a 20  er disappaered: 
1a00: 24 6d 73 67 22 0a 09 7d 0a 09 69 66 20 7b 5b 63  $msg"..}..if {[c
1a10: 61 74 63 68 20 7b 70 75 74 73 20 24 63 6f 6d 6d  atch {puts $comm
1a20: 61 6e 64 53 6f 63 6b 65 74 20 22 2d 2d 4d 61 72  andSocket "--Mar
1a30: 6b 65 72 2d 2d 4d 61 72 6b 65 72 2d 2d 4d 61 72  ker--Marker--Mar
1a40: 6b 65 72 2d 2d 22 7d 20 6d 73 67 5d 7d 20 7b 0a  ker--"} msg]} {.
1a50: 09 20 20 20 20 65 72 72 6f 72 20 22 72 65 6d 6f  .    error "remo
1a60: 74 65 20 73 65 72 76 65 72 20 64 69 73 61 70 70  te server disapp
1a70: 65 61 72 65 64 3a 20 24 6d 73 67 22 0a 09 7d 0a  eared: $msg"..}.
1a80: 0a 09 73 65 74 20 72 65 73 70 20 22 22 0a 09 77  ..set resp ""..w
1a90: 68 69 6c 65 20 7b 31 7d 20 7b 0a 09 20 20 20 20  hile {1} {..    
1aa0: 73 65 74 20 6c 69 6e 65 20 5b 67 65 74 73 20 24  set line [gets $
1ab0: 63 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 5d 0a 09  commandSocket]..
1ac0: 20 20 20 20 69 66 20 7b 5b 65 6f 66 20 24 63 6f      if {[eof $co
1ad0: 6d 6d 61 6e 64 53 6f 63 6b 65 74 5d 7d 20 7b 0a  mmandSocket]} {.
1ae0: 09 09 65 72 72 6f 72 20 22 72 65 6d 6f 74 65 20  ..error "remote 
1af0: 73 65 72 76 65 72 20 64 69 73 61 70 70 65 61 72  server disappear
1b00: 65 64 22 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ed"..    }..    
1b10: 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f 6d 70  if {[string comp
1b20: 61 72 65 20 24 6c 69 6e 65 20 22 2d 2d 4d 61 72  are $line "--Mar
1b30: 6b 65 72 2d 2d 4d 61 72 6b 65 72 2d 2d 4d 61 72  ker--Marker--Mar
1b40: 6b 65 72 2d 2d 22 5d 20 3d 3d 20 30 7d 20 7b 0a  ker--"] == 0} {.
1b50: 09 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f  ..if {[string co
1b60: 6d 70 61 72 65 20 5b 6c 69 6e 64 65 78 20 24 72  mpare [lindex $r
1b70: 65 73 70 20 30 5d 20 65 72 72 6f 72 5d 20 3d 3d  esp 0] error] ==
1b80: 20 30 7d 20 7b 0a 09 09 20 20 20 20 65 72 72 6f   0} {...    erro
1b90: 72 20 5b 6c 69 6e 64 65 78 20 24 72 65 73 70 20  r [lindex $resp 
1ba0: 31 5d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  1]...} else {...
1bb0: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64      return [lind
1bc0: 65 78 20 24 72 65 73 70 20 31 5d 0a 09 09 7d 0a  ex $resp 1]...}.
1bd0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
1be0: 61 70 70 65 6e 64 20 72 65 73 70 20 24 6c 69 6e  append resp $lin
1bf0: 65 20 22 5c 6e 22 0a 09 20 20 20 20 7d 0a 09 7d  e "\n"..    }..}
1c00: 0a 20 20 20 20 7d 0a 7d 0a 0a 74 65 73 74 20 74  .    }.}..test t
1c10: 6c 73 49 4f 2d 31 2e 31 20 7b 61 72 67 20 70 61  lsIO-1.1 {arg pa
1c20: 72 73 69 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74  rsing for socket
1c30: 20 63 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65   command} {socke
1c40: 74 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63  t} {.    list [c
1c50: 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65  atch {tls::socke
1c60: 74 20 2d 73 65 72 76 65 72 7d 20 6d 73 67 5d 20  t -server} msg] 
1c70: 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67  $msg.} {1 {wrong
1c80: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c90: 62 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  be "tls::socket 
1ca0: 2d 73 65 72 76 65 72 20 63 6f 6d 6d 61 6e 64 20  -server command 
1cb0: 3f 6f 70 74 69 6f 6e 73 3f 20 70 6f 72 74 22 7d  ?options? port"}
1cc0: 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31 2e  }..test tlsIO-1.
1cd0: 32 20 7b 61 72 67 20 70 61 72 73 69 6e 67 20 66  2 {arg parsing f
1ce0: 6f 72 20 73 6f 63 6b 65 74 20 63 6f 6d 6d 61 6e  or socket comman
1cf0: 64 7d 20 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20 20  d} {socket} {.  
1d00: 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 74    list [catch {t
1d10: 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76  ls::socket -serv
1d20: 65 72 20 66 6f 6f 7d 20 6d 73 67 5d 20 24 6d 73  er foo} msg] $ms
1d30: 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20  g.} {1 {wrong # 
1d40: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d50: 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65  "tls::socket -se
1d60: 72 76 65 72 20 63 6f 6d 6d 61 6e 64 20 3f 6f 70  rver command ?op
1d70: 74 69 6f 6e 73 3f 20 70 6f 72 74 22 7d 7d 0a 0a  tions? port"}}..
1d80: 74 65 73 74 20 74 6c 73 49 4f 2d 31 2e 33 20 7b  test tlsIO-1.3 {
1d90: 61 72 67 20 70 61 72 73 69 6e 67 20 66 6f 72 20  arg parsing for 
1da0: 73 6f 63 6b 65 74 20 63 6f 6d 6d 61 6e 64 7d 20  socket command} 
1db0: 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20 6c  {socket} {.    l
1dc0: 69 73 74 20 5b 63 61 74 63 68 20 7b 74 6c 73 3a  ist [catch {tls:
1dd0: 3a 73 6f 63 6b 65 74 20 2d 6d 79 61 64 64 72 7d  :socket -myaddr}
1de0: 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20   msg] $msg.} {1 
1df0: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
1e00: 68 6f 75 6c 64 20 62 65 20 22 74 6c 73 3a 3a 73  hould be "tls::s
1e10: 6f 63 6b 65 74 20 3f 6f 70 74 69 6f 6e 73 3f 20  ocket ?options? 
1e20: 68 6f 73 74 20 70 6f 72 74 22 7d 7d 0a 0a 74 65  host port"}}..te
1e30: 73 74 20 74 6c 73 49 4f 2d 31 2e 34 20 7b 61 72  st tlsIO-1.4 {ar
1e40: 67 20 70 61 72 73 69 6e 67 20 66 6f 72 20 73 6f  g parsing for so
1e50: 63 6b 65 74 20 63 6f 6d 6d 61 6e 64 7d 20 7b 73  cket command} {s
1e60: 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20 6c 69 73  ocket} {.    lis
1e70: 74 20 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a 73  t [catch {tls::s
1e80: 6f 63 6b 65 74 20 2d 6d 79 61 64 64 72 20 31 32  ocket -myaddr 12
1e90: 37 2e 30 2e 30 2e 31 7d 20 6d 73 67 5d 20 24 6d  7.0.0.1} msg] $m
1ea0: 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23  sg.} {1 {wrong #
1eb0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1ec0: 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 3f 6f   "tls::socket ?o
1ed0: 70 74 69 6f 6e 73 3f 20 68 6f 73 74 20 70 6f 72  ptions? host por
1ee0: 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f  t"}}..test tlsIO
1ef0: 2d 31 2e 35 20 7b 61 72 67 20 70 61 72 73 69 6e  -1.5 {arg parsin
1f00: 67 20 66 6f 72 20 73 6f 63 6b 65 74 20 63 6f 6d  g for socket com
1f10: 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65 74 7d 20 7b  mand} {socket} {
1f20: 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68  .    list [catch
1f30: 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 6d   {tls::socket -m
1f40: 79 70 6f 72 74 7d 20 6d 73 67 5d 20 24 6d 73 67  yport} msg] $msg
1f50: 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61  .} {1 {wrong # a
1f60: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22  rgs: should be "
1f70: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 3f 6f 70 74  tls::socket ?opt
1f80: 69 6f 6e 73 3f 20 68 6f 73 74 20 70 6f 72 74 22  ions? host port"
1f90: 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31  }}..test tlsIO-1
1fa0: 2e 36 20 7b 61 72 67 20 70 61 72 73 69 6e 67 20  .6 {arg parsing 
1fb0: 66 6f 72 20 73 6f 63 6b 65 74 20 63 6f 6d 6d 61  for socket comma
1fc0: 6e 64 7d 20 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20  nd} {socket} {. 
1fd0: 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b     list [catch {
1fe0: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 6d 79 70  tls::socket -myp
1ff0: 6f 72 74 20 78 78 78 78 7d 20 6d 73 67 5d 20 24  ort xxxx} msg] $
2000: 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20  msg.} {1 {wrong 
2010: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2020: 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 3f  e "tls::socket ?
2030: 6f 70 74 69 6f 6e 73 3f 20 68 6f 73 74 20 70 6f  options? host po
2040: 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49  rt"}}..test tlsI
2050: 4f 2d 31 2e 37 20 7b 61 72 67 20 70 61 72 73 69  O-1.7 {arg parsi
2060: 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74 20 63 6f  ng for socket co
2070: 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65 74 7d 20  mmand} {socket} 
2080: 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63  {.    list [catc
2090: 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d  h {tls::socket -
20a0: 6d 79 70 6f 72 74 20 32 35 32 32 7d 20 6d 73 67  myport 2522} msg
20b0: 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f  ] $msg.} {1 {wro
20c0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
20d0: 64 20 62 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65  d be "tls::socke
20e0: 74 20 3f 6f 70 74 69 6f 6e 73 3f 20 68 6f 73 74  t ?options? host
20f0: 20 70 6f 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74   port"}}..test t
2100: 6c 73 49 4f 2d 31 2e 38 20 7b 61 72 67 20 70 61  lsIO-1.8 {arg pa
2110: 72 73 69 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74  rsing for socket
2120: 20 63 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65   command} {socke
2130: 74 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63  t} {.    list [c
2140: 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65  atch {tls::socke
2150: 74 20 2d 66 72 6f 62 6f 7a 7d 20 6d 73 67 5d 20  t -froboz} msg] 
2160: 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67  $msg.} {1 {wrong
2170: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2180: 62 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  be "tls::socket 
2190: 3f 6f 70 74 69 6f 6e 73 3f 20 68 6f 73 74 20 70  ?options? host p
21a0: 6f 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c 73  ort"}}..test tls
21b0: 49 4f 2d 31 2e 39 20 7b 61 72 67 20 70 61 72 73  IO-1.9 {arg pars
21c0: 69 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74 20 63  ing for socket c
21d0: 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65 74 7d  ommand} {socket}
21e0: 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74   {.    list [cat
21f0: 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  ch {tls::socket 
2200: 2d 73 65 72 76 65 72 20 66 6f 6f 20 2d 6d 79 70  -server foo -myp
2210: 6f 72 74 20 32 35 32 31 20 33 33 33 33 7d 20 6d  ort 2521 3333} m
2220: 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77  sg] $msg.} {1 {w
2230: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2240: 75 6c 64 20 62 65 20 22 74 6c 73 3a 3a 73 6f 63  uld be "tls::soc
2250: 6b 65 74 20 2d 73 65 72 76 65 72 20 63 6f 6d 6d  ket -server comm
2260: 61 6e 64 20 3f 6f 70 74 69 6f 6e 73 3f 20 70 6f  and ?options? po
2270: 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49  rt"}}..test tlsI
2280: 4f 2d 31 2e 31 30 20 7b 61 72 67 20 70 61 72 73  O-1.10 {arg pars
2290: 69 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74 20 63  ing for socket c
22a0: 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65 74 7d  ommand} {socket}
22b0: 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74   {.    list [cat
22c0: 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  ch {tls::socket 
22d0: 68 6f 73 74 20 32 35 32 38 20 2d 6a 75 6e 6b 7d  host 2528 -junk}
22e0: 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20   msg] $msg.} {1 
22f0: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
2300: 68 6f 75 6c 64 20 62 65 20 22 74 6c 73 3a 3a 73  hould be "tls::s
2310: 6f 63 6b 65 74 20 3f 6f 70 74 69 6f 6e 73 3f 20  ocket ?options? 
2320: 68 6f 73 74 20 70 6f 72 74 22 7d 7d 0a 0a 74 65  host port"}}..te
2330: 73 74 20 74 6c 73 49 4f 2d 31 2e 31 31 20 7b 61  st tlsIO-1.11 {a
2340: 72 67 20 70 61 72 73 69 6e 67 20 66 6f 72 20 73  rg parsing for s
2350: 6f 63 6b 65 74 20 63 6f 6d 6d 61 6e 64 7d 20 7b  ocket command} {
2360: 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20 6c 69  socket} {.    li
2370: 73 74 20 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a  st [catch {tls::
2380: 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 63  socket -server c
2390: 61 6c 6c 62 61 63 6b 20 32 35 32 30 20 2d 2d 7d  allback 2520 --}
23a0: 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20   msg] $msg.} {1 
23b0: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
23c0: 68 6f 75 6c 64 20 62 65 20 22 74 6c 73 3a 3a 73  hould be "tls::s
23d0: 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 63 6f  ocket -server co
23e0: 6d 6d 61 6e 64 20 3f 6f 70 74 69 6f 6e 73 3f 20  mmand ?options? 
23f0: 70 6f 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c  port"}}..test tl
2400: 73 49 4f 2d 31 2e 31 32 20 7b 61 72 67 20 70 61  sIO-1.12 {arg pa
2410: 72 73 69 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74  rsing for socket
2420: 20 63 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65   command} {socke
2430: 74 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63  t} {.    list [c
2440: 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65  atch {tls::socke
2450: 74 20 66 6f 6f 20 62 61 64 70 6f 72 74 7d 20 6d  t foo badport} m
2460: 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 65  sg] $msg.} {1 {e
2470: 78 70 65 63 74 65 64 20 69 6e 74 65 67 65 72 20  xpected integer 
2480: 62 75 74 20 67 6f 74 20 22 62 61 64 70 6f 72 74  but got "badport
2490: 22 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d  "}}..test tlsIO-
24a0: 32 2e 31 20 7b 74 63 70 20 63 6f 6e 6e 65 63 74  2.1 {tcp connect
24b0: 69 6f 6e 7d 20 7b 73 6f 63 6b 65 74 20 73 74 64  ion} {socket std
24c0: 69 6f 7d 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65  io} {.    remove
24d0: 46 69 6c 65 20 73 63 72 69 70 74 0a 20 20 20 20  File script.    
24e0: 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69  set f [open scri
24f0: 70 74 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24  pt w].    puts $
2500: 66 20 7b 0a 20 20 20 20 09 70 61 63 6b 61 67 65  f {.    .package
2510: 20 72 65 71 75 69 72 65 20 74 6c 73 0a 09 73 65   require tls..se
2520: 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72 20 32  t timer [after 2
2530: 30 30 30 20 22 73 65 74 20 78 20 74 69 6d 65 64  000 "set x timed
2540: 5f 6f 75 74 22 5d 0a 20 20 20 20 7d 0a 20 20 20  _out"].    }.   
2550: 20 70 75 74 73 20 24 66 20 22 73 65 74 20 66 20   puts $f "set f 
2560: 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73  \[tls::socket -s
2570: 65 72 76 65 72 20 61 63 63 65 70 74 20 2d 63 65  erver accept -ce
2580: 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65  rtfile $serverCe
2590: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
25a0: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72  rt -keyfile $ser
25b0: 76 65 72 4b 65 79 20 24 74 6c 73 53 65 72 76 65  verKey $tlsServe
25c0: 72 50 6f 72 74 20 5c 5d 22 0a 20 20 20 20 70 75  rPort \]".    pu
25d0: 74 73 20 24 66 20 7b 0a 09 70 72 6f 63 20 61 63  ts $f {..proc ac
25e0: 63 65 70 74 20 7b 66 69 6c 65 20 61 64 64 72 20  cept {file addr 
25f0: 70 6f 72 74 7d 20 7b 0a 09 20 20 20 20 67 6c 6f  port} {..    glo
2600: 62 61 6c 20 78 0a 09 20 20 20 20 73 65 74 20 78  bal x..    set x
2610: 20 64 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20   done.          
2620: 20 20 63 6c 6f 73 65 20 24 66 69 6c 65 0a 09 7d    close $file..}
2630: 0a 09 70 75 74 73 20 72 65 61 64 79 0a 09 76 77  ..puts ready..vw
2640: 61 69 74 20 78 0a 09 61 66 74 65 72 20 63 61 6e  ait x..after can
2650: 63 65 6c 20 24 74 69 6d 65 72 0a 09 63 6c 6f 73  cel $timer..clos
2660: 65 20 24 66 0a 09 70 75 74 73 20 24 78 0a 20 20  e $f..puts $x.  
2670: 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66    }.    close $f
2680: 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e  .    set f [open
2690: 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74   "|[list $::tclt
26a0: 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73 63 72  est::tcltest scr
26b0: 69 70 74 5d 22 20 72 5d 0a 20 20 20 20 67 65 74  ipt]" r].    get
26c0: 73 20 24 66 20 78 0a 20 20 20 20 69 66 20 7b 5b  s $f x.    if {[
26d0: 63 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b  catch {tls::sock
26e0: 65 74 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c  et -certfile $cl
26f0: 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65  ientCert -cafile
2700: 20 24 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65 79   $caCert \..-key
2710: 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20  file $clientKey 
2720: 31 32 37 2e 30 2e 30 2e 31 20 24 74 6c 73 53 65  127.0.0.1 $tlsSe
2730: 72 76 65 72 50 6f 72 74 7d 20 6d 73 67 5d 7d 20  rverPort} msg]} 
2740: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 78 20  {.        set x 
2750: 24 6d 73 67 0a 20 20 20 20 7d 20 65 6c 73 65 20  $msg.    } else 
2760: 7b 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  {.        lappen
2770: 64 20 78 20 5b 67 65 74 73 20 24 66 5d 0a 20 20  d x [gets $f].  
2780: 20 20 20 20 20 20 63 6c 6f 73 65 20 24 6d 73 67        close $msg
2790: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65  .    }.    lappe
27a0: 6e 64 20 78 20 5b 67 65 74 73 20 24 66 5d 0a 20  nd x [gets $f]. 
27b0: 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20     close $f.    
27c0: 73 65 74 20 78 0a 7d 20 7b 72 65 61 64 79 20 64  set x.} {ready d
27d0: 6f 6e 65 20 7b 7d 7d 0a 0a 69 66 20 5b 69 6e 66  one {}}..if [inf
27e0: 6f 20 65 78 69 73 74 73 20 70 6f 72 74 5d 20 7b  o exists port] {
27f0: 0a 20 20 20 20 69 6e 63 72 20 70 6f 72 74 0a 7d  .    incr port.}
2800: 20 65 6c 73 65 20 7b 20 0a 20 20 20 20 73 65 74   else { .    set
2810: 20 70 6f 72 74 20 5b 65 78 70 72 20 24 74 6c 73   port [expr $tls
2820: 53 65 72 76 65 72 50 6f 72 74 20 2b 20 5b 70 69  ServerPort + [pi
2830: 64 5d 25 31 30 32 34 5d 0a 7d 0a 0a 74 65 73 74  d]%1024].}..test
2840: 20 74 6c 73 49 4f 2d 32 2e 32 20 7b 74 63 70 20   tlsIO-2.2 {tcp 
2850: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2860: 63 6c 69 65 6e 74 20 70 6f 72 74 20 73 70 65 63  client port spec
2870: 69 66 69 65 64 7d 20 7b 73 6f 63 6b 65 74 20 73  ified} {socket s
2880: 74 64 69 6f 7d 20 7b 0a 20 20 20 20 72 65 6d 6f  tdio} {.    remo
2890: 76 65 46 69 6c 65 20 73 63 72 69 70 74 0a 20 20  veFile script.  
28a0: 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63    set f [open sc
28b0: 72 69 70 74 20 77 5d 0a 20 20 20 20 70 75 74 73  ript w].    puts
28c0: 20 24 66 20 7b 0a 09 70 61 63 6b 61 67 65 20 72   $f {..package r
28d0: 65 71 75 69 72 65 20 74 6c 73 0a 09 73 65 74 20  equire tls..set 
28e0: 74 69 6d 65 72 20 5b 61 66 74 65 72 20 32 30 30  timer [after 200
28f0: 30 20 22 73 65 74 20 78 20 64 6f 6e 65 22 5d 0a  0 "set x done"].
2900: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20 24      }.    puts $
2910: 66 20 22 73 65 74 20 66 20 5c 5b 74 6c 73 3a 3a  f "set f \[tls::
2920: 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 61  socket -server a
2930: 63 63 65 70 74 20 2d 63 65 72 74 66 69 6c 65 20  ccept -certfile 
2940: 24 73 65 72 76 65 72 43 65 72 74 20 2d 63 61 66  $serverCert -caf
2950: 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79  ile $caCert -key
2960: 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20  file $serverKey 
2970: 38 38 32 39 20 5c 5d 22 0a 20 20 20 20 70 75 74  8829 \]".    put
2980: 73 20 24 66 20 7b 0a 09 70 72 6f 63 20 61 63 63  s $f {..proc acc
2990: 65 70 74 20 7b 66 69 6c 65 20 61 64 64 72 20 70  ept {file addr p
29a0: 6f 72 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ort} {.         
29b0: 20 20 20 67 6c 6f 62 61 6c 20 78 0a 20 20 20 20     global x.    
29c0: 20 20 20 20 20 20 20 20 70 75 74 73 20 22 5b 67          puts "[g
29d0: 65 74 73 20 24 66 69 6c 65 5d 20 24 70 6f 72 74  ets $file] $port
29e0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c  ".            cl
29f0: 6f 73 65 20 24 66 69 6c 65 0a 20 20 20 20 20 20  ose $file.      
2a00: 20 20 20 20 20 20 73 65 74 20 78 20 64 6f 6e 65        set x done
2a10: 0a 09 7d 0a 09 70 75 74 73 20 72 65 61 64 79 0a  ..}..puts ready.
2a20: 09 76 77 61 69 74 20 78 0a 09 61 66 74 65 72 20  .vwait x..after 
2a30: 63 61 6e 63 65 6c 20 24 74 69 6d 65 72 0a 09 63  cancel $timer..c
2a40: 6c 6f 73 65 20 24 66 0a 20 20 20 20 7d 0a 20 20  lose $f.    }.  
2a50: 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73    close $f.    s
2a60: 65 74 20 66 20 5b 6f 70 65 6e 20 22 7c 5b 6c 69  et f [open "|[li
2a70: 73 74 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74  st $::tcltest::t
2a80: 63 6c 74 65 73 74 20 73 63 72 69 70 74 5d 22 20  cltest script]" 
2a90: 72 5d 0a 20 20 20 20 67 65 74 73 20 24 66 20 78  r].    gets $f x
2aa0: 0a 20 20 20 20 67 6c 6f 62 61 6c 20 70 6f 72 74  .    global port
2ab0: 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20  .    if {[catch 
2ac0: 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 6d 79  {tls::socket -my
2ad0: 70 6f 72 74 20 24 70 6f 72 74 20 5c 0a 09 2d 63  port $port \..-c
2ae0: 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43  ertfile $clientC
2af0: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
2b00: 65 72 74 20 5c 0a 09 2d 6b 65 79 66 69 6c 65 20  ert \..-keyfile 
2b10: 24 63 6c 69 65 6e 74 4b 65 79 20 31 32 37 2e 30  $clientKey 127.0
2b20: 2e 30 2e 31 20 38 38 32 39 7d 20 73 6f 63 6b 5d  .0.1 8829} sock]
2b30: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
2b40: 78 20 24 73 6f 63 6b 0a 09 63 61 74 63 68 20 7b  x $sock..catch {
2b50: 63 6c 6f 73 65 20 5b 74 6c 73 3a 3a 73 6f 63 6b  close [tls::sock
2b60: 65 74 20 31 32 37 2e 30 2e 30 2e 31 20 38 38 32  et 127.0.0.1 882
2b70: 39 5d 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  9]}.    } else {
2b80: 0a 20 20 20 20 20 20 20 20 70 75 74 73 20 24 73  .        puts $s
2b90: 6f 63 6b 20 68 65 6c 6c 6f 0a 09 66 6c 75 73 68  ock hello..flush
2ba0: 20 24 73 6f 63 6b 0a 20 20 20 20 20 20 20 20 6c   $sock.        l
2bb0: 61 70 70 65 6e 64 20 78 20 5b 67 65 74 73 20 24  append x [gets $
2bc0: 66 5d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  f].        close
2bd0: 20 24 73 6f 63 6b 0a 20 20 20 20 7d 0a 20 20 20   $sock.    }.   
2be0: 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65   close $f.    se
2bf0: 74 20 78 0a 7d 20 5b 6c 69 73 74 20 72 65 61 64  t x.} [list read
2c00: 79 20 22 68 65 6c 6c 6f 20 24 70 6f 72 74 22 5d  y "hello $port"]
2c10: 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 32 2e 33  ..test tlsIO-2.3
2c20: 20 7b 74 63 70 20 63 6f 6e 6e 65 63 74 69 6f 6e   {tcp connection
2c30: 20 77 69 74 68 20 63 6c 69 65 6e 74 20 69 6e 74   with client int
2c40: 65 72 66 61 63 65 20 73 70 65 63 69 66 69 65 64  erface specified
2c50: 7d 20 7b 73 6f 63 6b 65 74 20 73 74 64 69 6f 7d  } {socket stdio}
2c60: 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c   {.    removeFil
2c70: 65 20 73 63 72 69 70 74 0a 20 20 20 20 73 65 74  e script.    set
2c80: 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70 74 20   f [open script 
2c90: 77 5d 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b  w].    puts $f {
2ca0: 0a 09 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  ..package requir
2cb0: 65 20 74 6c 73 0a 09 73 65 74 20 74 69 6d 65 72  e tls..set timer
2cc0: 20 5b 61 66 74 65 72 20 32 30 30 30 20 22 73 65   [after 2000 "se
2cd0: 74 20 78 20 64 6f 6e 65 22 5d 0a 20 20 20 20 7d  t x done"].    }
2ce0: 0a 20 20 20 20 70 75 74 73 20 24 66 20 22 73 65  .    puts $f "se
2cf0: 74 20 66 20 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65  t f \[tls::socke
2d00: 74 20 2d 73 65 72 76 65 72 20 61 63 63 65 70 74  t -server accept
2d10: 20 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72 76   -certfile $serv
2d20: 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24  erCert -cafile $
2d30: 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20  caCert -keyfile 
2d40: 24 73 65 72 76 65 72 4b 65 79 20 38 38 33 30 20  $serverKey 8830 
2d50: 5c 5d 22 0a 20 20 20 20 70 75 74 73 20 24 66 20  \]".    puts $f 
2d60: 7b 0a 09 70 72 6f 63 20 61 63 63 65 70 74 20 7b  {..proc accept {
2d70: 66 69 6c 65 20 61 64 64 72 20 70 6f 72 74 7d 20  file addr port} 
2d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6c  {.            gl
2d90: 6f 62 61 6c 20 78 0a 20 20 20 20 20 20 20 20 20  obal x.         
2da0: 20 20 20 70 75 74 73 20 22 5b 67 65 74 73 20 24     puts "[gets $
2db0: 66 69 6c 65 5d 20 24 61 64 64 72 22 0a 20 20 20  file] $addr".   
2dc0: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20 24           close $
2dd0: 66 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  file.           
2de0: 20 73 65 74 20 78 20 64 6f 6e 65 0a 09 7d 0a 09   set x done..}..
2df0: 70 75 74 73 20 72 65 61 64 79 0a 09 76 77 61 69  puts ready..vwai
2e00: 74 20 78 0a 09 61 66 74 65 72 20 63 61 6e 63 65  t x..after cance
2e10: 6c 20 24 74 69 6d 65 72 0a 09 63 6c 6f 73 65 20  l $timer..close 
2e20: 24 66 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f  $f.    }.    clo
2e30: 73 65 20 24 66 0a 20 20 20 20 73 65 74 20 66 20  se $f.    set f 
2e40: 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a  [open "|[list $:
2e50: 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73  :tcltest::tcltes
2e60: 74 20 73 63 72 69 70 74 5d 22 20 72 5d 0a 20 20  t script]" r].  
2e70: 20 20 67 65 74 73 20 24 66 20 78 0a 20 20 20 20    gets $f x.    
2e80: 69 66 20 7b 5b 63 61 74 63 68 20 7b 74 6c 73 3a  if {[catch {tls:
2e90: 3a 73 6f 63 6b 65 74 20 2d 6d 79 61 64 64 72 20  :socket -myaddr 
2ea0: 31 32 37 2e 30 2e 30 2e 31 20 5c 0a 09 2d 63 65  127.0.0.1 \..-ce
2eb0: 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65  rtfile $clientCe
2ec0: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
2ed0: 72 74 20 5c 0a 09 2d 6b 65 79 66 69 6c 65 20 24  rt \..-keyfile $
2ee0: 63 6c 69 65 6e 74 4b 65 79 20 31 32 37 2e 30 2e  clientKey 127.0.
2ef0: 30 2e 31 20 38 38 33 30 7d 20 73 6f 63 6b 5d 7d  0.1 8830} sock]}
2f00: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 78   {.        set x
2f10: 20 24 73 6f 63 6b 0a 20 20 20 20 7d 20 65 6c 73   $sock.    } els
2f20: 65 20 7b 0a 20 20 20 20 20 20 20 20 70 75 74 73  e {.        puts
2f30: 20 24 73 6f 63 6b 20 68 65 6c 6c 6f 0a 09 63 61   $sock hello..ca
2f40: 74 63 68 20 7b 66 6c 75 73 68 20 24 73 6f 63 6b  tch {flush $sock
2f50: 7d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  }.        lappen
2f60: 64 20 78 20 5b 67 65 74 73 20 24 66 5d 0a 20 20  d x [gets $f].  
2f70: 20 20 20 20 20 20 63 6c 6f 73 65 20 24 73 6f 63        close $soc
2f80: 6b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73  k.    }.    clos
2f90: 65 20 24 66 0a 20 20 20 20 73 65 74 20 78 0a 7d  e $f.    set x.}
2fa0: 20 7b 72 65 61 64 79 20 7b 68 65 6c 6c 6f 20 31   {ready {hello 1
2fb0: 32 37 2e 30 2e 30 2e 31 7d 7d 0a 0a 74 65 73 74  27.0.0.1}}..test
2fc0: 20 74 6c 73 49 4f 2d 32 2e 34 20 7b 74 63 70 20   tlsIO-2.4 {tcp 
2fd0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2fe0: 73 65 72 76 65 72 20 69 6e 74 65 72 66 61 63 65  server interface
2ff0: 20 73 70 65 63 69 66 69 65 64 7d 20 7b 73 6f 63   specified} {soc
3000: 6b 65 74 20 73 74 64 69 6f 7d 20 7b 0a 20 20 20  ket stdio} {.   
3010: 20 72 65 6d 6f 76 65 46 69 6c 65 20 73 63 72 69   removeFile scri
3020: 70 74 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70  pt.    set f [op
3030: 65 6e 20 73 63 72 69 70 74 20 77 5d 0a 20 20 20  en script w].   
3040: 20 70 75 74 73 20 24 66 20 7b 0a 09 70 61 63 6b   puts $f {..pack
3050: 61 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a  age require tls.
3060: 09 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65  .set timer [afte
3070: 72 20 32 30 30 30 20 22 73 65 74 20 78 20 64 6f  r 2000 "set x do
3080: 6e 65 22 5d 0a 20 20 20 20 7d 0a 20 20 20 20 70  ne"].    }.    p
3090: 75 74 73 20 24 66 20 22 73 65 74 20 66 20 5c 5b  uts $f "set f \[
30a0: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72  tls::socket -ser
30b0: 76 65 72 20 61 63 63 65 70 74 20 2d 63 65 72 74  ver accept -cert
30c0: 66 69 6c 65 20 24 73 65 72 76 65 72 43 65 72 74  file $serverCert
30d0: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
30e0: 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65   -keyfile $serve
30f0: 72 4b 65 79 20 2d 6d 79 61 64 64 72 20 5b 69 6e  rKey -myaddr [in
3100: 66 6f 20 68 6f 73 74 6e 61 6d 65 5d 20 38 38 33  fo hostname] 883
3110: 31 20 5c 5d 22 0a 20 20 20 20 70 75 74 73 20 24  1 \]".    puts $
3120: 66 20 7b 0a 09 70 72 6f 63 20 61 63 63 65 70 74  f {..proc accept
3130: 20 7b 66 69 6c 65 20 61 64 64 72 20 70 6f 72 74   {file addr port
3140: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
3150: 67 6c 6f 62 61 6c 20 78 0a 20 20 20 20 20 20 20  global x.       
3160: 20 20 20 20 20 70 75 74 73 20 22 5b 67 65 74 73       puts "[gets
3170: 20 24 66 69 6c 65 5d 22 0a 20 20 20 20 20 20 20   $file]".       
3180: 20 20 20 20 20 63 6c 6f 73 65 20 24 66 69 6c 65       close $file
3190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
31a0: 20 78 20 64 6f 6e 65 0a 09 7d 0a 09 70 75 74 73   x done..}..puts
31b0: 20 72 65 61 64 79 0a 09 76 77 61 69 74 20 78 0a   ready..vwait x.
31c0: 09 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74  .after cancel $t
31d0: 69 6d 65 72 0a 09 63 6c 6f 73 65 20 24 66 0a 20  imer..close $f. 
31e0: 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24     }.    close $
31f0: 66 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65  f.    set f [ope
3200: 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c  n "|[list $::tcl
3210: 74 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73 63  test::tcltest sc
3220: 72 69 70 74 5d 22 20 72 5d 0a 20 20 20 20 67 65  ript]" r].    ge
3230: 74 73 20 24 66 20 78 0a 20 20 20 20 69 66 20 7b  ts $f x.    if {
3240: 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63  [catch {tls::soc
3250: 6b 65 74 20 2d 63 65 72 74 66 69 6c 65 20 24 63  ket -certfile $c
3260: 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c  lientCert -cafil
3270: 65 20 24 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65  e $caCert \..-ke
3280: 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79  yfile $clientKey
3290: 20 5b 69 6e 66 6f 20 68 6f 73 74 6e 61 6d 65 5d   [info hostname]
32a0: 20 38 38 33 31 7d 20 73 6f 63 6b 5d 7d 20 7b 0a   8831} sock]} {.
32b0: 20 20 20 20 20 20 20 20 73 65 74 20 78 20 24 73          set x $s
32c0: 6f 63 6b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ock.    } else {
32d0: 0a 20 20 20 20 20 20 20 20 70 75 74 73 20 24 73  .        puts $s
32e0: 6f 63 6b 20 68 65 6c 6c 6f 0a 09 66 6c 75 73 68  ock hello..flush
32f0: 20 24 73 6f 63 6b 0a 20 20 20 20 20 20 20 20 6c   $sock.        l
3300: 61 70 70 65 6e 64 20 78 20 5b 67 65 74 73 20 24  append x [gets $
3310: 66 5d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  f].        close
3320: 20 24 73 6f 63 6b 0a 20 20 20 20 7d 0a 20 20 20   $sock.    }.   
3330: 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65   close $f.    se
3340: 74 20 78 0a 7d 20 7b 72 65 61 64 79 20 68 65 6c  t x.} {ready hel
3350: 6c 6f 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d  lo}..test tlsIO-
3360: 32 2e 35 20 7b 74 63 70 20 63 6f 6e 6e 65 63 74  2.5 {tcp connect
3370: 69 6f 6e 20 77 69 74 68 20 72 65 64 75 6e 64 61  ion with redunda
3380: 6e 74 20 73 65 72 76 65 72 20 70 6f 72 74 7d 20  nt server port} 
3390: 7b 73 6f 63 6b 65 74 20 73 74 64 69 6f 7d 20 7b  {socket stdio} {
33a0: 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20  .    removeFile 
33b0: 73 63 72 69 70 74 0a 20 20 20 20 73 65 74 20 66  script.    set f
33c0: 20 5b 6f 70 65 6e 20 73 63 72 69 70 74 20 77 5d   [open script w]
33d0: 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09  .    puts $f {..
33e0: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
33f0: 74 6c 73 0a 09 73 65 74 20 74 69 6d 65 72 20 5b  tls..set timer [
3400: 61 66 74 65 72 20 32 30 30 30 20 22 73 65 74 20  after 2000 "set 
3410: 78 20 64 6f 6e 65 22 5d 0a 20 20 20 20 7d 0a 20  x done"].    }. 
3420: 20 20 20 70 75 74 73 20 24 66 20 22 73 65 74 20     puts $f "set 
3430: 66 20 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  f \[tls::socket 
3440: 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20 2d  -server accept -
3450: 63 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72  certfile $server
3460: 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61  Cert -cafile $ca
3470: 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73  Cert -keyfile $s
3480: 65 72 76 65 72 4b 65 79 20 38 38 33 32 20 5c 5d  erverKey 8832 \]
3490: 22 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a  ".    puts $f {.
34a0: 09 70 72 6f 63 20 61 63 63 65 70 74 20 7b 66 69  .proc accept {fi
34b0: 6c 65 20 61 64 64 72 20 70 6f 72 74 7d 20 7b 0a  le addr port} {.
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 67 6c 6f 62              glob
34d0: 61 6c 20 78 0a 20 20 20 20 20 20 20 20 20 20 20  al x.           
34e0: 20 70 75 74 73 20 22 5b 67 65 74 73 20 24 66 69   puts "[gets $fi
34f0: 6c 65 5d 22 0a 20 20 20 20 20 20 20 20 20 20 20  le]".           
3500: 20 63 6c 6f 73 65 20 24 66 69 6c 65 0a 20 20 20   close $file.   
3510: 20 20 20 20 20 20 20 20 20 73 65 74 20 78 20 64           set x d
3520: 6f 6e 65 0a 09 7d 0a 09 70 75 74 73 20 72 65 61  one..}..puts rea
3530: 64 79 0a 09 76 77 61 69 74 20 78 0a 09 61 66 74  dy..vwait x..aft
3540: 65 72 20 63 61 6e 63 65 6c 20 24 74 69 6d 65 72  er cancel $timer
3550: 0a 09 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 7d  ..close $f.    }
3560: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20  .    close $f.  
3570: 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 22 7c    set f [open "|
3580: 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74 65 73 74  [list $::tcltest
3590: 3a 3a 74 63 6c 74 65 73 74 20 73 63 72 69 70 74  ::tcltest script
35a0: 5d 22 20 72 5d 0a 20 20 20 20 67 65 74 73 20 24  ]" r].    gets $
35b0: 66 20 78 0a 20 20 20 20 69 66 20 7b 5b 63 61 74  f x.    if {[cat
35c0: 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  ch {tls::socket 
35d0: 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e  -certfile $clien
35e0: 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63  tCert -cafile $c
35f0: 61 43 65 72 74 20 5c 0a 09 2d 6b 65 79 66 69 6c  aCert \..-keyfil
3600: 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 31 32 37  e $clientKey 127
3610: 2e 30 2e 30 2e 31 20 38 38 33 32 7d 20 73 6f 63  .0.0.1 8832} soc
3620: 6b 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  k]} {.        se
3630: 74 20 78 20 24 73 6f 63 6b 0a 20 20 20 20 7d 20  t x $sock.    } 
3640: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 70  else {.        p
3650: 75 74 73 20 24 73 6f 63 6b 20 68 65 6c 6c 6f 0a  uts $sock hello.
3660: 09 66 6c 75 73 68 20 24 73 6f 63 6b 0a 20 20 20  .flush $sock.   
3670: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 78 20 5b       lappend x [
3680: 67 65 74 73 20 24 66 5d 0a 20 20 20 20 20 20 20  gets $f].       
3690: 20 63 6c 6f 73 65 20 24 73 6f 63 6b 0a 20 20 20   close $sock.   
36a0: 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a   }.    close $f.
36b0: 20 20 20 20 73 65 74 20 78 0a 7d 20 7b 72 65 61      set x.} {rea
36c0: 64 79 20 68 65 6c 6c 6f 7d 0a 74 65 73 74 20 74  dy hello}.test t
36d0: 6c 73 49 4f 2d 32 2e 36 20 7b 74 63 70 20 63 6f  lsIO-2.6 {tcp co
36e0: 6e 6e 65 63 74 69 6f 6e 7d 20 7b 73 6f 63 6b 65  nnection} {socke
36f0: 74 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 74 61  t} {.    set sta
3700: 74 75 73 20 6f 6b 0a 20 20 20 20 69 66 20 7b 21  tus ok.    if {!
3710: 5b 63 61 74 63 68 20 7b 73 65 74 20 73 6f 63 6b  [catch {set sock
3720: 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 31 32   [tls::socket 12
3730: 37 2e 30 2e 30 2e 31 20 38 38 33 33 5d 7d 5d 7d  7.0.0.1 8833]}]}
3740: 20 7b 0a 09 69 66 20 7b 21 5b 63 61 74 63 68 20   {..if {![catch 
3750: 7b 67 65 74 73 20 24 73 6f 63 6b 7d 5d 7d 20 7b  {gets $sock}]} {
3760: 0a 09 20 20 20 20 73 65 74 20 73 74 61 74 75 73  ..    set status
3770: 20 62 72 6f 6b 65 6e 0a 09 7d 0a 09 63 6c 6f 73   broken..}..clos
3780: 65 20 24 73 6f 63 6b 0a 20 20 20 20 7d 0a 20 20  e $sock.    }.  
3790: 20 20 73 65 74 20 73 74 61 74 75 73 0a 7d 20 6f    set status.} o
37a0: 6b 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 32 2e  k..test tlsIO-2.
37b0: 37 20 7b 65 63 68 6f 20 73 65 72 76 65 72 2c 20  7 {echo server, 
37c0: 6f 6e 65 20 6c 69 6e 65 7d 20 7b 73 6f 63 6b 65  one line} {socke
37d0: 74 20 73 74 64 69 6f 7d 20 7b 0a 20 20 20 20 72  t stdio} {.    r
37e0: 65 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74  emoveFile script
37f0: 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e  .    set f [open
3800: 20 73 63 72 69 70 74 20 77 5d 0a 20 20 20 20 70   script w].    p
3810: 75 74 73 20 24 66 20 7b 0a 09 70 61 63 6b 61 67  uts $f {..packag
3820: 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a 09 73  e require tls..s
3830: 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72 20  et timer [after 
3840: 32 30 30 30 20 22 73 65 74 20 78 20 64 6f 6e 65  2000 "set x done
3850: 22 5d 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  "].    }.    put
3860: 73 20 24 66 20 22 73 65 74 20 66 20 5c 5b 74 6c  s $f "set f \[tl
3870: 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65  s::socket -serve
3880: 72 20 61 63 63 65 70 74 20 2d 63 65 72 74 66 69  r accept -certfi
3890: 6c 65 20 24 73 65 72 76 65 72 43 65 72 74 20 2d  le $serverCert -
38a0: 63 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d  cafile $caCert -
38b0: 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b  keyfile $serverK
38c0: 65 79 20 38 38 33 34 20 5c 5d 22 0a 20 20 20 20  ey 8834 \]".    
38d0: 70 75 74 73 20 24 66 20 7b 0a 09 70 72 6f 63 20  puts $f {..proc 
38e0: 61 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b  accept {s a p} {
38f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
3900: 65 65 76 65 6e 74 20 24 73 20 72 65 61 64 61 62  eevent $s readab
3910: 6c 65 20 5b 6c 69 73 74 20 65 63 68 6f 20 24 73  le [list echo $s
3920: 5d 0a 09 20 20 20 20 66 63 6f 6e 66 69 67 75 72  ]..    fconfigur
3930: 65 20 24 73 20 2d 74 72 61 6e 73 6c 61 74 69 6f  e $s -translatio
3940: 6e 20 6c 66 20 2d 62 75 66 66 65 72 69 6e 67 20  n lf -buffering 
3950: 6c 69 6e 65 0a 20 20 20 20 20 20 20 20 7d 0a 09  line.        }..
3960: 70 72 6f 63 20 65 63 68 6f 20 7b 73 7d 20 7b 0a  proc echo {s} {.
3970: 09 20 20 20 20 20 73 65 74 20 6c 20 5b 67 65 74  .     set l [get
3980: 73 20 24 73 5d 0a 20 20 20 20 20 20 20 20 20 20  s $s].          
3990: 20 20 20 69 66 20 7b 5b 65 6f 66 20 24 73 5d 7d     if {[eof $s]}
39a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
39b0: 20 20 20 20 67 6c 6f 62 61 6c 20 78 0a 20 20 20      global x.   
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
39d0: 6f 73 65 20 24 73 0a 20 20 20 20 20 20 20 20 20  ose $s.         
39e0: 20 20 20 20 20 20 20 20 73 65 74 20 78 20 64 6f          set x do
39f0: 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ne.             
3a00: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
3a10: 20 20 20 20 20 20 20 20 20 20 70 75 74 73 20 24            puts $
3a20: 73 20 24 6c 0a 20 20 20 20 20 20 20 20 20 20 20  s $l.           
3a30: 20 20 7d 0a 09 7d 0a 09 70 75 74 73 20 72 65 61    }..}..puts rea
3a40: 64 79 0a 09 76 77 61 69 74 20 78 0a 09 61 66 74  dy..vwait x..aft
3a50: 65 72 20 63 61 6e 63 65 6c 20 24 74 69 6d 65 72  er cancel $timer
3a60: 0a 09 63 6c 6f 73 65 20 24 66 0a 09 70 75 74 73  ..close $f..puts
3a70: 20 64 6f 6e 65 0a 20 20 20 20 7d 0a 20 20 20 20   done.    }.    
3a80: 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65 74  close $f.    set
3a90: 20 66 20 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74   f [open "|[list
3aa0: 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c   $::tcltest::tcl
3ab0: 74 65 73 74 20 73 63 72 69 70 74 5d 22 20 72 5d  test script]" r]
3ac0: 0a 20 20 20 20 67 65 74 73 20 24 66 0a 20 20 20  .    gets $f.   
3ad0: 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63   set s [tls::soc
3ae0: 6b 65 74 20 2d 63 65 72 74 66 69 6c 65 20 24 63  ket -certfile $c
3af0: 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c  lientCert -cafil
3b00: 65 20 24 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65  e $caCert \..-ke
3b10: 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79  yfile $clientKey
3b20: 20 31 32 37 2e 30 2e 30 2e 31 20 38 38 33 34 5d   127.0.0.1 8834]
3b30: 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20  .    fconfigure 
3b40: 24 73 20 2d 62 75 66 66 65 72 69 6e 67 20 6c 69  $s -buffering li
3b50: 6e 65 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ne -translation 
3b60: 6c 66 0a 20 20 20 20 70 75 74 73 20 24 73 20 22  lf.    puts $s "
3b70: 68 65 6c 6c 6f 20 61 62 63 64 65 66 67 68 69 6a  hello abcdefghij
3b80: 6b 6c 6d 6e 6f 70 22 0a 20 20 20 20 61 66 74 65  klmnop".    afte
3b90: 72 20 31 30 30 30 0a 20 20 20 20 73 65 74 20 78  r 1000.    set x
3ba0: 20 5b 67 65 74 73 20 24 73 5d 0a 20 20 20 20 63   [gets $s].    c
3bb0: 6c 6f 73 65 20 24 73 0a 20 20 20 20 73 65 74 20  lose $s.    set 
3bc0: 79 20 5b 67 65 74 73 20 24 66 5d 0a 20 20 20 20  y [gets $f].    
3bd0: 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 6c 69 73  close $f.    lis
3be0: 74 20 24 78 20 24 79 0a 7d 20 7b 7b 68 65 6c 6c  t $x $y.} {{hell
3bf0: 6f 20 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  o abcdefghijklmn
3c00: 6f 70 7d 20 64 6f 6e 65 7d 0a 0a 74 65 73 74 20  op} done}..test 
3c10: 74 6c 73 49 4f 2d 32 2e 38 20 7b 65 63 68 6f 20  tlsIO-2.8 {echo 
3c20: 73 65 72 76 65 72 2c 20 6c 6f 6f 70 20 35 30 20  server, loop 50 
3c30: 74 69 6d 65 73 2c 20 73 69 6e 67 6c 65 20 63 6f  times, single co
3c40: 6e 6e 65 63 74 69 6f 6e 7d 20 7b 73 6f 63 6b 65  nnection} {socke
3c50: 74 20 73 74 64 69 6f 7d 20 7b 0a 20 20 20 20 73  t stdio} {.    s
3c60: 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70  et f [open scrip
3c70: 74 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24 66  t w].    puts $f
3c80: 20 7b 0a 20 20 20 20 09 70 61 63 6b 61 67 65 20   {.    .package 
3c90: 72 65 71 75 69 72 65 20 74 6c 73 0a 20 20 20 20  require tls.    
3ca0: 7d 0a 20 20 20 20 70 75 74 73 20 24 66 20 22 73  }.    puts $f "s
3cb0: 65 74 20 66 20 5c 5b 74 6c 73 3a 3a 73 6f 63 6b  et f \[tls::sock
3cc0: 65 74 20 2d 73 65 72 76 65 72 20 61 63 63 65 70  et -server accep
3cd0: 74 20 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72  t -certfile $ser
3ce0: 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65 20  verCert -cafile 
3cf0: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
3d00: 20 24 73 65 72 76 65 72 4b 65 79 20 38 38 33 35   $serverKey 8835
3d10: 20 5c 5d 22 0a 20 20 20 20 70 75 74 73 20 24 66   \]".    puts $f
3d20: 20 7b 0a 09 70 72 6f 63 20 61 63 63 65 70 74 20   {..proc accept 
3d30: 7b 73 20 61 20 70 7d 20 7b 0a 20 20 20 20 20 20  {s a p} {.      
3d40: 20 20 20 20 20 20 66 69 6c 65 65 76 65 6e 74 20        fileevent 
3d50: 24 73 20 72 65 61 64 61 62 6c 65 20 5b 6c 69 73  $s readable [lis
3d60: 74 20 65 63 68 6f 20 24 73 5d 0a 20 20 20 20 20  t echo $s].     
3d70: 20 20 20 20 20 20 20 66 63 6f 6e 66 69 67 75 72         fconfigur
3d80: 65 20 24 73 20 2d 62 75 66 66 65 72 69 6e 67 20  e $s -buffering 
3d90: 6c 69 6e 65 0a 20 20 20 20 20 20 20 20 7d 0a 09  line.        }..
3da0: 70 72 6f 63 20 65 63 68 6f 20 7b 73 7d 20 7b 0a  proc echo {s} {.
3db0: 09 20 20 20 20 20 67 6c 6f 62 61 6c 20 69 0a 20  .     global i. 
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
3dd0: 6c 20 5b 67 65 74 73 20 24 73 5d 0a 20 20 20 20  l [gets $s].    
3de0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 65 6f           if {[eo
3df0: 66 20 24 73 5d 7d 20 7b 0a 20 20 20 20 20 20 20  f $s]} {.       
3e00: 20 20 20 20 20 20 20 20 20 20 67 6c 6f 62 61 6c            global
3e10: 20 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   x.             
3e20: 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20      close $s.   
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
3e40: 74 20 78 20 64 6f 6e 65 0a 20 20 20 20 20 20 20  t x done.       
3e50: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 0a        } else { .
3e60: 09 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 69  .         incr i
3e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3e80: 20 20 70 75 74 73 20 24 73 20 24 6c 0a 20 20 20    puts $s $l.   
3e90: 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 09            }..}..
3ea0: 73 65 74 20 69 20 30 0a 09 70 75 74 73 20 72 65  set i 0..puts re
3eb0: 61 64 79 0a 09 73 65 74 20 74 69 6d 65 72 20 5b  ady..set timer [
3ec0: 61 66 74 65 72 20 32 30 30 30 30 20 22 73 65 74  after 20000 "set
3ed0: 20 78 20 64 6f 6e 65 22 5d 0a 09 76 77 61 69 74   x done"]..vwait
3ee0: 20 78 0a 09 61 66 74 65 72 20 63 61 6e 63 65 6c   x..after cancel
3ef0: 20 24 74 69 6d 65 72 0a 09 63 6c 6f 73 65 20 24   $timer..close $
3f00: 66 0a 09 70 75 74 73 20 22 64 6f 6e 65 20 24 69  f..puts "done $i
3f10: 22 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73  ".    }.    clos
3f20: 65 20 24 66 0a 20 20 20 20 73 65 74 20 66 20 5b  e $f.    set f [
3f30: 6f 70 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a  open "|[list $::
3f40: 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73 74  tcltest::tcltest
3f50: 20 73 63 72 69 70 74 5d 22 20 72 5d 0a 20 20 20   script]" r].   
3f60: 20 67 65 74 73 20 24 66 0a 20 20 20 20 73 65 74   gets $f.    set
3f70: 20 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20   s [tls::socket 
3f80: 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e  -certfile $clien
3f90: 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63  tCert -cafile $c
3fa0: 61 43 65 72 74 20 5c 0a 09 2d 6b 65 79 66 69 6c  aCert \..-keyfil
3fb0: 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 31 32 37  e $clientKey 127
3fc0: 2e 30 2e 30 2e 31 20 38 38 33 35 5d 0a 20 20 20  .0.0.1 8835].   
3fd0: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d   fconfigure $s -
3fe0: 62 75 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 20  buffering line. 
3ff0: 20 20 20 63 61 74 63 68 20 7b 0a 09 66 6f 72 20     catch {..for 
4000: 7b 73 65 74 20 78 20 30 7d 20 7b 24 78 20 3c 20  {set x 0} {$x < 
4010: 35 30 7d 20 7b 69 6e 63 72 20 78 7d 20 7b 0a 09  50} {incr x} {..
4020: 20 20 20 20 70 75 74 73 20 24 73 20 22 68 65 6c      puts $s "hel
4030: 6c 6f 20 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  lo abcdefghijklm
4040: 6e 6f 70 22 0a 09 20 20 20 20 67 65 74 73 20 24  nop"..    gets $
4050: 73 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63  s..}.    }.    c
4060: 6c 6f 73 65 20 24 73 0a 20 20 20 20 63 61 74 63  lose $s.    catc
4070: 68 20 7b 73 65 74 20 78 20 5b 67 65 74 73 20 24  h {set x [gets $
4080: 66 5d 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  f]}.    close $f
4090: 0a 20 20 20 20 73 65 74 20 78 0a 7d 20 7b 64 6f  .    set x.} {do
40a0: 6e 65 20 35 30 7d 0a 0a 74 65 73 74 20 74 6c 73  ne 50}..test tls
40b0: 49 4f 2d 32 2e 39 20 7b 73 6f 63 6b 65 74 20 63  IO-2.9 {socket c
40c0: 6f 6e 66 6c 69 63 74 7d 20 7b 73 6f 63 6b 65 74  onflict} {socket
40d0: 20 73 74 64 69 6f 7d 20 7b 0a 20 20 20 20 73 65   stdio} {.    se
40e0: 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74  t s [tls::socket
40f0: 20 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20   -server accept 
4100: 38 38 32 38 5d 0a 20 20 20 20 72 65 6d 6f 76 65  8828].    remove
4110: 46 69 6c 65 20 73 63 72 69 70 74 0a 20 20 20 20  File script.    
4120: 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69  set f [open scri
4130: 70 74 20 77 5d 0a 20 20 20 20 70 75 74 73 20 2d  pt w].    puts -
4140: 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 20 7b 70 61  nonewline $f {pa
4150: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 74 6c  ckage require tl
4160: 73 3b 20 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d  s; tls::socket -
4170: 73 65 72 76 65 72 20 61 63 63 65 70 74 20 38 38  server accept 88
4180: 32 38 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  28}.    close $f
4190: 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e  .    set f [open
41a0: 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74   "|[list $::tclt
41b0: 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73 63 72  est::tcltest scr
41c0: 69 70 74 5d 22 20 72 5d 0a 20 20 20 20 67 65 74  ipt]" r].    get
41d0: 73 20 24 66 0a 20 20 20 20 61 66 74 65 72 20 31  s $f.    after 1
41e0: 30 30 0a 20 20 20 20 73 65 74 20 78 20 5b 6c 69  00.    set x [li
41f0: 73 74 20 5b 63 61 74 63 68 20 7b 63 6c 6f 73 65  st [catch {close
4200: 20 24 66 7d 20 6d 73 67 5d 20 24 6d 73 67 5d 0a   $f} msg] $msg].
4210: 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20      close $s.   
4220: 20 73 65 74 20 78 0a 7d 20 7b 31 20 7b 63 6f 75   set x.} {1 {cou
4230: 6c 64 6e 27 74 20 6f 70 65 6e 20 73 6f 63 6b 65  ldn't open socke
4240: 74 3a 20 61 64 64 72 65 73 73 20 61 6c 72 65 61  t: address alrea
4250: 64 79 20 69 6e 20 75 73 65 0a 20 20 20 20 77 68  dy in use.    wh
4260: 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 22 3a  ile executing.":
4270: 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20  :socket -server 
4280: 7b 74 6c 73 3a 3a 5f 61 63 63 65 70 74 20 7b 2d  {tls::_accept {-
4290: 73 65 72 76 65 72 20 31 7d 20 61 63 63 65 70 74  server 1} accept
42a0: 7d 20 38 38 32 38 22 0a 20 20 20 20 28 22 65 76  } 8828".    ("ev
42b0: 61 6c 22 20 62 6f 64 79 20 6c 69 6e 65 20 31 29  al" body line 1)
42c0: 0a 20 20 20 20 69 6e 76 6f 6b 65 64 20 66 72 6f  .    invoked fro
42d0: 6d 20 77 69 74 68 69 6e 0a 22 65 76 61 6c 20 3a  m within."eval :
42e0: 3a 73 6f 63 6b 65 74 20 24 73 6f 70 74 73 22 0a  :socket $sopts".
42f0: 20 20 20 20 28 70 72 6f 63 65 64 75 72 65 20 22      (procedure "
4300: 74 6c 73 3a 3a 73 6f 63 6b 65 74 22 20 6c 69 6e  tls::socket" lin
4310: 65 20 36 32 29 0a 20 20 20 20 69 6e 76 6f 6b 65  e 62).    invoke
4320: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 22 74  d from within."t
4330: 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76  ls::socket -serv
4340: 65 72 20 61 63 63 65 70 74 20 38 38 32 38 22 0a  er accept 8828".
4350: 20 20 20 20 28 66 69 6c 65 20 22 73 63 72 69 70      (file "scrip
4360: 74 22 20 6c 69 6e 65 20 31 29 7d 7d 0a 0a 74 65  t" line 1)}}..te
4370: 73 74 20 74 6c 73 49 4f 2d 32 2e 31 30 20 7b 63  st tlsIO-2.10 {c
4380: 6c 6f 73 65 20 6f 6e 20 61 63 63 65 70 74 2c 20  lose on accept, 
4390: 61 63 63 65 70 74 65 64 20 73 6f 63 6b 65 74 20  accepted socket 
43a0: 6c 69 76 65 73 7d 20 7b 73 6f 63 6b 65 74 20 6b  lives} {socket k
43b0: 6e 6f 77 6e 42 75 67 7d 20 7b 0a 20 20 20 20 73  nownBug} {.    s
43c0: 65 74 20 64 6f 6e 65 20 30 0a 20 20 20 20 73 65  et done 0.    se
43d0: 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72 20 32  t timer [after 2
43e0: 30 30 30 30 20 22 73 65 74 20 64 6f 6e 65 20 74  0000 "set done t
43f0: 69 6d 65 64 5f 6f 75 74 22 5d 0a 20 20 20 20 73  imed_out"].    s
4400: 65 74 20 73 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b  et ss [tls::sock
4410: 65 74 20 2d 73 65 72 76 65 72 20 61 63 63 65 70  et -server accep
4420: 74 20 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72  t -certfile $ser
4430: 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65 20  verCert -cafile 
4440: 24 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65 79 66  $caCert \..-keyf
4450: 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20 38  ile $serverKey 8
4460: 38 33 30 5d 0a 20 20 20 20 70 72 6f 63 20 61 63  830].    proc ac
4470: 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a 09  cept {s a p} {..
4480: 67 6c 6f 62 61 6c 20 73 73 0a 09 63 6c 6f 73 65  global ss..close
4490: 20 24 73 73 0a 09 66 69 6c 65 65 76 65 6e 74 20   $ss..fileevent 
44a0: 24 73 20 72 65 61 64 61 62 6c 65 20 22 72 65 61  $s readable "rea
44b0: 64 69 74 20 24 73 22 0a 09 66 63 6f 6e 66 69 67  dit $s"..fconfig
44c0: 75 72 65 20 24 73 20 2d 74 72 61 6e 73 20 6c 66  ure $s -trans lf
44d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 63 20  .    }.    proc 
44e0: 72 65 61 64 69 74 20 7b 73 7d 20 7b 0a 09 67 6c  readit {s} {..gl
44f0: 6f 62 61 6c 20 64 6f 6e 65 0a 09 67 65 74 73 20  obal done..gets 
4500: 24 73 0a 09 63 6c 6f 73 65 20 24 73 0a 09 73 65  $s..close $s..se
4510: 74 20 64 6f 6e 65 20 31 0a 20 20 20 20 7d 0a 20  t done 1.    }. 
4520: 20 20 20 73 65 74 20 63 73 20 5b 74 6c 73 3a 3a     set cs [tls::
4530: 73 6f 63 6b 65 74 20 2d 63 65 72 74 66 69 6c 65  socket -certfile
4540: 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61   $clientCert -ca
4550: 66 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a 09  file $caCert \..
4560: 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74  -keyfile $client
4570: 4b 65 79 20 5b 69 6e 66 6f 20 68 6f 73 74 6e 61  Key [info hostna
4580: 6d 65 5d 20 38 38 33 30 5d 0a 20 20 20 20 63 6c  me] 8830].    cl
4590: 6f 73 65 20 24 63 73 0a 0a 20 20 20 20 76 77 61  ose $cs..    vwa
45a0: 69 74 20 64 6f 6e 65 0a 20 20 20 20 61 66 74 65  it done.    afte
45b0: 72 20 63 61 6e 63 65 6c 20 24 74 69 6d 65 72 0a  r cancel $timer.
45c0: 20 20 20 20 73 65 74 20 64 6f 6e 65 0a 7d 20 31      set done.} 1
45d0: 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 32 2e 31  ..test tlsIO-2.1
45e0: 31 20 7b 64 65 74 65 63 74 69 6e 67 20 6e 65 77  1 {detecting new
45f0: 20 64 61 74 61 7d 20 7b 73 6f 63 6b 65 74 20 6b   data} {socket k
4600: 6e 6f 77 6e 42 75 67 7d 20 7b 0a 20 20 20 20 70  nownBug} {.    p
4610: 72 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61 20  roc accept {s a 
4620: 70 7d 20 7b 0a 09 67 6c 6f 62 61 6c 20 73 6f 63  p} {..global soc
4630: 6b 0a 09 73 65 74 20 73 6f 63 6b 20 24 73 0a 09  k..set sock $s..
4640: 73 65 74 20 66 20 5b 6f 70 65 6e 20 61 77 62 2e  set f [open awb.
4650: 6c 6f 67 20 77 5d 0a 09 70 75 74 73 20 24 66 20  log w]..puts $f 
4660: 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a 68 61 6e  [catch {tls::han
4670: 64 73 68 61 6b 65 20 24 73 6f 63 6b 7d 20 65 72  dshake $sock} er
4680: 72 5d 0a 09 70 75 74 73 20 24 66 20 22 65 72 72  r]..puts $f "err
4690: 3a 20 24 65 72 72 22 0a 09 70 75 74 73 20 24 66  : $err"..puts $f
46a0: 20 22 5b 74 6c 73 3a 3a 73 74 61 74 75 73 20 24   "[tls::status $
46b0: 73 6f 63 6b 5d 22 0a 09 63 6c 6f 73 65 20 24 73  sock]"..close $s
46c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20  .    }..    set 
46d0: 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d  s [tls::socket -
46e0: 72 65 71 75 69 72 65 20 30 20 2d 72 65 71 75 65  require 0 -reque
46f0: 73 74 20 30 20 2d 73 65 72 76 65 72 20 61 63 63  st 0 -server acc
4700: 65 70 74 20 2d 63 65 72 74 66 69 6c 65 20 24 73  ept -certfile $s
4710: 65 72 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c  erverCert -cafil
4720: 65 20 24 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65  e $caCert \..-ke
4730: 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79  yfile $serverKey
4740: 20 38 34 30 30 5d 0a 20 20 20 20 73 65 74 20 73   8400].    set s
4750: 6f 63 6b 20 22 22 0a 20 20 20 20 73 65 74 20 73  ock "".    set s
4760: 32 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d  2 [tls::socket -
4770: 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74  certfile $client
4780: 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61  Cert -cafile $ca
4790: 43 65 72 74 20 5c 0a 09 2d 6b 65 79 66 69 6c 65  Cert \..-keyfile
47a0: 20 24 63 6c 69 65 6e 74 4b 65 79 20 31 32 37 2e   $clientKey 127.
47b0: 30 2e 30 2e 31 20 38 34 30 30 5d 0a 20 20 20 20  0.0.1 8400].    
47c0: 76 77 61 69 74 20 73 6f 63 6b 0a 20 20 20 20 70  vwait sock.    p
47d0: 75 74 73 20 24 73 32 20 6f 6e 65 0a 20 20 20 20  uts $s2 one.    
47e0: 66 6c 75 73 68 20 24 73 32 0a 20 20 20 20 61 66  flush $s2.    af
47f0: 74 65 72 20 35 30 30 0a 20 20 20 20 66 63 6f 6e  ter 500.    fcon
4800: 66 69 67 75 72 65 20 24 73 6f 63 6b 20 2d 62 6c  figure $sock -bl
4810: 6f 63 6b 69 6e 67 20 30 0a 20 20 20 20 73 65 74  ocking 0.    set
4820: 20 72 65 73 75 6c 74 20 5b 67 65 74 73 20 24 73   result [gets $s
4830: 6f 63 6b 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64  ock].    lappend
4840: 20 72 65 73 75 6c 74 20 5b 67 65 74 73 20 24 73   result [gets $s
4850: 6f 63 6b 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67  ock].    fconfig
4860: 75 72 65 20 24 73 6f 63 6b 20 2d 62 6c 6f 63 6b  ure $sock -block
4870: 69 6e 67 20 31 0a 20 20 20 20 70 75 74 73 20 24  ing 1.    puts $
4880: 73 32 20 74 77 6f 0a 20 20 20 20 66 6c 75 73 68  s2 two.    flush
4890: 20 24 73 32 0a 20 20 20 20 66 63 6f 6e 66 69 67   $s2.    fconfig
48a0: 75 72 65 20 24 73 6f 63 6b 20 2d 62 6c 6f 63 6b  ure $sock -block
48b0: 69 6e 67 20 30 0a 20 20 20 20 6c 61 70 70 65 6e  ing 0.    lappen
48c0: 64 20 72 65 73 75 6c 74 20 5b 67 65 74 73 20 24  d result [gets $
48d0: 73 6f 63 6b 5d 0a 20 20 20 20 66 63 6f 6e 66 69  sock].    fconfi
48e0: 67 75 72 65 20 24 73 6f 63 6b 20 2d 62 6c 6f 63  gure $sock -bloc
48f0: 6b 69 6e 67 20 31 0a 20 20 20 20 63 6c 6f 73 65  king 1.    close
4900: 20 24 73 32 0a 20 20 20 20 63 6c 6f 73 65 20 24   $s2.    close $
4910: 73 0a 20 20 20 20 63 6c 6f 73 65 20 24 73 6f 63  s.    close $soc
4920: 6b 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  k.    set result
4930: 0a 7d 20 7b 6f 6e 65 20 7b 7d 20 74 77 6f 7d 0a  .} {one {} two}.
4940: 0a 74 65 73 74 20 74 6c 73 49 4f 2d 32 2e 31 32  .test tlsIO-2.12
4950: 20 7b 74 63 70 20 63 6f 6e 6e 65 63 74 69 6f 6e   {tcp connection
4960: 3b 20 6e 6f 20 63 65 72 74 69 66 69 63 61 74 65  ; no certificate
4970: 73 20 73 70 65 63 69 66 69 65 64 7d 20 7b 73 6f  s specified} {so
4980: 63 6b 65 74 20 73 74 64 69 6f 20 70 63 43 72 61  cket stdio pcCra
4990: 73 68 7d 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65  sh} {.    remove
49a0: 46 69 6c 65 20 73 63 72 69 70 74 0a 20 20 20 20  File script.    
49b0: 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69  set f [open scri
49c0: 70 74 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24  pt w].    puts $
49d0: 66 20 7b 0a 20 20 20 20 09 70 61 63 6b 61 67 65  f {.    .package
49e0: 20 72 65 71 75 69 72 65 20 74 6c 73 0a 09 73 65   require tls..se
49f0: 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72 20 32  t timer [after 2
4a00: 30 30 30 20 22 73 65 74 20 78 20 74 69 6d 65 64  000 "set x timed
4a10: 5f 6f 75 74 22 5d 0a 09 73 65 74 20 66 20 5b 74  _out"]..set f [t
4a20: 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76  ls::socket -serv
4a30: 65 72 20 61 63 63 65 70 74 20 38 38 32 38 5d 0a  er accept 8828].
4a40: 09 70 72 6f 63 20 61 63 63 65 70 74 20 7b 66 69  .proc accept {fi
4a50: 6c 65 20 61 64 64 72 20 70 6f 72 74 7d 20 7b 0a  le addr port} {.
4a60: 09 20 20 20 20 67 6c 6f 62 61 6c 20 78 0a 09 20  .    global x.. 
4a70: 20 20 20 73 65 74 20 78 20 64 6f 6e 65 0a 20 20     set x done.  
4a80: 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20            close 
4a90: 24 66 69 6c 65 0a 09 7d 0a 09 70 75 74 73 20 72  $file..}..puts r
4aa0: 65 61 64 79 0a 09 76 77 61 69 74 20 78 0a 09 61  eady..vwait x..a
4ab0: 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74 69 6d  fter cancel $tim
4ac0: 65 72 0a 09 63 6c 6f 73 65 20 24 66 0a 09 70 75  er..close $f..pu
4ad0: 74 73 20 24 78 0a 20 20 20 20 7d 0a 20 20 20 20  ts $x.    }.    
4ae0: 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65 74  close $f.    set
4af0: 20 66 20 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74   f [open "|[list
4b00: 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c   $::tcltest::tcl
4b10: 74 65 73 74 20 73 63 72 69 70 74 5d 22 20 72 5d  test script]" r]
4b20: 0a 20 20 20 20 67 65 74 73 20 24 66 20 78 0a 20  .    gets $f x. 
4b30: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 74     if {[catch {t
4b40: 6c 73 3a 3a 73 6f 63 6b 65 74 20 31 32 37 2e 30  ls::socket 127.0
4b50: 2e 30 2e 31 20 38 38 32 38 7d 20 6d 73 67 5d 7d  .0.1 8828} msg]}
4b60: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 78   {.        set x
4b70: 20 24 6d 73 67 0a 20 20 20 20 7d 20 65 6c 73 65   $msg.    } else
4b80: 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65   {.        lappe
4b90: 6e 64 20 78 20 5b 67 65 74 73 20 24 66 5d 0a 20  nd x [gets $f]. 
4ba0: 20 20 20 20 20 20 20 63 6c 6f 73 65 20 24 6d 73         close $ms
4bb0: 67 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61 70 70  g.    }.    lapp
4bc0: 65 6e 64 20 78 20 5b 67 65 74 73 20 24 66 5d 0a  end x [gets $f].
4bd0: 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 20      close $f.   
4be0: 20 73 65 74 20 78 0a 7d 20 7b 72 65 61 64 79 20   set x.} {ready 
4bf0: 64 6f 6e 65 20 7b 7d 7d 0a 0a 74 65 73 74 20 74  done {}}..test t
4c00: 6c 73 49 4f 2d 33 2e 31 20 7b 73 6f 63 6b 65 74  lsIO-3.1 {socket
4c10: 20 63 6f 6e 66 6c 69 63 74 7d 20 7b 73 6f 63 6b   conflict} {sock
4c20: 65 74 20 73 74 64 69 6f 7d 20 7b 0a 20 20 20 20  et stdio} {.    
4c30: 72 65 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70  removeFile scrip
4c40: 74 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65  t.    set f [ope
4c50: 6e 20 73 63 72 69 70 74 20 77 5d 0a 20 20 20 20  n script w].    
4c60: 70 75 74 73 20 24 66 20 7b 0a 20 20 20 20 09 70  puts $f {.    .p
4c70: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 74  ackage require t
4c80: 6c 73 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ls.    }.    put
4c90: 73 20 24 66 20 22 73 65 74 20 66 20 5c 5b 74 6c  s $f "set f \[tl
4ca0: 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65  s::socket -serve
4cb0: 72 20 61 63 63 65 70 74 20 2d 63 65 72 74 66 69  r accept -certfi
4cc0: 6c 65 20 24 73 65 72 76 65 72 43 65 72 74 20 2d  le $serverCert -
4cd0: 63 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d  cafile $caCert -
4ce0: 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b  keyfile $serverK
4cf0: 65 79 20 38 38 32 38 20 5c 5d 22 0a 20 20 20 20  ey 8828 \]".    
4d00: 70 75 74 73 20 24 66 20 7b 0a 09 70 75 74 73 20  puts $f {..puts 
4d10: 72 65 61 64 79 0a 09 67 65 74 73 20 73 74 64 69  ready..gets stdi
4d20: 6e 0a 09 63 6c 6f 73 65 20 24 66 0a 20 20 20 20  n..close $f.    
4d30: 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20  }.    close $f. 
4d40: 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 22     set f [open "
4d50: 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74 65 73  |[list $::tcltes
4d60: 74 3a 3a 74 63 6c 74 65 73 74 20 73 63 72 69 70  t::tcltest scrip
4d70: 74 5d 22 20 72 2b 5d 0a 20 20 20 20 67 65 74 73  t]" r+].    gets
4d80: 20 24 66 0a 20 20 20 20 73 65 74 20 78 20 5b 6c   $f.    set x [l
4d90: 69 73 74 20 5b 63 61 74 63 68 20 7b 74 6c 73 3a  ist [catch {tls:
4da0: 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d  :socket \..    -
4db0: 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74  certfile $client
4dc0: 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61  Cert -cafile $ca
4dd0: 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63  Cert -keyfile $c
4de0: 6c 69 65 6e 74 4b 65 79 20 5c 0a 20 20 20 20 09  lientKey \.    .
4df0: 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20 38  -server accept 8
4e00: 38 32 38 7d 20 6d 73 67 5d 20 5c 0a 09 09 24 6d  828} msg] \...$m
4e10: 73 67 5d 0a 20 20 20 20 70 75 74 73 20 24 66 20  sg].    puts $f 
4e20: 62 79 65 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  bye.    close $f
4e30: 0a 20 20 20 20 73 65 74 20 78 0a 7d 20 7b 31 20  .    set x.} {1 
4e40: 7b 63 6f 75 6c 64 6e 27 74 20 6f 70 65 6e 20 73  {couldn't open s
4e50: 6f 63 6b 65 74 3a 20 61 64 64 72 65 73 73 20 61  ocket: address a
4e60: 6c 72 65 61 64 79 20 69 6e 20 75 73 65 7d 7d 0a  lready in use}}.
4e70: 0a 74 65 73 74 20 74 6c 73 49 4f 2d 33 2e 32 20  .test tlsIO-3.2 
4e80: 7b 73 65 72 76 65 72 20 77 69 74 68 20 73 65 76  {server with sev
4e90: 65 72 61 6c 20 63 6c 69 65 6e 74 73 7d 20 7b 73  eral clients} {s
4ea0: 6f 63 6b 65 74 20 73 74 64 69 6f 7d 20 7b 0a 20  ocket stdio} {. 
4eb0: 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20 73 63     removeFile sc
4ec0: 72 69 70 74 0a 20 20 20 20 73 65 74 20 66 20 5b  ript.    set f [
4ed0: 6f 70 65 6e 20 73 63 72 69 70 74 20 77 5d 0a 20  open script w]. 
4ee0: 20 20 20 70 75 74 73 20 24 66 20 7b 0a 20 20 20     puts $f {.   
4ef0: 20 09 70 61 63 6b 61 67 65 20 72 65 71 75 69 72   .package requir
4f00: 65 20 74 6c 73 0a 09 73 65 74 20 74 31 20 5b 61  e tls..set t1 [a
4f10: 66 74 65 72 20 33 30 30 30 30 20 22 73 65 74 20  fter 30000 "set 
4f20: 78 20 74 69 6d 65 64 5f 6f 75 74 22 5d 0a 09 73  x timed_out"]..s
4f30: 65 74 20 74 32 20 5b 61 66 74 65 72 20 33 31 30  et t2 [after 310
4f40: 30 30 20 22 73 65 74 20 78 20 74 69 6d 65 64 5f  00 "set x timed_
4f50: 6f 75 74 22 5d 0a 09 73 65 74 20 74 33 20 5b 61  out"]..set t3 [a
4f60: 66 74 65 72 20 33 32 30 30 30 20 22 73 65 74 20  fter 32000 "set 
4f70: 78 20 74 69 6d 65 64 5f 6f 75 74 22 5d 0a 09 73  x timed_out"]..s
4f80: 65 74 20 63 6f 75 6e 74 65 72 20 30 0a 20 20 20  et counter 0.   
4f90: 20 7d 0a 20 20 20 20 70 75 74 73 20 24 66 20 22   }.    puts $f "
4fa0: 73 65 74 20 73 20 5c 5b 74 6c 73 3a 3a 73 6f 63  set s \[tls::soc
4fb0: 6b 65 74 20 2d 73 65 72 76 65 72 20 61 63 63 65  ket -server acce
4fc0: 70 74 20 2d 63 65 72 74 66 69 6c 65 20 24 73 65  pt -certfile $se
4fd0: 72 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65  rverCert -cafile
4fe0: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
4ff0: 65 20 24 73 65 72 76 65 72 4b 65 79 20 38 38 32  e $serverKey 882
5000: 38 20 5c 5d 22 0a 20 20 20 20 70 75 74 73 20 24  8 \]".    puts $
5010: 66 20 7b 0a 09 70 72 6f 63 20 61 63 63 65 70 74  f {..proc accept
5020: 20 7b 73 20 61 20 70 7d 20 7b 0a 09 20 20 20 20   {s a p} {..    
5030: 66 69 6c 65 65 76 65 6e 74 20 24 73 20 72 65 61  fileevent $s rea
5040: 64 61 62 6c 65 20 5b 6c 69 73 74 20 65 63 68 6f  dable [list echo
5050: 20 24 73 5d 0a 09 20 20 20 20 66 63 6f 6e 66 69   $s]..    fconfi
5060: 67 75 72 65 20 24 73 20 2d 62 75 66 66 65 72 69  gure $s -bufferi
5070: 6e 67 20 6c 69 6e 65 0a 09 7d 0a 09 70 72 6f 63  ng line..}..proc
5080: 20 65 63 68 6f 20 7b 73 7d 20 7b 0a 09 20 20 20   echo {s} {..   
5090: 20 20 67 6c 6f 62 61 6c 20 78 0a 20 20 20 20 20    global x.     
50a0: 20 20 20 20 20 20 20 20 73 65 74 20 6c 20 5b 67          set l [g
50b0: 65 74 73 20 24 73 5d 0a 20 20 20 20 20 20 20 20  ets $s].        
50c0: 20 20 20 20 20 69 66 20 7b 5b 65 6f 66 20 24 73       if {[eof $s
50d0: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ]} {.           
50e0: 20 20 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 20        close $s. 
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5100: 73 65 74 20 78 20 64 6f 6e 65 0a 20 20 20 20 20  set x done.     
5110: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
5120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5130: 20 20 70 75 74 73 20 24 73 20 24 6c 0a 20 20 20    puts $s $l.   
5140: 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 09            }..}..
5150: 70 75 74 73 20 72 65 61 64 79 0a 09 76 77 61 69  puts ready..vwai
5160: 74 20 78 0a 09 61 66 74 65 72 20 63 61 6e 63 65  t x..after cance
5170: 6c 20 24 74 31 0a 09 76 77 61 69 74 20 78 0a 09  l $t1..vwait x..
5180: 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74 32  after cancel $t2
5190: 0a 09 76 77 61 69 74 20 78 0a 09 61 66 74 65 72  ..vwait x..after
51a0: 20 63 61 6e 63 65 6c 20 24 74 33 0a 09 63 6c 6f   cancel $t3..clo
51b0: 73 65 20 24 73 0a 09 70 75 74 73 20 24 78 0a 20  se $s..puts $x. 
51c0: 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24     }.    close $
51d0: 66 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65  f.    set f [ope
51e0: 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c  n "|[list $::tcl
51f0: 74 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73 63  test::tcltest sc
5200: 72 69 70 74 5d 22 20 72 2b 5d 0a 20 20 20 20 73  ript]" r+].    s
5210: 65 74 20 78 20 5b 67 65 74 73 20 24 66 5d 0a 20  et x [gets $f]. 
5220: 20 20 20 73 65 74 20 73 31 20 5b 74 6c 73 3a 3a     set s1 [tls::
5230: 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63  socket \..    -c
5240: 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43  ertfile $clientC
5250: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
5260: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c  ert -keyfile $cl
5270: 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 31  ientKey \..    1
5280: 32 37 2e 30 2e 30 2e 31 20 38 38 32 38 5d 0a 20  27.0.0.1 8828]. 
5290: 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 73     fconfigure $s
52a0: 31 20 2d 62 75 66 66 65 72 69 6e 67 20 6c 69 6e  1 -buffering lin
52b0: 65 0a 20 20 20 20 73 65 74 20 73 32 20 5b 74 6c  e.    set s2 [tl
52c0: 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20  s::socket \..   
52d0: 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65   -certfile $clie
52e0: 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24  ntCert -cafile $
52f0: 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20  caCert -keyfile 
5300: 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20  $clientKey \..  
5310: 20 20 31 32 37 2e 30 2e 30 2e 31 20 38 38 32 38    127.0.0.1 8828
5320: 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65  ].    fconfigure
5330: 20 24 73 32 20 2d 62 75 66 66 65 72 69 6e 67 20   $s2 -buffering 
5340: 6c 69 6e 65 0a 20 20 20 20 73 65 74 20 73 33 20  line.    set s3 
5350: 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09  [tls::socket \..
5360: 20 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63      -certfile $c
5370: 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c  lientCert -cafil
5380: 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69  e $caCert -keyfi
5390: 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a  le $clientKey \.
53a0: 09 20 20 20 20 31 32 37 2e 30 2e 30 2e 31 20 38  .    127.0.0.1 8
53b0: 38 32 38 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67  828].    fconfig
53c0: 75 72 65 20 24 73 33 20 2d 62 75 66 66 65 72 69  ure $s3 -bufferi
53d0: 6e 67 20 6c 69 6e 65 0a 20 20 20 20 66 6f 72 20  ng line.    for 
53e0: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
53f0: 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  100} {incr i} {.
5400: 09 70 75 74 73 20 24 73 31 20 68 65 6c 6c 6f 2c  .puts $s1 hello,
5410: 73 31 0a 09 67 65 74 73 20 24 73 31 0a 09 70 75  s1..gets $s1..pu
5420: 74 73 20 24 73 32 20 68 65 6c 6c 6f 2c 73 32 0a  ts $s2 hello,s2.
5430: 09 67 65 74 73 20 24 73 32 0a 09 70 75 74 73 20  .gets $s2..puts 
5440: 24 73 33 20 68 65 6c 6c 6f 2c 73 33 0a 09 67 65  $s3 hello,s3..ge
5450: 74 73 20 24 73 33 0a 20 20 20 20 7d 0a 20 20 20  ts $s3.    }.   
5460: 20 63 6c 6f 73 65 20 24 73 31 0a 20 20 20 20 63   close $s1.    c
5470: 6c 6f 73 65 20 24 73 32 0a 20 20 20 20 63 6c 6f  lose $s2.    clo
5480: 73 65 20 24 73 33 0a 20 20 20 20 6c 61 70 70 65  se $s3.    lappe
5490: 6e 64 20 78 20 5b 67 65 74 73 20 24 66 5d 0a 20  nd x [gets $f]. 
54a0: 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20     close $f.    
54b0: 73 65 74 20 78 0a 7d 20 7b 72 65 61 64 79 20 64  set x.} {ready d
54c0: 6f 6e 65 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f  one}..test tlsIO
54d0: 2d 34 2e 31 20 7b 73 65 72 76 65 72 20 77 69 74  -4.1 {server wit
54e0: 68 20 73 65 76 65 72 61 6c 20 63 6c 69 65 6e 74  h several client
54f0: 73 7d 20 7b 73 6f 63 6b 65 74 20 73 74 64 69 6f  s} {socket stdio
5500: 7d 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46 69  } {.    removeFi
5510: 6c 65 20 73 63 72 69 70 74 0a 20 20 20 20 73 65  le script.    se
5520: 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70 74  t f [open script
5530: 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24 66 20   w].    puts $f 
5540: 7b 0a 20 20 20 20 09 70 61 63 6b 61 67 65 20 72  {.    .package r
5550: 65 71 75 69 72 65 20 74 6c 73 0a 09 67 65 74 73  equire tls..gets
5560: 20 73 74 64 69 6e 0a 20 20 20 20 7d 0a 20 20 20   stdin.    }.   
5570: 20 70 75 74 73 20 24 66 20 22 73 65 74 20 73 20   puts $f "set s 
5580: 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 63  \[tls::socket -c
5590: 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43  ertfile $clientC
55a0: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
55b0: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c  ert -keyfile $cl
55c0: 69 65 6e 74 4b 65 79 20 31 32 37 2e 30 2e 30 2e  ientKey 127.0.0.
55d0: 31 20 38 38 32 38 20 5c 5d 22 0a 20 20 20 20 70  1 8828 \]".    p
55e0: 75 74 73 20 24 66 20 7b 0a 09 66 63 6f 6e 66 69  uts $f {..fconfi
55f0: 67 75 72 65 20 24 73 20 2d 62 75 66 66 65 72 69  gure $s -bufferi
5600: 6e 67 20 6c 69 6e 65 0a 09 66 6f 72 20 7b 73 65  ng line..for {se
5610: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30  t i 0} {$i < 100
5620: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 09 20 20  } {incr i} {..  
5630: 20 20 70 75 74 73 20 24 73 20 68 65 6c 6c 6f 0a    puts $s hello.
5640: 09 20 20 20 20 67 65 74 73 20 24 73 0a 09 7d 0a  .    gets $s..}.
5650: 09 63 6c 6f 73 65 20 24 73 0a 09 70 75 74 73 20  .close $s..puts 
5660: 62 79 65 0a 09 67 65 74 73 20 73 74 64 69 6e 0a  bye..gets stdin.
5670: 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20      }.    close 
5680: 24 66 0a 20 20 20 20 73 65 74 20 70 31 20 5b 6f  $f.    set p1 [o
5690: 70 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74  pen "|[list $::t
56a0: 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73 74 20  cltest::tcltest 
56b0: 73 63 72 69 70 74 5d 22 20 72 2b 5d 0a 20 20 20  script]" r+].   
56c0: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 70 31 20   fconfigure $p1 
56d0: 2d 62 75 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a  -buffering line.
56e0: 20 20 20 20 73 65 74 20 70 32 20 5b 6f 70 65 6e      set p2 [open
56f0: 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74   "|[list $::tclt
5700: 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73 63 72  est::tcltest scr
5710: 69 70 74 5d 22 20 72 2b 5d 0a 20 20 20 20 66 63  ipt]" r+].    fc
5720: 6f 6e 66 69 67 75 72 65 20 24 70 32 20 2d 62 75  onfigure $p2 -bu
5730: 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 20 20 20  ffering line.   
5740: 20 73 65 74 20 70 33 20 5b 6f 70 65 6e 20 22 7c   set p3 [open "|
5750: 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74 65 73 74  [list $::tcltest
5760: 3a 3a 74 63 6c 74 65 73 74 20 73 63 72 69 70 74  ::tcltest script
5770: 5d 22 20 72 2b 5d 0a 20 20 20 20 66 63 6f 6e 66  ]" r+].    fconf
5780: 69 67 75 72 65 20 24 70 33 20 2d 62 75 66 66 65  igure $p3 -buffe
5790: 72 69 6e 67 20 6c 69 6e 65 0a 20 20 20 20 70 72  ring line.    pr
57a0: 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61 20 70  oc accept {s a p
57b0: 7d 20 7b 0a 09 66 63 6f 6e 66 69 67 75 72 65 20  } {..fconfigure 
57c0: 24 73 20 2d 62 75 66 66 65 72 69 6e 67 20 6c 69  $s -buffering li
57d0: 6e 65 0a 09 66 69 6c 65 65 76 65 6e 74 20 24 73  ne..fileevent $s
57e0: 20 72 65 61 64 61 62 6c 65 20 5b 6c 69 73 74 20   readable [list 
57f0: 65 63 68 6f 20 24 73 5d 0a 20 20 20 20 7d 0a 20  echo $s].    }. 
5800: 20 20 20 70 72 6f 63 20 65 63 68 6f 20 7b 73 7d     proc echo {s}
5810: 20 7b 0a 09 67 6c 6f 62 61 6c 20 78 0a 20 20 20   {..global x.   
5820: 20 20 20 20 20 73 65 74 20 6c 20 5b 67 65 74 73       set l [gets
5830: 20 24 73 5d 0a 20 20 20 20 20 20 20 20 69 66 20   $s].        if 
5840: 7b 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a 20 20 20  {[eof $s]} {.   
5850: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20 24           close $
5860: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  s.            se
5870: 74 20 78 20 64 6f 6e 65 0a 20 20 20 20 20 20 20  t x done.       
5880: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
5890: 20 20 20 20 20 20 70 75 74 73 20 24 73 20 24 6c        puts $s $l
58a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
58b0: 0a 20 20 20 20 73 65 74 20 74 31 20 5b 61 66 74  .    set t1 [aft
58c0: 65 72 20 33 30 30 30 30 20 22 73 65 74 20 78 20  er 30000 "set x 
58d0: 74 69 6d 65 64 5f 6f 75 74 22 5d 0a 20 20 20 20  timed_out"].    
58e0: 73 65 74 20 74 32 20 5b 61 66 74 65 72 20 33 31  set t2 [after 31
58f0: 30 30 30 20 22 73 65 74 20 78 20 74 69 6d 65 64  000 "set x timed
5900: 5f 6f 75 74 22 5d 0a 20 20 20 20 73 65 74 20 74  _out"].    set t
5910: 33 20 5b 61 66 74 65 72 20 33 32 30 30 30 20 22  3 [after 32000 "
5920: 73 65 74 20 78 20 74 69 6d 65 64 5f 6f 75 74 22  set x timed_out"
5930: 5d 0a 20 20 20 20 73 65 74 20 73 20 5b 74 6c 73  ].    set s [tls
5940: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20  ::socket \..    
5950: 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72 76 65  -certfile $serve
5960: 72 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63  rCert -cafile $c
5970: 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24  aCert -keyfile $
5980: 73 65 72 76 65 72 4b 65 79 20 5c 0a 20 20 20 20  serverKey \.    
5990: 09 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20  .-server accept 
59a0: 38 38 32 38 5d 0a 20 20 20 20 70 75 74 73 20 24  8828].    puts $
59b0: 70 31 20 6f 70 65 6e 0a 20 20 20 20 70 75 74 73  p1 open.    puts
59c0: 20 24 70 32 20 6f 70 65 6e 0a 20 20 20 20 70 75   $p2 open.    pu
59d0: 74 73 20 24 70 33 20 6f 70 65 6e 0a 20 20 20 20  ts $p3 open.    
59e0: 76 77 61 69 74 20 78 0a 20 20 20 20 76 77 61 69  vwait x.    vwai
59f0: 74 20 78 0a 20 20 20 20 76 77 61 69 74 20 78 0a  t x.    vwait x.
5a00: 20 20 20 20 61 66 74 65 72 20 63 61 6e 63 65 6c      after cancel
5a10: 20 24 74 31 0a 20 20 20 20 61 66 74 65 72 20 63   $t1.    after c
5a20: 61 6e 63 65 6c 20 24 74 32 0a 20 20 20 20 61 66  ancel $t2.    af
5a30: 74 65 72 20 63 61 6e 63 65 6c 20 24 74 33 0a 20  ter cancel $t3. 
5a40: 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20     close $s.    
5a50: 73 65 74 20 6c 20 22 22 0a 20 20 20 20 6c 61 70  set l "".    lap
5a60: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 70 31 20  pend l [list p1 
5a70: 5b 67 65 74 73 20 24 70 31 5d 20 24 78 5d 0a 20  [gets $p1] $x]. 
5a80: 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69     lappend l [li
5a90: 73 74 20 70 32 20 5b 67 65 74 73 20 24 70 32 5d  st p2 [gets $p2]
5aa0: 20 24 78 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64   $x].    lappend
5ab0: 20 6c 20 5b 6c 69 73 74 20 70 33 20 5b 67 65 74   l [list p3 [get
5ac0: 73 20 24 70 33 5d 20 24 78 5d 0a 20 20 20 20 70  s $p3] $x].    p
5ad0: 75 74 73 20 24 70 31 20 62 79 65 0a 20 20 20 20  uts $p1 bye.    
5ae0: 70 75 74 73 20 24 70 32 20 62 79 65 0a 20 20 20  puts $p2 bye.   
5af0: 20 70 75 74 73 20 24 70 33 20 62 79 65 0a 20 20   puts $p3 bye.  
5b00: 20 20 63 6c 6f 73 65 20 24 70 31 0a 20 20 20 20    close $p1.    
5b10: 63 6c 6f 73 65 20 24 70 32 0a 20 20 20 20 63 6c  close $p2.    cl
5b20: 6f 73 65 20 24 70 33 0a 20 20 20 20 73 65 74 20  ose $p3.    set 
5b30: 6c 0a 7d 20 7b 7b 70 31 20 62 79 65 20 64 6f 6e  l.} {{p1 bye don
5b40: 65 7d 20 7b 70 32 20 62 79 65 20 64 6f 6e 65 7d  e} {p2 bye done}
5b50: 20 7b 70 33 20 62 79 65 20 64 6f 6e 65 7d 7d 0a   {p3 bye done}}.
5b60: 0a 74 65 73 74 20 74 6c 73 49 4f 2d 34 2e 32 20  .test tlsIO-4.2 
5b70: 7b 62 79 74 65 20 6f 72 64 65 72 20 70 72 6f 62  {byte order prob
5b80: 6c 65 6d 73 2c 20 73 6f 63 6b 65 74 20 6e 75 6d  lems, socket num
5b90: 62 65 72 73 2c 20 68 74 6f 6e 73 7d 20 7b 73 6f  bers, htons} {so
5ba0: 63 6b 65 74 7d 20 7b 0a 20 20 20 20 73 65 74 20  cket} {.    set 
5bb0: 78 20 6f 6b 0a 20 20 20 20 69 66 20 7b 5b 63 61  x ok.    if {[ca
5bc0: 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74  tch {tls::socket
5bd0: 20 2d 73 65 72 76 65 72 20 64 6f 64 6f 20 30 78   -server dodo 0x
5be0: 33 30 30 30 7d 20 6d 73 67 5d 7d 20 7b 0a 09 73  3000} msg]} {..s
5bf0: 65 74 20 78 20 24 6d 73 67 0a 20 20 20 20 7d 20  et x $msg.    } 
5c00: 65 6c 73 65 20 7b 0a 09 63 6c 6f 73 65 20 24 6d  else {..close $m
5c10: 73 67 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  sg.    }.    set
5c20: 20 78 0a 7d 20 6f 6b 0a 0a 74 65 73 74 20 74 6c   x.} ok..test tl
5c30: 73 49 4f 2d 35 2e 31 20 7b 62 79 74 65 20 6f 72  sIO-5.1 {byte or
5c40: 64 65 72 20 70 72 6f 62 6c 65 6d 73 2c 20 73 6f  der problems, so
5c50: 63 6b 65 74 20 6e 75 6d 62 65 72 73 2c 20 68 74  cket numbers, ht
5c60: 6f 6e 73 7d 20 5c 0a 09 7b 73 6f 63 6b 65 74 20  ons} \..{socket 
5c70: 75 6e 69 78 4f 6e 6c 79 20 6e 6f 74 52 6f 6f 74  unixOnly notRoot
5c80: 7d 20 7b 0a 20 20 20 20 73 65 74 20 78 20 7b 63  } {.    set x {c
5c90: 6f 75 6c 64 6e 27 74 20 6f 70 65 6e 20 73 6f 63  ouldn't open soc
5ca0: 6b 65 74 3a 20 6e 6f 74 20 6f 77 6e 65 72 7d 0a  ket: not owner}.
5cb0: 20 20 20 20 69 66 20 7b 21 5b 63 61 74 63 68 20      if {![catch 
5cc0: 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65  {tls::socket -se
5cd0: 72 76 65 72 20 64 6f 64 6f 20 30 78 31 7d 20 6d  rver dodo 0x1} m
5ce0: 73 67 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  sg]} {.        s
5cf0: 65 74 20 78 20 7b 68 74 6f 6e 73 20 70 72 6f 62  et x {htons prob
5d00: 6c 65 6d 2c 20 73 68 6f 75 6c 64 20 62 65 20 64  lem, should be d
5d10: 69 73 61 6c 6c 6f 77 65 64 2c 20 61 72 65 20 79  isallowed, are y
5d20: 6f 75 20 72 75 6e 6e 69 6e 67 20 61 73 20 53 55  ou running as SU
5d30: 3f 7d 0a 09 63 6c 6f 73 65 20 24 6d 73 67 0a 20  ?}..close $msg. 
5d40: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 78 0a 7d     }.    set x.}
5d50: 20 7b 63 6f 75 6c 64 6e 27 74 20 6f 70 65 6e 20   {couldn't open 
5d60: 73 6f 63 6b 65 74 3a 20 6e 6f 74 20 6f 77 6e 65  socket: not owne
5d70: 72 7d 0a 74 65 73 74 20 74 6c 73 49 4f 2d 35 2e  r}.test tlsIO-5.
5d80: 32 20 7b 62 79 74 65 20 6f 72 64 65 72 20 70 72  2 {byte order pr
5d90: 6f 62 6c 65 6d 73 2c 20 73 6f 63 6b 65 74 20 6e  oblems, socket n
5da0: 75 6d 62 65 72 73 2c 20 68 74 6f 6e 73 7d 20 7b  umbers, htons} {
5db0: 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20 73 65  socket} {.    se
5dc0: 74 20 78 20 7b 63 6f 75 6c 64 6e 27 74 20 6f 70  t x {couldn't op
5dd0: 65 6e 20 73 6f 63 6b 65 74 3a 20 70 6f 72 74 20  en socket: port 
5de0: 6e 75 6d 62 65 72 20 74 6f 6f 20 68 69 67 68 7d  number too high}
5df0: 0a 20 20 20 20 69 66 20 7b 21 5b 63 61 74 63 68  .    if {![catch
5e00: 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73   {tls::socket -s
5e10: 65 72 76 65 72 20 64 6f 64 6f 20 30 78 31 30 30  erver dodo 0x100
5e20: 30 30 7d 20 6d 73 67 5d 7d 20 7b 0a 09 73 65 74  00} msg]} {..set
5e30: 20 78 20 7b 70 6f 72 74 20 72 65 73 6f 6c 75 74   x {port resolut
5e40: 69 6f 6e 20 70 72 6f 62 6c 65 6d 2c 20 73 68 6f  ion problem, sho
5e50: 75 6c 64 20 62 65 20 64 69 73 61 6c 6c 6f 77 65  uld be disallowe
5e60: 64 7d 0a 09 63 6c 6f 73 65 20 24 6d 73 67 0a 20  d}..close $msg. 
5e70: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 78 0a 7d     }.    set x.}
5e80: 20 7b 63 6f 75 6c 64 6e 27 74 20 6f 70 65 6e 20   {couldn't open 
5e90: 73 6f 63 6b 65 74 3a 20 70 6f 72 74 20 6e 75 6d  socket: port num
5ea0: 62 65 72 20 74 6f 6f 20 68 69 67 68 7d 0a 74 65  ber too high}.te
5eb0: 73 74 20 74 6c 73 49 4f 2d 35 2e 33 20 7b 62 79  st tlsIO-5.3 {by
5ec0: 74 65 20 6f 72 64 65 72 20 70 72 6f 62 6c 65 6d  te order problem
5ed0: 73 2c 20 73 6f 63 6b 65 74 20 6e 75 6d 62 65 72  s, socket number
5ee0: 73 2c 20 68 74 6f 6e 73 7d 20 5c 0a 09 7b 73 6f  s, htons} \..{so
5ef0: 63 6b 65 74 20 75 6e 69 78 4f 6e 6c 79 20 6e 6f  cket unixOnly no
5f00: 74 52 6f 6f 74 7d 20 7b 0a 20 20 20 20 73 65 74  tRoot} {.    set
5f10: 20 78 20 7b 63 6f 75 6c 64 6e 27 74 20 6f 70 65   x {couldn't ope
5f20: 6e 20 73 6f 63 6b 65 74 3a 20 6e 6f 74 20 6f 77  n socket: not ow
5f30: 6e 65 72 7d 0a 20 20 20 20 69 66 20 7b 21 5b 63  ner}.    if {![c
5f40: 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65  atch {tls::socke
5f50: 74 20 2d 73 65 72 76 65 72 20 64 6f 64 6f 20 32  t -server dodo 2
5f60: 31 7d 20 6d 73 67 5d 7d 20 7b 0a 09 73 65 74 20  1} msg]} {..set 
5f70: 78 20 7b 68 74 6f 6e 73 20 70 72 6f 62 6c 65 6d  x {htons problem
5f80: 2c 20 73 68 6f 75 6c 64 20 62 65 20 64 69 73 61  , should be disa
5f90: 6c 6c 6f 77 65 64 2c 20 61 72 65 20 79 6f 75 20  llowed, are you 
5fa0: 72 75 6e 6e 69 6e 67 20 61 73 20 53 55 3f 7d 0a  running as SU?}.
5fb0: 09 63 6c 6f 73 65 20 24 6d 73 67 0a 20 20 20 20  .close $msg.    
5fc0: 7d 0a 20 20 20 20 73 65 74 20 78 0a 7d 20 7b 63  }.    set x.} {c
5fd0: 6f 75 6c 64 6e 27 74 20 6f 70 65 6e 20 73 6f 63  ouldn't open soc
5fe0: 6b 65 74 3a 20 6e 6f 74 20 6f 77 6e 65 72 7d 0a  ket: not owner}.
5ff0: 0a 74 65 73 74 20 74 6c 73 49 4f 2d 36 2e 31 20  .test tlsIO-6.1 
6000: 7b 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63 6b  {accept callback
6010: 20 65 72 72 6f 72 7d 20 7b 75 6e 65 78 70 6c 61   error} {unexpla
6020: 69 6e 65 64 46 61 69 6c 75 72 65 20 73 6f 63 6b  inedFailure sock
6030: 65 74 20 73 74 64 69 6f 20 70 63 43 72 61 73 68  et stdio pcCrash
6040: 7d 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46 69  } {.    removeFi
6050: 6c 65 20 73 63 72 69 70 74 0a 20 20 20 20 73 65  le script.    se
6060: 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70 74  t f [open script
6070: 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24 66 20   w].    puts $f 
6080: 7b 0a 20 20 20 20 09 70 61 63 6b 61 67 65 20 72  {.    .package r
6090: 65 71 75 69 72 65 20 74 6c 73 0a 09 67 65 74 73  equire tls..gets
60a0: 20 73 74 64 69 6e 0a 09 74 6c 73 3a 3a 73 6f 63   stdin..tls::soc
60b0: 6b 65 74 20 31 32 37 2e 30 2e 30 2e 31 20 38 38  ket 127.0.0.1 88
60c0: 34 38 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f  48.    }.    clo
60d0: 73 65 20 24 66 0a 20 20 20 20 73 65 74 20 66 20  se $f.    set f 
60e0: 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a  [open "|[list $:
60f0: 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73  :tcltest::tcltes
6100: 74 20 73 63 72 69 70 74 5d 22 20 72 2b 5d 0a 20  t script]" r+]. 
6110: 20 20 20 70 72 6f 63 20 62 67 65 72 72 6f 72 20     proc bgerror 
6120: 61 72 67 73 20 7b 0a 09 67 6c 6f 62 61 6c 20 78  args {..global x
6130: 0a 09 73 65 74 20 78 20 24 61 72 67 73 0a 20 20  ..set x $args.  
6140: 20 20 7d 0a 20 20 20 20 70 72 6f 63 20 61 63 63    }.    proc acc
6150: 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 65 78 70  ept {s a p} {exp
6160: 72 20 31 30 20 2f 20 30 7d 0a 20 20 20 20 73 65  r 10 / 0}.    se
6170: 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74  t s [tls::socket
6180: 20 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20   -server accept 
6190: 38 38 34 38 5d 0a 20 20 20 20 70 75 74 73 20 24  8848].    puts $
61a0: 66 20 68 65 6c 6c 6f 0a 20 20 20 20 63 6c 6f 73  f hello.    clos
61b0: 65 20 24 66 0a 20 20 20 20 73 65 74 20 74 69 6d  e $f.    set tim
61c0: 65 72 20 5b 61 66 74 65 72 20 31 30 30 30 30 20  er [after 10000 
61d0: 22 73 65 74 20 78 20 74 69 6d 65 64 5f 6f 75 74  "set x timed_out
61e0: 22 5d 0a 20 20 20 20 76 77 61 69 74 20 78 0a 20  "].    vwait x. 
61f0: 20 20 20 61 66 74 65 72 20 63 61 6e 63 65 6c 20     after cancel 
6200: 24 74 69 6d 65 72 0a 20 20 20 20 63 6c 6f 73 65  $timer.    close
6210: 20 24 73 0a 20 20 20 20 72 65 6e 61 6d 65 20 62   $s.    rename b
6220: 67 65 72 72 6f 72 20 7b 7d 0a 20 20 20 20 73 65  gerror {}.    se
6230: 74 20 78 0a 7d 20 7b 7b 64 69 76 69 64 65 20 62  t x.} {{divide b
6240: 79 20 7a 65 72 6f 7d 7d 0a 0a 23 20 62 75 67 20  y zero}}..# bug 
6250: 72 65 70 6f 72 74 20 23 35 38 31 32 20 66 63 6f  report #5812 fco
6260: 6e 66 69 67 75 72 65 20 64 6f 65 73 6e 27 74 20  nfigure doesn't 
6270: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72  return value for
6280: 20 27 2d 70 65 65 72 6e 61 6d 65 27 0a 0a 74 65   '-peername'..te
6290: 73 74 20 74 6c 73 49 4f 2d 37 2e 31 20 7b 74 65  st tlsIO-7.1 {te
62a0: 73 74 69 6e 67 20 73 6f 63 6b 65 74 20 73 70 65  sting socket spe
62b0: 63 69 66 69 63 20 6f 70 74 69 6f 6e 73 7d 20 7b  cific options} {
62c0: 6b 6e 6f 77 6e 42 75 67 20 73 6f 63 6b 65 74 20  knownBug socket 
62d0: 73 74 64 69 6f 7d 20 7b 0a 20 20 20 20 72 65 6d  stdio} {.    rem
62e0: 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74 0a 20  oveFile script. 
62f0: 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 73     set f [open s
6300: 63 72 69 70 74 20 77 5d 0a 20 20 20 20 70 75 74  cript w].    put
6310: 73 20 24 66 20 7b 0a 09 70 61 63 6b 61 67 65 20  s $f {..package 
6320: 72 65 71 75 69 72 65 20 74 6c 73 0a 20 20 20 20  require tls.    
6330: 7d 0a 20 20 20 20 70 75 74 73 20 24 66 20 22 74  }.    puts $f "t
6340: 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76  ls::socket -serv
6350: 65 72 20 61 63 63 65 70 74 20 2d 63 65 72 74 66  er accept -certf
6360: 69 6c 65 20 24 73 65 72 76 65 72 43 65 72 74 20  ile $serverCert 
6370: 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74 20  -cafile $caCert 
6380: 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65 72  -keyfile $server
6390: 4b 65 79 20 38 38 32 30 22 0a 20 20 20 20 70 75  Key 8820".    pu
63a0: 74 73 20 24 66 20 7b 0a 09 70 72 6f 63 20 61 63  ts $f {..proc ac
63b0: 63 65 70 74 20 61 72 67 73 20 7b 0a 09 20 20 20  cept args {..   
63c0: 20 67 6c 6f 62 61 6c 20 78 0a 09 20 20 20 20 73   global x..    s
63d0: 65 74 20 78 20 64 6f 6e 65 0a 09 7d 0a 09 70 75  et x done..}..pu
63e0: 74 73 20 72 65 61 64 79 0a 09 73 65 74 20 74 69  ts ready..set ti
63f0: 6d 65 72 20 5b 61 66 74 65 72 20 31 30 30 30 30  mer [after 10000
6400: 20 22 73 65 74 20 78 20 74 69 6d 65 64 5f 6f 75   "set x timed_ou
6410: 74 22 5d 0a 09 76 77 61 69 74 20 78 0a 09 61 66  t"]..vwait x..af
6420: 74 65 72 20 63 61 6e 63 65 6c 20 24 74 69 6d 65  ter cancel $time
6430: 72 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73  r.    }.    clos
6440: 65 20 24 66 0a 20 20 20 20 73 65 74 20 66 20 5b  e $f.    set f [
6450: 6f 70 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a  open "|[list $::
6460: 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73 74  tcltest::tcltest
6470: 20 73 63 72 69 70 74 5d 22 20 72 5d 0a 20 20 20   script]" r].   
6480: 20 67 65 74 73 20 24 66 0a 20 20 20 20 73 65 74   gets $f.    set
6490: 20 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20   s [tls::socket 
64a0: 5c 0a 09 20 20 20 20 2d 63 65 72 74 66 69 6c 65  \..    -certfile
64b0: 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61   $clientCert -ca
64c0: 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65  file $caCert -ke
64d0: 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79  yfile $clientKey
64e0: 20 5c 0a 09 20 20 20 20 31 32 37 2e 30 2e 30 2e   \..    127.0.0.
64f0: 31 20 38 38 32 30 5d 0a 20 20 20 20 73 65 74 20  1 8820].    set 
6500: 70 20 5b 66 63 6f 6e 66 69 67 75 72 65 20 24 73  p [fconfigure $s
6510: 20 2d 70 65 65 72 6e 61 6d 65 5d 0a 20 20 20 20   -peername].    
6520: 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 63 6c 6f  close $s.    clo
6530: 73 65 20 24 66 0a 20 20 20 20 73 65 74 20 6c 20  se $f.    set l 
6540: 22 22 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6c  "".    lappend l
6550: 20 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65   [string compare
6560: 20 5b 6c 69 6e 64 65 78 20 24 70 20 30 5d 20 31   [lindex $p 0] 1
6570: 32 37 2e 30 2e 30 2e 31 5d 0a 20 20 20 20 6c 61  27.0.0.1].    la
6580: 70 70 65 6e 64 20 6c 20 5b 73 74 72 69 6e 67 20  ppend l [string 
6590: 63 6f 6d 70 61 72 65 20 5b 6c 69 6e 64 65 78 20  compare [lindex 
65a0: 24 70 20 32 5d 20 38 38 32 30 5d 0a 20 20 20 20  $p 2] 8820].    
65b0: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 6c 65 6e 67  lappend l [lleng
65c0: 74 68 20 24 70 5d 0a 7d 20 7b 30 20 30 20 33 7d  th $p].} {0 0 3}
65d0: 0a 0a 23 20 62 75 67 20 72 65 70 6f 72 74 20 23  ..# bug report #
65e0: 35 38 31 32 20 66 63 6f 6e 66 69 67 75 72 65 20  5812 fconfigure 
65f0: 64 6f 65 73 6e 27 74 20 72 65 74 75 72 6e 20 76  doesn't return v
6600: 61 6c 75 65 20 66 6f 72 20 27 2d 73 6f 63 6b 6e  alue for '-sockn
6610: 61 6d 65 27 0a 0a 74 65 73 74 20 74 6c 73 49 4f  ame'..test tlsIO
6620: 2d 37 2e 32 20 7b 74 65 73 74 69 6e 67 20 73 6f  -7.2 {testing so
6630: 63 6b 65 74 20 73 70 65 63 69 66 69 63 20 6f 70  cket specific op
6640: 74 69 6f 6e 73 7d 20 7b 6b 6e 6f 77 6e 42 75 67  tions} {knownBug
6650: 20 73 6f 63 6b 65 74 20 73 74 64 69 6f 7d 20 7b   socket stdio} {
6660: 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20  .    removeFile 
6670: 73 63 72 69 70 74 0a 20 20 20 20 73 65 74 20 66  script.    set f
6680: 20 5b 6f 70 65 6e 20 73 63 72 69 70 74 20 77 5d   [open script w]
6690: 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09  .    puts $f {..
66a0: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
66b0: 74 6c 73 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  tls.    }.    pu
66c0: 74 73 20 24 66 20 22 74 6c 73 3a 3a 73 6f 63 6b  ts $f "tls::sock
66d0: 65 74 20 2d 73 65 72 76 65 72 20 61 63 63 65 70  et -server accep
66e0: 74 20 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72  t -certfile $ser
66f0: 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65 20  verCert -cafile 
6700: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
6710: 20 24 73 65 72 76 65 72 4b 65 79 20 38 38 32 31   $serverKey 8821
6720: 22 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a  ".    puts $f {.
6730: 09 70 72 6f 63 20 61 63 63 65 70 74 20 61 72 67  .proc accept arg
6740: 73 20 7b 0a 09 20 20 20 20 67 6c 6f 62 61 6c 20  s {..    global 
6750: 78 0a 09 20 20 20 20 73 65 74 20 78 20 64 6f 6e  x..    set x don
6760: 65 0a 09 7d 0a 09 70 75 74 73 20 72 65 61 64 79  e..}..puts ready
6770: 0a 09 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74  ..set timer [aft
6780: 65 72 20 31 30 30 30 30 20 22 73 65 74 20 78 20  er 10000 "set x 
6790: 74 69 6d 65 64 5f 6f 75 74 22 5d 0a 09 76 77 61  timed_out"]..vwa
67a0: 69 74 20 78 0a 09 61 66 74 65 72 20 63 61 6e 63  it x..after canc
67b0: 65 6c 20 24 74 69 6d 65 72 0a 20 20 20 20 7d 0a  el $timer.    }.
67c0: 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 20      close $f.   
67d0: 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 22 7c 5b   set f [open "|[
67e0: 6c 69 73 74 20 24 3a 3a 74 63 6c 74 65 73 74 3a  list $::tcltest:
67f0: 3a 74 63 6c 74 65 73 74 20 73 63 72 69 70 74 5d  :tcltest script]
6800: 22 20 72 5d 0a 20 20 20 20 67 65 74 73 20 24 66  " r].    gets $f
6810: 0a 20 20 20 20 73 65 74 20 73 20 5b 74 6c 73 3a  .    set s [tls:
6820: 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d  :socket \..    -
6830: 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74  certfile $client
6840: 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61  Cert -cafile $ca
6850: 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63  Cert -keyfile $c
6860: 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20  lientKey \..    
6870: 31 32 37 2e 30 2e 30 2e 31 20 38 38 32 31 5d 0a  127.0.0.1 8821].
6880: 20 20 20 20 73 65 74 20 70 20 5b 66 63 6f 6e 66      set p [fconf
6890: 69 67 75 72 65 20 24 73 20 2d 73 6f 63 6b 6e 61  igure $s -sockna
68a0: 6d 65 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 73  me].    close $s
68b0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20  .    close $f.  
68c0: 20 20 73 65 74 20 6c 20 22 22 0a 20 20 20 20 6c    set l "".    l
68d0: 61 70 70 65 6e 64 20 6c 20 5b 6c 6c 65 6e 67 74  append l [llengt
68e0: 68 20 24 70 5d 0a 20 20 20 20 6c 61 70 70 65 6e  h $p].    lappen
68f0: 64 20 6c 20 5b 6c 69 6e 64 65 78 20 24 70 20 30  d l [lindex $p 0
6900: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20  ].    lappend l 
6910: 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 5b 6c  [string equal [l
6920: 69 6e 64 65 78 20 24 70 20 32 5d 20 38 38 32 31  index $p 2] 8821
6930: 5d 0a 7d 20 7b 33 20 31 32 37 2e 30 2e 30 2e 31  ].} {3 127.0.0.1
6940: 20 30 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d   0}..test tlsIO-
6950: 37 2e 33 20 7b 74 65 73 74 69 6e 67 20 73 6f 63  7.3 {testing soc
6960: 6b 65 74 20 73 70 65 63 69 66 69 63 20 6f 70 74  ket specific opt
6970: 69 6f 6e 73 7d 20 7b 73 6f 63 6b 65 74 7d 20 7b  ions} {socket} {
6980: 0a 20 20 20 20 73 65 74 20 73 20 5b 74 6c 73 3a  .    set s [tls:
6990: 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74  :socket \..-cert
69a0: 66 69 6c 65 20 24 73 65 72 76 65 72 43 65 72 74  file $serverCert
69b0: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
69c0: 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65   -keyfile $serve
69d0: 72 4b 65 79 20 5c 0a 20 20 20 20 09 2d 73 65 72  rKey \.    .-ser
69e0: 76 65 72 20 61 63 63 65 70 74 20 38 38 32 32 5d  ver accept 8822]
69f0: 0a 20 20 20 20 73 65 74 20 6c 20 5b 66 63 6f 6e  .    set l [fcon
6a00: 66 69 67 75 72 65 20 24 73 5d 0a 20 20 20 20 63  figure $s].    c
6a10: 6c 6f 73 65 20 24 73 0a 20 20 20 20 75 70 64 61  lose $s.    upda
6a20: 74 65 0a 20 20 20 20 6c 6c 65 6e 67 74 68 20 24  te.    llength $
6a30: 6c 0a 7d 20 31 32 0a 0a 23 20 62 75 67 20 72 65  l.} 12..# bug re
6a40: 70 6f 72 74 20 23 35 38 31 32 20 66 63 6f 6e 66  port #5812 fconf
6a50: 69 67 75 72 65 20 64 6f 65 73 6e 27 74 20 72 65  igure doesn't re
6a60: 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20 27  turn value for '
6a70: 2d 73 6f 63 6b 6e 61 6d 65 27 0a 0a 74 65 73 74  -sockname'..test
6a80: 20 74 6c 73 49 4f 2d 37 2e 34 20 7b 74 65 73 74   tlsIO-7.4 {test
6a90: 69 6e 67 20 73 6f 63 6b 65 74 20 73 70 65 63 69  ing socket speci
6aa0: 66 69 63 20 6f 70 74 69 6f 6e 73 7d 20 7b 6b 6e  fic options} {kn
6ab0: 6f 77 6e 42 75 67 20 73 6f 63 6b 65 74 7d 20 7b  ownBug socket} {
6ac0: 0a 20 20 20 20 73 65 74 20 73 20 5b 74 6c 73 3a  .    set s [tls:
6ad0: 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74  :socket \..-cert
6ae0: 66 69 6c 65 20 24 73 65 72 76 65 72 43 65 72 74  file $serverCert
6af0: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
6b00: 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65   -keyfile $serve
6b10: 72 4b 65 79 20 5c 0a 20 20 20 20 09 2d 73 65 72  rKey \.    .-ser
6b20: 76 65 72 20 61 63 63 65 70 74 20 38 38 32 33 5d  ver accept 8823]
6b30: 0a 20 20 20 20 70 72 6f 63 20 61 63 63 65 70 74  .    proc accept
6b40: 20 7b 73 20 61 20 70 7d 20 7b 0a 09 67 6c 6f 62   {s a p} {..glob
6b50: 61 6c 20 78 0a 09 73 65 74 20 78 20 5b 66 63 6f  al x..set x [fco
6b60: 6e 66 69 67 75 72 65 20 24 73 20 2d 73 6f 63 6b  nfigure $s -sock
6b70: 6e 61 6d 65 5d 0a 09 63 6c 6f 73 65 20 24 73 0a  name]..close $s.
6b80: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 73 31      }.    set s1
6b90: 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a   [tls::socket \.
6ba0: 09 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65  .-certfile $clie
6bb0: 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24  ntCert -cafile $
6bc0: 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20  caCert -keyfile 
6bd0: 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 20 20 20  $clientKey \.   
6be0: 20 09 5b 69 6e 66 6f 20 68 6f 73 74 6e 61 6d 65   .[info hostname
6bf0: 5d 20 38 38 32 33 5d 0a 20 20 20 20 73 65 74 20  ] 8823].    set 
6c00: 74 69 6d 65 72 20 5b 61 66 74 65 72 20 31 30 30  timer [after 100
6c10: 30 30 20 22 73 65 74 20 78 20 74 69 6d 65 64 5f  00 "set x timed_
6c20: 6f 75 74 22 5d 0a 20 20 20 20 76 77 61 69 74 20  out"].    vwait 
6c30: 78 0a 20 20 20 20 61 66 74 65 72 20 63 61 6e 63  x.    after canc
6c40: 65 6c 20 24 74 69 6d 65 72 0a 20 20 20 20 63 6c  el $timer.    cl
6c50: 6f 73 65 20 24 73 0a 20 20 20 20 63 6c 6f 73 65  ose $s.    close
6c60: 20 24 73 31 0a 20 20 20 20 73 65 74 20 6c 20 22   $s1.    set l "
6c70: 22 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20  ".    lappend l 
6c80: 5b 6c 69 6e 64 65 78 20 24 78 20 32 5d 20 5b 6c  [lindex $x 2] [l
6c90: 6c 65 6e 67 74 68 20 24 78 5d 0a 7d 20 7b 38 38  length $x].} {88
6ca0: 32 33 20 33 7d 0a 0a 23 20 62 75 67 20 72 65 70  23 3}..# bug rep
6cb0: 6f 72 74 20 23 35 38 31 32 20 66 63 6f 6e 66 69  ort #5812 fconfi
6cc0: 67 75 72 65 20 64 6f 65 73 6e 27 74 20 72 65 74  gure doesn't ret
6cd0: 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20 27 2d  urn value for '-
6ce0: 73 6f 63 6b 6e 61 6d 65 27 0a 0a 74 65 73 74 20  sockname'..test 
6cf0: 74 6c 73 49 4f 2d 37 2e 35 20 7b 74 65 73 74 69  tlsIO-7.5 {testi
6d00: 6e 67 20 73 6f 63 6b 65 74 20 73 70 65 63 69 66  ng socket specif
6d10: 69 63 20 6f 70 74 69 6f 6e 73 7d 20 7b 6b 6e 6f  ic options} {kno
6d20: 77 6e 42 75 67 20 73 6f 63 6b 65 74 20 75 6e 69  wnBug socket uni
6d30: 78 4f 72 50 63 7d 20 7b 0a 20 20 20 20 73 65 74  xOrPc} {.    set
6d40: 20 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20   s [tls::socket 
6d50: 5c 0a 09 2d 63 65 72 74 66 69 6c 65 20 24 73 65  \..-certfile $se
6d60: 72 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65  rverCert -cafile
6d70: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
6d80: 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c 0a 20  e $serverKey \. 
6d90: 20 20 20 09 2d 73 65 72 76 65 72 20 61 63 63 65     .-server acce
6da0: 70 74 20 38 38 32 39 5d 0a 20 20 20 20 70 72 6f  pt 8829].    pro
6db0: 63 20 61 63 63 65 70 74 20 7b 73 20 61 20 70 7d  c accept {s a p}
6dc0: 20 7b 0a 09 67 6c 6f 62 61 6c 20 78 0a 09 73 65   {..global x..se
6dd0: 74 20 78 20 5b 66 63 6f 6e 66 69 67 75 72 65 20  t x [fconfigure 
6de0: 24 73 20 2d 73 6f 63 6b 6e 61 6d 65 5d 0a 09 63  $s -sockname]..c
6df0: 6c 6f 73 65 20 24 73 0a 20 20 20 20 7d 0a 20 20  lose $s.    }.  
6e00: 20 20 73 65 74 20 73 31 20 5b 74 6c 73 3a 3a 73    set s1 [tls::s
6e10: 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74 66 69  ocket \..-certfi
6e20: 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d  le $clientCert -
6e30: 63 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d  cafile $caCert -
6e40: 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b  keyfile $clientK
6e50: 65 79 20 5c 0a 20 20 20 20 09 31 32 37 2e 30 2e  ey \.    .127.0.
6e60: 30 2e 31 20 38 38 32 39 5d 0a 20 20 20 20 73 65  0.1 8829].    se
6e70: 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72 20 31  t timer [after 1
6e80: 30 30 30 30 20 22 73 65 74 20 78 20 74 69 6d 65  0000 "set x time
6e90: 64 5f 6f 75 74 22 5d 0a 20 20 20 20 76 77 61 69  d_out"].    vwai
6ea0: 74 20 78 0a 20 20 20 20 61 66 74 65 72 20 63 61  t x.    after ca
6eb0: 6e 63 65 6c 20 24 74 69 6d 65 72 0a 20 20 20 20  ncel $timer.    
6ec0: 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 63 6c 6f  close $s.    clo
6ed0: 73 65 20 24 73 31 0a 20 20 20 20 73 65 74 20 6c  se $s1.    set l
6ee0: 20 22 22 0a 20 20 20 20 6c 61 70 70 65 6e 64 20   "".    lappend 
6ef0: 6c 20 5b 6c 69 6e 64 65 78 20 24 78 20 30 5d 20  l [lindex $x 0] 
6f00: 5b 6c 69 6e 64 65 78 20 24 78 20 32 5d 20 5b 6c  [lindex $x 2] [l
6f10: 6c 65 6e 67 74 68 20 24 78 5d 0a 7d 20 7b 31 32  length $x].} {12
6f20: 37 2e 30 2e 30 2e 31 20 38 38 32 39 20 33 7d 0a  7.0.0.1 8829 3}.
6f30: 0a 74 65 73 74 20 74 6c 73 49 4f 2d 38 2e 31 20  .test tlsIO-8.1 
6f40: 7b 74 65 73 74 69 6e 67 20 2d 61 73 79 6e 63 20  {testing -async 
6f50: 66 6c 61 67 20 6f 6e 20 73 6f 63 6b 65 74 73 7d  flag on sockets}
6f60: 20 7b 75 6e 65 78 70 6c 61 69 6e 65 64 48 61 6e   {unexplainedHan
6f70: 67 20 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20  g socket} {.    
6f80: 23 20 74 65 73 74 20 73 65 65 6d 73 20 74 6f 20  # test seems to 
6f90: 68 61 6e 67 20 2d 2d 20 61 77 62 20 36 2f 32 2f  hang -- awb 6/2/
6fa0: 32 30 30 30 0a 20 20 20 20 23 20 4e 4f 54 45 3a  2000.    # NOTE:
6fb0: 20 54 68 69 73 20 74 65 73 74 20 6d 61 79 20 66   This test may f
6fc0: 61 69 6c 20 6f 6e 20 73 6f 6d 65 20 53 6f 6c 61  ail on some Sola
6fd0: 72 69 73 20 32 2e 34 20 73 79 73 74 65 6d 73 2e  ris 2.4 systems.
6fe0: 20 49 66 20 69 74 20 64 6f 65 73 2c 0a 20 20 20   If it does,.   
6ff0: 20 23 20 63 68 65 63 6b 20 74 68 61 74 20 79 6f   # check that yo
7000: 75 20 68 61 76 65 20 74 68 65 73 65 20 70 61 74  u have these pat
7010: 63 68 65 73 20 69 6e 73 74 61 6c 6c 65 64 20 28  ches installed (
7020: 75 73 69 6e 67 20 73 68 6f 77 72 65 76 20 2d 70  using showrev -p
7030: 29 3a 0a 20 20 20 20 23 0a 20 20 20 20 23 20 31  ):.    #.    # 1
7040: 30 31 39 30 37 2d 30 35 2c 20 31 30 31 39 32 35  01907-05, 101925
7050: 2d 30 32 2c 20 31 30 31 39 34 35 2d 31 34 2c 20  -02, 101945-14, 
7060: 31 30 31 39 35 39 2d 30 33 2c 20 31 30 31 39 36  101959-03, 10196
7070: 39 2d 30 35 2c 20 31 30 31 39 37 33 2d 30 33 2c  9-05, 101973-03,
7080: 0a 20 20 20 20 23 20 31 30 31 39 37 37 2d 30 33  .    # 101977-03
7090: 2c 20 31 30 31 39 38 31 2d 30 32 2c 20 31 30 31  , 101981-02, 101
70a0: 39 38 35 2d 30 31 2c 20 31 30 32 30 30 31 2d 30  985-01, 102001-0
70b0: 33 2c 20 31 30 32 30 30 33 2d 30 31 2c 20 31 30  3, 102003-01, 10
70c0: 32 30 30 37 2d 30 31 2c 0a 20 20 20 20 23 20 31  2007-01,.    # 1
70d0: 30 32 30 31 31 2d 30 32 2c 20 31 30 32 30 32 34  02011-02, 102024
70e0: 2d 30 31 2c 20 31 30 32 30 33 39 2d 30 31 2c 20  -01, 102039-01, 
70f0: 31 30 32 30 34 34 2d 30 31 2c 20 31 30 32 30 34  102044-01, 10204
7100: 38 2d 30 31 2c 20 31 30 32 30 36 32 2d 30 33 2c  8-01, 102062-03,
7110: 0a 20 20 20 20 23 20 31 30 32 30 36 36 2d 30 34  .    # 102066-04
7120: 2c 20 31 30 32 30 37 30 2d 30 31 2c 20 31 30 32  , 102070-01, 102
7130: 31 30 35 2d 30 31 2c 20 31 30 32 31 35 33 2d 30  105-01, 102153-0
7140: 33 2c 20 31 30 32 32 31 36 2d 30 31 2c 20 31 30  3, 102216-01, 10
7150: 32 32 33 32 2d 30 31 2c 0a 20 20 20 20 23 20 31  2232-01,.    # 1
7160: 30 31 38 37 38 2d 30 33 2c 20 31 30 31 38 37 39  01878-03, 101879
7170: 2d 30 31 2c 20 31 30 31 38 38 30 2d 30 33 2c 20  -01, 101880-03, 
7180: 31 30 31 39 33 33 2d 30 31 2c 20 31 30 31 39 35  101933-01, 10195
7190: 30 2d 30 31 2c 20 31 30 32 30 33 30 2d 30 31 2c  0-01, 102030-01,
71a0: 0a 20 20 20 20 23 20 31 30 32 30 35 37 2d 30 38  .    # 102057-08
71b0: 2c 20 31 30 32 31 34 30 2d 30 31 2c 20 31 30 31  , 102140-01, 101
71c0: 39 32 30 2d 30 32 2c 20 31 30 31 39 32 31 2d 30  920-02, 101921-0
71d0: 39 2c 20 31 30 31 39 32 32 2d 30 37 2c 20 31 30  9, 101922-07, 10
71e0: 31 39 32 33 2d 30 33 0a 20 20 20 20 23 0a 20 20  1923-03.    #.  
71f0: 20 20 23 20 49 66 20 61 66 74 65 72 20 69 6e 73    # If after ins
7200: 74 61 6c 6c 69 6e 67 20 74 68 65 73 65 20 70 61  talling these pa
7210: 74 63 68 65 73 20 79 6f 75 20 61 72 65 20 73 74  tches you are st
7220: 69 6c 6c 20 65 78 70 65 72 69 65 6e 63 69 6e 67  ill experiencing
7230: 20 61 0a 20 20 20 20 23 20 70 72 6f 62 6c 65 6d   a.    # problem
7240: 2c 20 70 6c 65 61 73 65 20 65 6d 61 69 6c 20 6a  , please email j
7250: 79 6c 40 65 6e 67 2e 73 75 6e 2e 63 6f 6d 2e 20  yl@eng.sun.com. 
7260: 57 65 20 68 61 76 65 20 6e 6f 74 20 6f 62 73 65  We have not obse
7270: 72 76 65 64 20 74 68 69 73 0a 20 20 20 20 23 20  rved this.    # 
7280: 66 61 69 6c 75 72 65 20 6f 6e 20 53 6f 6c 61 72  failure on Solar
7290: 69 73 20 32 2e 35 2c 20 73 6f 20 61 6e 6f 74 68  is 2.5, so anoth
72a0: 65 72 20 6f 70 74 69 6f 6e 20 28 69 6e 73 74 65  er option (inste
72b0: 61 64 20 6f 66 20 69 6e 73 74 61 6c 6c 69 6e 67  ad of installing
72c0: 0a 20 20 20 20 23 20 74 68 65 73 65 20 70 61 74  .    # these pat
72d0: 63 68 65 73 29 20 69 73 20 74 6f 20 75 70 67 72  ches) is to upgr
72e0: 61 64 65 20 74 6f 20 53 6f 6c 61 72 69 73 20 32  ade to Solaris 2
72f0: 2e 35 2e 0a 20 20 20 20 73 65 74 20 73 20 5b 74  .5..    set s [t
7300: 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63  ls::socket \..-c
7310: 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43  ertfile $serverC
7320: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
7330: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65  ert -keyfile $se
7340: 72 76 65 72 4b 65 79 20 5c 0a 20 20 20 20 09 2d  rverKey \.    .-
7350: 73 65 72 76 65 72 20 61 63 63 65 70 74 20 38 38  server accept 88
7360: 33 30 5d 0a 20 20 20 20 70 72 6f 63 20 61 63 63  30].    proc acc
7370: 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a 09 67  ept {s a p} {..g
7380: 6c 6f 62 61 6c 20 78 0a 09 70 75 74 73 20 24 73  lobal x..puts $s
7390: 20 62 79 65 0a 09 63 6c 6f 73 65 20 24 73 0a 09   bye..close $s..
73a0: 73 65 74 20 78 20 64 6f 6e 65 0a 20 20 20 20 7d  set x done.    }
73b0: 0a 20 20 20 20 73 65 74 20 73 31 20 5b 74 6c 73  .    set s1 [tls
73c0: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72  ::socket \..-cer
73d0: 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72  tfile $clientCer
73e0: 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72  t -cafile $caCer
73f0: 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65  t -keyfile $clie
7400: 6e 74 4b 65 79 20 5c 0a 09 2d 61 73 79 6e 63 20  ntKey \..-async 
7410: 5b 69 6e 66 6f 20 68 6f 73 74 6e 61 6d 65 5d 20  [info hostname] 
7420: 38 38 33 30 5d 0a 20 20 20 20 76 77 61 69 74 20  8830].    vwait 
7430: 78 0a 20 20 20 20 73 65 74 20 7a 20 5b 67 65 74  x.    set z [get
7440: 73 20 24 73 31 5d 0a 20 20 20 20 63 6c 6f 73 65  s $s1].    close
7450: 20 24 73 0a 20 20 20 20 63 6c 6f 73 65 20 24 73   $s.    close $s
7460: 31 0a 20 20 20 20 73 65 74 20 7a 0a 7d 20 62 79  1.    set z.} by
7470: 65 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 39 2e  e..test tlsIO-9.
7480: 31 20 7b 74 65 73 74 69 6e 67 20 73 70 75 72 69  1 {testing spuri
7490: 6f 75 73 20 65 76 65 6e 74 73 7d 20 7b 75 6e 65  ous events} {une
74a0: 78 70 6c 61 69 6e 65 64 48 61 6e 67 20 73 6f 63  xplainedHang soc
74b0: 6b 65 74 7d 20 7b 0a 20 20 20 20 23 20 6c 6f 63  ket} {.    # loc
74c0: 6b 73 20 75 70 20 0a 20 20 20 20 73 65 74 20 6c  ks up .    set l
74d0: 65 6e 20 30 0a 20 20 20 20 73 65 74 20 73 70 75  en 0.    set spu
74e0: 72 69 6f 75 73 20 30 0a 20 20 20 20 73 65 74 20  rious 0.    set 
74f0: 64 6f 6e 65 20 30 0a 20 20 20 20 70 72 6f 63 20  done 0.    proc 
7500: 72 65 61 64 6c 69 74 74 6c 65 20 7b 73 7d 20 7b  readlittle {s} {
7510: 0a 09 67 6c 6f 62 61 6c 20 73 70 75 72 69 6f 75  ..global spuriou
7520: 73 20 64 6f 6e 65 20 6c 65 6e 0a 09 73 65 74 20  s done len..set 
7530: 6c 20 5b 72 65 61 64 20 24 73 20 31 5d 0a 09 69  l [read $s 1]..i
7540: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
7550: 68 20 24 6c 5d 20 3d 3d 20 30 7d 20 7b 0a 09 20  h $l] == 0} {.. 
7560: 20 20 20 69 66 20 7b 21 5b 65 6f 66 20 24 73 5d     if {![eof $s]
7570: 7d 20 7b 0a 09 09 69 6e 63 72 20 73 70 75 72 69  } {...incr spuri
7580: 6f 75 73 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  ous..    } else 
7590: 7b 0a 09 09 63 6c 6f 73 65 20 24 73 0a 09 09 73  {...close $s...s
75a0: 65 74 20 64 6f 6e 65 20 31 0a 09 20 20 20 20 7d  et done 1..    }
75b0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
75c0: 69 6e 63 72 20 6c 65 6e 20 5b 73 74 72 69 6e 67  incr len [string
75d0: 20 6c 65 6e 67 74 68 20 24 6c 5d 0a 09 7d 0a 20   length $l]..}. 
75e0: 20 20 20 7d 0a 20 20 20 20 70 72 6f 63 20 61 63     }.    proc ac
75f0: 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a 09  cept {s a p} {..
7600: 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62  fconfigure $s -b
7610: 75 66 66 65 72 69 6e 67 20 6e 6f 6e 65 20 2d 62  uffering none -b
7620: 6c 6f 63 6b 69 6e 67 20 6f 66 66 0a 09 66 69 6c  locking off..fil
7630: 65 65 76 65 6e 74 20 24 73 20 72 65 61 64 61 62  eevent $s readab
7640: 6c 65 20 5b 6c 69 73 74 20 72 65 61 64 6c 69 74  le [list readlit
7650: 74 6c 65 20 24 73 5d 0a 20 20 20 20 7d 0a 20 20  tle $s].    }.  
7660: 20 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f    set s [tls::so
7670: 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74 66 69 6c  cket \..-certfil
7680: 65 20 24 73 65 72 76 65 72 43 65 72 74 20 2d 63  e $serverCert -c
7690: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b  afile $caCert -k
76a0: 65 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65  eyfile $serverKe
76b0: 79 20 5c 0a 20 20 20 09 2d 73 65 72 76 65 72 20  y \.   .-server 
76c0: 61 63 63 65 70 74 20 38 38 33 31 5d 0a 20 20 20  accept 8831].   
76d0: 20 73 65 74 20 63 20 5b 74 6c 73 3a 3a 73 6f 63   set c [tls::soc
76e0: 6b 65 74 20 5c 0a 09 2d 63 65 72 74 66 69 6c 65  ket \..-certfile
76f0: 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61   $clientCert -ca
7700: 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65  file $caCert -ke
7710: 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79  yfile $clientKey
7720: 20 5c 0a 20 20 20 20 09 5b 69 6e 66 6f 20 68 6f   \.    .[info ho
7730: 73 74 6e 61 6d 65 5d 20 38 38 33 31 5d 0a 20 20  stname] 8831].  
7740: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
7750: 65 20 24 63 20 30 31 32 33 34 35 36 37 38 39 30  e $c 01234567890
7760: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
7770: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
7780: 33 34 35 36 37 38 39 0a 20 20 20 20 63 6c 6f 73  3456789.    clos
7790: 65 20 24 63 0a 20 20 20 20 73 65 74 20 74 69 6d  e $c.    set tim
77a0: 65 72 20 5b 61 66 74 65 72 20 31 30 30 30 30 20  er [after 10000 
77b0: 22 73 65 74 20 64 6f 6e 65 20 74 69 6d 65 64 5f  "set done timed_
77c0: 6f 75 74 22 5d 0a 20 20 20 20 76 77 61 69 74 20  out"].    vwait 
77d0: 64 6f 6e 65 0a 20 20 20 20 61 66 74 65 72 20 63  done.    after c
77e0: 61 6e 63 65 6c 20 24 74 69 6d 65 72 0a 20 20 20  ancel $timer.   
77f0: 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 6c 69   close $s.    li
7800: 73 74 20 24 73 70 75 72 69 6f 75 73 20 24 6c 65  st $spurious $le
7810: 6e 0a 7d 20 7b 30 20 35 30 7d 0a 0a 74 65 73 74  n.} {0 50}..test
7820: 20 74 6c 73 49 4f 2d 39 2e 32 20 7b 74 65 73 74   tlsIO-9.2 {test
7830: 69 6e 67 20 61 73 79 6e 63 20 77 72 69 74 65 2c  ing async write,
7840: 20 66 69 6c 65 65 76 65 6e 74 73 2c 20 66 6c 75   fileevents, flu
7850: 73 68 20 6f 6e 20 63 6c 6f 73 65 7d 20 7b 73 6f  sh on close} {so
7860: 63 6b 65 74 7d 20 7b 0a 20 20 20 20 73 65 74 20  cket} {.    set 
7870: 66 69 72 73 74 62 6c 6f 63 6b 20 22 22 0a 20 20  firstblock "".  
7880: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
7890: 7b 24 69 20 3c 20 35 7d 20 7b 69 6e 63 72 20 69  {$i < 5} {incr i
78a0: 7d 20 7b 73 65 74 20 66 69 72 73 74 62 6c 6f 63  } {set firstbloc
78b0: 6b 20 22 61 24 66 69 72 73 74 62 6c 6f 63 6b 24  k "a$firstblock$
78c0: 66 69 72 73 74 62 6c 6f 63 6b 22 7d 0a 20 20 20  firstblock"}.   
78d0: 20 73 65 74 20 73 65 63 6f 6e 64 62 6c 6f 63 6b   set secondblock
78e0: 20 22 22 0a 20 20 20 20 66 6f 72 20 7b 73 65 74   "".    for {set
78f0: 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 36 7d 20   i 0} {$i < 16} 
7900: 7b 69 6e 63 72 20 69 7d 20 7b 0a 09 73 65 74 20  {incr i} {..set 
7910: 73 65 63 6f 6e 64 62 6c 6f 63 6b 20 22 62 24 73  secondblock "b$s
7920: 65 63 6f 6e 64 62 6c 6f 63 6b 24 73 65 63 6f 6e  econdblock$secon
7930: 64 62 6c 6f 63 6b 22 0a 20 20 20 20 7d 0a 20 20  dblock".    }.  
7940: 20 20 73 65 74 20 6c 20 5b 74 6c 73 3a 3a 73 6f    set l [tls::so
7950: 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74 66 69 6c  cket \..-certfil
7960: 65 20 24 73 65 72 76 65 72 43 65 72 74 20 2d 63  e $serverCert -c
7970: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b  afile $caCert -k
7980: 65 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65  eyfile $serverKe
7990: 79 20 5c 0a 20 20 20 20 09 2d 73 65 72 76 65 72  y \.    .-server
79a0: 20 61 63 63 65 70 74 20 38 38 33 32 5d 0a 20 20   accept 8832].  
79b0: 20 20 70 72 6f 63 20 61 63 63 65 70 74 20 7b 73    proc accept {s
79c0: 20 61 20 70 7d 20 7b 0a 09 66 63 6f 6e 66 69 67   a p} {..fconfig
79d0: 75 72 65 20 24 73 20 2d 62 6c 6f 63 6b 69 6e 67  ure $s -blocking
79e0: 20 30 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20   0 -translation 
79f0: 6c 66 20 2d 62 75 66 66 65 72 73 69 7a 65 20 31  lf -buffersize 1
7a00: 36 33 38 34 20 5c 0a 09 09 2d 62 75 66 66 65 72  6384 \...-buffer
7a10: 69 6e 67 20 6c 69 6e 65 0a 09 66 69 6c 65 65 76  ing line..fileev
7a20: 65 6e 74 20 24 73 20 72 65 61 64 61 62 6c 65 20  ent $s readable 
7a30: 22 72 65 61 64 61 62 6c 65 20 24 73 22 0a 20 20  "readable $s".  
7a40: 20 20 7d 0a 20 20 20 20 70 72 6f 63 20 72 65 61    }.    proc rea
7a50: 64 61 62 6c 65 20 7b 73 7d 20 7b 0a 09 73 65 74  dable {s} {..set
7a60: 20 6c 20 5b 67 65 74 73 20 24 73 5d 0a 09 66 69   l [gets $s]..fi
7a70: 6c 65 65 76 65 6e 74 20 24 73 20 72 65 61 64 61  leevent $s reada
7a80: 62 6c 65 20 7b 7d 0a 09 61 66 74 65 72 20 31 30  ble {}..after 10
7a90: 30 30 20 72 65 73 70 6f 6e 64 20 24 73 0a 20 20  00 respond $s.  
7aa0: 20 20 7d 0a 20 20 20 20 70 72 6f 63 20 72 65 73    }.    proc res
7ab0: 70 6f 6e 64 20 7b 73 7d 20 7b 0a 09 67 6c 6f 62  pond {s} {..glob
7ac0: 61 6c 20 66 69 72 73 74 62 6c 6f 63 6b 0a 09 70  al firstblock..p
7ad0: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
7ae0: 73 20 24 66 69 72 73 74 62 6c 6f 63 6b 0a 09 61  s $firstblock..a
7af0: 66 74 65 72 20 31 30 30 30 20 77 72 69 74 65 64  fter 1000 writed
7b00: 61 74 61 20 24 73 0a 20 20 20 20 7d 0a 20 20 20  ata $s.    }.   
7b10: 20 70 72 6f 63 20 77 72 69 74 65 64 61 74 61 20   proc writedata 
7b20: 7b 73 7d 20 7b 0a 09 67 6c 6f 62 61 6c 20 73 65  {s} {..global se
7b30: 63 6f 6e 64 62 6c 6f 63 6b 0a 09 70 75 74 73 20  condblock..puts 
7b40: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 73 20 24 73  -nonewline $s $s
7b50: 65 63 6f 6e 64 62 6c 6f 63 6b 0a 09 63 6c 6f 73  econdblock..clos
7b60: 65 20 24 73 0a 20 20 20 20 7d 0a 20 20 20 20 73  e $s.    }.    s
7b70: 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65  et s [tls::socke
7b80: 74 20 5c 0a 09 2d 63 65 72 74 66 69 6c 65 20 24  t \..-certfile $
7b90: 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69  clientCert -cafi
7ba0: 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66  le $caCert -keyf
7bb0: 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c  ile $clientKey \
7bc0: 0a 20 20 20 20 09 5b 69 6e 66 6f 20 68 6f 73 74  .    .[info host
7bd0: 6e 61 6d 65 5d 20 38 38 33 32 5d 0a 20 20 20 20  name] 8832].    
7be0: 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62  fconfigure $s -b
7bf0: 6c 6f 63 6b 69 6e 67 20 30 20 2d 74 72 61 6e 73  locking 0 -trans
7c00: 20 6c 66 20 2d 62 75 66 66 65 72 69 6e 67 20 6c   lf -buffering l
7c10: 69 6e 65 0a 20 20 20 20 73 65 74 20 63 6f 75 6e  ine.    set coun
7c20: 74 20 30 0a 20 20 20 20 70 75 74 73 20 24 73 20  t 0.    puts $s 
7c30: 68 65 6c 6c 6f 0a 20 20 20 20 70 72 6f 63 20 72  hello.    proc r
7c40: 65 61 64 69 74 20 7b 73 7d 20 7b 0a 09 67 6c 6f  eadit {s} {..glo
7c50: 62 61 6c 20 63 6f 75 6e 74 20 64 6f 6e 65 0a 09  bal count done..
7c60: 73 65 74 20 6c 20 5b 72 65 61 64 20 24 73 5d 0a  set l [read $s].
7c70: 09 69 6e 63 72 20 63 6f 75 6e 74 20 5b 73 74 72  .incr count [str
7c80: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6c 5d 0a 09  ing length $l]..
7c90: 69 66 20 7b 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a  if {[eof $s]} {.
7ca0: 09 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 09 20  .    close $s.. 
7cb0: 20 20 20 73 65 74 20 64 6f 6e 65 20 31 0a 09 7d     set done 1..}
7cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 65  .    }.    filee
7cd0: 76 65 6e 74 20 24 73 20 72 65 61 64 61 62 6c 65  vent $s readable
7ce0: 20 22 72 65 61 64 69 74 20 24 73 22 0a 20 20 20   "readit $s".   
7cf0: 20 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65   set timer [afte
7d00: 72 20 31 30 30 30 30 20 22 73 65 74 20 64 6f 6e  r 10000 "set don
7d10: 65 20 74 69 6d 65 64 5f 6f 75 74 22 5d 0a 20 20  e timed_out"].  
7d20: 20 20 76 77 61 69 74 20 64 6f 6e 65 0a 20 20 20    vwait done.   
7d30: 20 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74   after cancel $t
7d40: 69 6d 65 72 0a 20 20 20 20 63 6c 6f 73 65 20 24  imer.    close $
7d50: 6c 0a 20 20 20 20 73 65 74 20 63 6f 75 6e 74 0a  l.    set count.
7d60: 7d 20 36 35 35 36 36 0a 0a 74 65 73 74 20 74 6c  } 65566..test tl
7d70: 73 49 4f 2d 39 2e 33 20 7b 74 65 73 74 69 6e 67  sIO-9.3 {testing
7d80: 20 45 4f 46 20 73 74 69 63 6b 79 6e 65 73 73 7d   EOF stickyness}
7d90: 20 7b 75 6e 65 78 70 6c 61 69 6e 65 64 48 61 6e   {unexplainedHan
7da0: 67 20 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20  g socket} {.    
7db0: 23 20 68 61 6e 67 73 0a 20 20 20 20 70 72 6f 63  # hangs.    proc
7dc0: 20 63 6f 75 6e 74 5f 74 6f 5f 65 6f 66 20 7b 73   count_to_eof {s
7dd0: 7d 20 7b 0a 09 67 6c 6f 62 61 6c 20 63 6f 75 6e  } {..global coun
7de0: 74 20 64 6f 6e 65 20 74 69 6d 65 72 0a 09 73 65  t done timer..se
7df0: 74 20 6c 20 5b 67 65 74 73 20 24 73 5d 0a 09 69  t l [gets $s]..i
7e00: 66 20 7b 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a 09  f {[eof $s]} {..
7e10: 20 20 20 20 69 6e 63 72 20 63 6f 75 6e 74 0a 09      incr count..
7e20: 20 20 20 20 69 66 20 7b 24 63 6f 75 6e 74 20 3e      if {$count >
7e30: 20 39 7d 20 7b 0a 09 09 63 6c 6f 73 65 20 24 73   9} {...close $s
7e40: 0a 09 09 73 65 74 20 64 6f 6e 65 20 74 72 75 65  ...set done true
7e50: 0a 09 09 73 65 74 20 63 6f 75 6e 74 20 7b 65 6f  ...set count {eo
7e60: 66 20 69 73 20 73 74 69 63 6b 79 7d 0a 09 09 61  f is sticky}...a
7e70: 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74 69 6d  fter cancel $tim
7e80: 65 72 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  er..    }..}.   
7e90: 20 7d 0a 20 20 20 20 70 72 6f 63 20 74 69 6d 65   }.    proc time
7ea0: 72 70 72 6f 63 20 7b 7d 20 7b 0a 09 67 6c 6f 62  rproc {} {..glob
7eb0: 61 6c 20 64 6f 6e 65 20 63 6f 75 6e 74 20 63 0a  al done count c.
7ec0: 09 73 65 74 20 64 6f 6e 65 20 74 72 75 65 0a 09  .set done true..
7ed0: 73 65 74 20 63 6f 75 6e 74 20 7b 74 69 6d 65 72  set count {timer
7ee0: 20 77 65 6e 74 20 6f 66 66 2c 20 65 6f 66 20 69   went off, eof i
7ef0: 73 20 6e 6f 74 20 73 74 69 63 6b 79 7d 0a 09 63  s not sticky}..c
7f00: 6c 6f 73 65 20 24 63 0a 20 20 20 20 7d 09 0a 20  lose $c.    }.. 
7f10: 20 20 20 73 65 74 20 63 6f 75 6e 74 20 30 0a 20     set count 0. 
7f20: 20 20 20 73 65 74 20 64 6f 6e 65 20 66 61 6c 73     set done fals
7f30: 65 0a 20 20 20 20 70 72 6f 63 20 77 72 69 74 65  e.    proc write
7f40: 5f 74 68 65 6e 5f 63 6c 6f 73 65 20 7b 73 7d 20  _then_close {s} 
7f50: 7b 0a 09 70 75 74 73 20 24 73 20 62 79 65 0a 09  {..puts $s bye..
7f60: 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 7d 0a 20  close $s.    }. 
7f70: 20 20 20 70 72 6f 63 20 61 63 63 65 70 74 20 7b     proc accept {
7f80: 73 20 61 20 70 7d 20 7b 0a 09 66 63 6f 6e 66 69  s a p} {..fconfi
7f90: 67 75 72 65 20 24 73 20 2d 62 75 66 66 65 72 69  gure $s -bufferi
7fa0: 6e 67 20 6c 69 6e 65 20 2d 74 72 61 6e 73 6c 61  ng line -transla
7fb0: 74 69 6f 6e 20 6c 66 0a 09 66 69 6c 65 65 76 65  tion lf..fileeve
7fc0: 6e 74 20 24 73 20 77 72 69 74 61 62 6c 65 20 22  nt $s writable "
7fd0: 77 72 69 74 65 5f 74 68 65 6e 5f 63 6c 6f 73 65  write_then_close
7fe0: 20 24 73 22 0a 20 20 20 20 7d 0a 20 20 20 20 73   $s".    }.    s
7ff0: 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65  et s [tls::socke
8000: 74 20 5c 0a 09 2d 63 65 72 74 66 69 6c 65 20 24  t \..-certfile $
8010: 73 65 72 76 65 72 43 65 72 74 20 2d 63 61 66 69  serverCert -cafi
8020: 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66  le $caCert -keyf
8030: 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c  ile $serverKey \
8040: 0a 20 20 20 20 09 2d 73 65 72 76 65 72 20 61 63  .    .-server ac
8050: 63 65 70 74 20 38 38 33 33 5d 0a 20 20 20 20 73  cept 8833].    s
8060: 65 74 20 63 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65  et c [tls::socke
8070: 74 20 5c 0a 09 2d 63 65 72 74 66 69 6c 65 20 24  t \..-certfile $
8080: 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69  clientCert -cafi
8090: 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66  le $caCert -keyf
80a0: 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c  ile $clientKey \
80b0: 0a 20 20 20 20 09 5b 69 6e 66 6f 20 68 6f 73 74  .    .[info host
80c0: 6e 61 6d 65 5d 20 38 38 33 33 5d 0a 20 20 20 20  name] 8833].    
80d0: 66 63 6f 6e 66 69 67 75 72 65 20 24 63 20 2d 62  fconfigure $c -b
80e0: 6c 6f 63 6b 69 6e 67 20 6f 66 66 20 2d 62 75 66  locking off -buf
80f0: 66 65 72 69 6e 67 20 6c 69 6e 65 20 2d 74 72 61  fering line -tra
8100: 6e 73 6c 61 74 69 6f 6e 20 6c 66 0a 20 20 20 20  nslation lf.    
8110: 66 69 6c 65 65 76 65 6e 74 20 24 63 20 72 65 61  fileevent $c rea
8120: 64 61 62 6c 65 20 22 63 6f 75 6e 74 5f 74 6f 5f  dable "count_to_
8130: 65 6f 66 20 24 63 22 0a 20 20 20 20 73 65 74 20  eof $c".    set 
8140: 74 69 6d 65 72 20 5b 61 66 74 65 72 20 31 30 30  timer [after 100
8150: 30 20 74 69 6d 65 72 70 72 6f 63 5d 0a 20 20 20  0 timerproc].   
8160: 20 76 77 61 69 74 20 64 6f 6e 65 0a 20 20 20 20   vwait done.    
8170: 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 73 65 74  close $s.    set
8180: 20 63 6f 75 6e 74 0a 7d 20 7b 65 6f 66 20 69 73   count.} {eof is
8190: 20 73 74 69 63 6b 79 7d 0a 0a 72 65 6d 6f 76 65   sticky}..remove
81a0: 46 69 6c 65 20 73 63 72 69 70 74 0a 0a 74 65 73  File script..tes
81b0: 74 20 74 6c 73 49 4f 2d 31 30 2e 31 20 7b 74 65  t tlsIO-10.1 {te
81c0: 73 74 69 6e 67 20 73 6f 63 6b 65 74 20 61 63 63  sting socket acc
81d0: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 65 72 72  ept callback err
81e0: 6f 72 20 68 61 6e 64 6c 69 6e 67 7d 20 7b 73 6f  or handling} {so
81f0: 63 6b 65 74 7d 20 7b 0a 20 20 20 20 73 65 74 20  cket} {.    set 
8200: 67 6f 74 65 72 72 6f 72 20 30 0a 20 20 20 20 70  goterror 0.    p
8210: 72 6f 63 20 62 67 65 72 72 6f 72 20 61 72 67 73  roc bgerror args
8220: 20 7b 67 6c 6f 62 61 6c 20 67 6f 74 65 72 72 6f   {global goterro
8230: 72 3b 20 73 65 74 20 67 6f 74 65 72 72 6f 72 20  r; set goterror 
8240: 31 7d 0a 20 20 20 20 73 65 74 20 73 20 5b 74 6c  1}.    set s [tl
8250: 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65  s::socket \..-ce
8260: 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65  rtfile $serverCe
8270: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
8280: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72  rt -keyfile $ser
8290: 76 65 72 4b 65 79 20 5c 0a 20 20 20 20 09 2d 73  verKey \.    .-s
82a0: 65 72 76 65 72 20 61 63 63 65 70 74 20 38 38 39  erver accept 889
82b0: 38 5d 0a 20 20 20 20 70 72 6f 63 20 61 63 63 65  8].    proc acce
82c0: 70 74 20 7b 73 20 61 20 70 7d 20 7b 63 6c 6f 73  pt {s a p} {clos
82d0: 65 20 24 73 3b 20 65 72 72 6f 72 7d 0a 20 20 20  e $s; error}.   
82e0: 20 73 65 74 20 63 20 5b 74 6c 73 3a 3a 73 6f 63   set c [tls::soc
82f0: 6b 65 74 20 5c 0a 09 2d 63 65 72 74 66 69 6c 65  ket \..-certfile
8300: 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61   $clientCert -ca
8310: 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65  file $caCert -ke
8320: 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79  yfile $clientKey
8330: 20 5c 0a 09 31 32 37 2e 30 2e 30 2e 31 20 38 38   \..127.0.0.1 88
8340: 39 38 5d 0a 20 20 20 20 76 77 61 69 74 20 67 6f  98].    vwait go
8350: 74 65 72 72 6f 72 0a 20 20 20 20 63 6c 6f 73 65  terror.    close
8360: 20 24 73 0a 20 20 20 20 63 6c 6f 73 65 20 24 63   $s.    close $c
8370: 0a 20 20 20 20 73 65 74 20 67 6f 74 65 72 72 6f  .    set goterro
8380: 72 0a 7d 20 31 0a 0a 74 65 73 74 20 74 6c 73 49  r.} 1..test tlsI
8390: 4f 2d 31 31 2e 31 20 7b 74 63 70 20 63 6f 6e 6e  O-11.1 {tcp conn
83a0: 65 63 74 69 6f 6e 7d 20 7b 73 6f 63 6b 65 74 20  ection} {socket 
83b0: 64 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f 74  doTestsWithRemot
83c0: 65 53 65 72 76 65 72 7d 20 7b 0a 20 20 20 20 73  eServer} {.    s
83d0: 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20  endCommand "set 
83e0: 63 61 43 65 72 74 20 24 63 61 43 65 72 74 22 0a  caCert $caCert".
83f0: 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20      sendCommand 
8400: 22 73 65 74 20 73 65 72 76 65 72 43 65 72 74 20  "set serverCert 
8410: 24 73 65 72 76 65 72 43 65 72 74 22 0a 20 20 20  $serverCert".   
8420: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65   sendCommand "se
8430: 74 20 63 6c 69 65 6e 74 43 65 72 74 20 24 63 6c  t clientCert $cl
8440: 69 65 6e 74 43 65 72 74 22 0a 20 20 20 20 73 65  ientCert".    se
8450: 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73  ndCommand "set s
8460: 65 72 76 65 72 4b 65 79 20 24 73 65 72 76 65 72  erverKey $server
8470: 4b 65 79 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d  Key".    sendCom
8480: 6d 61 6e 64 20 22 73 65 74 20 63 6c 69 65 6e 74  mand "set client
8490: 4b 65 79 20 24 63 6c 69 65 6e 74 4b 65 79 22 0a  Key $clientKey".
84a0: 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20      sendCommand 
84b0: 7b 0a 09 73 65 74 20 73 6f 63 6b 65 74 39 5f 31  {..set socket9_1
84c0: 5f 74 65 73 74 5f 73 65 72 76 65 72 20 5b 74 6c  _test_server [tl
84d0: 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65  s::socket -serve
84e0: 72 20 61 63 63 65 70 74 20 5c 0a 09 09 2d 63 65  r accept \...-ce
84f0: 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65  rtfile $serverCe
8500: 72 74 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20 24  rt \...-cafile $
8510: 63 61 43 65 72 74 20 5c 0a 09 09 2d 6b 65 79 66  caCert \...-keyf
8520: 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c  ile $serverKey \
8530: 0a 09 09 38 38 33 34 5d 0a 09 70 72 6f 63 20 61  ...8834]..proc a
8540: 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a  ccept {s a p} {.
8550: 09 20 20 20 20 70 75 74 73 20 24 73 20 64 6f 6e  .    puts $s don
8560: 65 0a 09 20 20 20 20 74 6c 73 3a 3a 68 61 6e 64  e..    tls::hand
8570: 73 68 61 6b 65 20 24 73 0a 09 20 20 20 20 63 6c  shake $s..    cl
8580: 6f 73 65 20 24 73 0a 09 7d 0a 20 20 20 20 7d 0a  ose $s..}.    }.
8590: 20 20 20 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a      set s [tls::
85a0: 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63  socket \..    -c
85b0: 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43  ertfile $clientC
85c0: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
85d0: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c  ert -keyfile $cl
85e0: 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 24  ientKey \..    $
85f0: 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50 20 38  remoteServerIP 8
8600: 38 33 34 5d 0a 20 20 20 20 73 65 74 20 72 20 5b  834].    set r [
8610: 67 65 74 73 20 24 73 5d 0a 20 20 20 20 63 6c 6f  gets $s].    clo
8620: 73 65 20 24 73 0a 20 20 20 20 73 65 6e 64 43 6f  se $s.    sendCo
8630: 6d 6d 61 6e 64 20 7b 63 6c 6f 73 65 20 24 73 6f  mmand {close $so
8640: 63 6b 65 74 39 5f 31 5f 74 65 73 74 5f 73 65 72  cket9_1_test_ser
8650: 76 65 72 7d 0a 20 20 20 20 73 65 74 20 72 0a 7d  ver}.    set r.}
8660: 20 64 6f 6e 65 0a 0a 74 65 73 74 20 74 6c 73 49   done..test tlsI
8670: 4f 2d 31 31 2e 32 20 7b 63 6c 69 65 6e 74 20 73  O-11.2 {client s
8680: 70 65 63 69 66 69 65 73 20 69 74 73 20 70 6f 72  pecifies its por
8690: 74 7d 20 7b 73 6f 63 6b 65 74 20 64 6f 54 65 73  t} {socket doTes
86a0: 74 73 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76  tsWithRemoteServ
86b0: 65 72 7d 20 7b 0a 20 20 20 20 73 65 6e 64 43 6f  er} {.    sendCo
86c0: 6d 6d 61 6e 64 20 22 73 65 74 20 63 61 43 65 72  mmand "set caCer
86d0: 74 20 24 63 61 43 65 72 74 22 0a 20 20 20 20 73  t $caCert".    s
86e0: 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20  endCommand "set 
86f0: 73 65 72 76 65 72 43 65 72 74 20 24 73 65 72 76  serverCert $serv
8700: 65 72 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64  erCert".    send
8710: 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c 69  Command "set cli
8720: 65 6e 74 43 65 72 74 20 24 63 6c 69 65 6e 74 43  entCert $clientC
8730: 65 72 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d  ert".    sendCom
8740: 6d 61 6e 64 20 22 73 65 74 20 73 65 72 76 65 72  mand "set server
8750: 4b 65 79 20 24 73 65 72 76 65 72 4b 65 79 22 0a  Key $serverKey".
8760: 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20      sendCommand 
8770: 22 73 65 74 20 63 6c 69 65 6e 74 4b 65 79 20 24  "set clientKey $
8780: 63 6c 69 65 6e 74 4b 65 79 22 0a 20 20 20 20 69  clientKey".    i
8790: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
87a0: 70 6f 72 74 5d 7d 20 7b 0a 09 69 6e 63 72 20 70  port]} {..incr p
87b0: 6f 72 74 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ort.    } else {
87c0: 0a 09 73 65 74 20 70 6f 72 74 20 5b 65 78 70 72  ..set port [expr
87d0: 20 24 74 6c 73 53 65 72 76 65 72 50 6f 72 74 20   $tlsServerPort 
87e0: 2b 20 5b 70 69 64 5d 25 31 30 32 34 5d 0a 20 20  + [pid]%1024].  
87f0: 20 20 7d 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d    }.    sendComm
8800: 61 6e 64 20 7b 0a 09 73 65 74 20 73 6f 63 6b 65  and {..set socke
8810: 74 39 5f 32 5f 74 65 73 74 5f 73 65 72 76 65 72  t9_2_test_server
8820: 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73   [tls::socket -s
8830: 65 72 76 65 72 20 61 63 63 65 70 74 20 5c 0a 09  erver accept \..
8840: 09 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72 76  .-certfile $serv
8850: 65 72 43 65 72 74 20 5c 0a 09 09 2d 63 61 66 69  erCert \...-cafi
8860: 6c 65 20 24 63 61 43 65 72 74 20 5c 0a 09 09 2d  le $caCert \...-
8870: 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b  keyfile $serverK
8880: 65 79 20 5c 0a 09 20 20 20 20 38 38 33 35 5d 0a  ey \..    8835].
8890: 09 70 72 6f 63 20 61 63 63 65 70 74 20 7b 73 20  .proc accept {s 
88a0: 61 20 70 7d 20 7b 0a 09 20 20 20 20 74 6c 73 3a  a p} {..    tls:
88b0: 3a 68 61 6e 64 73 68 61 6b 65 20 24 73 0a 09 20  :handshake $s.. 
88c0: 20 20 20 70 75 74 73 20 24 73 20 24 70 0a 09 20     puts $s $p.. 
88d0: 20 20 20 63 6c 6f 73 65 20 24 73 0a 09 7d 0a 20     close $s..}. 
88e0: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 73 20 5b     }.    set s [
88f0: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20  tls::socket \.. 
8900: 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c     -certfile $cl
8910: 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65  ientCert -cafile
8920: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
8930: 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09  e $clientKey \..
8940: 20 20 20 20 2d 6d 79 70 6f 72 74 20 24 70 6f 72      -myport $por
8950: 74 20 24 72 65 6d 6f 74 65 53 65 72 76 65 72 49  t $remoteServerI
8960: 50 20 38 38 33 35 5d 0a 20 20 20 20 73 65 74 20  P 8835].    set 
8970: 72 20 5b 67 65 74 73 20 24 73 5d 0a 20 20 20 20  r [gets $s].    
8980: 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 73 65 6e  close $s.    sen
8990: 64 43 6f 6d 6d 61 6e 64 20 7b 63 6c 6f 73 65 20  dCommand {close 
89a0: 24 73 6f 63 6b 65 74 39 5f 32 5f 74 65 73 74 5f  $socket9_2_test_
89b0: 73 65 72 76 65 72 7d 0a 20 20 20 20 69 66 20 7b  server}.    if {
89c0: 24 72 20 3d 3d 20 24 70 6f 72 74 7d 20 7b 0a 09  $r == $port} {..
89d0: 73 65 74 20 72 65 73 75 6c 74 20 6f 6b 0a 20 20  set result ok.  
89e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 65 74 20    } else {..set 
89f0: 72 65 73 75 6c 74 20 62 72 6f 6b 65 6e 0a 20 20  result broken.  
8a00: 20 20 7d 0a 20 20 20 20 73 65 74 20 72 65 73 75    }.    set resu
8a10: 6c 74 0a 7d 20 6f 6b 0a 74 65 73 74 20 74 6c 73  lt.} ok.test tls
8a20: 49 4f 2d 31 31 2e 33 20 7b 74 72 79 69 6e 67 20  IO-11.3 {trying 
8a30: 74 6f 20 63 6f 6e 6e 65 63 74 2c 20 6e 6f 20 73  to connect, no s
8a40: 65 72 76 65 72 7d 20 7b 73 6f 63 6b 65 74 20 64  erver} {socket d
8a50: 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65  oTestsWithRemote
8a60: 53 65 72 76 65 72 7d 20 7b 0a 20 20 20 20 73 65  Server} {.    se
8a70: 74 20 73 74 61 74 75 73 20 6f 6b 0a 20 20 20 20  t status ok.    
8a80: 69 66 20 7b 21 5b 63 61 74 63 68 20 7b 73 65 74  if {![catch {set
8a90: 20 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20   s [tls::socket 
8aa0: 5c 0a 09 20 20 20 20 2d 63 65 72 74 66 69 6c 65  \..    -certfile
8ab0: 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61   $clientCert -ca
8ac0: 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65  file $caCert -ke
8ad0: 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79  yfile $clientKey
8ae0: 20 5c 0a 09 20 20 20 20 24 72 65 6d 6f 74 65 53   \..    $remoteS
8af0: 65 72 76 65 72 49 70 20 38 38 33 36 5d 7d 5d 7d  erverIp 8836]}]}
8b00: 20 7b 0a 09 69 66 20 7b 21 5b 63 61 74 63 68 20   {..if {![catch 
8b10: 7b 67 65 74 73 20 24 73 7d 5d 7d 20 7b 0a 09 20  {gets $s}]} {.. 
8b20: 20 20 20 73 65 74 20 73 74 61 74 75 73 20 62 72     set status br
8b30: 6f 6b 65 6e 0a 09 7d 0a 09 63 6c 6f 73 65 20 24  oken..}..close $
8b40: 73 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20  s.    }.    set 
8b50: 73 74 61 74 75 73 0a 7d 20 6f 6b 0a 0a 74 65 73  status.} ok..tes
8b60: 74 20 74 6c 73 49 4f 2d 31 31 2e 34 20 7b 72 65  t tlsIO-11.4 {re
8b70: 6d 6f 74 65 20 65 63 68 6f 2c 20 6f 6e 65 20 6c  mote echo, one l
8b80: 69 6e 65 7d 20 7b 73 6f 63 6b 65 74 20 64 6f 54  ine} {socket doT
8b90: 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65 53 65  estsWithRemoteSe
8ba0: 72 76 65 72 7d 20 7b 0a 20 20 20 20 73 65 6e 64  rver} {.    send
8bb0: 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 61 43  Command "set caC
8bc0: 65 72 74 20 24 63 61 43 65 72 74 22 0a 20 20 20  ert $caCert".   
8bd0: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65   sendCommand "se
8be0: 74 20 73 65 72 76 65 72 43 65 72 74 20 24 73 65  t serverCert $se
8bf0: 72 76 65 72 43 65 72 74 22 0a 20 20 20 20 73 65  rverCert".    se
8c00: 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63  ndCommand "set c
8c10: 6c 69 65 6e 74 43 65 72 74 20 24 63 6c 69 65 6e  lientCert $clien
8c20: 74 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64 43  tCert".    sendC
8c30: 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73 65 72 76  ommand "set serv
8c40: 65 72 4b 65 79 20 24 73 65 72 76 65 72 4b 65 79  erKey $serverKey
8c50: 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e  ".    sendComman
8c60: 64 20 22 73 65 74 20 63 6c 69 65 6e 74 4b 65 79  d "set clientKey
8c70: 20 24 63 6c 69 65 6e 74 4b 65 79 22 0a 20 20 20   $clientKey".   
8c80: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 0a 20   sendCommand {. 
8c90: 20 20 20 09 67 6c 6f 62 61 6c 20 73 65 72 76 65     .global serve
8ca0: 72 43 65 72 74 0a 09 67 6c 6f 62 61 6c 20 63 61  rCert..global ca
8cb0: 43 65 72 74 0a 09 67 6c 6f 62 61 6c 20 73 65 72  Cert..global ser
8cc0: 76 65 72 4b 65 79 0a 09 73 65 74 20 73 6f 63 6b  verKey..set sock
8cd0: 65 74 31 30 5f 36 5f 74 65 73 74 5f 73 65 72 76  et10_6_test_serv
8ce0: 65 72 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  er [tls::socket 
8cf0: 5c 0a 09 09 2d 63 65 72 74 66 69 6c 65 20 24 73  \...-certfile $s
8d00: 65 72 76 65 72 43 65 72 74 20 5c 0a 09 09 2d 63  erverCert \...-c
8d10: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a  afile $caCert \.
8d20: 09 09 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76  ..-keyfile $serv
8d30: 65 72 4b 65 79 20 5c 0a 09 09 2d 73 65 72 76 65  erKey \...-serve
8d40: 72 20 61 63 63 65 70 74 20 38 38 33 36 5d 0a 09  r accept 8836]..
8d50: 70 72 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61  proc accept {s a
8d60: 20 70 7d 20 7b 0a 09 20 20 20 20 74 6c 73 3a 3a   p} {..    tls::
8d70: 68 61 6e 64 73 68 61 6b 65 20 24 73 0a 09 20 20  handshake $s..  
8d80: 20 20 66 69 6c 65 65 76 65 6e 74 20 24 73 20 72    fileevent $s r
8d90: 65 61 64 61 62 6c 65 20 5b 6c 69 73 74 20 65 63  eadable [list ec
8da0: 68 6f 20 24 73 5d 0a 09 20 20 20 20 66 63 6f 6e  ho $s]..    fcon
8db0: 66 69 67 75 72 65 20 24 73 20 2d 62 75 66 66 65  figure $s -buffe
8dc0: 72 69 6e 67 20 6c 69 6e 65 20 2d 74 72 61 6e 73  ring line -trans
8dd0: 6c 61 74 69 6f 6e 20 63 72 6c 66 0a 09 7d 0a 09  lation crlf..}..
8de0: 70 72 6f 63 20 65 63 68 6f 20 7b 73 7d 20 7b 0a  proc echo {s} {.
8df0: 09 20 20 20 20 73 65 74 20 6c 20 5b 67 65 74 73  .    set l [gets
8e00: 20 24 73 5d 0a 09 20 20 20 20 69 66 20 7b 5b 65   $s]..    if {[e
8e10: 6f 66 20 24 73 5d 7d 20 7b 0a 09 09 63 6c 6f 73  of $s]} {...clos
8e20: 65 20 24 73 0a 09 20 20 20 20 7d 20 65 6c 73 65  e $s..    } else
8e30: 20 7b 0a 09 09 70 75 74 73 20 24 73 20 24 6c 0a   {...puts $s $l.
8e40: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
8e50: 20 20 20 20 73 65 74 20 66 20 5b 74 6c 73 3a 3a      set f [tls::
8e60: 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63  socket \..    -c
8e70: 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43  ertfile $clientC
8e80: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
8e90: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c  ert -keyfile $cl
8ea0: 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 24  ientKey \..    $
8eb0: 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50 20 38  remoteServerIP 8
8ec0: 38 33 36 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67  836].    fconfig
8ed0: 75 72 65 20 24 66 20 2d 74 72 61 6e 73 6c 61 74  ure $f -translat
8ee0: 69 6f 6e 20 63 72 6c 66 20 2d 62 75 66 66 65 72  ion crlf -buffer
8ef0: 69 6e 67 20 6c 69 6e 65 0a 20 20 20 20 70 75 74  ing line.    put
8f00: 73 20 24 66 20 68 65 6c 6c 6f 0a 20 20 20 20 73  s $f hello.    s
8f10: 65 74 20 72 20 5b 67 65 74 73 20 24 66 5d 0a 20  et r [gets $f]. 
8f20: 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20     close $f.    
8f30: 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 63 6c 6f  sendCommand {clo
8f40: 73 65 20 24 73 6f 63 6b 65 74 31 30 5f 36 5f 74  se $socket10_6_t
8f50: 65 73 74 5f 73 65 72 76 65 72 7d 0a 20 20 20 20  est_server}.    
8f60: 73 65 74 20 72 0a 7d 20 68 65 6c 6c 6f 0a 0a 74  set r.} hello..t
8f70: 65 73 74 20 74 6c 73 49 4f 2d 31 31 2e 35 20 7b  est tlsIO-11.5 {
8f80: 72 65 6d 6f 74 65 20 65 63 68 6f 2c 20 35 30 20  remote echo, 50 
8f90: 6c 69 6e 65 73 7d 20 7b 73 6f 63 6b 65 74 20 64  lines} {socket d
8fa0: 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65  oTestsWithRemote
8fb0: 53 65 72 76 65 72 7d 20 7b 0a 20 20 20 20 73 65  Server} {.    se
8fc0: 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63  ndCommand "set c
8fd0: 61 43 65 72 74 20 24 63 61 43 65 72 74 22 0a 20  aCert $caCert". 
8fe0: 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22     sendCommand "
8ff0: 73 65 74 20 73 65 72 76 65 72 43 65 72 74 20 24  set serverCert $
9000: 73 65 72 76 65 72 43 65 72 74 22 0a 20 20 20 20  serverCert".    
9010: 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74  sendCommand "set
9020: 20 63 6c 69 65 6e 74 43 65 72 74 20 24 63 6c 69   clientCert $cli
9030: 65 6e 74 43 65 72 74 22 0a 20 20 20 20 73 65 6e  entCert".    sen
9040: 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73 65  dCommand "set se
9050: 72 76 65 72 4b 65 79 20 24 73 65 72 76 65 72 4b  rverKey $serverK
9060: 65 79 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  ey".    sendComm
9070: 61 6e 64 20 22 73 65 74 20 63 6c 69 65 6e 74 4b  and "set clientK
9080: 65 79 20 24 63 6c 69 65 6e 74 4b 65 79 22 0a 20  ey $clientKey". 
9090: 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b     sendCommand {
90a0: 0a 09 73 65 74 20 73 6f 63 6b 65 74 31 30 5f 37  ..set socket10_7
90b0: 5f 74 65 73 74 5f 73 65 72 76 65 72 20 5b 74 6c  _test_server [tl
90c0: 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65  s::socket -serve
90d0: 72 20 61 63 63 65 70 74 20 5c 0a 09 09 2d 63 65  r accept \...-ce
90e0: 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65  rtfile $serverCe
90f0: 72 74 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20 24  rt \...-cafile $
9100: 63 61 43 65 72 74 20 5c 0a 09 09 2d 6b 65 79 66  caCert \...-keyf
9110: 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c  ile $serverKey \
9120: 0a 09 09 38 38 33 36 5d 0a 09 70 72 6f 63 20 61  ...8836]..proc a
9130: 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a  ccept {s a p} {.
9140: 09 20 20 20 20 74 6c 73 3a 3a 68 61 6e 64 73 68  .    tls::handsh
9150: 61 6b 65 20 24 73 0a 09 20 20 20 20 66 69 6c 65  ake $s..    file
9160: 65 76 65 6e 74 20 24 73 20 72 65 61 64 61 62 6c  event $s readabl
9170: 65 20 5b 6c 69 73 74 20 65 63 68 6f 20 24 73 5d  e [list echo $s]
9180: 0a 09 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65  ..    fconfigure
9190: 20 24 73 20 2d 62 75 66 66 65 72 69 6e 67 20 6c   $s -buffering l
91a0: 69 6e 65 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  ine -translation
91b0: 20 63 72 6c 66 0a 09 7d 0a 09 70 72 6f 63 20 65   crlf..}..proc e
91c0: 63 68 6f 20 7b 73 7d 20 7b 0a 09 20 20 20 20 73  cho {s} {..    s
91d0: 65 74 20 6c 20 5b 67 65 74 73 20 24 73 5d 0a 09  et l [gets $s]..
91e0: 20 20 20 20 69 66 20 7b 5b 65 6f 66 20 24 73 5d      if {[eof $s]
91f0: 7d 20 7b 0a 09 09 63 6c 6f 73 65 20 24 73 0a 09  } {...close $s..
9200: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 70      } else {...p
9210: 75 74 73 20 24 73 20 24 6c 0a 09 20 20 20 20 7d  uts $s $l..    }
9220: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  ..}.    }.    se
9230: 74 20 66 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74  t f [tls::socket
9240: 20 5c 0a 09 20 20 20 20 2d 63 65 72 74 66 69 6c   \..    -certfil
9250: 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63  e $clientCert -c
9260: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b  afile $caCert -k
9270: 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65  eyfile $clientKe
9280: 79 20 5c 0a 09 20 20 20 20 24 72 65 6d 6f 74 65  y \..    $remote
9290: 53 65 72 76 65 72 49 50 20 38 38 33 36 5d 0a 20  ServerIP 8836]. 
92a0: 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66     fconfigure $f
92b0: 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 63 72   -translation cr
92c0: 6c 66 20 2d 62 75 66 66 65 72 69 6e 67 20 6c 69  lf -buffering li
92d0: 6e 65 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20  ne.    for {set 
92e0: 63 6e 74 20 30 7d 20 7b 24 63 6e 74 20 3c 20 35  cnt 0} {$cnt < 5
92f0: 30 7d 20 7b 69 6e 63 72 20 63 6e 74 7d 20 7b 0a  0} {incr cnt} {.
9300: 09 70 75 74 73 20 24 66 20 22 68 65 6c 6c 6f 2c  .puts $f "hello,
9310: 20 24 63 6e 74 22 0a 09 69 66 20 7b 5b 73 74 72   $cnt"..if {[str
9320: 69 6e 67 20 63 6f 6d 70 61 72 65 20 5b 67 65 74  ing compare [get
9330: 73 20 24 66 5d 20 22 68 65 6c 6c 6f 2c 20 24 63  s $f] "hello, $c
9340: 6e 74 22 5d 20 21 3d 20 30 7d 20 7b 0a 09 20 20  nt"] != 0} {..  
9350: 20 20 62 72 65 61 6b 0a 09 7d 0a 20 20 20 20 7d    break..}.    }
9360: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20  .    close $f.  
9370: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 63    sendCommand {c
9380: 6c 6f 73 65 20 24 73 6f 63 6b 65 74 31 30 5f 37  lose $socket10_7
9390: 5f 74 65 73 74 5f 73 65 72 76 65 72 7d 0a 20 20  _test_server}.  
93a0: 20 20 73 65 74 20 63 6e 74 0a 7d 20 35 30 0a 0a    set cnt.} 50..
93b0: 23 20 4d 61 63 69 6e 74 6f 73 68 20 73 6f 63 6b  # Macintosh sock
93c0: 65 74 73 20 63 61 6e 20 68 61 76 65 20 6d 6f 72  ets can have mor
93d0: 65 20 74 68 61 6e 20 6f 6e 65 20 73 65 72 76 65  e than one serve
93e0: 72 20 70 65 72 20 70 6f 72 74 0a 69 66 20 7b 24  r per port.if {$
93f0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
9400: 74 66 6f 72 6d 29 20 3d 3d 20 22 6d 61 63 69 6e  tform) == "macin
9410: 74 6f 73 68 22 7d 20 7b 0a 20 20 20 20 73 65 74  tosh"} {.    set
9420: 20 63 6f 6e 66 6c 69 63 74 52 65 73 75 6c 74 20   conflictResult 
9430: 7b 30 20 38 38 33 36 7d 0a 7d 20 65 6c 73 65 20  {0 8836}.} else 
9440: 7b 0a 20 20 20 20 73 65 74 20 63 6f 6e 66 6c 69  {.    set confli
9450: 63 74 52 65 73 75 6c 74 20 7b 31 20 7b 63 6f 75  ctResult {1 {cou
9460: 6c 64 6e 27 74 20 6f 70 65 6e 20 73 6f 63 6b 65  ldn't open socke
9470: 74 3a 20 61 64 64 72 65 73 73 20 61 6c 72 65 61  t: address alrea
9480: 64 79 20 69 6e 20 75 73 65 7d 7d 0a 7d 0a 0a 74  dy in use}}.}..t
9490: 65 73 74 20 74 6c 73 49 4f 2d 31 31 2e 36 20 7b  est tlsIO-11.6 {
94a0: 73 6f 63 6b 65 74 20 63 6f 6e 66 6c 69 63 74 7d  socket conflict}
94b0: 20 7b 73 6f 63 6b 65 74 20 64 6f 54 65 73 74 73   {socket doTests
94c0: 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72  WithRemoteServer
94d0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 31 20 5b  } {.    set s1 [
94e0: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20  tls::socket \.. 
94f0: 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 73 65     -certfile $se
9500: 72 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65  rverCert -cafile
9510: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
9520: 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c 0a 09  e $serverKey \..
9530: 20 20 20 20 2d 73 65 72 76 65 72 20 61 63 63 65      -server acce
9540: 70 74 20 38 38 33 36 5d 0a 20 20 20 20 69 66 20  pt 8836].    if 
9550: 7b 5b 63 61 74 63 68 20 7b 73 65 74 20 73 32 20  {[catch {set s2 
9560: 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09  [tls::socket \..
9570: 20 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 73      -certfile $s
9580: 65 72 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c  erverCert -cafil
9590: 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69  e $caCert -keyfi
95a0: 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c 0a  le $serverKey \.
95b0: 09 20 20 20 20 2d 73 65 72 76 65 72 20 61 63 63  .    -server acc
95c0: 65 70 74 20 38 38 33 36 5d 7d 20 6d 73 67 5d 7d  ept 8836]} msg]}
95d0: 20 7b 0a 09 73 65 74 20 72 65 73 75 6c 74 20 5b   {..set result [
95e0: 6c 69 73 74 20 31 20 24 6d 73 67 5d 0a 20 20 20  list 1 $msg].   
95f0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 65 74 20 72   } else {..set r
9600: 65 73 75 6c 74 20 5b 6c 69 73 74 20 30 20 5b 6c  esult [list 0 [l
9610: 69 6e 64 65 78 20 5b 66 63 6f 6e 66 69 67 75 72  index [fconfigur
9620: 65 20 24 73 32 20 2d 73 6f 63 6b 6e 61 6d 65 5d  e $s2 -sockname]
9630: 20 32 5d 5d 0a 09 63 6c 6f 73 65 20 24 73 32 0a   2]]..close $s2.
9640: 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20      }.    close 
9650: 24 73 31 0a 20 20 20 20 73 65 74 20 72 65 73 75  $s1.    set resu
9660: 6c 74 0a 7d 20 24 63 6f 6e 66 6c 69 63 74 52 65  lt.} $conflictRe
9670: 73 75 6c 74 0a 0a 74 65 73 74 20 74 6c 73 49 4f  sult..test tlsIO
9680: 2d 31 31 2e 37 20 7b 73 65 72 76 65 72 20 77 69  -11.7 {server wi
9690: 74 68 20 73 65 76 65 72 61 6c 20 63 6c 69 65 6e  th several clien
96a0: 74 73 7d 20 7b 73 6f 63 6b 65 74 20 64 6f 54 65  ts} {socket doTe
96b0: 73 74 73 57 69 74 68 52 65 6d 6f 74 65 53 65 72  stsWithRemoteSer
96c0: 76 65 72 7d 20 7b 0a 20 20 20 20 73 65 6e 64 43  ver} {.    sendC
96d0: 6f 6d 6d 61 6e 64 20 7b 0a 09 73 65 74 20 73 6f  ommand {..set so
96e0: 63 6b 65 74 31 30 5f 39 5f 74 65 73 74 5f 73 65  cket10_9_test_se
96f0: 72 76 65 72 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65  rver [tls::socke
9700: 74 20 5c 0a 09 09 2d 63 65 72 74 66 69 6c 65 20  t \...-certfile 
9710: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d  [file join [pwd]
9720: 20 63 65 72 74 73 20 73 65 72 76 65 72 2e 70 65   certs server.pe
9730: 6d 5d 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20 5b  m] \...-cafile [
9740: 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d 20  file join [pwd] 
9750: 63 65 72 74 73 20 63 61 46 69 6c 65 2e 70 65 6d  certs caFile.pem
9760: 5d 20 5c 0a 09 09 2d 6b 65 79 66 69 6c 65 20 5b  ] \...-keyfile [
9770: 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d 20  file join [pwd] 
9780: 63 65 72 74 73 20 73 6b 65 79 2e 70 65 6d 5d 20  certs skey.pem] 
9790: 5c 0a 09 09 2d 73 65 72 76 65 72 20 61 63 63 65  \...-server acce
97a0: 70 74 20 38 38 33 36 5d 0a 09 70 72 6f 63 20 61  pt 8836]..proc a
97b0: 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a  ccept {s a p} {.
97c0: 09 20 20 20 20 23 20 68 61 6e 64 73 68 61 6b 65  .    # handshake
97d0: 20 6c 6f 63 6b 73 20 75 70 20 74 68 65 20 74 68   locks up the th
97e0: 72 65 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ree synchronous 
97f0: 63 6c 69 65 6e 74 73 0a 09 20 20 20 20 23 20 74  clients..    # t
9800: 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 20 24 73  ls::handshake $s
9810: 0a 09 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65  ..    fconfigure
9820: 20 24 73 20 2d 62 75 66 66 65 72 69 6e 67 20 6c   $s -buffering l
9830: 69 6e 65 0a 09 20 20 20 20 66 69 6c 65 65 76 65  ine..    fileeve
9840: 6e 74 20 24 73 20 72 65 61 64 61 62 6c 65 20 5b  nt $s readable [
9850: 6c 69 73 74 20 65 63 68 6f 20 24 73 5d 0a 09 7d  list echo $s]..}
9860: 0a 09 70 72 6f 63 20 65 63 68 6f 20 7b 73 7d 20  ..proc echo {s} 
9870: 7b 0a 09 20 20 20 20 73 65 74 20 6c 20 5b 67 65  {..    set l [ge
9880: 74 73 20 24 73 5d 0a 09 20 20 20 20 69 66 20 7b  ts $s]..    if {
9890: 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a 09 09 63 6c  [eof $s]} {...cl
98a0: 6f 73 65 20 24 73 0a 09 20 20 20 20 7d 20 65 6c  ose $s..    } el
98b0: 73 65 20 7b 0a 09 09 70 75 74 73 20 24 73 20 24  se {...puts $s $
98c0: 6c 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20  l..    }..}.    
98d0: 7d 0a 20 20 20 20 73 65 74 20 73 31 20 5b 74 6c  }.    set s1 [tl
98e0: 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20  s::socket \..   
98f0: 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65   -certfile $clie
9900: 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24  ntCert -cafile $
9910: 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20  caCert -keyfile 
9920: 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20  $clientKey \..  
9930: 20 20 24 72 65 6d 6f 74 65 53 65 72 76 65 72 49    $remoteServerI
9940: 50 20 38 38 33 36 5d 0a 20 20 20 20 66 63 6f 6e  P 8836].    fcon
9950: 66 69 67 75 72 65 20 24 73 31 20 2d 62 75 66 66  figure $s1 -buff
9960: 65 72 69 6e 67 20 6c 69 6e 65 0a 20 20 20 20 73  ering line.    s
9970: 65 74 20 73 32 20 5b 74 6c 73 3a 3a 73 6f 63 6b  et s2 [tls::sock
9980: 65 74 20 5c 0a 09 20 20 20 20 2d 63 65 72 74 66  et \..    -certf
9990: 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20  ile $clientCert 
99a0: 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74 20  -cafile $caCert 
99b0: 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74  -keyfile $client
99c0: 4b 65 79 20 5c 0a 09 20 20 20 20 24 72 65 6d 6f  Key \..    $remo
99d0: 74 65 53 65 72 76 65 72 49 50 20 38 38 33 36 5d  teServerIP 8836]
99e0: 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20  .    fconfigure 
99f0: 24 73 32 20 2d 62 75 66 66 65 72 69 6e 67 20 6c  $s2 -buffering l
9a00: 69 6e 65 0a 20 20 20 20 73 65 74 20 73 33 20 5b  ine.    set s3 [
9a10: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20  tls::socket \.. 
9a20: 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c     -certfile $cl
9a30: 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65  ientCert -cafile
9a40: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
9a50: 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09  e $clientKey \..
9a60: 20 20 20 20 24 72 65 6d 6f 74 65 53 65 72 76 65      $remoteServe
9a70: 72 49 50 20 38 38 33 36 5d 0a 20 20 20 20 66 63  rIP 8836].    fc
9a80: 6f 6e 66 69 67 75 72 65 20 24 73 33 20 2d 62 75  onfigure $s3 -bu
9a90: 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 20 20 20  ffering line.   
9aa0: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
9ab0: 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20  $i < 100} {incr 
9ac0: 69 7d 20 7b 0a 09 70 75 74 73 20 24 73 31 20 68  i} {..puts $s1 h
9ad0: 65 6c 6c 6f 2c 73 31 0a 09 67 65 74 73 20 24 73  ello,s1..gets $s
9ae0: 31 0a 09 70 75 74 73 20 24 73 32 20 68 65 6c 6c  1..puts $s2 hell
9af0: 6f 2c 73 32 0a 09 67 65 74 73 20 24 73 32 0a 09  o,s2..gets $s2..
9b00: 70 75 74 73 20 24 73 33 20 68 65 6c 6c 6f 2c 73  puts $s3 hello,s
9b10: 33 0a 09 67 65 74 73 20 24 73 33 0a 20 20 20 20  3..gets $s3.    
9b20: 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24 73 31 0a  }.    close $s1.
9b30: 20 20 20 20 63 6c 6f 73 65 20 24 73 32 0a 20 20      close $s2.  
9b40: 20 20 63 6c 6f 73 65 20 24 73 33 0a 20 20 20 20    close $s3.    
9b50: 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 63 6c 6f  sendCommand {clo
9b60: 73 65 20 24 73 6f 63 6b 65 74 31 30 5f 39 5f 74  se $socket10_9_t
9b70: 65 73 74 5f 73 65 72 76 65 72 7d 0a 20 20 20 20  est_server}.    
9b80: 73 65 74 20 69 0a 7d 20 31 30 30 20 20 20 20 0a  set i.} 100    .
9b90: 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31 31 2e 38  .test tlsIO-11.8
9ba0: 20 7b 63 6c 69 65 6e 74 20 77 69 74 68 20 73 65   {client with se
9bb0: 76 65 72 61 6c 20 73 65 72 76 65 72 73 7d 20 7b  veral servers} {
9bc0: 75 6e 65 78 70 6c 61 69 6e 65 64 48 61 6e 67 20  unexplainedHang 
9bd0: 73 6f 63 6b 65 74 20 64 6f 54 65 73 74 73 57 69  socket doTestsWi
9be0: 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72 7d 20  thRemoteServer} 
9bf0: 7b 0a 20 20 20 20 23 20 74 68 69 73 20 6f 6e 65  {.    # this one
9c00: 20 73 65 65 6d 73 20 74 6f 20 68 61 6e 67 20 2d   seems to hang -
9c10: 2d 20 61 77 62 20 36 2f 32 2f 32 30 30 30 0a 20  - awb 6/2/2000. 
9c20: 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b     sendCommand {
9c30: 0a 09 73 65 74 20 73 31 20 5b 74 6c 73 3a 3a 73  ..set s1 [tls::s
9c40: 6f 63 6b 65 74 20 5c 0a 09 09 2d 63 65 72 74 66  ocket \...-certf
9c50: 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ile [file join [
9c60: 70 77 64 5d 20 63 65 72 74 73 20 73 65 72 76 65  pwd] certs serve
9c70: 72 2e 70 65 6d 5d 20 5c 0a 09 09 2d 63 61 66 69  r.pem] \...-cafi
9c80: 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70  le [file join [p
9c90: 77 64 5d 20 63 65 72 74 73 20 63 61 46 69 6c 65  wd] certs caFile
9ca0: 2e 70 65 6d 5d 20 5c 0a 09 09 2d 6b 65 79 66 69  .pem] \...-keyfi
9cb0: 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70  le [file join [p
9cc0: 77 64 5d 20 63 65 72 74 73 20 73 6b 65 79 2e 70  wd] certs skey.p
9cd0: 65 6d 5d 20 5c 0a 09 09 2d 73 65 72 76 65 72 20  em] \...-server 
9ce0: 22 61 63 63 65 70 74 20 34 30 30 33 22 20 34 30  "accept 4003" 40
9cf0: 30 33 5d 0a 09 73 65 74 20 73 32 20 5b 74 6c 73  03]..set s2 [tls
9d00: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09 2d 63 65  ::socket \...-ce
9d10: 72 74 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69  rtfile [file joi
9d20: 6e 20 5b 70 77 64 5d 20 63 65 72 74 73 20 73 65  n [pwd] certs se
9d30: 72 76 65 72 2e 70 65 6d 5d 20 5c 0a 09 09 2d 63  rver.pem] \...-c
9d40: 61 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  afile [file join
9d50: 20 5b 70 77 64 5d 20 63 65 72 74 73 20 63 61 46   [pwd] certs caF
9d60: 69 6c 65 2e 70 65 6d 5d 20 5c 0a 09 09 2d 6b 65  ile.pem] \...-ke
9d70: 79 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  yfile [file join
9d80: 20 5b 70 77 64 5d 20 63 65 72 74 73 20 73 6b 65   [pwd] certs ske
9d90: 79 2e 70 65 6d 5d 20 5c 0a 09 09 2d 73 65 72 76  y.pem] \...-serv
9da0: 65 72 20 22 61 63 63 65 70 74 20 34 30 30 34 22  er "accept 4004"
9db0: 20 34 30 30 34 5d 0a 09 73 65 74 20 73 33 20 5b   4004]..set s3 [
9dc0: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09  tls::socket \...
9dd0: 2d 63 65 72 74 66 69 6c 65 20 5b 66 69 6c 65 20  -certfile [file 
9de0: 6a 6f 69 6e 20 5b 70 77 64 5d 20 63 65 72 74 73  join [pwd] certs
9df0: 20 73 65 72 76 65 72 2e 70 65 6d 5d 20 5c 0a 09   server.pem] \..
9e00: 09 2d 63 61 66 69 6c 65 20 5b 66 69 6c 65 20 6a  .-cafile [file j
9e10: 6f 69 6e 20 5b 70 77 64 5d 20 63 65 72 74 73 20  oin [pwd] certs 
9e20: 63 61 46 69 6c 65 2e 70 65 6d 5d 20 5c 0a 09 09  caFile.pem] \...
9e30: 2d 6b 65 79 66 69 6c 65 20 5b 66 69 6c 65 20 6a  -keyfile [file j
9e40: 6f 69 6e 20 5b 70 77 64 5d 20 63 65 72 74 73 20  oin [pwd] certs 
9e50: 73 6b 65 79 2e 70 65 6d 5d 20 5c 0a 09 09 2d 73  skey.pem] \...-s
9e60: 65 72 76 65 72 20 22 61 63 63 65 70 74 20 34 30  erver "accept 40
9e70: 30 35 22 20 34 30 30 35 5d 0a 09 70 72 6f 63 20  05" 4005]..proc 
9e80: 61 63 63 65 70 74 20 7b 6d 70 20 73 20 61 20 70  accept {mp s a p
9e90: 7d 20 7b 0a 09 20 20 20 20 74 6c 73 3a 3a 68 61  } {..    tls::ha
9ea0: 6e 64 73 68 61 6b 65 20 24 73 0a 09 20 20 20 20  ndshake $s..    
9eb0: 70 75 74 73 20 24 73 20 24 6d 70 0a 09 20 20 20  puts $s $mp..   
9ec0: 20 63 6c 6f 73 65 20 24 73 0a 09 7d 0a 20 20 20   close $s..}.   
9ed0: 20 7d 0a 20 20 20 20 73 65 74 20 73 31 20 5b 74   }.    set s1 [t
9ee0: 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20  ls::socket \..  
9ef0: 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69    -certfile $cli
9f00: 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20  entCert -cafile 
9f10: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
9f20: 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20   $clientKey \.. 
9f30: 20 20 20 24 72 65 6d 6f 74 65 53 65 72 76 65 72     $remoteServer
9f40: 49 50 20 34 30 30 33 5d 0a 20 20 20 20 73 65 74  IP 4003].    set
9f50: 20 73 32 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74   s2 [tls::socket
9f60: 20 5c 0a 09 20 20 20 20 2d 63 65 72 74 66 69 6c   \..    -certfil
9f70: 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63  e $clientCert -c
9f80: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b  afile $caCert -k
9f90: 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65  eyfile $clientKe
9fa0: 79 20 5c 0a 09 20 20 20 20 24 72 65 6d 6f 74 65  y \..    $remote
9fb0: 53 65 72 76 65 72 49 50 20 34 30 30 34 5d 0a 20  ServerIP 4004]. 
9fc0: 20 20 20 73 65 74 20 73 33 20 5b 74 6c 73 3a 3a     set s3 [tls::
9fd0: 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63  socket \..    -c
9fe0: 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43  ertfile $clientC
9ff0: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
a000: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c  ert -keyfile $cl
a010: 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 24  ientKey \..    $
a020: 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50 20 34  remoteServerIP 4
a030: 30 30 35 5d 0a 20 20 20 20 73 65 74 20 6c 20 22  005].    set l "
a040: 22 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20  ".    lappend l 
a050: 5b 67 65 74 73 20 24 73 31 5d 20 5b 67 65 74 73  [gets $s1] [gets
a060: 20 24 73 31 5d 20 5b 65 6f 66 20 24 73 31 5d 20   $s1] [eof $s1] 
a070: 5b 67 65 74 73 20 24 73 32 5d 20 5b 67 65 74 73  [gets $s2] [gets
a080: 20 24 73 32 5d 20 5b 65 6f 66 20 24 73 32 5d 20   $s2] [eof $s2] 
a090: 5c 0a 09 5b 67 65 74 73 20 24 73 33 5d 20 5b 67  \..[gets $s3] [g
a0a0: 65 74 73 20 24 73 33 5d 20 5b 65 6f 66 20 24 73  ets $s3] [eof $s
a0b0: 33 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 73 31  3].    close $s1
a0c0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 73 32 0a 20  .    close $s2. 
a0d0: 20 20 20 63 6c 6f 73 65 20 24 73 33 0a 20 20 20     close $s3.   
a0e0: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 0a 09   sendCommand {..
a0f0: 63 6c 6f 73 65 20 24 73 31 0a 09 63 6c 6f 73 65  close $s1..close
a100: 20 24 73 32 0a 09 63 6c 6f 73 65 20 24 73 33 0a   $s2..close $s3.
a110: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 6c 0a      }.    set l.
a120: 7d 20 7b 34 30 30 33 20 7b 7d 20 31 20 34 30 30  } {4003 {} 1 400
a130: 34 20 7b 7d 20 31 20 34 30 30 35 20 7b 7d 20 31  4 {} 1 4005 {} 1
a140: 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31 31  }..test tlsIO-11
a150: 2e 39 20 7b 61 63 63 65 70 74 20 63 61 6c 6c 62  .9 {accept callb
a160: 61 63 6b 20 65 72 72 6f 72 7d 20 7b 73 6f 63 6b  ack error} {sock
a170: 65 74 20 64 6f 54 65 73 74 73 57 69 74 68 52 65  et doTestsWithRe
a180: 6d 6f 74 65 53 65 72 76 65 72 7d 20 7b 0a 20 20  moteServer} {.  
a190: 20 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f    set s [tls::so
a1a0: 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65 72  cket \..    -cer
a1b0: 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65 72  tfile $serverCer
a1c0: 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72  t -cafile $caCer
a1d0: 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76  t -keyfile $serv
a1e0: 65 72 4b 65 79 20 5c 0a 09 20 20 20 20 2d 73 65  erKey \..    -se
a1f0: 72 76 65 72 20 61 63 63 65 70 74 20 38 38 33 36  rver accept 8836
a200: 5d 0a 20 20 20 20 70 72 6f 63 20 61 63 63 65 70  ].    proc accep
a210: 74 20 7b 73 20 61 20 70 7d 20 7b 65 78 70 72 20  t {s a p} {expr 
a220: 31 30 20 2f 20 30 7d 0a 20 20 20 20 70 72 6f 63  10 / 0}.    proc
a230: 20 62 67 65 72 72 6f 72 20 61 72 67 73 20 7b 0a   bgerror args {.
a240: 09 67 6c 6f 62 61 6c 20 78 0a 09 73 65 74 20 78  .global x..set x
a250: 20 24 61 72 67 73 0a 20 20 20 20 7d 0a 20 20 20   $args.    }.   
a260: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65   sendCommand "se
a270: 74 20 63 61 43 65 72 74 20 24 63 61 43 65 72 74  t caCert $caCert
a280: 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e  ".    sendComman
a290: 64 20 22 73 65 74 20 73 65 72 76 65 72 43 65 72  d "set serverCer
a2a0: 74 20 24 73 65 72 76 65 72 43 65 72 74 22 0a 20  t $serverCert". 
a2b0: 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22     sendCommand "
a2c0: 73 65 74 20 63 6c 69 65 6e 74 43 65 72 74 20 24  set clientCert $
a2d0: 63 6c 69 65 6e 74 43 65 72 74 22 0a 20 20 20 20  clientCert".    
a2e0: 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74  sendCommand "set
a2f0: 20 73 65 72 76 65 72 4b 65 79 20 24 73 65 72 76   serverKey $serv
a300: 65 72 4b 65 79 22 0a 20 20 20 20 73 65 6e 64 43  erKey".    sendC
a310: 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c 69 65  ommand "set clie
a320: 6e 74 4b 65 79 20 24 63 6c 69 65 6e 74 4b 65 79  ntKey $clientKey
a330: 22 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68  ".    if {[catch
a340: 20 7b 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 0a   {sendCommand {.
a350: 09 20 20 20 20 73 65 74 20 70 65 65 72 6e 61 6d  .    set peernam
a360: 65 20 5b 66 63 6f 6e 66 69 67 75 72 65 20 24 63  e [fconfigure $c
a370: 61 6c 6c 65 72 53 6f 63 6b 65 74 20 2d 70 65 65  allerSocket -pee
a380: 72 6e 61 6d 65 5d 0a 09 20 20 20 20 73 65 74 20  rname]..    set 
a390: 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c  s [tls::socket \
a3a0: 0a 09 09 2d 63 65 72 74 66 69 6c 65 20 24 63 6c  ...-certfile $cl
a3b0: 69 65 6e 74 43 65 72 74 20 5c 0a 09 09 2d 63 61  ientCert \...-ca
a3c0: 66 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a 09  file $caCert \..
a3d0: 09 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e  .-keyfile $clien
a3e0: 74 4b 65 79 20 5c 0a 09 20 20 20 20 09 5b 6c 69  tKey \..    .[li
a3f0: 6e 64 65 78 20 24 70 65 65 72 6e 61 6d 65 20 30  ndex $peername 0
a400: 5d 20 38 38 33 36 5d 0a 09 20 20 20 20 63 6c 6f  ] 8836]..    clo
a410: 73 65 20 24 73 0a 20 20 20 20 09 20 7d 7d 20 6d  se $s.    . }} m
a420: 73 67 5d 7d 20 7b 0a 09 63 6c 6f 73 65 20 24 73  sg]} {..close $s
a430: 0a 09 65 72 72 6f 72 20 24 6d 73 67 0a 20 20 20  ..error $msg.   
a440: 20 7d 0a 20 20 20 20 73 65 74 20 74 69 6d 65 72   }.    set timer
a450: 20 5b 61 66 74 65 72 20 31 30 30 30 30 20 22 73   [after 10000 "s
a460: 65 74 20 78 20 74 69 6d 65 64 5f 6f 75 74 22 5d  et x timed_out"]
a470: 0a 20 20 20 20 76 77 61 69 74 20 78 0a 20 20 20  .    vwait x.   
a480: 20 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74   after cancel $t
a490: 69 6d 65 72 0a 20 20 20 20 63 6c 6f 73 65 20 24  imer.    close $
a4a0: 73 0a 20 20 20 20 72 65 6e 61 6d 65 20 62 67 65  s.    rename bge
a4b0: 72 72 6f 72 20 7b 7d 0a 20 20 20 20 73 65 74 20  rror {}.    set 
a4c0: 78 0a 7d 20 7b 7b 64 69 76 69 64 65 20 62 79 20  x.} {{divide by 
a4d0: 7a 65 72 6f 7d 7d 0a 0a 74 65 73 74 20 74 6c 73  zero}}..test tls
a4e0: 49 4f 2d 31 31 2e 31 30 20 7b 74 65 73 74 69 6e  IO-11.10 {testin
a4f0: 67 20 73 6f 63 6b 65 74 20 73 70 65 63 69 66 69  g socket specifi
a500: 63 20 6f 70 74 69 6f 6e 73 7d 20 7b 73 6f 63 6b  c options} {sock
a510: 65 74 20 64 6f 54 65 73 74 73 57 69 74 68 52 65  et doTestsWithRe
a520: 6d 6f 74 65 53 65 72 76 65 72 7d 20 7b 0a 20 20  moteServer} {.  
a530: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73    sendCommand "s
a540: 65 74 20 63 61 43 65 72 74 20 24 63 61 43 65 72  et caCert $caCer
a550: 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61  t".    sendComma
a560: 6e 64 20 22 73 65 74 20 73 65 72 76 65 72 43 65  nd "set serverCe
a570: 72 74 20 24 73 65 72 76 65 72 43 65 72 74 22 0a  rt $serverCert".
a580: 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20      sendCommand 
a590: 22 73 65 74 20 63 6c 69 65 6e 74 43 65 72 74 20  "set clientCert 
a5a0: 24 63 6c 69 65 6e 74 43 65 72 74 22 0a 20 20 20  $clientCert".   
a5b0: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65   sendCommand "se
a5c0: 74 20 73 65 72 76 65 72 4b 65 79 20 24 73 65 72  t serverKey $ser
a5d0: 76 65 72 4b 65 79 22 0a 20 20 20 20 73 65 6e 64  verKey".    send
a5e0: 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c 69  Command "set cli
a5f0: 65 6e 74 4b 65 79 20 24 63 6c 69 65 6e 74 4b 65  entKey $clientKe
a600: 79 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61  y".    sendComma
a610: 6e 64 20 7b 0a 09 73 65 74 20 73 6f 63 6b 65 74  nd {..set socket
a620: 31 30 5f 31 32 5f 74 65 73 74 5f 73 65 72 76 65  10_12_test_serve
a630: 72 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c  r [tls::socket \
a640: 0a 09 09 2d 63 65 72 74 66 69 6c 65 20 24 73 65  ...-certfile $se
a650: 72 76 65 72 43 65 72 74 20 5c 0a 09 09 2d 63 61  rverCert \...-ca
a660: 66 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a 09  file $caCert \..
a670: 09 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65  .-keyfile $serve
a680: 72 4b 65 79 20 5c 0a 09 09 2d 73 65 72 76 65 72  rKey \...-server
a690: 20 61 63 63 65 70 74 20 38 38 33 36 5d 0a 09 70   accept 8836]..p
a6a0: 72 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61 20  roc accept {s a 
a6b0: 70 7d 20 7b 63 6c 6f 73 65 20 24 73 7d 0a 20 20  p} {close $s}.  
a6c0: 20 20 7d 0a 20 20 20 20 73 65 74 20 73 20 5b 74    }.    set s [t
a6d0: 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20  ls::socket \..  
a6e0: 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69    -certfile $cli
a6f0: 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20  entCert -cafile 
a700: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
a710: 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20   $clientKey \.. 
a720: 20 20 20 24 72 65 6d 6f 74 65 53 65 72 76 65 72     $remoteServer
a730: 49 50 20 38 38 33 36 5d 0a 20 20 20 20 73 65 74  IP 8836].    set
a740: 20 70 20 5b 66 63 6f 6e 66 69 67 75 72 65 20 24   p [fconfigure $
a750: 73 20 2d 70 65 65 72 6e 61 6d 65 5d 0a 20 20 20  s -peername].   
a760: 20 73 65 74 20 6e 20 5b 66 63 6f 6e 66 69 67 75   set n [fconfigu
a770: 72 65 20 24 73 20 2d 73 6f 63 6b 6e 61 6d 65 5d  re $s -sockname]
a780: 0a 20 20 20 20 73 65 74 20 6c 20 22 22 0a 20 20  .    set l "".  
a790: 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 6e    lappend l [lin
a7a0: 64 65 78 20 24 70 20 32 5d 20 5b 6c 6c 65 6e 67  dex $p 2] [lleng
a7b0: 74 68 20 24 70 5d 20 5b 6c 6c 65 6e 67 74 68 20  th $p] [llength 
a7c0: 24 70 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 73  $p].    close $s
a7d0: 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64  .    sendCommand
a7e0: 20 7b 63 6c 6f 73 65 20 24 73 6f 63 6b 65 74 31   {close $socket1
a7f0: 30 5f 31 32 5f 74 65 73 74 5f 73 65 72 76 65 72  0_12_test_server
a800: 7d 0a 20 20 20 20 73 65 74 20 6c 0a 7d 20 7b 38  }.    set l.} {8
a810: 38 33 36 20 33 20 33 7d 0a 0a 74 65 73 74 20 74  836 3 3}..test t
a820: 6c 73 49 4f 2d 31 31 2e 31 31 20 7b 74 65 73 74  lsIO-11.11 {test
a830: 69 6e 67 20 73 70 75 72 69 6f 75 73 20 65 76 65  ing spurious eve
a840: 6e 74 73 7d 20 7b 75 6e 65 78 70 6c 61 69 6e 65  nts} {unexplaine
a850: 64 48 61 6e 67 20 73 6f 63 6b 65 74 20 64 6f 54  dHang socket doT
a860: 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65 53 65  estsWithRemoteSe
a870: 72 76 65 72 7d 20 7b 0a 20 20 20 20 23 20 68 61  rver} {.    # ha
a880: 6e 67 73 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  ngs.    sendComm
a890: 61 6e 64 20 22 73 65 74 20 63 61 43 65 72 74 20  and "set caCert 
a8a0: 24 63 61 43 65 72 74 22 0a 20 20 20 20 73 65 6e  $caCert".    sen
a8b0: 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73 65  dCommand "set se
a8c0: 72 76 65 72 43 65 72 74 20 24 73 65 72 76 65 72  rverCert $server
a8d0: 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64 43 6f  Cert".    sendCo
a8e0: 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c 69 65 6e  mmand "set clien
a8f0: 74 43 65 72 74 20 24 63 6c 69 65 6e 74 43 65 72  tCert $clientCer
a900: 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61  t".    sendComma
a910: 6e 64 20 22 73 65 74 20 73 65 72 76 65 72 4b 65  nd "set serverKe
a920: 79 20 24 73 65 72 76 65 72 4b 65 79 22 0a 20 20  y $serverKey".  
a930: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73    sendCommand "s
a940: 65 74 20 63 6c 69 65 6e 74 4b 65 79 20 24 63 6c  et clientKey $cl
a950: 69 65 6e 74 4b 65 79 22 0a 20 20 20 20 73 65 6e  ientKey".    sen
a960: 64 43 6f 6d 6d 61 6e 64 20 7b 0a 09 73 65 74 20  dCommand {..set 
a970: 73 6f 63 6b 65 74 31 30 5f 31 33 5f 74 65 73 74  socket10_13_test
a980: 5f 73 65 72 76 65 72 20 5b 74 6c 73 3a 3a 73 6f  _server [tls::so
a990: 63 6b 65 74 20 5c 0a 09 09 2d 63 65 72 74 66 69  cket \...-certfi
a9a0: 6c 65 20 24 73 65 72 76 65 72 43 65 72 74 20 5c  le $serverCert \
a9b0: 0a 09 09 2d 63 61 66 69 6c 65 20 24 63 61 43 65  ...-cafile $caCe
a9c0: 72 74 20 5c 0a 09 09 2d 6b 65 79 66 69 6c 65 20  rt \...-keyfile 
a9d0: 24 73 65 72 76 65 72 4b 65 79 20 5c 0a 09 09 2d  $serverKey \...-
a9e0: 73 65 72 76 65 72 20 61 63 63 65 70 74 20 38 38  server accept 88
a9f0: 33 36 5d 0a 09 70 72 6f 63 20 61 63 63 65 70 74  36]..proc accept
aa00: 20 7b 73 20 61 20 70 7d 20 7b 0a 09 20 20 20 20   {s a p} {..    
aa10: 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 20 24  tls::handshake $
aa20: 73 0a 09 20 20 20 20 66 63 6f 6e 66 69 67 75 72  s..    fconfigur
aa30: 65 20 24 73 20 2d 74 72 61 6e 73 6c 61 74 69 6f  e $s -translatio
aa40: 6e 20 22 61 75 74 6f 20 6c 66 22 0a 09 20 20 20  n "auto lf"..   
aa50: 20 61 66 74 65 72 20 31 30 30 20 77 72 69 74 65   after 100 write
aa60: 73 6f 6d 65 20 24 73 0a 09 7d 0a 09 70 72 6f 63  some $s..}..proc
aa70: 20 77 72 69 74 65 73 6f 6d 65 20 7b 73 7d 20 7b   writesome {s} {
aa80: 0a 09 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69  ..    for {set i
aa90: 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b   0} {$i < 100} {
aaa0: 69 6e 63 72 20 69 7d 20 7b 0a 09 09 70 75 74 73  incr i} {...puts
aab0: 20 24 73 20 22 6c 69 6e 65 20 24 69 20 66 72 6f   $s "line $i fro
aac0: 6d 20 72 65 6d 6f 74 65 20 73 65 72 76 65 72 22  m remote server"
aad0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 63 6c 6f  ..    }..    clo
aae0: 73 65 20 24 73 0a 09 7d 0a 20 20 20 20 7d 0a 20  se $s..}.    }. 
aaf0: 20 20 20 73 65 74 20 6c 65 6e 20 30 0a 20 20 20     set len 0.   
ab00: 20 73 65 74 20 73 70 75 72 69 6f 75 73 20 30 0a   set spurious 0.
ab10: 20 20 20 20 73 65 74 20 64 6f 6e 65 20 30 0a 20      set done 0. 
ab20: 20 20 20 70 72 6f 63 20 72 65 61 64 6c 69 74 74     proc readlitt
ab30: 6c 65 20 7b 73 7d 20 7b 0a 09 67 6c 6f 62 61 6c  le {s} {..global
ab40: 20 73 70 75 72 69 6f 75 73 20 64 6f 6e 65 20 6c   spurious done l
ab50: 65 6e 0a 09 73 65 74 20 6c 20 5b 72 65 61 64 20  en..set l [read 
ab60: 24 73 20 31 5d 0a 09 69 66 20 7b 5b 73 74 72 69  $s 1]..if {[stri
ab70: 6e 67 20 6c 65 6e 67 74 68 20 24 6c 5d 20 3d 3d  ng length $l] ==
ab80: 20 30 7d 20 7b 0a 09 20 20 20 20 69 66 20 7b 21   0} {..    if {!
ab90: 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a 09 09 69 6e  [eof $s]} {...in
aba0: 63 72 20 73 70 75 72 69 6f 75 73 0a 09 20 20 20  cr spurious..   
abb0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 63 6c 6f 73   } else {...clos
abc0: 65 20 24 73 0a 09 09 73 65 74 20 64 6f 6e 65 20  e $s...set done 
abd0: 31 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65  1..    }..} else
abe0: 20 7b 0a 09 20 20 20 20 69 6e 63 72 20 6c 65 6e   {..    incr len
abf0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
ac00: 24 6c 5d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  $l]..}.    }.   
ac10: 20 73 65 74 20 63 20 5b 74 6c 73 3a 3a 73 6f 63   set c [tls::soc
ac20: 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65 72 74  ket \..    -cert
ac30: 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74  file $clientCert
ac40: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
ac50: 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e   -keyfile $clien
ac60: 74 4b 65 79 20 5c 0a 09 20 20 20 20 24 72 65 6d  tKey \..    $rem
ac70: 6f 74 65 53 65 72 76 65 72 49 50 20 38 38 33 36  oteServerIP 8836
ac80: 5d 0a 20 20 20 20 66 69 6c 65 65 76 65 6e 74 20  ].    fileevent 
ac90: 24 63 20 72 65 61 64 61 62 6c 65 20 22 72 65 61  $c readable "rea
aca0: 64 6c 69 74 74 6c 65 20 24 63 22 0a 20 20 20 20  dlittle $c".    
acb0: 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72  set timer [after
acc0: 20 31 30 30 30 30 20 22 73 65 74 20 64 6f 6e 65   10000 "set done
acd0: 20 74 69 6d 65 64 5f 6f 75 74 22 5d 0a 20 20 20   timed_out"].   
ace0: 20 76 77 61 69 74 20 64 6f 6e 65 0a 20 20 20 20   vwait done.    
acf0: 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74 69  after cancel $ti
ad00: 6d 65 72 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  mer.    sendComm
ad10: 61 6e 64 20 7b 63 6c 6f 73 65 20 24 73 6f 63 6b  and {close $sock
ad20: 65 74 31 30 5f 31 33 5f 74 65 73 74 5f 73 65 72  et10_13_test_ser
ad30: 76 65 72 7d 0a 20 20 20 20 6c 69 73 74 20 24 73  ver}.    list $s
ad40: 70 75 72 69 6f 75 73 20 24 6c 65 6e 0a 7d 20 7b  purious $len.} {
ad50: 30 20 32 36 39 30 7d 0a 0a 74 65 73 74 20 74 6c  0 2690}..test tl
ad60: 73 49 4f 2d 31 31 2e 31 32 20 7b 74 65 73 74 69  sIO-11.12 {testi
ad70: 6e 67 20 45 4f 46 20 73 74 69 63 6b 79 6e 65 73  ng EOF stickynes
ad80: 73 7d 20 7b 73 6f 63 6b 65 74 20 64 6f 54 65 73  s} {socket doTes
ad90: 74 73 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76  tsWithRemoteServ
ada0: 65 72 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 6f  er} {.    set co
adb0: 75 6e 74 65 72 20 30 0a 20 20 20 20 73 65 74 20  unter 0.    set 
adc0: 64 6f 6e 65 20 30 0a 20 20 20 20 70 72 6f 63 20  done 0.    proc 
add0: 63 6f 75 6e 74 5f 75 70 20 7b 73 7d 20 7b 0a 09  count_up {s} {..
ade0: 67 6c 6f 62 61 6c 20 63 6f 75 6e 74 65 72 20 64  global counter d
adf0: 6f 6e 65 20 61 66 74 65 72 5f 69 64 0a 09 73 65  one after_id..se
ae00: 74 20 6c 20 5b 67 65 74 73 20 24 73 5d 0a 09 69  t l [gets $s]..i
ae10: 66 20 7b 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a 09  f {[eof $s]} {..
ae20: 20 20 20 20 69 6e 63 72 20 63 6f 75 6e 74 65 72      incr counter
ae30: 0a 09 20 20 20 20 69 66 20 7b 24 63 6f 75 6e 74  ..    if {$count
ae40: 65 72 20 3e 20 39 7d 20 7b 0a 09 09 73 65 74 20  er > 9} {...set 
ae50: 64 6f 6e 65 20 7b 45 4f 46 20 69 73 20 73 74 69  done {EOF is sti
ae60: 63 6b 79 7d 0a 09 09 61 66 74 65 72 20 63 61 6e  cky}...after can
ae70: 63 65 6c 20 24 61 66 74 65 72 5f 69 64 0a 09 09  cel $after_id...
ae80: 63 6c 6f 73 65 20 24 73 0a 09 20 20 20 20 7d 0a  close $s..    }.
ae90: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f  .}.    }.    pro
aea0: 63 20 74 69 6d 65 64 5f 6f 75 74 20 7b 7d 20 7b  c timed_out {} {
aeb0: 0a 09 67 6c 6f 62 61 6c 20 63 20 64 6f 6e 65 0a  ..global c done.
aec0: 09 73 65 74 20 64 6f 6e 65 20 7b 74 69 6d 65 64  .set done {timed
aed0: 5f 6f 75 74 2c 20 45 4f 46 20 69 73 20 6e 6f 74  _out, EOF is not
aee0: 20 73 74 69 63 6b 79 7d 0a 09 63 6c 6f 73 65 20   sticky}..close 
aef0: 24 63 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6e  $c.    }.    sen
af00: 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 61  dCommand "set ca
af10: 43 65 72 74 20 24 63 61 43 65 72 74 22 0a 20 20  Cert $caCert".  
af20: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73    sendCommand "s
af30: 65 74 20 73 65 72 76 65 72 43 65 72 74 20 24 73  et serverCert $s
af40: 65 72 76 65 72 43 65 72 74 22 0a 20 20 20 20 73  erverCert".    s
af50: 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20  endCommand "set 
af60: 63 6c 69 65 6e 74 43 65 72 74 20 24 63 6c 69 65  clientCert $clie
af70: 6e 74 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64  ntCert".    send
af80: 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73 65 72  Command "set ser
af90: 76 65 72 4b 65 79 20 24 73 65 72 76 65 72 4b 65  verKey $serverKe
afa0: 79 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61  y".    sendComma
afb0: 6e 64 20 22 73 65 74 20 63 6c 69 65 6e 74 4b 65  nd "set clientKe
afc0: 79 20 24 63 6c 69 65 6e 74 4b 65 79 22 0a 20 20  y $clientKey".  
afd0: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 0a    sendCommand {.
afe0: 09 73 65 74 20 73 6f 63 6b 65 74 31 30 5f 31 34  .set socket10_14
aff0: 5f 74 65 73 74 5f 73 65 72 76 65 72 20 5b 74 6c  _test_server [tl
b000: 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09 2d 63  s::socket \...-c
b010: 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43  ertfile $serverC
b020: 65 72 74 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20  ert \...-cafile 
b030: 24 63 61 43 65 72 74 20 5c 0a 09 09 2d 6b 65 79  $caCert \...-key
b040: 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20  file $serverKey 
b050: 5c 0a 09 09 2d 73 65 72 76 65 72 20 61 63 63 65  \...-server acce
b060: 70 74 20 38 38 33 36 5d 0a 09 70 72 6f 63 20 61  pt 8836]..proc a
b070: 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a  ccept {s a p} {.
b080: 09 20 20 20 20 74 6c 73 3a 3a 68 61 6e 64 73 68  .    tls::handsh
b090: 61 6b 65 20 24 73 0a 09 20 20 20 20 61 66 74 65  ake $s..    afte
b0a0: 72 20 31 30 30 20 63 6c 6f 73 65 20 24 73 0a 09  r 100 close $s..
b0b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20  }.    }.    set 
b0c0: 63 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c  c [tls::socket \
b0d0: 0a 09 20 20 20 20 2d 63 65 72 74 66 69 6c 65 20  ..    -certfile 
b0e0: 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66  $clientCert -caf
b0f0: 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79  ile $caCert -key
b100: 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20  file $clientKey 
b110: 5c 0a 20 20 20 20 09 24 72 65 6d 6f 74 65 53 65  \.    .$remoteSe
b120: 72 76 65 72 49 50 20 38 38 33 36 5d 0a 20 20 20  rverIP 8836].   
b130: 20 66 69 6c 65 65 76 65 6e 74 20 24 63 20 72 65   fileevent $c re
b140: 61 64 61 62 6c 65 20 22 63 6f 75 6e 74 5f 75 70  adable "count_up
b150: 20 24 63 22 0a 20 20 20 20 73 65 74 20 61 66 74   $c".    set aft
b160: 65 72 5f 69 64 20 5b 61 66 74 65 72 20 31 30 30  er_id [after 100
b170: 30 20 74 69 6d 65 64 5f 6f 75 74 5d 0a 20 20 20  0 timed_out].   
b180: 20 76 77 61 69 74 20 64 6f 6e 65 0a 20 20 20 20   vwait done.    
b190: 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 63 6c 6f  sendCommand {clo
b1a0: 73 65 20 24 73 6f 63 6b 65 74 31 30 5f 31 34 5f  se $socket10_14_
b1b0: 74 65 73 74 5f 73 65 72 76 65 72 7d 0a 20 20 20  test_server}.   
b1c0: 20 73 65 74 20 64 6f 6e 65 0a 7d 20 7b 45 4f 46   set done.} {EOF
b1d0: 20 69 73 20 73 74 69 63 6b 79 7d 0a 0a 74 65 73   is sticky}..tes
b1e0: 74 20 74 6c 73 49 4f 2d 31 31 2e 31 33 20 7b 74  t tlsIO-11.13 {t
b1f0: 65 73 74 69 6e 67 20 61 73 79 6e 63 20 77 72 69  esting async wri
b200: 74 65 2c 20 61 73 79 6e 63 20 66 6c 75 73 68 2c  te, async flush,
b210: 20 61 73 79 6e 63 20 63 6c 6f 73 65 7d 20 5c 0a   async close} \.
b220: 09 7b 73 6f 63 6b 65 74 20 64 6f 54 65 73 74 73  .{socket doTests
b230: 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72  WithRemoteServer
b240: 7d 20 7b 0a 20 20 20 20 70 72 6f 63 20 72 65 61  } {.    proc rea
b250: 64 69 74 20 7b 73 7d 20 7b 0a 09 67 6c 6f 62 61  dit {s} {..globa
b260: 6c 20 63 6f 75 6e 74 20 64 6f 6e 65 0a 09 73 65  l count done..se
b270: 74 20 6c 20 5b 72 65 61 64 20 24 73 5d 0a 09 69  t l [read $s]..i
b280: 6e 63 72 20 63 6f 75 6e 74 20 5b 73 74 72 69 6e  ncr count [strin
b290: 67 20 6c 65 6e 67 74 68 20 24 6c 5d 0a 09 69 66  g length $l]..if
b2a0: 20 7b 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a 09 20   {[eof $s]} {.. 
b2b0: 20 20 20 63 6c 6f 73 65 20 24 73 0a 09 20 20 20     close $s..   
b2c0: 20 73 65 74 20 64 6f 6e 65 20 31 0a 09 7d 0a 20   set done 1..}. 
b2d0: 20 20 20 7d 0a 20 20 20 20 73 65 6e 64 43 6f 6d     }.    sendCom
b2e0: 6d 61 6e 64 20 22 73 65 74 20 63 61 43 65 72 74  mand "set caCert
b2f0: 20 24 63 61 43 65 72 74 22 0a 20 20 20 20 73 65   $caCert".    se
b300: 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73  ndCommand "set s
b310: 65 72 76 65 72 43 65 72 74 20 24 73 65 72 76 65  erverCert $serve
b320: 72 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64 43  rCert".    sendC
b330: 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c 69 65  ommand "set clie
b340: 6e 74 43 65 72 74 20 24 63 6c 69 65 6e 74 43 65  ntCert $clientCe
b350: 72 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  rt".    sendComm
b360: 61 6e 64 20 22 73 65 74 20 73 65 72 76 65 72 4b  and "set serverK
b370: 65 79 20 24 73 65 72 76 65 72 4b 65 79 22 0a 20  ey $serverKey". 
b380: 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22     sendCommand "
b390: 73 65 74 20 63 6c 69 65 6e 74 4b 65 79 20 24 63  set clientKey $c
b3a0: 6c 69 65 6e 74 4b 65 79 22 0a 20 20 20 20 73 65  lientKey".    se
b3b0: 6e 64 43 6f 6d 6d 61 6e 64 20 7b 0a 09 73 65 74  ndCommand {..set
b3c0: 20 66 69 72 73 74 62 6c 6f 63 6b 20 22 22 0a 09   firstblock ""..
b3d0: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
b3e0: 69 20 3c 20 35 7d 20 7b 69 6e 63 72 20 69 7d 20  i < 5} {incr i} 
b3f0: 7b 0a 09 09 73 65 74 20 66 69 72 73 74 62 6c 6f  {...set firstblo
b400: 63 6b 20 22 61 24 66 69 72 73 74 62 6c 6f 63 6b  ck "a$firstblock
b410: 24 66 69 72 73 74 62 6c 6f 63 6b 22 0a 09 7d 0a  $firstblock"..}.
b420: 09 73 65 74 20 73 65 63 6f 6e 64 62 6c 6f 63 6b  .set secondblock
b430: 20 22 22 0a 09 66 6f 72 20 7b 73 65 74 20 69 20   ""..for {set i 
b440: 30 7d 20 7b 24 69 20 3c 20 31 36 7d 20 7b 69 6e  0} {$i < 16} {in
b450: 63 72 20 69 7d 20 7b 0a 09 20 20 20 20 73 65 74  cr i} {..    set
b460: 20 73 65 63 6f 6e 64 62 6c 6f 63 6b 20 22 62 24   secondblock "b$
b470: 73 65 63 6f 6e 64 62 6c 6f 63 6b 24 73 65 63 6f  secondblock$seco
b480: 6e 64 62 6c 6f 63 6b 22 0a 09 7d 0a 09 73 65 74  ndblock"..}..set
b490: 20 6c 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20   l [tls::socket 
b4a0: 5c 0a 09 09 2d 63 65 72 74 66 69 6c 65 20 24 73  \...-certfile $s
b4b0: 65 72 76 65 72 43 65 72 74 20 5c 0a 09 09 2d 63  erverCert \...-c
b4c0: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a  afile $caCert \.
b4d0: 09 09 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76  ..-keyfile $serv
b4e0: 65 72 4b 65 79 20 5c 0a 09 09 2d 73 65 72 76 65  erKey \...-serve
b4f0: 72 20 61 63 63 65 70 74 20 38 38 34 35 5d 0a 09  r accept 8845]..
b500: 70 72 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61  proc accept {s a
b510: 20 70 7d 20 7b 0a 09 20 20 20 20 74 6c 73 3a 3a   p} {..    tls::
b520: 68 61 6e 64 73 68 61 6b 65 20 24 73 0a 09 20 20  handshake $s..  
b530: 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20    fconfigure $s 
b540: 2d 62 6c 6f 63 6b 69 6e 67 20 30 20 2d 74 72 61  -blocking 0 -tra
b550: 6e 73 6c 61 74 69 6f 6e 20 6c 66 20 2d 62 75 66  nslation lf -buf
b560: 66 65 72 73 69 7a 65 20 31 36 33 38 34 20 5c 0a  fersize 16384 \.
b570: 09 09 2d 62 75 66 66 65 72 69 6e 67 20 6c 69 6e  ..-buffering lin
b580: 65 0a 09 20 20 20 20 66 69 6c 65 65 76 65 6e 74  e..    fileevent
b590: 20 24 73 20 72 65 61 64 61 62 6c 65 20 22 72 65   $s readable "re
b5a0: 61 64 61 62 6c 65 20 24 73 22 0a 09 7d 0a 09 70  adable $s"..}..p
b5b0: 72 6f 63 20 72 65 61 64 61 62 6c 65 20 7b 73 7d  roc readable {s}
b5c0: 20 7b 0a 09 20 20 20 20 73 65 74 20 6c 20 5b 67   {..    set l [g
b5d0: 65 74 73 20 24 73 5d 0a 09 20 20 20 20 66 69 6c  ets $s]..    fil
b5e0: 65 65 76 65 6e 74 20 24 73 20 72 65 61 64 61 62  eevent $s readab
b5f0: 6c 65 20 7b 7d 0a 09 20 20 20 20 61 66 74 65 72  le {}..    after
b600: 20 31 30 30 30 20 72 65 73 70 6f 6e 64 20 24 73   1000 respond $s
b610: 0a 09 7d 0a 09 70 72 6f 63 20 72 65 73 70 6f 6e  ..}..proc respon
b620: 64 20 7b 73 7d 20 7b 0a 09 20 20 20 20 67 6c 6f  d {s} {..    glo
b630: 62 61 6c 20 66 69 72 73 74 62 6c 6f 63 6b 0a 09  bal firstblock..
b640: 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c      puts -nonewl
b650: 69 6e 65 20 24 73 20 24 66 69 72 73 74 62 6c 6f  ine $s $firstblo
b660: 63 6b 0a 09 20 20 20 20 61 66 74 65 72 20 31 30  ck..    after 10
b670: 30 30 20 77 72 69 74 65 64 61 74 61 20 24 73 0a  00 writedata $s.
b680: 09 7d 0a 09 70 72 6f 63 20 77 72 69 74 65 64 61  .}..proc writeda
b690: 74 61 20 7b 73 7d 20 7b 0a 09 20 20 20 20 67 6c  ta {s} {..    gl
b6a0: 6f 62 61 6c 20 73 65 63 6f 6e 64 62 6c 6f 63 6b  obal secondblock
b6b0: 0a 09 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65  ..    puts -none
b6c0: 77 6c 69 6e 65 20 24 73 20 24 73 65 63 6f 6e 64  wline $s $second
b6d0: 62 6c 6f 63 6b 0a 09 20 20 20 20 63 6c 6f 73 65  block..    close
b6e0: 20 24 73 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20   $s..}.    }.   
b6f0: 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63   set s [tls::soc
b700: 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65 72 74  ket \..    -cert
b710: 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74  file $clientCert
b720: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
b730: 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e   -keyfile $clien
b740: 74 4b 65 79 20 5c 0a 20 20 20 20 09 24 72 65 6d  tKey \.    .$rem
b750: 6f 74 65 53 65 72 76 65 72 49 50 20 38 38 34 35  oteServerIP 8845
b760: 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65  ].    fconfigure
b770: 20 24 73 20 2d 62 6c 6f 63 6b 69 6e 67 20 30 20   $s -blocking 0 
b780: 2d 74 72 61 6e 73 20 6c 66 20 2d 62 75 66 66 65  -trans lf -buffe
b790: 72 69 6e 67 20 6c 69 6e 65 0a 20 20 20 20 73 65  ring line.    se
b7a0: 74 20 63 6f 75 6e 74 20 30 0a 20 20 20 20 70 75  t count 0.    pu
b7b0: 74 73 20 24 73 20 68 65 6c 6c 6f 0a 20 20 20 20  ts $s hello.    
b7c0: 66 69 6c 65 65 76 65 6e 74 20 24 73 20 72 65 61  fileevent $s rea
b7d0: 64 61 62 6c 65 20 22 72 65 61 64 69 74 20 24 73  dable "readit $s
b7e0: 22 0a 20 20 20 20 73 65 74 20 74 69 6d 65 72 20  ".    set timer 
b7f0: 5b 61 66 74 65 72 20 31 30 30 30 30 20 22 73 65  [after 10000 "se
b800: 74 20 64 6f 6e 65 20 74 69 6d 65 64 5f 6f 75 74  t done timed_out
b810: 22 5d 0a 20 20 20 20 76 77 61 69 74 20 64 6f 6e  "].    vwait don
b820: 65 0a 20 20 20 20 61 66 74 65 72 20 63 61 6e 63  e.    after canc
b830: 65 6c 20 24 74 69 6d 65 72 0a 20 20 20 20 73 65  el $timer.    se
b840: 6e 64 43 6f 6d 6d 61 6e 64 20 7b 63 6c 6f 73 65  ndCommand {close
b850: 20 24 6c 7d 0a 20 20 20 20 73 65 74 20 63 6f 75   $l}.    set cou
b860: 6e 74 0a 7d 20 36 35 35 36 36 0a 0a 74 65 73 74  nt.} 65566..test
b870: 20 74 6c 73 49 4f 2d 31 32 2e 31 20 7b 74 65 73   tlsIO-12.1 {tes
b880: 74 69 6e 67 20 69 6e 68 65 72 69 74 61 6e 63 65  ting inheritance
b890: 20 6f 66 20 73 65 72 76 65 72 20 73 6f 63 6b 65   of server socke
b8a0: 74 73 7d 20 5c 0a 09 7b 73 6f 63 6b 65 74 20 64  ts} \..{socket d
b8b0: 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65  oTestsWithRemote
b8c0: 53 65 72 76 65 72 7d 20 7b 0a 20 20 20 20 72 65  Server} {.    re
b8d0: 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74 31  moveFile script1
b8e0: 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20  .    removeFile 
b8f0: 73 63 72 69 70 74 32 0a 0a 20 20 20 20 23 20 53  script2..    # S
b900: 63 72 69 70 74 31 20 69 73 20 6a 75 73 74 20 61  cript1 is just a
b910: 20 31 30 20 73 65 63 6f 6e 64 20 64 65 6c 61 79   10 second delay
b920: 2e 20 20 49 66 20 74 68 65 20 73 65 72 76 65 72  .  If the server
b930: 20 73 6f 63 6b 65 74 0a 20 20 20 20 23 20 69 73   socket.    # is
b940: 20 69 6e 68 65 72 69 74 65 64 2c 20 69 74 20 77   inherited, it w
b950: 69 6c 6c 20 62 65 20 68 65 6c 64 20 6f 70 65 6e  ill be held open
b960: 20 66 6f 72 20 31 30 20 73 65 63 6f 6e 64 73 0a   for 10 seconds.
b970: 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e  .    set f [open
b980: 20 73 63 72 69 70 74 31 20 77 5d 0a 20 20 20 20   script1 w].    
b990: 70 75 74 73 20 24 66 20 7b 0a 09 61 66 74 65 72  puts $f {..after
b9a0: 20 31 30 30 30 30 20 65 78 69 74 0a 09 76 77 61   10000 exit..vwa
b9b0: 69 74 20 66 6f 72 65 76 65 72 0a 20 20 20 20 7d  it forever.    }
b9c0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 0a 20  .    close $f.. 
b9d0: 20 20 20 23 20 53 63 72 69 70 74 32 20 63 72 65     # Script2 cre
b9e0: 61 74 65 73 20 74 68 65 20 73 65 72 76 65 72 20  ates the server 
b9f0: 73 6f 63 6b 65 74 2c 20 6c 61 75 6e 63 68 65 73  socket, launches
ba00: 20 73 63 72 69 70 74 31 2c 0a 20 20 20 20 23 20   script1,.    # 
ba10: 77 61 69 74 73 20 61 20 73 65 63 6f 6e 64 2c 20  waits a second, 
ba20: 61 6e 64 20 65 78 69 74 73 2e 20 20 54 68 65 20  and exits.  The 
ba30: 73 65 72 76 65 72 20 73 6f 63 6b 65 74 20 77 69  server socket wi
ba40: 6c 6c 20 6e 6f 77 0a 20 20 20 20 23 20 62 65 20  ll now.    # be 
ba50: 63 6c 6f 73 65 64 20 75 6e 6c 65 73 73 20 73 63  closed unless sc
ba60: 72 69 70 74 31 20 69 6e 68 65 72 69 74 65 64 20  ript1 inherited 
ba70: 69 74 2e 0a 0a 20 20 20 20 73 65 74 20 66 20 5b  it...    set f [
ba80: 6f 70 65 6e 20 73 63 72 69 70 74 32 20 77 5d 0a  open script2 w].
ba90: 20 20 20 20 23 20 70 75 74 73 20 24 66 20 5b 6c      # puts $f [l
baa0: 69 73 74 20 73 65 74 20 74 63 6c 74 65 73 74 20  ist set tcltest 
bab0: 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74  $::tcltest::tclt
bac0: 65 73 74 5d 0a 20 20 20 20 70 75 74 73 20 24 66  est].    puts $f
bad0: 20 5b 6c 69 73 74 20 73 65 74 20 74 63 6c 73 68   [list set tclsh
bae0: 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65   [info nameofexe
baf0: 63 75 74 61 62 6c 65 5d 5d 0a 20 20 20 20 70 75  cutable]].    pu
bb00: 74 73 20 24 66 20 7b 0a 09 70 61 63 6b 61 67 65  ts $f {..package
bb10: 20 72 65 71 75 69 72 65 20 74 63 6c 74 65 73 74   require tcltest
bb20: 0a 09 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  ..package requir
bb30: 65 20 74 6c 73 0a 20 20 20 20 7d 0a 20 20 20 20  e tls.    }.    
bb40: 70 75 74 73 20 24 66 20 22 73 65 74 20 66 20 5c  puts $f "set f \
bb50: 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65  [tls::socket -se
bb60: 72 76 65 72 20 61 63 63 65 70 74 20 2d 63 65 72  rver accept -cer
bb70: 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65 72  tfile $serverCer
bb80: 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72  t -cafile $caCer
bb90: 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76  t -keyfile $serv
bba0: 65 72 4b 65 79 20 38 38 32 38 20 5c 5d 22 0a 20  erKey 8828 \]". 
bbb0: 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09 70 72     puts $f {..pr
bbc0: 6f 63 20 61 63 63 65 70 74 20 7b 20 66 69 6c 65  oc accept { file
bbd0: 20 61 64 64 72 20 70 6f 72 74 20 7d 20 7b 0a 09   addr port } {..
bbe0: 20 20 20 20 63 6c 6f 73 65 20 24 66 69 6c 65 0a      close $file.
bbf0: 09 7d 0a 09 23 20 65 78 65 63 20 24 3a 3a 74 63  .}..# exec $::tc
bc00: 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73  ltest::tcltest s
bc10: 63 72 69 70 74 31 20 26 0a 09 65 78 65 63 20 24  cript1 &..exec $
bc20: 74 63 6c 73 68 20 73 63 72 69 70 74 31 20 26 0a  tclsh script1 &.
bc30: 09 63 6c 6f 73 65 20 24 66 0a 09 61 66 74 65 72  .close $f..after
bc40: 20 31 30 30 30 20 65 78 69 74 0a 09 76 77 61 69   1000 exit..vwai
bc50: 74 20 66 6f 72 65 76 65 72 0a 20 20 20 20 7d 0a  t forever.    }.
bc60: 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 09 0a 20      close $f... 
bc70: 20 20 20 23 20 4c 61 75 6e 63 68 20 73 63 72 69     # Launch scri
bc80: 70 74 32 20 61 6e 64 20 77 61 69 74 20 35 20 73  pt2 and wait 5 s
bc90: 65 63 6f 6e 64 73 0a 0a 20 20 20 20 23 20 65 78  econds..    # ex
bca0: 65 63 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74  ec $::tcltest::t
bcb0: 63 6c 74 65 73 74 20 73 63 72 69 70 74 32 20 26  cltest script2 &
bcc0: 0a 20 20 20 20 65 78 65 63 20 5b 69 6e 66 6f 20  .    exec [info 
bcd0: 6e 61 6d 65 6f 66 65 78 65 63 75 74 61 62 6c 65  nameofexecutable
bce0: 5d 20 73 63 72 69 70 74 32 20 26 0a 20 20 20 20  ] script2 &.    
bcf0: 61 66 74 65 72 20 35 30 30 30 20 7b 20 73 65 74  after 5000 { set
bd00: 20 6f 6b 5f 74 6f 5f 70 72 6f 63 65 65 64 20 31   ok_to_proceed 1
bd10: 20 7d 0a 20 20 20 20 76 77 61 69 74 20 6f 6b 5f   }.    vwait ok_
bd20: 74 6f 5f 70 72 6f 63 65 65 64 0a 0a 20 20 20 20  to_proceed..    
bd30: 23 20 49 66 20 77 65 20 63 61 6e 20 73 74 69 6c  # If we can stil
bd40: 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  l connect to the
bd50: 20 73 65 72 76 65 72 2c 20 74 68 65 20 73 6f 63   server, the soc
bd60: 6b 65 74 20 67 6f 74 20 69 6e 68 65 72 69 74 65  ket got inherite
bd70: 64 2e 0a 0a 20 20 20 20 69 66 20 7b 5b 63 61 74  d...    if {[cat
bd80: 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  ch {tls::socket 
bd90: 5c 0a 09 2d 63 65 72 74 66 69 6c 65 20 24 63 6c  \..-certfile $cl
bda0: 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65  ientCert -cafile
bdb0: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
bdc0: 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 20  e $clientKey \. 
bdd0: 20 20 09 20 31 32 37 2e 30 2e 30 2e 31 20 38 38    . 127.0.0.1 88
bde0: 32 38 7d 20 6d 73 67 5d 7d 20 7b 0a 09 73 65 74  28} msg]} {..set
bdf0: 20 78 20 7b 73 65 72 76 65 72 20 73 6f 63 6b 65   x {server socke
be00: 74 20 77 61 73 20 6e 6f 74 20 69 6e 68 65 72 69  t was not inheri
be10: 74 65 64 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ted}.    } else 
be20: 7b 0a 09 63 6c 6f 73 65 20 24 6d 73 67 0a 09 73  {..close $msg..s
be30: 65 74 20 78 20 7b 73 65 72 76 65 72 20 73 6f 63  et x {server soc
be40: 6b 65 74 20 77 61 73 20 69 6e 68 65 72 69 74 65  ket was inherite
be50: 64 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  d}.    }..    re
be60: 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74 31  moveFile script1
be70: 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20  .    removeFile 
be80: 73 63 72 69 70 74 32 0a 20 20 20 20 73 65 74 20  script2.    set 
be90: 78 0a 7d 20 7b 73 65 72 76 65 72 20 73 6f 63 6b  x.} {server sock
bea0: 65 74 20 77 61 73 20 6e 6f 74 20 69 6e 68 65 72  et was not inher
beb0: 69 74 65 64 7d 0a 0a 74 65 73 74 20 74 6c 73 49  ited}..test tlsI
bec0: 4f 2d 31 32 2e 32 20 7b 74 65 73 74 69 6e 67 20  O-12.2 {testing 
bed0: 69 6e 68 65 72 69 74 61 6e 63 65 20 6f 66 20 63  inheritance of c
bee0: 6c 69 65 6e 74 20 73 6f 63 6b 65 74 73 7d 20 5c  lient sockets} \
bef0: 0a 09 7b 73 6f 63 6b 65 74 20 64 6f 54 65 73 74  ..{socket doTest
bf00: 73 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65  sWithRemoteServe
bf10: 72 7d 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46  r} {.    removeF
bf20: 69 6c 65 20 73 63 72 69 70 74 31 0a 20 20 20 20  ile script1.    
bf30: 72 65 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70  removeFile scrip
bf40: 74 32 0a 0a 20 20 20 20 23 20 53 63 72 69 70 74  t2..    # Script
bf50: 31 20 69 73 20 6a 75 73 74 20 61 20 31 30 20 73  1 is just a 10 s
bf60: 65 63 6f 6e 64 20 64 65 6c 61 79 2e 20 20 49 66  econd delay.  If
bf70: 20 74 68 65 20 73 65 72 76 65 72 20 73 6f 63 6b   the server sock
bf80: 65 74 0a 20 20 20 20 23 20 69 73 20 69 6e 68 65  et.    # is inhe
bf90: 72 69 74 65 64 2c 20 69 74 20 77 69 6c 6c 20 62  rited, it will b
bfa0: 65 20 68 65 6c 64 20 6f 70 65 6e 20 66 6f 72 20  e held open for 
bfb0: 31 30 20 73 65 63 6f 6e 64 73 0a 0a 20 20 20 20  10 seconds..    
bfc0: 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69  set f [open scri
bfd0: 70 74 31 20 77 5d 0a 20 20 20 20 70 75 74 73 20  pt1 w].    puts 
bfe0: 24 66 20 7b 0a 09 61 66 74 65 72 20 31 30 30 30  $f {..after 1000
bff0: 30 20 65 78 69 74 0a 09 76 77 61 69 74 20 66 6f  0 exit..vwait fo
c000: 72 65 76 65 72 0a 20 20 20 20 7d 0a 20 20 20 20  rever.    }.    
c010: 63 6c 6f 73 65 20 24 66 0a 0a 20 20 20 20 23 20  close $f..    # 
c020: 53 63 72 69 70 74 32 20 6f 70 65 6e 73 20 74 68  Script2 opens th
c030: 65 20 63 6c 69 65 6e 74 20 73 6f 63 6b 65 74 20  e client socket 
c040: 61 6e 64 20 77 72 69 74 65 73 20 74 6f 20 69 74  and writes to it
c050: 2e 20 20 49 74 20 74 68 65 6e 0a 20 20 20 20 23  .  It then.    #
c060: 20 6c 61 75 6e 63 68 65 73 20 73 63 72 69 70 74   launches script
c070: 31 20 61 6e 64 20 65 78 69 74 73 2e 20 20 49 66  1 and exits.  If
c080: 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65   the child proce
c090: 73 73 20 69 6e 68 65 72 69 74 65 64 20 74 68 65  ss inherited the
c0a0: 0a 20 20 20 20 23 20 63 6c 69 65 6e 74 20 73 6f  .    # client so
c0b0: 63 6b 65 74 2c 20 74 68 65 20 73 6f 63 6b 65 74  cket, the socket
c0c0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20 6f   will still be o
c0d0: 70 65 6e 2e 0a 0a 20 20 20 20 73 65 74 20 66 20  pen...    set f 
c0e0: 5b 6f 70 65 6e 20 73 63 72 69 70 74 32 20 77 5d  [open script2 w]
c0f0: 0a 20 20 20 20 70 75 74 73 20 24 66 20 5b 6c 69  .    puts $f [li
c100: 73 74 20 73 65 74 20 74 63 6c 73 68 20 5b 69 6e  st set tclsh [in
c110: 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63 75 74 61  fo nameofexecuta
c120: 62 6c 65 5d 5d 0a 20 20 20 20 70 75 74 73 20 24  ble]].    puts $
c130: 66 20 7b 0a 20 20 20 20 09 70 61 63 6b 61 67 65  f {.    .package
c140: 20 72 65 71 75 69 72 65 20 74 6c 73 0a 20 20 20   require tls.   
c150: 20 7d 0a 20 20 20 20 70 75 74 73 20 24 66 20 22   }.    puts $f "
c160: 73 65 74 20 66 20 5c 5b 74 6c 73 3a 3a 73 6f 63  set f \[tls::soc
c170: 6b 65 74 20 2d 63 65 72 74 66 69 6c 65 20 24 63  ket -certfile $c
c180: 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c  lientCert -cafil
c190: 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69  e $caCert -keyfi
c1a0: 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 31 32  le $clientKey 12
c1b0: 37 2e 30 2e 30 2e 31 20 38 38 32 39 20 5c 5d 22  7.0.0.1 8829 \]"
c1c0: 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09  .    puts $f {..
c1d0: 65 78 65 63 20 24 74 63 6c 73 68 20 73 63 72 69  exec $tclsh scri
c1e0: 70 74 31 20 26 0a 09 70 75 74 73 20 24 66 20 74  pt1 &..puts $f t
c1f0: 65 73 74 69 6e 67 0a 09 66 6c 75 73 68 20 24 66  esting..flush $f
c200: 0a 09 61 66 74 65 72 20 31 30 30 30 20 65 78 69  ..after 1000 exi
c210: 74 0a 09 76 77 61 69 74 20 66 6f 72 65 76 65 72  t..vwait forever
c220: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65  .    }.    close
c230: 20 24 66 0a 0a 20 20 20 20 23 20 43 72 65 61 74   $f..    # Creat
c240: 65 20 74 68 65 20 73 65 72 76 65 72 20 73 6f 63  e the server soc
c250: 6b 65 74 0a 0a 20 20 20 20 73 65 74 20 73 65 72  ket..    set ser
c260: 76 65 72 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74  ver [tls::socket
c270: 20 5c 0a 09 2d 63 65 72 74 66 69 6c 65 20 24 73   \..-certfile $s
c280: 65 72 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c  erverCert -cafil
c290: 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69  e $caCert -keyfi
c2a0: 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c 0a  le $serverKey \.
c2b0: 09 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20  .-server accept 
c2c0: 38 38 32 39 5d 0a 20 20 20 20 70 72 6f 63 20 61  8829].    proc a
c2d0: 63 63 65 70 74 20 7b 20 66 69 6c 65 20 68 6f 73  ccept { file hos
c2e0: 74 20 70 6f 72 74 20 7d 20 7b 0a 0a 09 23 20 57  t port } {...# W
c2f0: 68 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 20 63  hen the client c
c300: 6f 6e 6e 65 63 74 73 2c 20 65 73 74 61 62 6c 69  onnects, establi
c310: 73 68 20 74 68 65 20 72 65 61 64 20 68 61 6e 64  sh the read hand
c320: 6c 65 72 0a 09 67 6c 6f 62 61 6c 20 73 65 72 76  ler..global serv
c330: 65 72 0a 09 63 6c 6f 73 65 20 24 73 65 72 76 65  er..close $serve
c340: 72 0a 09 66 69 6c 65 65 76 65 6e 74 20 24 66 69  r..fileevent $fi
c350: 6c 65 20 72 65 61 64 61 62 6c 65 20 5b 6c 69 73  le readable [lis
c360: 74 20 67 65 74 64 61 74 61 20 24 66 69 6c 65 5d  t getdata $file]
c370: 0a 09 66 63 6f 6e 66 69 67 75 72 65 20 24 66 69  ..fconfigure $fi
c380: 6c 65 20 2d 62 75 66 66 65 72 69 6e 67 20 6c 69  le -buffering li
c390: 6e 65 20 2d 62 6c 6f 63 6b 69 6e 67 20 30 0a 09  ne -blocking 0..
c3a0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 20 20 20  return.    }.   
c3b0: 20 70 72 6f 63 20 67 65 74 64 61 74 61 20 7b 20   proc getdata { 
c3c0: 66 69 6c 65 20 7d 20 7b 0a 0a 09 23 20 52 65 61  file } {...# Rea
c3d0: 64 20 68 61 6e 64 6c 65 72 20 6f 6e 20 74 68 65  d handler on the
c3e0: 20 61 63 63 65 70 74 65 64 20 73 6f 63 6b 65 74   accepted socket
c3f0: 2e 0a 09 67 6c 6f 62 61 6c 20 78 0a 09 67 6c 6f  ...global x..glo
c400: 62 61 6c 20 66 61 69 6c 65 64 0a 09 73 65 74 20  bal failed..set 
c410: 73 74 61 74 75 73 20 5b 63 61 74 63 68 20 7b 72  status [catch {r
c420: 65 61 64 20 24 66 69 6c 65 7d 20 64 61 74 61 5d  ead $file} data]
c430: 0a 09 69 66 20 7b 24 73 74 61 74 75 73 20 21 3d  ..if {$status !=
c440: 20 30 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 78   0} {..    set x
c450: 20 7b 72 65 61 64 20 66 61 69 6c 65 64 2c 20 65   {read failed, e
c460: 72 72 6f 72 20 77 61 73 20 24 64 61 74 61 7d 0a  rror was $data}.
c470: 09 20 20 20 20 63 61 74 63 68 20 7b 20 63 6c 6f  .    catch { clo
c480: 73 65 20 24 66 69 6c 65 20 7d 0a 09 7d 20 65 6c  se $file }..} el
c490: 73 65 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f  seif {[string co
c4a0: 6d 70 61 72 65 20 7b 7d 20 24 64 61 74 61 5d 7d  mpare {} $data]}
c4b0: 20 7b 0a 09 7d 20 65 6c 73 65 69 66 20 7b 5b 66   {..} elseif {[f
c4c0: 62 6c 6f 63 6b 65 64 20 24 66 69 6c 65 5d 7d 20  blocked $file]} 
c4d0: 7b 0a 09 7d 20 65 6c 73 65 69 66 20 7b 5b 65 6f  {..} elseif {[eo
c4e0: 66 20 24 66 69 6c 65 5d 7d 20 7b 0a 09 20 20 20  f $file]} {..   
c4f0: 20 69 66 20 7b 24 66 61 69 6c 65 64 7d 20 7b 0a   if {$failed} {.
c500: 09 09 73 65 74 20 78 20 7b 63 6c 69 65 6e 74 20  ..set x {client 
c510: 73 6f 63 6b 65 74 20 77 61 73 20 69 6e 68 65 72  socket was inher
c520: 69 74 65 64 7d 0a 09 20 20 20 20 7d 20 65 6c 73  ited}..    } els
c530: 65 20 7b 0a 09 09 73 65 74 20 78 20 7b 63 6c 69  e {...set x {cli
c540: 65 6e 74 20 73 6f 63 6b 65 74 20 77 61 73 20 6e  ent socket was n
c550: 6f 74 20 69 6e 68 65 72 69 74 65 64 7d 0a 09 20  ot inherited}.. 
c560: 20 20 20 7d 0a 09 20 20 20 20 63 61 74 63 68 20     }..    catch 
c570: 7b 20 63 6c 6f 73 65 20 24 66 69 6c 65 20 7d 0a  { close $file }.
c580: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73  .} else {..    s
c590: 65 74 20 78 20 7b 69 6d 70 6f 73 73 69 62 6c 65  et x {impossible
c5a0: 20 63 61 73 65 7d 0a 09 20 20 20 20 63 61 74 63   case}..    catc
c5b0: 68 20 7b 20 63 6c 6f 73 65 20 24 66 69 6c 65 20  h { close $file 
c5c0: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  }..}..return.   
c5d0: 20 7d 0a 0a 20 20 20 20 23 20 49 66 20 74 68 65   }..    # If the
c5e0: 20 73 6f 63 6b 65 74 20 64 6f 65 73 6e 27 74 20   socket doesn't 
c5f0: 68 69 74 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20  hit end-of-file 
c600: 69 6e 20 35 20 73 65 63 6f 6e 64 73 2c 20 74 68  in 5 seconds, th
c610: 65 0a 20 20 20 20 23 20 73 63 72 69 70 74 31 20  e.    # script1 
c620: 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
c630: 65 20 69 6e 68 65 72 69 74 65 64 20 74 68 65 20  e inherited the 
c640: 63 6c 69 65 6e 74 2e 0a 0a 20 20 20 20 73 65 74  client...    set
c650: 20 66 61 69 6c 65 64 20 30 0a 20 20 20 20 61 66   failed 0.    af
c660: 74 65 72 20 35 30 30 30 20 5b 6c 69 73 74 20 73  ter 5000 [list s
c670: 65 74 20 66 61 69 6c 65 64 20 31 5d 0a 0a 20 20  et failed 1]..  
c680: 20 20 23 20 4c 61 75 6e 63 68 20 74 68 65 20 73    # Launch the s
c690: 63 72 69 70 74 32 20 70 72 6f 63 65 73 73 0a 0a  cript2 process..
c6a0: 20 20 20 20 65 78 65 63 20 5b 69 6e 66 6f 20 6e      exec [info n
c6b0: 61 6d 65 6f 66 65 78 65 63 75 74 61 62 6c 65 5d  ameofexecutable]
c6c0: 20 73 63 72 69 70 74 32 20 26 0a 0a 20 20 20 20   script2 &..    
c6d0: 76 77 61 69 74 20 78 0a 20 20 20 20 69 66 20 7b  vwait x.    if {
c6e0: 21 24 66 61 69 6c 65 64 7d 20 7b 0a 09 76 77 61  !$failed} {..vwa
c6f0: 69 74 20 66 61 69 6c 65 64 0a 20 20 20 20 7d 0a  it failed.    }.
c700: 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20 73      removeFile s
c710: 63 72 69 70 74 31 0a 20 20 20 20 72 65 6d 6f 76  cript1.    remov
c720: 65 46 69 6c 65 20 73 63 72 69 70 74 32 0a 20 20  eFile script2.  
c730: 20 20 73 65 74 20 78 0a 7d 20 7b 63 6c 69 65 6e    set x.} {clien
c740: 74 20 73 6f 63 6b 65 74 20 77 61 73 20 6e 6f 74  t socket was not
c750: 20 69 6e 68 65 72 69 74 65 64 7d 0a 0a 74 65 73   inherited}..tes
c760: 74 20 74 6c 73 49 4f 2d 31 32 2e 33 20 7b 74 65  t tlsIO-12.3 {te
c770: 73 74 69 6e 67 20 69 6e 68 65 72 69 74 61 6e 63  sting inheritanc
c780: 65 20 6f 66 20 61 63 63 65 70 74 65 64 20 73 6f  e of accepted so
c790: 63 6b 65 74 73 7d 20 5c 0a 09 7b 68 61 6e 67 73  ckets} \..{hangs
c7a0: 4f 6e 4c 69 6e 75 78 20 73 6f 63 6b 65 74 20 64  OnLinux socket d
c7b0: 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65  oTestsWithRemote
c7c0: 53 65 72 76 65 72 7d 20 7b 0a 20 20 20 20 23 20  Server} {.    # 
c7d0: 68 61 6e 67 73 20 6f 6e 20 4c 69 6e 75 78 0a 20  hangs on Linux. 
c7e0: 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20 73 63     removeFile sc
c7f0: 72 69 70 74 31 0a 20 20 20 20 72 65 6d 6f 76 65  ript1.    remove
c800: 46 69 6c 65 20 73 63 72 69 70 74 32 0a 0a 20 20  File script2..  
c810: 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63    set f [open sc
c820: 72 69 70 74 31 20 77 5d 0a 20 20 20 20 70 75 74  ript1 w].    put
c830: 73 20 24 66 20 7b 0a 09 61 66 74 65 72 20 31 30  s $f {..after 10
c840: 30 30 30 20 65 78 69 74 0a 09 76 77 61 69 74 20  000 exit..vwait 
c850: 66 6f 72 65 76 65 72 0a 20 20 20 20 7d 0a 20 20  forever.    }.  
c860: 20 20 63 6c 6f 73 65 20 24 66 0a 0a 20 20 20 20    close $f..    
c870: 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69  set f [open scri
c880: 70 74 32 20 77 5d 0a 20 20 20 20 70 75 74 73 20  pt2 w].    puts 
c890: 24 66 20 5b 6c 69 73 74 20 73 65 74 20 74 63 6c  $f [list set tcl
c8a0: 73 68 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65  sh [info nameofe
c8b0: 78 65 63 75 74 61 62 6c 65 5d 5d 0a 20 20 20 20  xecutable]].    
c8c0: 70 75 74 73 20 24 66 20 7b 0a 20 20 20 20 09 70  puts $f {.    .p
c8d0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 74  ackage require t
c8e0: 6c 73 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ls.    }.    put
c8f0: 73 20 24 66 20 22 63 61 74 63 68 20 7b 73 65 74  s $f "catch {set
c900: 20 66 20 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74   f \[tls::socket
c910: 20 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20   -server accept 
c920: 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72 76 65  -certfile $serve
c930: 72 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63  rCert -cafile $c
c940: 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24  aCert -keyfile $
c950: 73 65 72 76 65 72 4b 65 79 20 38 39 33 30 20 5c  serverKey 8930 \
c960: 5d 7d 22 0a 20 20 20 20 70 75 74 73 20 24 66 20  ]}".    puts $f 
c970: 7b 0a 09 70 72 6f 63 20 61 63 63 65 70 74 20 7b  {..proc accept {
c980: 20 66 69 6c 65 20 68 6f 73 74 20 70 6f 72 74 20   file host port 
c990: 7d 20 7b 0a 09 20 20 20 20 67 6c 6f 62 61 6c 20  } {..    global 
c9a0: 74 63 6c 73 68 0a 09 20 20 20 20 70 75 74 73 20  tclsh..    puts 
c9b0: 24 66 69 6c 65 20 7b 74 65 73 74 20 64 61 74 61  $file {test data
c9c0: 20 6f 6e 20 73 6f 63 6b 65 74 7d 0a 09 20 20 20   on socket}..   
c9d0: 20 65 78 65 63 20 24 74 63 6c 73 68 20 73 63 72   exec $tclsh scr
c9e0: 69 70 74 31 20 26 0a 09 20 20 20 20 61 66 74 65  ipt1 &..    afte
c9f0: 72 20 31 30 30 30 20 65 78 69 74 0a 09 7d 0a 09  r 1000 exit..}..
ca00: 63 61 74 63 68 20 7b 76 77 61 69 74 20 66 6f 72  catch {vwait for
ca10: 65 76 65 72 7d 0a 20 20 20 20 7d 0a 20 20 20 20  ever}.    }.    
ca20: 63 6c 6f 73 65 20 24 66 0a 0a 20 20 20 20 23 20  close $f..    # 
ca30: 4c 61 75 6e 63 68 20 74 68 65 20 73 63 72 69 70  Launch the scrip
ca40: 74 32 20 70 72 6f 63 65 73 73 20 61 6e 64 20 63  t2 process and c
ca50: 6f 6e 6e 65 63 74 20 74 6f 20 69 74 2e 20 20 53  onnect to it.  S
ca60: 65 65 20 68 6f 77 20 6c 6f 6e 67 0a 20 20 20 20  ee how long.    
ca70: 23 20 74 68 65 20 73 6f 63 6b 65 74 20 73 74 61  # the socket sta
ca80: 79 73 20 6f 70 65 6e 0a 0a 20 20 20 20 65 78 65  ys open..    exe
ca90: 63 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78  c [info nameofex
caa0: 65 63 75 74 61 62 6c 65 5d 20 73 63 72 69 70 74  ecutable] script
cab0: 32 20 26 0a 0a 20 20 20 20 61 66 74 65 72 20 31  2 &..    after 1
cac0: 30 30 30 20 73 65 74 20 6f 6b 5f 74 6f 5f 70 72  000 set ok_to_pr
cad0: 6f 63 65 65 64 20 31 0a 20 20 20 20 76 77 61 69  oceed 1.    vwai
cae0: 74 20 6f 6b 5f 74 6f 5f 70 72 6f 63 65 65 64 0a  t ok_to_proceed.
caf0: 0a 20 20 20 20 73 65 74 20 66 20 5b 74 6c 73 3a  .    set f [tls:
cb00: 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d  :socket \..    -
cb10: 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74  certfile $client
cb20: 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61  Cert -cafile $ca
cb30: 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63  Cert -keyfile $c
cb40: 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20  lientKey \..    
cb50: 31 32 37 2e 30 2e 30 2e 31 20 38 39 33 30 5d 0a  127.0.0.1 8930].
cb60: 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24      fconfigure $
cb70: 66 20 2d 62 75 66 66 65 72 69 6e 67 20 66 75 6c  f -buffering ful
cb80: 6c 20 2d 62 6c 6f 63 6b 69 6e 67 20 30 0a 20 20  l -blocking 0.  
cb90: 20 20 66 69 6c 65 65 76 65 6e 74 20 24 66 20 72    fileevent $f r
cba0: 65 61 64 61 62 6c 65 20 5b 6c 69 73 74 20 67 65  eadable [list ge
cbb0: 74 64 61 74 61 20 24 66 5d 0a 0a 20 20 20 20 23  tdata $f]..    #
cbc0: 20 49 66 20 74 68 65 20 73 6f 63 6b 65 74 20 69   If the socket i
cbd0: 73 20 73 74 69 6c 6c 20 6f 70 65 6e 20 61 66 74  s still open aft
cbe0: 65 72 20 35 20 73 65 63 6f 6e 64 73 2c 20 74 68  er 5 seconds, th
cbf0: 65 20 73 63 72 69 70 74 31 20 70 72 6f 63 65 73  e script1 proces
cc00: 73 0a 20 20 20 20 23 20 6d 75 73 74 20 68 61 76  s.    # must hav
cc10: 65 20 69 6e 68 65 72 69 74 65 64 20 74 68 65 20  e inherited the 
cc20: 61 63 63 65 70 74 65 64 20 73 6f 63 6b 65 74 2e  accepted socket.
cc30: 0a 0a 20 20 20 20 73 65 74 20 66 61 69 6c 65 64  ..    set failed
cc40: 20 30 0a 20 20 20 20 61 66 74 65 72 20 35 30 30   0.    after 500
cc50: 30 20 73 65 74 20 66 61 69 6c 65 64 20 31 0a 0a  0 set failed 1..
cc60: 20 20 20 20 70 72 6f 63 20 67 65 74 64 61 74 61      proc getdata
cc70: 20 7b 20 66 69 6c 65 20 7d 20 7b 0a 0a 09 23 20   { file } {...# 
cc80: 52 65 61 64 20 68 61 6e 64 6c 65 72 20 6f 6e 20  Read handler on 
cc90: 74 68 65 20 63 6c 69 65 6e 74 20 73 6f 63 6b 65  the client socke
cca0: 74 2e 0a 09 67 6c 6f 62 61 6c 20 78 0a 09 67 6c  t...global x..gl
ccb0: 6f 62 61 6c 20 66 61 69 6c 65 64 0a 09 73 65 74  obal failed..set
ccc0: 20 73 74 61 74 75 73 20 5b 63 61 74 63 68 20 7b   status [catch {
ccd0: 72 65 61 64 20 24 66 69 6c 65 7d 20 64 61 74 61  read $file} data
cce0: 5d 0a 09 69 66 20 7b 24 73 74 61 74 75 73 20 21  ]..if {$status !
ccf0: 3d 20 30 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  = 0} {..    set 
cd00: 78 20 7b 72 65 61 64 20 66 61 69 6c 65 64 2c 20  x {read failed, 
cd10: 65 72 72 6f 72 20 77 61 73 20 24 64 61 74 61 7d  error was $data}
cd20: 0a 09 20 20 20 20 63 61 74 63 68 20 7b 20 63 6c  ..    catch { cl
cd30: 6f 73 65 20 24 66 69 6c 65 20 7d 0a 09 7d 20 65  ose $file }..} e
cd40: 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67 20 63  lseif {[string c
cd50: 6f 6d 70 61 72 65 20 7b 7d 20 24 64 61 74 61 5d  ompare {} $data]
cd60: 7d 20 7b 0a 09 7d 20 65 6c 73 65 69 66 20 7b 5b  } {..} elseif {[
cd70: 66 62 6c 6f 63 6b 65 64 20 24 66 69 6c 65 5d 7d  fblocked $file]}
cd80: 20 7b 0a 09 7d 20 65 6c 73 65 69 66 20 7b 5b 65   {..} elseif {[e
cd90: 6f 66 20 24 66 69 6c 65 5d 7d 20 7b 0a 09 20 20  of $file]} {..  
cda0: 20 20 69 66 20 7b 24 66 61 69 6c 65 64 7d 20 7b    if {$failed} {
cdb0: 0a 09 09 73 65 74 20 78 20 7b 61 63 63 65 70 74  ...set x {accept
cdc0: 65 64 20 73 6f 63 6b 65 74 20 77 61 73 20 69 6e  ed socket was in
cdd0: 68 65 72 69 74 65 64 7d 0a 09 20 20 20 20 7d 20  herited}..    } 
cde0: 65 6c 73 65 20 7b 0a 09 09 73 65 74 20 78 20 7b  else {...set x {
cdf0: 61 63 63 65 70 74 65 64 20 73 6f 63 6b 65 74 20  accepted socket 
ce00: 77 61 73 20 6e 6f 74 20 69 6e 68 65 72 69 74 65  was not inherite
ce10: 64 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 63  d}..    }..    c
ce20: 61 74 63 68 20 7b 20 63 6c 6f 73 65 20 24 66 69  atch { close $fi
ce30: 6c 65 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  le }..} else {..
ce40: 20 20 20 20 73 65 74 20 78 20 7b 69 6d 70 6f 73      set x {impos
ce50: 73 69 62 6c 65 20 63 61 73 65 7d 0a 09 20 20 20  sible case}..   
ce60: 20 63 61 74 63 68 20 7b 20 63 6c 6f 73 65 20 24   catch { close $
ce70: 66 69 6c 65 20 7d 0a 09 7d 0a 09 72 65 74 75 72  file }..}..retur
ce80: 6e 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  n.    }.    .   
ce90: 20 76 77 61 69 74 20 78 0a 0a 20 20 20 20 72 65   vwait x..    re
cea0: 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74 31  moveFile script1
ceb0: 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20  .    removeFile 
cec0: 73 63 72 69 70 74 32 0a 20 20 20 20 73 65 74 20  script2.    set 
ced0: 78 0a 7d 20 7b 61 63 63 65 70 74 65 64 20 73 6f  x.} {accepted so
cee0: 63 6b 65 74 20 77 61 73 20 6e 6f 74 20 69 6e 68  cket was not inh
cef0: 65 72 69 74 65 64 7d 0a 0a 74 65 73 74 20 74 6c  erited}..test tl
cf00: 73 49 4f 2d 31 33 2e 31 20 7b 54 65 73 74 69 6e  sIO-13.1 {Testin
cf10: 67 20 75 73 65 20 6f 66 20 73 68 61 72 65 64 20  g use of shared 
cf20: 73 6f 63 6b 65 74 20 62 65 74 77 65 65 6e 20 74  socket between t
cf30: 77 6f 20 74 68 72 65 61 64 73 7d 20 5c 0a 09 7b  wo threads} \..{
cf40: 73 6f 63 6b 65 74 20 74 65 73 74 74 68 72 65 61  socket testthrea
cf50: 64 7d 20 7b 0a 0a 20 20 20 20 72 65 6d 6f 76 65  d} {..    remove
cf60: 46 69 6c 65 20 73 63 72 69 70 74 0a 20 20 20 20  File script.    
cf70: 74 68 72 65 61 64 52 65 61 70 0a 0a 20 20 20 20  threadReap..    
cf80: 6d 61 6b 65 46 69 6c 65 20 7b 0a 20 20 20 20 09  makeFile {.    .
cf90: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
cfa0: 74 6c 73 0a 09 73 65 74 20 66 20 5b 74 6c 73 3a  tls..set f [tls:
cfb0: 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20  :socket -server 
cfc0: 61 63 63 65 70 74 20 38 38 32 38 5d 0a 09 70 72  accept 8828]..pr
cfd0: 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61 20 70  oc accept {s a p
cfe0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
cff0: 66 69 6c 65 65 76 65 6e 74 20 24 73 20 72 65 61  fileevent $s rea
d000: 64 61 62 6c 65 20 5b 6c 69 73 74 20 65 63 68 6f  dable [list echo
d010: 20 24 73 5d 0a 20 20 20 20 20 20 20 20 20 20 20   $s].           
d020: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d   fconfigure $s -
d030: 62 75 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 20  buffering line. 
d040: 20 20 20 20 20 20 20 7d 0a 09 70 72 6f 63 20 65         }..proc e
d050: 63 68 6f 20 7b 73 7d 20 7b 0a 09 20 20 20 20 20  cho {s} {..     
d060: 67 6c 6f 62 61 6c 20 69 0a 20 20 20 20 20 20 20  global i.       
d070: 20 20 20 20 20 20 73 65 74 20 6c 20 5b 67 65 74        set l [get
d080: 73 20 24 73 5d 0a 20 20 20 20 20 20 20 20 20 20  s $s].          
d090: 20 20 20 69 66 20 7b 5b 65 6f 66 20 24 73 5d 7d     if {[eof $s]}
d0a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
d0b0: 20 20 20 20 67 6c 6f 62 61 6c 20 78 0a 20 20 20      global x.   
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
d0d0: 6f 73 65 20 24 73 0a 20 20 20 20 20 20 20 20 20  ose $s.         
d0e0: 20 20 20 20 20 20 20 20 73 65 74 20 78 20 64 6f          set x do
d0f0: 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ne.             
d100: 7d 20 65 6c 73 65 20 7b 20 0a 09 20 20 20 20 20  } else { ..     
d110: 20 20 20 20 69 6e 63 72 20 69 0a 20 20 20 20 20      incr i.     
d120: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 73              puts
d130: 20 24 73 20 24 6c 0a 20 20 20 20 20 20 20 20 20   $s $l.         
d140: 20 20 20 20 7d 0a 09 7d 0a 09 73 65 74 20 69 20      }..}..set i 
d150: 30 0a 09 76 77 61 69 74 20 78 0a 09 63 6c 6f 73  0..vwait x..clos
d160: 65 20 24 66 0a 0a 09 23 20 74 68 72 65 61 64 20  e $f...# thread 
d170: 63 6c 65 61 6e 73 20 69 74 73 65 6c 66 20 75 70  cleans itself up
d180: 2e 0a 09 74 65 73 74 74 68 72 65 61 64 20 65 78  ...testthread ex
d190: 69 74 0a 20 20 20 20 7d 20 73 63 72 69 70 74 0a  it.    } script.
d1a0: 20 20 20 20 0a 20 20 20 20 23 20 63 72 65 61 74      .    # creat
d1b0: 65 20 61 20 74 68 72 65 61 64 0a 20 20 20 20 73  e a thread.    s
d1c0: 65 74 20 73 65 72 76 65 72 74 68 72 65 61 64 20  et serverthread 
d1d0: 5b 74 65 73 74 74 68 72 65 61 64 20 63 72 65 61  [testthread crea
d1e0: 74 65 20 7b 20 73 6f 75 72 63 65 20 73 63 72 69  te { source scri
d1f0: 70 74 20 7d 20 5d 0a 20 20 20 20 75 70 64 61 74  pt } ].    updat
d200: 65 0a 20 20 20 20 0a 20 20 20 20 61 66 74 65 72  e.    .    after
d210: 20 31 30 30 30 0a 20 20 20 20 73 65 74 20 73 20   1000.    set s 
d220: 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 31 32 37  [tls::socket 127
d230: 2e 30 2e 30 2e 31 20 38 38 32 38 5d 0a 20 20 20  .0.0.1 8828].   
d240: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d   fconfigure $s -
d250: 62 75 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 0a  buffering line..
d260: 20 20 20 20 63 61 74 63 68 20 7b 0a 09 70 75 74      catch {..put
d270: 73 20 24 73 20 22 68 65 6c 6c 6f 22 0a 09 67 65  s $s "hello"..ge
d280: 74 73 20 24 73 20 72 65 73 75 6c 74 0a 20 20 20  ts $s result.   
d290: 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24 73 0a   }.    close $s.
d2a0: 20 20 20 20 75 70 64 61 74 65 0a 0a 20 20 20 20      update..    
d2b0: 61 66 74 65 72 20 32 30 30 30 0a 20 20 20 20 6c  after 2000.    l
d2c0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 74  append result [t
d2d0: 68 72 65 61 64 52 65 61 70 5d 0a 20 20 20 20 0a  hreadReap].    .
d2e0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 0a      set result..
d2f0: 7d 20 7b 68 65 6c 6c 6f 20 31 7d 0a 0a 23 20 63  } {hello 1}..# c
d300: 6c 65 61 6e 75 70 0a 69 66 20 7b 5b 73 74 72 69  leanup.if {[stri
d310: 6e 67 20 6d 61 74 63 68 20 73 6f 63 6b 2a 20 24  ng match sock* $
d320: 63 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 5d 20 3d  commandSocket] =
d330: 3d 20 31 7d 20 7b 0a 20 20 20 70 75 74 73 20 24  = 1} {.   puts $
d340: 63 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 20 65 78  commandSocket ex
d350: 69 74 0a 20 20 20 66 6c 75 73 68 20 24 63 6f 6d  it.   flush $com
d360: 6d 61 6e 64 53 6f 63 6b 65 74 0a 7d 0a 63 61 74  mandSocket.}.cat
d370: 63 68 20 7b 63 6c 6f 73 65 20 24 63 6f 6d 6d 61  ch {close $comma
d380: 6e 64 53 6f 63 6b 65 74 7d 0a 63 61 74 63 68 20  ndSocket}.catch 
d390: 7b 63 6c 6f 73 65 20 24 72 65 6d 6f 74 65 50 72  {close $remotePr
d3a0: 6f 63 43 68 61 6e 7d 0a 3a 3a 74 63 6c 74 65 73  ocChan}.::tcltes
d3b0: 74 3a 3a 63 6c 65 61 6e 75 70 54 65 73 74 73 0a  t::cleanupTests.
d3c0: 66 6c 75 73 68 20 73 74 64 6f 75 74 0a 72 65 74  flush stdout.ret
d3d0: 75 72 6e 0a 0a                                   urn..