Hex Artifact Content

Artifact 1ca9d390dd4c473769ea009a167aa6a5a7f5baa3:


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 38 20 32 30 30 30 2f 30 36 2f 30 36 20 30 31  .8 2000/06/06 01
0210: 3a 33 34 3a 32 32 20 77 65 6c 63 68 20 45 78 70  :34:22 welch Exp
0220: 20 24 0a 0a 23 20 52 75 6e 6e 69 6e 67 20 73 6f   $..# Running so
0230: 63 6b 65 74 20 74 65 73 74 73 20 77 69 74 68 20  cket tests with 
0240: 61 20 72 65 6d 6f 74 65 20 73 65 72 76 65 72 3a  a remote server:
0250: 0a 23 20 2d 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 0a 23 20  -------------.# 
0280: 0a 23 20 53 6f 6d 65 20 74 65 73 74 73 20 69 6e  .# Some tests in
0290: 20 73 6f 63 6b 65 74 2e 74 65 73 74 20 64 65 70   socket.test dep
02a0: 65 6e 64 20 6f 6e 20 74 68 65 20 65 78 69 73 74  end on the exist
02b0: 65 6e 63 65 20 6f 66 20 61 20 72 65 6d 6f 74 65  ence of a remote
02c0: 20 73 65 72 76 65 72 20 74 6f 0a 23 20 77 68 69   server to.# whi
02d0: 63 68 20 74 68 65 79 20 63 6f 6e 6e 65 63 74 2e  ch they connect.
02e0: 20 54 68 65 20 72 65 6d 6f 74 65 20 73 65 72 76   The remote serv
02f0: 65 72 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e  er must be an in
0300: 73 74 61 6e 63 65 20 6f 66 20 74 63 6c 74 65 73  stance of tcltes
0310: 74 20 61 6e 64 20 69 74 0a 23 20 6d 75 73 74 20  t and it.# must 
0320: 72 75 6e 20 74 68 65 20 73 63 72 69 70 74 20 66  run the script f
0330: 6f 75 6e 64 20 69 6e 20 74 68 65 20 66 69 6c 65  ound in the file
0340: 20 22 72 65 6d 6f 74 65 2e 74 63 6c 22 20 69 6e   "remote.tcl" in
0350: 20 74 68 69 73 20 64 69 72 65 63 74 6f 72 79 2e   this directory.
0360: 20 59 6f 75 0a 23 20 63 61 6e 20 73 74 61 72 74   You.# can start
0370: 20 74 68 65 20 72 65 6d 6f 74 65 20 73 65 72 76   the remote serv
0380: 65 72 20 6f 6e 20 61 6e 79 20 6d 61 63 68 69 6e  er on any machin
0390: 65 20 72 65 61 63 68 61 62 6c 65 20 66 72 6f 6d  e reachable from
03a0: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6f 6e 0a   the machine on.
03b0: 23 20 77 68 69 63 68 20 79 6f 75 20 77 61 6e 74  # which you want
03c0: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 63 6b   to run the sock
03d0: 65 74 20 74 65 73 74 73 2c 20 62 79 20 69 73 73  et tests, by iss
03e0: 75 69 6e 67 3a 0a 23 20 0a 23 20 20 20 20 20 74  uing:.# .#     t
03f0: 63 6c 74 65 73 74 20 72 65 6d 6f 74 65 2e 74 63  cltest remote.tc
0400: 6c 20 2d 70 6f 72 74 20 32 30 34 38 09 23 20 4f  l -port 2048.# O
0410: 72 20 63 68 6f 6f 73 65 20 61 6e 6f 74 68 65 72  r choose another
0420: 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 23 20   port number..# 
0430: 0a 23 20 49 66 20 74 68 65 20 6d 61 63 68 69 6e  .# If the machin
0440: 65 20 79 6f 75 20 61 72 65 20 72 75 6e 6e 69 6e  e you are runnin
0450: 67 20 74 68 65 20 72 65 6d 6f 74 65 20 73 65 72  g the remote ser
0460: 76 65 72 20 6f 6e 20 68 61 73 20 73 65 76 65 72  ver on has sever
0470: 61 6c 20 49 50 0a 23 20 69 6e 74 65 72 66 61 63  al IP.# interfac
0480: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 68 6f 6f  es, you can choo
0490: 73 65 20 77 68 69 63 68 20 69 6e 74 65 72 66 61  se which interfa
04a0: 63 65 20 74 68 65 20 73 65 72 76 65 72 20 6c 69  ce the server li
04b0: 73 74 65 6e 73 20 6f 6e 20 66 6f 72 0a 23 20 63  stens on for.# c
04c0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 62 79 20 73 70  onnections by sp
04d0: 65 63 69 66 79 69 6e 67 20 74 68 65 20 2d 61 64  ecifying the -ad
04e0: 64 72 65 73 73 20 63 6f 6d 6d 61 6e 64 20 6c 69  dress command li
04f0: 6e 65 20 66 6c 61 67 2c 20 73 6f 3a 0a 23 20 0a  ne flag, so:.# .
0500: 23 20 20 20 20 20 74 63 6c 74 65 73 74 20 72 65  #     tcltest re
0510: 6d 6f 74 65 2e 74 63 6c 20 2d 61 64 64 72 65 73  mote.tcl -addres
0520: 73 20 79 6f 75 72 2e 6d 61 63 68 69 6e 65 2e 63  s your.machine.c
0530: 6f 6d 0a 23 20 0a 23 20 54 68 65 73 65 20 6f 70  om.# .# These op
0540: 74 69 6f 6e 73 20 63 61 6e 20 61 6c 73 6f 20 62  tions can also b
0550: 65 20 73 65 74 20 62 79 20 65 6e 76 69 72 6f 6e  e set by environ
0560: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 2e 20  ment variables. 
0570: 4f 6e 20 55 6e 69 78 2c 20 79 6f 75 20 63 61 6e  On Unix, you can
0580: 0a 23 20 74 79 70 65 20 74 68 65 73 65 20 63 6f  .# type these co
0590: 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20 73 68  mmands to the sh
05a0: 65 6c 6c 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ell from which t
05b0: 68 65 20 72 65 6d 6f 74 65 20 73 65 72 76 65 72  he remote server
05c0: 20 69 73 20 73 74 61 72 74 65 64 3a 0a 23 20 0a   is started:.# .
05d0: 23 20 20 20 20 20 73 68 65 6c 6c 25 20 73 65 74  #     shell% set
05e0: 65 6e 76 20 73 65 72 76 65 72 50 6f 72 74 20 32  env serverPort 2
05f0: 30 34 38 0a 23 20 20 20 20 20 73 68 65 6c 6c 25  048.#     shell%
0600: 20 73 65 74 65 6e 76 20 73 65 72 76 65 72 41 64   setenv serverAd
0610: 64 72 65 73 73 20 79 6f 75 72 2e 6d 61 63 68 69  dress your.machi
0620: 6e 65 2e 63 6f 6d 0a 23 20 0a 23 20 61 6e 64 20  ne.com.# .# and 
0630: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 79 6f 75  subsequently you
0640: 20 63 61 6e 20 73 74 61 72 74 20 74 68 65 20 72   can start the r
0650: 65 6d 6f 74 65 20 73 65 72 76 65 72 20 77 69 74  emote server wit
0660: 68 3a 0a 23 20 0a 23 20 20 20 20 20 74 63 6c 74  h:.# .#     tclt
0670: 65 73 74 20 72 65 6d 6f 74 65 2e 74 63 6c 0a 23  est remote.tcl.#
0680: 20 0a 23 20 74 6f 20 68 61 76 65 20 69 74 20 6c   .# to have it l
0690: 69 73 74 65 6e 20 6f 6e 20 70 6f 72 74 20 32 30  isten on port 20
06a0: 34 38 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 66  48 on the interf
06b0: 61 63 65 20 79 6f 75 72 2e 6d 61 63 68 69 6e 65  ace your.machine
06c0: 2e 63 6f 6d 2e 0a 23 20 20 20 20 20 0a 23 20 57  .com..#     .# W
06d0: 68 65 6e 20 74 68 65 20 73 65 72 76 65 72 20 73  hen the server s
06e0: 74 61 72 74 73 2c 20 69 74 20 70 72 69 6e 74 73  tarts, it prints
06f0: 20 6f 75 74 20 61 20 64 65 74 61 69 6c 65 64 20   out a detailed 
0700: 6d 65 73 73 61 67 65 20 63 6f 6e 74 61 69 6e 69  message containi
0710: 6e 67 20 69 74 73 0a 23 20 63 6f 6e 66 69 67 75  ng its.# configu
0720: 72 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  ration informati
0730: 6f 6e 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20  on, and it will 
0740: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 6b 69 6c 6c  block until kill
0750: 65 64 20 77 69 74 68 20 61 20 43 74 72 6c 2d 43  ed with a Ctrl-C
0760: 2e 0a 23 20 4f 6e 63 65 20 74 68 65 20 72 65 6d  ..# Once the rem
0770: 6f 74 65 20 73 65 72 76 65 72 20 65 78 69 73 74  ote server exist
0780: 73 2c 20 79 6f 75 20 63 61 6e 20 72 75 6e 20 74  s, you can run t
0790: 68 65 20 74 65 73 74 73 20 69 6e 20 73 6f 63 6b  he tests in sock
07a0: 65 74 2e 74 65 73 74 20 77 69 74 68 0a 23 20 74  et.test with.# t
07b0: 68 65 20 73 65 72 76 65 72 20 62 79 20 73 65 74  he server by set
07c0: 74 69 6e 67 20 74 77 6f 20 54 63 6c 20 76 61 72  ting two Tcl var
07d0: 69 61 62 6c 65 73 3a 0a 23 20 0a 23 20 20 20 20  iables:.# .#    
07e0: 20 25 20 73 65 74 20 72 65 6d 6f 74 65 53 65 72   % set remoteSer
07f0: 76 65 72 49 50 20 3c 6e 61 6d 65 20 6f 72 20 61  verIP <name or a
0800: 64 64 72 65 73 73 20 6f 66 20 6d 61 63 68 69 6e  ddress of machin
0810: 65 20 6f 6e 20 77 68 69 63 68 20 73 65 72 76 65  e on which serve
0820: 72 20 72 75 6e 73 3e 0a 23 20 20 20 20 20 25 20  r runs>.#     % 
0830: 73 65 74 20 72 65 6d 6f 74 65 53 65 72 76 65 72  set remoteServer
0840: 50 6f 72 74 20 32 30 34 38 0a 23 20 0a 23 20 54  Port 2048.# .# T
0850: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61  hese variables a
0860: 72 65 20 61 6c 73 6f 20 73 65 74 74 61 62 6c 65  re also settable
0870: 20 66 72 6f 6d 20 74 68 65 20 65 6e 76 69 72 6f   from the enviro
0880: 6e 6d 65 6e 74 2e 20 4f 6e 20 55 6e 69 78 2c 20  nment. On Unix, 
0890: 79 6f 75 20 63 61 6e 3a 0a 23 20 0a 23 20 20 20  you can:.# .#   
08a0: 20 20 73 68 65 6c 6c 25 20 73 65 74 65 6e 76 20    shell% setenv 
08b0: 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50 20 6d  remoteServerIP m
08c0: 61 63 68 69 6e 65 2e 77 68 65 72 65 2e 73 65 72  achine.where.ser
08d0: 76 65 72 2e 72 75 6e 73 0a 23 20 20 20 20 20 73  ver.runs.#     s
08e0: 68 65 6c 6c 25 20 73 65 6e 65 74 76 20 72 65 6d  hell% senetv rem
08f0: 6f 74 65 53 65 72 76 65 72 50 6f 72 74 20 32 30  oteServerPort 20
0900: 34 38 0a 23 20 0a 23 20 54 68 65 20 70 72 65 61  48.# .# The prea
0910: 6d 62 6c 65 20 6f 66 20 74 68 65 20 73 6f 63 6b  mble of the sock
0920: 65 74 2e 74 65 73 74 20 66 69 6c 65 20 63 68 65  et.test file che
0930: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
0940: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
0950: 73 65 74 0a 23 20 65 69 74 68 65 72 20 69 6e 20  set.# either in 
0960: 54 63 6c 20 6f 72 20 69 6e 20 74 68 65 20 65 6e  Tcl or in the en
0970: 76 69 72 6f 6e 6d 65 6e 74 3b 20 69 66 20 74 68  vironment; if th
0980: 65 79 20 61 72 65 2c 20 69 74 20 61 74 74 65 6d  ey are, it attem
0990: 70 74 73 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74  pts to connect t
09a0: 6f 0a 23 20 74 68 65 20 73 65 72 76 65 72 2e 20  o.# the server. 
09b0: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
09c0: 6e 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  n is successful,
09d0: 20 74 68 65 20 74 65 73 74 73 20 75 73 69 6e 67   the tests using
09e0: 20 74 68 65 20 72 65 6d 6f 74 65 0a 23 20 73 65   the remote.# se
09f0: 72 76 65 72 20 77 69 6c 6c 20 62 65 20 70 65 72  rver will be per
0a00: 66 6f 72 6d 65 64 3b 20 6f 74 68 65 72 77 69 73  formed; otherwis
0a10: 65 2c 20 69 74 20 77 69 6c 6c 20 61 74 74 65 6d  e, it will attem
0a20: 70 74 20 74 6f 20 73 74 61 72 74 20 74 68 65 20  pt to start the 
0a30: 72 65 6d 6f 74 65 0a 23 20 73 65 72 76 65 72 20  remote.# server 
0a40: 28 76 69 61 20 65 78 65 63 29 20 6f 6e 20 70 6c  (via exec) on pl
0a50: 61 74 66 6f 72 6d 73 20 74 68 61 74 20 73 75 70  atforms that sup
0a60: 70 6f 72 74 20 74 68 69 73 2c 20 6f 6e 20 74 68  port this, on th
0a70: 65 20 6c 6f 63 61 6c 20 68 6f 73 74 2c 0a 23 20  e local host,.# 
0a80: 6c 69 73 74 65 6e 69 6e 67 20 61 74 20 70 6f 72  listening at por
0a90: 74 20 32 30 34 38 2e 20 49 66 20 61 6c 6c 20 66  t 2048. If all f
0aa0: 61 69 6c 73 2c 20 61 20 6d 65 73 73 61 67 65 20  ails, a message 
0ab0: 69 73 20 70 72 69 6e 74 65 64 20 61 6e 64 20 74  is printed and t
0ac0: 68 65 20 74 65 73 74 73 0a 23 20 75 73 69 6e 67  he tests.# using
0ad0: 20 74 68 65 20 72 65 6d 6f 74 65 20 73 65 72 76   the remote serv
0ae0: 65 72 20 61 72 65 20 6e 6f 74 20 70 65 72 66 6f  er are not perfo
0af0: 72 6d 65 64 2e 0a 0a 69 66 20 7b 5b 6c 73 65 61  rmed...if {[lsea
0b00: 72 63 68 20 5b 6e 61 6d 65 73 70 61 63 65 20 63  rch [namespace c
0b10: 68 69 6c 64 72 65 6e 5d 20 3a 3a 74 63 6c 74 65  hildren] ::tclte
0b20: 73 74 5d 20 3d 3d 20 2d 31 7d 20 7b 0a 20 20 20  st] == -1} {.   
0b30: 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
0b40: 20 74 63 6c 74 65 73 74 0a 20 20 20 20 6e 61 6d   tcltest.    nam
0b50: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 2d 66  espace import -f
0b60: 6f 72 63 65 20 3a 3a 74 63 6c 74 65 73 74 3a 3a  orce ::tcltest::
0b70: 2a 0a 7d 0a 0a 23 20 4c 6f 61 64 20 74 68 65 20  *.}..# Load the 
0b80: 74 6c 73 20 70 61 63 6b 61 67 65 0a 70 61 63 6b  tls package.pack
0b90: 61 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a  age require tls.
0ba0: 0a 73 65 74 20 63 65 72 74 73 44 69 72 20 5b 66  .set certsDir [f
0bb0: 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64  ile join [file d
0bc0: 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72  irname [info scr
0bd0: 69 70 74 5d 5d 20 63 65 72 74 73 5d 20 0a 0a 73  ipt]] certs] ..s
0be0: 65 74 20 73 65 72 76 65 72 43 65 72 74 20 5b 66  et serverCert [f
0bf0: 69 6c 65 20 6a 6f 69 6e 20 24 63 65 72 74 73 44  ile join $certsD
0c00: 69 72 20 73 65 72 76 65 72 2e 70 65 6d 5d 0a 73  ir server.pem].s
0c10: 65 74 20 63 6c 69 65 6e 74 43 65 72 74 20 5b 66  et clientCert [f
0c20: 69 6c 65 20 6a 6f 69 6e 20 24 63 65 72 74 73 44  ile join $certsD
0c30: 69 72 20 63 6c 69 65 6e 74 2e 70 65 6d 5d 0a 73  ir client.pem].s
0c40: 65 74 20 63 61 43 65 72 74 20 5b 66 69 6c 65 20  et caCert [file 
0c50: 6a 6f 69 6e 20 24 63 65 72 74 73 44 69 72 20 63  join $certsDir c
0c60: 61 63 65 72 74 2e 70 65 6d 5d 0a 73 65 74 20 73  acert.pem].set s
0c70: 65 72 76 65 72 4b 65 79 20 5b 66 69 6c 65 20 6a  erverKey [file j
0c80: 6f 69 6e 20 24 63 65 72 74 73 44 69 72 20 73 6b  oin $certsDir sk
0c90: 65 79 2e 70 65 6d 5d 0a 73 65 74 20 63 6c 69 65  ey.pem].set clie
0ca0: 6e 74 4b 65 79 20 5b 66 69 6c 65 20 6a 6f 69 6e  ntKey [file join
0cb0: 20 24 63 65 72 74 73 44 69 72 20 63 6b 65 79 2e   $certsDir ckey.
0cc0: 70 65 6d 5d 0a 0a 23 20 53 6f 6d 65 20 74 65 73  pem]..# Some tes
0cd0: 74 73 20 72 65 71 75 69 72 65 20 74 68 65 20 74  ts require the t
0ce0: 65 73 74 74 68 72 65 61 64 20 63 6f 6d 6d 61 6e  estthread comman
0cf0: 64 0a 0a 73 65 74 20 3a 3a 74 63 6c 74 65 73 74  d..set ::tcltest
0d00: 3a 3a 74 65 73 74 43 6f 6e 73 74 72 61 69 6e 74  ::testConstraint
0d10: 73 28 74 65 73 74 74 68 72 65 61 64 29 20 5c 0a  s(testthread) \.
0d20: 09 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 63 6f  .[expr {[info co
0d30: 6d 6d 61 6e 64 73 20 74 65 73 74 74 68 72 65 61  mmands testthrea
0d40: 64 5d 20 21 3d 20 7b 7d 7d 5d 0a 0a 23 0a 23 20  d] != {}}]..#.# 
0d50: 49 66 20 72 65 6d 6f 74 65 53 65 72 76 65 72 49  If remoteServerI
0d60: 50 20 6f 72 20 72 65 6d 6f 74 65 53 65 72 76 65  P or remoteServe
0d70: 72 50 6f 72 74 20 61 72 65 20 6e 6f 74 20 73 65  rPort are not se
0d80: 74 2c 20 63 68 65 63 6b 20 69 6e 20 74 68 65 0a  t, check in the.
0d90: 23 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  # environment va
0da0: 72 69 61 62 6c 65 73 20 66 6f 72 20 65 78 74 65  riables for exte
0db0: 72 6e 61 6c 6c 79 20 73 65 74 20 76 61 6c 75 65  rnally set value
0dc0: 73 2e 0a 23 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f  s..#..if {![info
0dd0: 20 65 78 69 73 74 73 20 72 65 6d 6f 74 65 53 65   exists remoteSe
0de0: 72 76 65 72 49 50 5d 7d 20 7b 0a 20 20 20 20 69  rverIP]} {.    i
0df0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0e00: 65 6e 76 28 72 65 6d 6f 74 65 53 65 72 76 65 72  env(remoteServer
0e10: 49 50 29 5d 7d 20 7b 0a 09 73 65 74 20 72 65 6d  IP)]} {..set rem
0e20: 6f 74 65 53 65 72 76 65 72 49 50 20 24 65 6e 76  oteServerIP $env
0e30: 28 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50 29  (remoteServerIP)
0e40: 0a 20 20 20 20 7d 0a 7d 0a 69 66 20 7b 21 5b 69  .    }.}.if {![i
0e50: 6e 66 6f 20 65 78 69 73 74 73 20 72 65 6d 6f 74  nfo exists remot
0e60: 65 53 65 72 76 65 72 50 6f 72 74 5d 7d 20 7b 0a  eServerPort]} {.
0e70: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0e80: 69 73 74 73 20 65 6e 76 28 72 65 6d 6f 74 65 53  ists env(remoteS
0e90: 65 72 76 65 72 50 6f 72 74 29 5d 7d 20 7b 0a 09  erverPort)]} {..
0ea0: 73 65 74 20 72 65 6d 6f 74 65 53 65 72 76 65 72  set remoteServer
0eb0: 50 6f 72 74 20 24 65 6e 76 28 72 65 6d 6f 74 65  Port $env(remote
0ec0: 53 65 72 76 65 72 50 6f 72 74 29 0a 20 20 20 20  ServerPort).    
0ed0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
0ee0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
0ef0: 73 20 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50  s remoteServerIP
0f00: 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 72 65  ]} {..    set re
0f10: 6d 6f 74 65 53 65 72 76 65 72 50 6f 72 74 20 32  moteServerPort 2
0f20: 30 34 38 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  048.        }.  
0f30: 20 20 7d 0a 7d 0a 0a 23 0a 23 20 43 68 65 63 6b    }.}..#.# Check
0f40: 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73   if we're suppos
0f50: 65 64 20 74 6f 20 64 6f 20 74 65 73 74 73 20 61  ed to do tests a
0f60: 67 61 69 6e 73 74 20 74 68 65 20 72 65 6d 6f 74  gainst the remot
0f70: 65 20 73 65 72 76 65 72 0a 23 0a 0a 73 65 74 20  e server.#..set 
0f80: 64 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f 74  doTestsWithRemot
0f90: 65 53 65 72 76 65 72 20 31 0a 69 66 20 7b 21 5b  eServer 1.if {![
0fa0: 69 6e 66 6f 20 65 78 69 73 74 73 20 72 65 6d 6f  info exists remo
0fb0: 74 65 53 65 72 76 65 72 49 50 5d 20 26 26 20 28  teServerIP] && (
0fc0: 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c  $tcl_platform(pl
0fd0: 61 74 66 6f 72 6d 29 20 21 3d 20 22 6d 61 63 69  atform) != "maci
0fe0: 6e 74 6f 73 68 22 29 7d 20 7b 0a 20 20 20 20 73  ntosh")} {.    s
0ff0: 65 74 20 72 65 6d 6f 74 65 53 65 72 76 65 72 49  et remoteServerI
1000: 50 20 31 32 37 2e 30 2e 30 2e 31 0a 7d 0a 69 66  P 127.0.0.1.}.if
1010: 20 7b 28 24 64 6f 54 65 73 74 73 57 69 74 68 52   {($doTestsWithR
1020: 65 6d 6f 74 65 53 65 72 76 65 72 20 3d 3d 20 31  emoteServer == 1
1030: 29 20 26 26 20 28 21 5b 69 6e 66 6f 20 65 78 69  ) && (![info exi
1040: 73 74 73 20 72 65 6d 6f 74 65 53 65 72 76 65 72  sts remoteServer
1050: 50 6f 72 74 5d 29 7d 20 7b 0a 20 20 20 20 73 65  Port])} {.    se
1060: 74 20 72 65 6d 6f 74 65 53 65 72 76 65 72 50 6f  t remoteServerPo
1070: 72 74 20 32 30 34 38 0a 7d 0a 0a 23 20 41 74 74  rt 2048.}..# Att
1080: 65 6d 70 74 20 74 6f 20 63 6f 6e 6e 65 63 74 20  empt to connect 
1090: 74 6f 20 61 20 72 65 6d 6f 74 65 20 73 65 72 76  to a remote serv
10a0: 65 72 20 69 66 20 6f 6e 65 20 69 73 20 61 6c 72  er if one is alr
10b0: 65 61 64 79 20 72 75 6e 6e 69 6e 67 2e 20 49 66  eady running. If
10c0: 20 69 74 0a 23 20 69 73 20 6e 6f 74 20 72 75 6e   it.# is not run
10d0: 6e 69 6e 67 20 6f 72 20 66 6f 72 20 73 6f 6d 65  ning or for some
10e0: 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 20 74 68   other reason th
10f0: 65 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 73 2c  e connect fails,
1100: 20 61 74 74 65 6d 70 74 20 74 6f 0a 23 20 73 74   attempt to.# st
1110: 61 72 74 20 74 68 65 20 72 65 6d 6f 74 65 20 73  art the remote s
1120: 65 72 76 65 72 20 6f 6e 20 74 68 65 20 6c 6f 63  erver on the loc
1130: 61 6c 20 68 6f 73 74 20 6c 69 73 74 65 6e 69 6e  al host listenin
1140: 67 20 6f 6e 20 70 6f 72 74 20 32 30 34 38 2e 20  g on port 2048. 
1150: 54 68 69 73 0a 23 20 69 73 20 6f 6e 6c 79 20 64  This.# is only d
1160: 6f 6e 65 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73  one on platforms
1170: 20 74 68 61 74 20 73 75 70 70 6f 72 74 20 65 78   that support ex
1180: 65 63 20 28 69 2e 65 2e 20 6e 6f 74 20 6f 6e 20  ec (i.e. not on 
1190: 74 68 65 20 4d 61 63 29 2e 20 4f 6e 0a 23 20 70  the Mac). On.# p
11a0: 6c 61 74 66 6f 72 6d 73 20 74 68 61 74 20 64 6f  latforms that do
11b0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 65 78 65   not support exe
11c0: 63 2c 20 74 68 65 20 72 65 6d 6f 74 65 20 73 65  c, the remote se
11d0: 72 76 65 72 20 6d 75 73 74 20 62 65 20 73 74 61  rver must be sta
11e0: 72 74 65 64 0a 23 20 62 79 20 74 68 65 20 75 73  rted.# by the us
11f0: 65 72 20 62 65 66 6f 72 65 20 72 75 6e 6e 69 6e  er before runnin
1200: 67 20 74 68 65 20 74 65 73 74 73 2e 0a 0a 73 65  g the tests...se
1210: 74 20 72 65 6d 6f 74 65 50 72 6f 63 43 68 61 6e  t remoteProcChan
1220: 20 22 22 0a 73 65 74 20 63 6f 6d 6d 61 6e 64 53   "".set commandS
1230: 6f 63 6b 65 74 20 22 22 0a 69 66 20 7b 24 64 6f  ocket "".if {$do
1240: 54 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65 53  TestsWithRemoteS
1250: 65 72 76 65 72 7d 20 7b 0a 20 20 20 20 63 61 74  erver} {.    cat
1260: 63 68 20 7b 63 6c 6f 73 65 20 24 63 6f 6d 6d 61  ch {close $comma
1270: 6e 64 53 6f 63 6b 65 74 7d 0a 20 20 20 20 69 66  ndSocket}.    if
1280: 20 7b 5b 63 61 74 63 68 20 7b 73 65 74 20 63 6f   {[catch {set co
1290: 6d 6d 61 6e 64 53 6f 63 6b 65 74 20 5b 74 6c 73  mmandSocket [tls
12a0: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20  ::socket \..    
12b0: 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e  -certfile $clien
12c0: 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63  tCert -cafile $c
12d0: 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24  aCert -keyfile $
12e0: 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20  clientKey \..   
12f0: 20 24 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50   $remoteServerIP
1300: 20 5c 0a 09 20 20 20 20 24 72 65 6d 6f 74 65 53   \..    $remoteS
1310: 65 72 76 65 72 50 6f 72 74 5d 7d 5d 20 21 3d 20  erverPort]}] != 
1320: 30 7d 20 7b 0a 09 69 66 20 7b 5b 69 6e 66 6f 20  0} {..if {[info 
1330: 63 6f 6d 6d 61 6e 64 73 20 65 78 65 63 5d 20 3d  commands exec] =
1340: 3d 20 22 22 7d 20 7b 0a 09 20 20 20 20 73 65 74  = ""} {..    set
1350: 20 6e 6f 52 65 6d 6f 74 65 54 65 73 74 52 65 61   noRemoteTestRea
1360: 73 6f 6e 20 22 63 61 6e 27 74 20 65 78 65 63 22  son "can't exec"
1370: 0a 09 20 20 20 20 73 65 74 20 64 6f 54 65 73 74  ..    set doTest
1380: 73 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65  sWithRemoteServe
1390: 72 20 30 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  r 0..} else {.. 
13a0: 20 20 20 73 65 74 20 72 65 6d 6f 74 65 53 65 72     set remoteSer
13b0: 76 65 72 49 50 20 31 32 37 2e 30 2e 30 2e 31 0a  verIP 127.0.0.1.
13c0: 09 20 20 20 20 73 65 74 20 72 65 6d 6f 74 65 46  .    set remoteF
13d0: 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ile [file join [
13e0: 70 77 64 5d 20 72 65 6d 6f 74 65 2e 74 63 6c 5d  pwd] remote.tcl]
13f0: 0a 09 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68  ..    if {[catch
1400: 20 7b 73 65 74 20 72 65 6d 6f 74 65 50 72 6f 63   {set remoteProc
1410: 43 68 61 6e 20 5c 0a 09 09 09 09 5b 6f 70 65 6e  Chan \.....[open
1420: 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74   "|[list $::tclt
1430: 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 24 72 65  est::tcltest $re
1440: 6d 6f 74 65 46 69 6c 65 20 5c 0a 09 09 09 09 09  moteFile \......
1450: 2d 73 65 72 76 65 72 49 73 53 69 6c 65 6e 74 20  -serverIsSilent 
1460: 5c 0a 09 09 09 09 09 2d 70 6f 72 74 20 24 72 65  \......-port $re
1470: 6d 6f 74 65 53 65 72 76 65 72 50 6f 72 74 20 5c  moteServerPort \
1480: 0a 09 09 09 09 09 2d 61 64 64 72 65 73 73 20 24  ......-address $
1490: 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50 5d 22  remoteServerIP]"
14a0: 20 5c 0a 09 09 09 09 09 77 2b 5d 7d 20 5c 0a 09   \......w+]} \..
14b0: 09 20 20 20 6d 73 67 5d 20 3d 3d 20 30 7d 20 7b  .   msg] == 0} {
14c0: 0a 09 09 61 66 74 65 72 20 31 30 30 30 0a 09 09  ...after 1000...
14d0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 65 74 20  if {[catch {set 
14e0: 63 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 20 5b 74  commandSocket [t
14f0: 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09 20  ls::socket \... 
1500: 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c     -certfile $cl
1510: 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65  ientCert -cafile
1520: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
1530: 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09  e $clientKey \..
1540: 09 09 09 24 72 65 6d 6f 74 65 53 65 72 76 65 72  ...$remoteServer
1550: 49 50 20 5c 0a 09 09 09 09 24 72 65 6d 6f 74 65  IP \.....$remote
1560: 53 65 72 76 65 72 50 6f 72 74 5d 7d 20 6d 73 67  ServerPort]} msg
1570: 5d 20 3d 3d 20 30 7d 20 7b 0a 09 09 20 20 20 20  ] == 0} {...    
1580: 66 63 6f 6e 66 69 67 75 72 65 20 24 63 6f 6d 6d  fconfigure $comm
1590: 61 6e 64 53 6f 63 6b 65 74 20 2d 74 72 61 6e 73  andSocket -trans
15a0: 6c 61 74 69 6f 6e 20 63 72 6c 66 20 2d 62 75 66  lation crlf -buf
15b0: 66 65 72 69 6e 67 20 6c 69 6e 65 0a 09 09 7d 20  fering line...} 
15c0: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 73 65 74  else {...    set
15d0: 20 6e 6f 52 65 6d 6f 74 65 54 65 73 74 52 65 61   noRemoteTestRea
15e0: 73 6f 6e 20 24 6d 73 67 0a 09 09 20 20 20 20 73  son $msg...    s
15f0: 65 74 20 64 6f 54 65 73 74 73 57 69 74 68 52 65  et doTestsWithRe
1600: 6d 6f 74 65 53 65 72 76 65 72 20 30 0a 09 09 7d  moteServer 0...}
1610: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
1620: 09 73 65 74 20 6e 6f 52 65 6d 6f 74 65 54 65 73  .set noRemoteTes
1630: 74 52 65 61 73 6f 6e 20 22 24 6d 73 67 20 24 3a  tReason "$msg $:
1640: 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73  :tcltest::tcltes
1650: 74 22 0a 09 09 73 65 74 20 64 6f 54 65 73 74 73  t"...set doTests
1660: 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72  WithRemoteServer
1670: 20 30 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20   0..    }..}.   
1680: 20 7d 20 65 6c 73 65 20 7b 0a 09 66 63 6f 6e 66   } else {..fconf
1690: 69 67 75 72 65 20 24 63 6f 6d 6d 61 6e 64 53 6f  igure $commandSo
16a0: 63 6b 65 74 20 2d 74 72 61 6e 73 6c 61 74 69 6f  cket -translatio
16b0: 6e 20 63 72 6c 66 20 2d 62 75 66 66 65 72 69 6e  n crlf -bufferin
16c0: 67 20 6c 69 6e 65 0a 20 20 20 20 7d 0a 7d 0a 0a  g line.    }.}..
16d0: 23 20 53 6f 6d 65 20 74 65 73 74 73 20 61 72 65  # Some tests are
16e0: 20 72 75 6e 20 6f 6e 6c 79 20 69 66 20 77 65 20   run only if we 
16f0: 61 72 65 20 64 6f 69 6e 67 20 74 65 73 74 69 6e  are doing testin
1700: 67 20 61 67 61 69 6e 73 74 20 61 20 72 65 6d 6f  g against a remo
1710: 74 65 20 73 65 72 76 65 72 2e 0a 73 65 74 20 3a  te server..set :
1720: 3a 74 63 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f  :tcltest::testCo
1730: 6e 73 74 72 61 69 6e 74 73 28 64 6f 54 65 73 74  nstraints(doTest
1740: 73 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65  sWithRemoteServe
1750: 72 29 20 24 64 6f 54 65 73 74 73 57 69 74 68 52  r) $doTestsWithR
1760: 65 6d 6f 74 65 53 65 72 76 65 72 0a 69 66 20 7b  emoteServer.if {
1770: 24 64 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f  $doTestsWithRemo
1780: 74 65 53 65 72 76 65 72 20 3d 3d 20 30 7d 20 7b  teServer == 0} {
1790: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
17a0: 20 66 69 72 73 74 20 73 20 24 3a 3a 74 63 6c 74   first s $::tclt
17b0: 65 73 74 3a 3a 76 65 72 62 6f 73 65 5d 20 21 3d  est::verbose] !=
17c0: 20 2d 31 7d 20 7b 0a 20 20 20 20 09 70 75 74 73   -1} {.    .puts
17d0: 20 22 53 6b 69 70 70 69 6e 67 20 74 65 73 74 73   "Skipping tests
17e0: 20 77 69 74 68 20 72 65 6d 6f 74 65 20 73 65 72   with remote ser
17f0: 76 65 72 2e 20 53 65 65 20 74 65 73 74 73 2f 73  ver. See tests/s
1800: 6f 63 6b 65 74 2e 74 65 73 74 20 66 6f 72 22 0a  ocket.test for".
1810: 09 70 75 74 73 20 22 69 6e 66 6f 72 6d 61 74 69  .puts "informati
1820: 6f 6e 20 6f 6e 20 68 6f 77 20 74 6f 20 72 75 6e  on on how to run
1830: 20 72 65 6d 6f 74 65 20 73 65 72 76 65 72 2e 22   remote server."
1840: 0a 09 70 75 74 73 20 22 52 65 61 73 6f 6e 20 66  ..puts "Reason f
1850: 6f 72 20 6e 6f 74 20 64 6f 69 6e 67 20 72 65 6d  or not doing rem
1860: 6f 74 65 20 74 65 73 74 73 3a 20 24 6e 6f 52 65  ote tests: $noRe
1870: 6d 6f 74 65 54 65 73 74 52 65 61 73 6f 6e 22 0a  moteTestReason".
1880: 20 20 20 20 7d 0a 7d 0a 0a 23 0a 23 20 49 66 20      }.}..#.# If 
1890: 77 65 20 64 6f 20 74 68 65 20 74 65 73 74 73 2c  we do the tests,
18a0: 20 64 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e   define a comman
18b0: 64 20 74 6f 20 73 65 6e 64 20 61 20 63 6f 6d 6d  d to send a comm
18c0: 61 6e 64 20 74 6f 20 74 68 65 0a 23 20 72 65 6d  and to the.# rem
18d0: 6f 74 65 20 73 65 72 76 65 72 2e 0a 23 0a 0a 69  ote server..#..i
18e0: 66 20 7b 24 64 6f 54 65 73 74 73 57 69 74 68 52  f {$doTestsWithR
18f0: 65 6d 6f 74 65 53 65 72 76 65 72 20 3d 3d 20 31  emoteServer == 1
1900: 7d 20 7b 0a 20 20 20 20 70 72 6f 63 20 73 65 6e  } {.    proc sen
1910: 64 43 6f 6d 6d 61 6e 64 20 7b 63 7d 20 7b 0a 09  dCommand {c} {..
1920: 67 6c 6f 62 61 6c 20 63 6f 6d 6d 61 6e 64 53 6f  global commandSo
1930: 63 6b 65 74 0a 0a 09 69 66 20 7b 5b 65 6f 66 20  cket...if {[eof 
1940: 24 63 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 5d 7d  $commandSocket]}
1950: 20 7b 0a 09 20 20 20 20 65 72 72 6f 72 20 22 72   {..    error "r
1960: 65 6d 6f 74 65 20 73 65 72 76 65 72 20 64 69 73  emote server dis
1970: 61 70 70 65 61 72 65 64 22 0a 09 7d 0a 0a 09 69  appeared"..}...i
1980: 66 20 7b 5b 63 61 74 63 68 20 7b 70 75 74 73 20  f {[catch {puts 
1990: 24 63 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 20 24  $commandSocket $
19a0: 63 7d 20 6d 73 67 5d 7d 20 7b 0a 09 20 20 20 20  c} msg]} {..    
19b0: 65 72 72 6f 72 20 22 72 65 6d 6f 74 65 20 73 65  error "remote se
19c0: 72 76 65 72 20 64 69 73 61 70 70 61 65 72 65 64  rver disappaered
19d0: 3a 20 24 6d 73 67 22 0a 09 7d 0a 09 69 66 20 7b  : $msg"..}..if {
19e0: 5b 63 61 74 63 68 20 7b 70 75 74 73 20 24 63 6f  [catch {puts $co
19f0: 6d 6d 61 6e 64 53 6f 63 6b 65 74 20 22 2d 2d 4d  mmandSocket "--M
1a00: 61 72 6b 65 72 2d 2d 4d 61 72 6b 65 72 2d 2d 4d  arker--Marker--M
1a10: 61 72 6b 65 72 2d 2d 22 7d 20 6d 73 67 5d 7d 20  arker--"} msg]} 
1a20: 7b 0a 09 20 20 20 20 65 72 72 6f 72 20 22 72 65  {..    error "re
1a30: 6d 6f 74 65 20 73 65 72 76 65 72 20 64 69 73 61  mote server disa
1a40: 70 70 65 61 72 65 64 3a 20 24 6d 73 67 22 0a 09  ppeared: $msg"..
1a50: 7d 0a 0a 09 73 65 74 20 72 65 73 70 20 22 22 0a  }...set resp "".
1a60: 09 77 68 69 6c 65 20 7b 31 7d 20 7b 0a 09 20 20  .while {1} {..  
1a70: 20 20 73 65 74 20 6c 69 6e 65 20 5b 67 65 74 73    set line [gets
1a80: 20 24 63 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 5d   $commandSocket]
1a90: 0a 09 20 20 20 20 69 66 20 7b 5b 65 6f 66 20 24  ..    if {[eof $
1aa0: 63 6f 6d 6d 61 6e 64 53 6f 63 6b 65 74 5d 7d 20  commandSocket]} 
1ab0: 7b 0a 09 09 65 72 72 6f 72 20 22 72 65 6d 6f 74  {...error "remot
1ac0: 65 20 73 65 72 76 65 72 20 64 69 73 61 70 70 65  e server disappe
1ad0: 61 72 65 64 22 0a 09 20 20 20 20 7d 0a 09 20 20  ared"..    }..  
1ae0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f    if {[string co
1af0: 6d 70 61 72 65 20 24 6c 69 6e 65 20 22 2d 2d 4d  mpare $line "--M
1b00: 61 72 6b 65 72 2d 2d 4d 61 72 6b 65 72 2d 2d 4d  arker--Marker--M
1b10: 61 72 6b 65 72 2d 2d 22 5d 20 3d 3d 20 30 7d 20  arker--"] == 0} 
1b20: 7b 0a 09 09 69 66 20 7b 5b 73 74 72 69 6e 67 20  {...if {[string 
1b30: 63 6f 6d 70 61 72 65 20 5b 6c 69 6e 64 65 78 20  compare [lindex 
1b40: 24 72 65 73 70 20 30 5d 20 65 72 72 6f 72 5d 20  $resp 0] error] 
1b50: 3d 3d 20 30 7d 20 7b 0a 09 09 20 20 20 20 65 72  == 0} {...    er
1b60: 72 6f 72 20 5b 6c 69 6e 64 65 78 20 24 72 65 73  ror [lindex $res
1b70: 70 20 31 5d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  p 1]...} else {.
1b80: 09 09 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69  ..    return [li
1b90: 6e 64 65 78 20 24 72 65 73 70 20 31 5d 0a 09 09  ndex $resp 1]...
1ba0: 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  }..    } else {.
1bb0: 09 09 61 70 70 65 6e 64 20 72 65 73 70 20 24 6c  ..append resp $l
1bc0: 69 6e 65 20 22 5c 6e 22 0a 09 20 20 20 20 7d 0a  ine "\n"..    }.
1bd0: 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 74 65 73 74  .}.    }.}..test
1be0: 20 74 6c 73 49 4f 2d 31 2e 31 20 7b 61 72 67 20   tlsIO-1.1 {arg 
1bf0: 70 61 72 73 69 6e 67 20 66 6f 72 20 73 6f 63 6b  parsing for sock
1c00: 65 74 20 63 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63  et command} {soc
1c10: 6b 65 74 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20  ket} {.    list 
1c20: 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63  [catch {tls::soc
1c30: 6b 65 74 20 2d 73 65 72 76 65 72 7d 20 6d 73 67  ket -server} msg
1c40: 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f  ] $msg.} {1 {wro
1c50: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1c60: 64 20 62 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65  d be "tls::socke
1c70: 74 20 2d 73 65 72 76 65 72 20 63 6f 6d 6d 61 6e  t -server comman
1c80: 64 20 3f 6f 70 74 69 6f 6e 73 3f 20 70 6f 72 74  d ?options? port
1c90: 22 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d  "}}..test tlsIO-
1ca0: 31 2e 32 20 7b 61 72 67 20 70 61 72 73 69 6e 67  1.2 {arg parsing
1cb0: 20 66 6f 72 20 73 6f 63 6b 65 74 20 63 6f 6d 6d   for socket comm
1cc0: 61 6e 64 7d 20 7b 73 6f 63 6b 65 74 7d 20 7b 0a  and} {socket} {.
1cd0: 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20      list [catch 
1ce0: 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65  {tls::socket -se
1cf0: 72 76 65 72 20 66 6f 6f 7d 20 6d 73 67 5d 20 24  rver foo} msg] $
1d00: 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20  msg.} {1 {wrong 
1d10: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1d20: 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d  e "tls::socket -
1d30: 73 65 72 76 65 72 20 63 6f 6d 6d 61 6e 64 20 3f  server command ?
1d40: 6f 70 74 69 6f 6e 73 3f 20 70 6f 72 74 22 7d 7d  options? port"}}
1d50: 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31 2e 33  ..test tlsIO-1.3
1d60: 20 7b 61 72 67 20 70 61 72 73 69 6e 67 20 66 6f   {arg parsing fo
1d70: 72 20 73 6f 63 6b 65 74 20 63 6f 6d 6d 61 6e 64  r socket command
1d80: 7d 20 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20  } {socket} {.   
1d90: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 74 6c   list [catch {tl
1da0: 73 3a 3a 73 6f 63 6b 65 74 20 2d 6d 79 61 64 64  s::socket -myadd
1db0: 72 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b  r} msg] $msg.} {
1dc0: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  1 {wrong # args:
1dd0: 20 73 68 6f 75 6c 64 20 62 65 20 22 74 6c 73 3a   should be "tls:
1de0: 3a 73 6f 63 6b 65 74 20 3f 6f 70 74 69 6f 6e 73  :socket ?options
1df0: 3f 20 68 6f 73 74 20 70 6f 72 74 22 7d 7d 0a 0a  ? host port"}}..
1e00: 74 65 73 74 20 74 6c 73 49 4f 2d 31 2e 34 20 7b  test tlsIO-1.4 {
1e10: 61 72 67 20 70 61 72 73 69 6e 67 20 66 6f 72 20  arg parsing for 
1e20: 73 6f 63 6b 65 74 20 63 6f 6d 6d 61 6e 64 7d 20  socket command} 
1e30: 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20 6c  {socket} {.    l
1e40: 69 73 74 20 5b 63 61 74 63 68 20 7b 74 6c 73 3a  ist [catch {tls:
1e50: 3a 73 6f 63 6b 65 74 20 2d 6d 79 61 64 64 72 20  :socket -myaddr 
1e60: 31 32 37 2e 30 2e 30 2e 31 7d 20 6d 73 67 5d 20  127.0.0.1} msg] 
1e70: 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67  $msg.} {1 {wrong
1e80: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1e90: 62 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  be "tls::socket 
1ea0: 3f 6f 70 74 69 6f 6e 73 3f 20 68 6f 73 74 20 70  ?options? host p
1eb0: 6f 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c 73  ort"}}..test tls
1ec0: 49 4f 2d 31 2e 35 20 7b 61 72 67 20 70 61 72 73  IO-1.5 {arg pars
1ed0: 69 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74 20 63  ing for socket c
1ee0: 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65 74 7d  ommand} {socket}
1ef0: 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74   {.    list [cat
1f00: 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  ch {tls::socket 
1f10: 2d 6d 79 70 6f 72 74 7d 20 6d 73 67 5d 20 24 6d  -myport} msg] $m
1f20: 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23  sg.} {1 {wrong #
1f30: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1f40: 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 3f 6f   "tls::socket ?o
1f50: 70 74 69 6f 6e 73 3f 20 68 6f 73 74 20 70 6f 72  ptions? host por
1f60: 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f  t"}}..test tlsIO
1f70: 2d 31 2e 36 20 7b 61 72 67 20 70 61 72 73 69 6e  -1.6 {arg parsin
1f80: 67 20 66 6f 72 20 73 6f 63 6b 65 74 20 63 6f 6d  g for socket com
1f90: 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65 74 7d 20 7b  mand} {socket} {
1fa0: 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68  .    list [catch
1fb0: 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 6d   {tls::socket -m
1fc0: 79 70 6f 72 74 20 78 78 78 78 7d 20 6d 73 67 5d  yport xxxx} msg]
1fd0: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e   $msg.} {1 {wron
1fe0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1ff0: 20 62 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74   be "tls::socket
2000: 20 3f 6f 70 74 69 6f 6e 73 3f 20 68 6f 73 74 20   ?options? host 
2010: 70 6f 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c  port"}}..test tl
2020: 73 49 4f 2d 31 2e 37 20 7b 61 72 67 20 70 61 72  sIO-1.7 {arg par
2030: 73 69 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74 20  sing for socket 
2040: 63 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65 74  command} {socket
2050: 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61  } {.    list [ca
2060: 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74  tch {tls::socket
2070: 20 2d 6d 79 70 6f 72 74 20 32 35 32 32 7d 20 6d   -myport 2522} m
2080: 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77  sg] $msg.} {1 {w
2090: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
20a0: 75 6c 64 20 62 65 20 22 74 6c 73 3a 3a 73 6f 63  uld be "tls::soc
20b0: 6b 65 74 20 3f 6f 70 74 69 6f 6e 73 3f 20 68 6f  ket ?options? ho
20c0: 73 74 20 70 6f 72 74 22 7d 7d 0a 0a 74 65 73 74  st port"}}..test
20d0: 20 74 6c 73 49 4f 2d 31 2e 38 20 7b 61 72 67 20   tlsIO-1.8 {arg 
20e0: 70 61 72 73 69 6e 67 20 66 6f 72 20 73 6f 63 6b  parsing for sock
20f0: 65 74 20 63 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63  et command} {soc
2100: 6b 65 74 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20  ket} {.    list 
2110: 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63  [catch {tls::soc
2120: 6b 65 74 20 2d 66 72 6f 62 6f 7a 7d 20 6d 73 67  ket -froboz} msg
2130: 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f  ] $msg.} {1 {wro
2140: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2150: 64 20 62 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65  d be "tls::socke
2160: 74 20 3f 6f 70 74 69 6f 6e 73 3f 20 68 6f 73 74  t ?options? host
2170: 20 70 6f 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74   port"}}..test t
2180: 6c 73 49 4f 2d 31 2e 39 20 7b 61 72 67 20 70 61  lsIO-1.9 {arg pa
2190: 72 73 69 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74  rsing for socket
21a0: 20 63 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65   command} {socke
21b0: 74 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63  t} {.    list [c
21c0: 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65  atch {tls::socke
21d0: 74 20 2d 73 65 72 76 65 72 20 66 6f 6f 20 2d 6d  t -server foo -m
21e0: 79 70 6f 72 74 20 32 35 32 31 20 33 33 33 33 7d  yport 2521 3333}
21f0: 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20   msg] $msg.} {1 
2200: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
2210: 68 6f 75 6c 64 20 62 65 20 22 74 6c 73 3a 3a 73  hould be "tls::s
2220: 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 63 6f  ocket -server co
2230: 6d 6d 61 6e 64 20 3f 6f 70 74 69 6f 6e 73 3f 20  mmand ?options? 
2240: 70 6f 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c  port"}}..test tl
2250: 73 49 4f 2d 31 2e 31 30 20 7b 61 72 67 20 70 61  sIO-1.10 {arg pa
2260: 72 73 69 6e 67 20 66 6f 72 20 73 6f 63 6b 65 74  rsing for socket
2270: 20 63 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63 6b 65   command} {socke
2280: 74 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63  t} {.    list [c
2290: 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65  atch {tls::socke
22a0: 74 20 68 6f 73 74 20 32 35 32 38 20 2d 6a 75 6e  t host 2528 -jun
22b0: 6b 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b  k} msg] $msg.} {
22c0: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  1 {wrong # args:
22d0: 20 73 68 6f 75 6c 64 20 62 65 20 22 74 6c 73 3a   should be "tls:
22e0: 3a 73 6f 63 6b 65 74 20 3f 6f 70 74 69 6f 6e 73  :socket ?options
22f0: 3f 20 68 6f 73 74 20 70 6f 72 74 22 7d 7d 0a 0a  ? host port"}}..
2300: 74 65 73 74 20 74 6c 73 49 4f 2d 31 2e 31 31 20  test tlsIO-1.11 
2310: 7b 61 72 67 20 70 61 72 73 69 6e 67 20 66 6f 72  {arg parsing for
2320: 20 73 6f 63 6b 65 74 20 63 6f 6d 6d 61 6e 64 7d   socket command}
2330: 20 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20   {socket} {.    
2340: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 74 6c 73  list [catch {tls
2350: 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72  ::socket -server
2360: 20 63 61 6c 6c 62 61 63 6b 20 32 35 32 30 20 2d   callback 2520 -
2370: 2d 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b  -} msg] $msg.} {
2380: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  1 {wrong # args:
2390: 20 73 68 6f 75 6c 64 20 62 65 20 22 74 6c 73 3a   should be "tls:
23a0: 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20  :socket -server 
23b0: 63 6f 6d 6d 61 6e 64 20 3f 6f 70 74 69 6f 6e 73  command ?options
23c0: 3f 20 70 6f 72 74 22 7d 7d 0a 0a 74 65 73 74 20  ? port"}}..test 
23d0: 74 6c 73 49 4f 2d 31 2e 31 32 20 7b 61 72 67 20  tlsIO-1.12 {arg 
23e0: 70 61 72 73 69 6e 67 20 66 6f 72 20 73 6f 63 6b  parsing for sock
23f0: 65 74 20 63 6f 6d 6d 61 6e 64 7d 20 7b 73 6f 63  et command} {soc
2400: 6b 65 74 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20  ket} {.    list 
2410: 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63  [catch {tls::soc
2420: 6b 65 74 20 66 6f 6f 20 62 61 64 70 6f 72 74 7d  ket foo badport}
2430: 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20   msg] $msg.} {1 
2440: 7b 65 78 70 65 63 74 65 64 20 69 6e 74 65 67 65  {expected intege
2450: 72 20 62 75 74 20 67 6f 74 20 22 62 61 64 70 6f  r but got "badpo
2460: 72 74 22 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49  rt"}}..test tlsI
2470: 4f 2d 32 2e 31 20 7b 74 63 70 20 63 6f 6e 6e 65  O-2.1 {tcp conne
2480: 63 74 69 6f 6e 7d 20 7b 73 6f 63 6b 65 74 20 73  ction} {socket s
2490: 74 64 69 6f 7d 20 7b 0a 20 20 20 20 72 65 6d 6f  tdio} {.    remo
24a0: 76 65 46 69 6c 65 20 73 63 72 69 70 74 0a 20 20  veFile script.  
24b0: 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63    set f [open sc
24c0: 72 69 70 74 20 77 5d 0a 20 20 20 20 70 75 74 73  ript w].    puts
24d0: 20 24 66 20 7b 0a 20 20 20 20 09 70 61 63 6b 61   $f {.    .packa
24e0: 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a 09  ge require tls..
24f0: 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72  set timer [after
2500: 20 32 30 30 30 20 22 73 65 74 20 78 20 74 69 6d   2000 "set x tim
2510: 65 64 5f 6f 75 74 22 5d 0a 20 20 20 20 7d 0a 20  ed_out"].    }. 
2520: 20 20 20 70 75 74 73 20 24 66 20 22 73 65 74 20     puts $f "set 
2530: 66 20 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  f \[tls::socket 
2540: 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20 2d  -server accept -
2550: 63 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72  certfile $server
2560: 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61  Cert -cafile $ca
2570: 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73  Cert -keyfile $s
2580: 65 72 76 65 72 4b 65 79 20 32 38 32 38 20 5c 5d  erverKey 2828 \]
2590: 22 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a  ".    puts $f {.
25a0: 09 70 72 6f 63 20 61 63 63 65 70 74 20 7b 66 69  .proc accept {fi
25b0: 6c 65 20 61 64 64 72 20 70 6f 72 74 7d 20 7b 0a  le addr port} {.
25c0: 09 20 20 20 20 67 6c 6f 62 61 6c 20 78 0a 09 20  .    global x.. 
25d0: 20 20 20 73 65 74 20 78 20 64 6f 6e 65 0a 20 20     set x done.  
25e0: 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20            close 
25f0: 24 66 69 6c 65 0a 09 7d 0a 09 70 75 74 73 20 72  $file..}..puts r
2600: 65 61 64 79 0a 09 76 77 61 69 74 20 78 0a 09 61  eady..vwait x..a
2610: 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74 69 6d  fter cancel $tim
2620: 65 72 0a 09 63 6c 6f 73 65 20 24 66 0a 09 70 75  er..close $f..pu
2630: 74 73 20 24 78 0a 20 20 20 20 7d 0a 20 20 20 20  ts $x.    }.    
2640: 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65 74  close $f.    set
2650: 20 66 20 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74   f [open "|[list
2660: 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c   $::tcltest::tcl
2670: 74 65 73 74 20 73 63 72 69 70 74 5d 22 20 72 5d  test script]" r]
2680: 0a 20 20 20 20 67 65 74 73 20 24 66 20 78 0a 20  .    gets $f x. 
2690: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 74     if {[catch {t
26a0: 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 63 65 72 74  ls::socket -cert
26b0: 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74  file $clientCert
26c0: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
26d0: 20 5c 0a 09 2d 6b 65 79 66 69 6c 65 20 24 63 6c   \..-keyfile $cl
26e0: 69 65 6e 74 4b 65 79 20 31 32 37 2e 30 2e 30 2e  ientKey 127.0.0.
26f0: 31 20 32 38 32 38 7d 20 6d 73 67 5d 7d 20 7b 0a  1 2828} msg]} {.
2700: 20 20 20 20 20 20 20 20 73 65 74 20 78 20 24 6d          set x $m
2710: 73 67 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  sg.    } else {.
2720: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
2730: 78 20 5b 67 65 74 73 20 24 66 5d 0a 20 20 20 20  x [gets $f].    
2740: 20 20 20 20 63 6c 6f 73 65 20 24 6d 73 67 0a 20      close $msg. 
2750: 20 20 20 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64     }.    lappend
2760: 20 78 20 5b 67 65 74 73 20 24 66 5d 0a 20 20 20   x [gets $f].   
2770: 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65   close $f.    se
2780: 74 20 78 0a 7d 20 7b 72 65 61 64 79 20 64 6f 6e  t x.} {ready don
2790: 65 20 7b 7d 7d 0a 0a 69 66 20 5b 69 6e 66 6f 20  e {}}..if [info 
27a0: 65 78 69 73 74 73 20 70 6f 72 74 5d 20 7b 0a 20  exists port] {. 
27b0: 20 20 20 69 6e 63 72 20 70 6f 72 74 0a 7d 20 65     incr port.} e
27c0: 6c 73 65 20 7b 20 0a 20 20 20 20 73 65 74 20 70  lse { .    set p
27d0: 6f 72 74 20 5b 65 78 70 72 20 32 30 34 38 20 2b  ort [expr 2048 +
27e0: 20 5b 70 69 64 5d 25 31 30 32 34 5d 0a 7d 0a 0a   [pid]%1024].}..
27f0: 74 65 73 74 20 74 6c 73 49 4f 2d 32 2e 32 20 7b  test tlsIO-2.2 {
2800: 74 63 70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  tcp connection w
2810: 69 74 68 20 63 6c 69 65 6e 74 20 70 6f 72 74 20  ith client port 
2820: 73 70 65 63 69 66 69 65 64 7d 20 7b 73 6f 63 6b  specified} {sock
2830: 65 74 20 73 74 64 69 6f 7d 20 7b 0a 20 20 20 20  et stdio} {.    
2840: 72 65 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70  removeFile scrip
2850: 74 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65  t.    set f [ope
2860: 6e 20 73 63 72 69 70 74 20 77 5d 0a 20 20 20 20  n script w].    
2870: 70 75 74 73 20 24 66 20 7b 0a 09 70 61 63 6b 61  puts $f {..packa
2880: 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a 09  ge require tls..
2890: 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72  set timer [after
28a0: 20 32 30 30 30 20 22 73 65 74 20 78 20 64 6f 6e   2000 "set x don
28b0: 65 22 5d 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  e"].    }.    pu
28c0: 74 73 20 24 66 20 22 73 65 74 20 66 20 5c 5b 74  ts $f "set f \[t
28d0: 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76  ls::socket -serv
28e0: 65 72 20 61 63 63 65 70 74 20 2d 63 65 72 74 66  er accept -certf
28f0: 69 6c 65 20 24 73 65 72 76 65 72 43 65 72 74 20  ile $serverCert 
2900: 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74 20  -cafile $caCert 
2910: 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65 72  -keyfile $server
2920: 4b 65 79 20 32 38 32 39 20 5c 5d 22 0a 20 20 20  Key 2829 \]".   
2930: 20 70 75 74 73 20 24 66 20 7b 0a 09 70 72 6f 63   puts $f {..proc
2940: 20 61 63 63 65 70 74 20 7b 66 69 6c 65 20 61 64   accept {file ad
2950: 64 72 20 70 6f 72 74 7d 20 7b 0a 20 20 20 20 20  dr port} {.     
2960: 20 20 20 20 20 20 20 67 6c 6f 62 61 6c 20 78 0a         global x.
2970: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 73              puts
2980: 20 22 5b 67 65 74 73 20 24 66 69 6c 65 5d 20 24   "[gets $file] $
2990: 70 6f 72 74 22 0a 20 20 20 20 20 20 20 20 20 20  port".          
29a0: 20 20 63 6c 6f 73 65 20 24 66 69 6c 65 0a 20 20    close $file.  
29b0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 78 20            set x 
29c0: 64 6f 6e 65 0a 09 7d 0a 09 70 75 74 73 20 72 65  done..}..puts re
29d0: 61 64 79 0a 09 76 77 61 69 74 20 78 0a 09 61 66  ady..vwait x..af
29e0: 74 65 72 20 63 61 6e 63 65 6c 20 24 74 69 6d 65  ter cancel $time
29f0: 72 0a 09 63 6c 6f 73 65 20 24 66 0a 20 20 20 20  r..close $f.    
2a00: 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20  }.    close $f. 
2a10: 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 22     set f [open "
2a20: 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74 65 73  |[list $::tcltes
2a30: 74 3a 3a 74 63 6c 74 65 73 74 20 73 63 72 69 70  t::tcltest scrip
2a40: 74 5d 22 20 72 5d 0a 20 20 20 20 67 65 74 73 20  t]" r].    gets 
2a50: 24 66 20 78 0a 20 20 20 20 67 6c 6f 62 61 6c 20  $f x.    global 
2a60: 70 6f 72 74 0a 20 20 20 20 69 66 20 7b 5b 63 61  port.    if {[ca
2a70: 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74  tch {tls::socket
2a80: 20 2d 6d 79 70 6f 72 74 20 24 70 6f 72 74 20 5c   -myport $port \
2a90: 0a 09 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69  ..-certfile $cli
2aa0: 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20  entCert -cafile 
2ab0: 24 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65 79 66  $caCert \..-keyf
2ac0: 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 31  ile $clientKey 1
2ad0: 32 37 2e 30 2e 30 2e 31 20 32 38 32 39 7d 20 73  27.0.0.1 2829} s
2ae0: 6f 63 6b 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  ock]} {.        
2af0: 73 65 74 20 78 20 24 73 6f 63 6b 0a 09 63 61 74  set x $sock..cat
2b00: 63 68 20 7b 63 6c 6f 73 65 20 5b 74 6c 73 3a 3a  ch {close [tls::
2b10: 73 6f 63 6b 65 74 20 31 32 37 2e 30 2e 30 2e 31  socket 127.0.0.1
2b20: 20 32 38 32 39 5d 7d 0a 20 20 20 20 7d 20 65 6c   2829]}.    } el
2b30: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 70 75 74  se {.        put
2b40: 73 20 24 73 6f 63 6b 20 68 65 6c 6c 6f 0a 09 66  s $sock hello..f
2b50: 6c 75 73 68 20 24 73 6f 63 6b 0a 20 20 20 20 20  lush $sock.     
2b60: 20 20 20 6c 61 70 70 65 6e 64 20 78 20 5b 67 65     lappend x [ge
2b70: 74 73 20 24 66 5d 0a 20 20 20 20 20 20 20 20 63  ts $f].        c
2b80: 6c 6f 73 65 20 24 73 6f 63 6b 0a 20 20 20 20 7d  lose $sock.    }
2b90: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20  .    close $f.  
2ba0: 20 20 73 65 74 20 78 0a 7d 20 5b 6c 69 73 74 20    set x.} [list 
2bb0: 72 65 61 64 79 20 22 68 65 6c 6c 6f 20 24 70 6f  ready "hello $po
2bc0: 72 74 22 5d 0a 0a 74 65 73 74 20 74 6c 73 49 4f  rt"]..test tlsIO
2bd0: 2d 32 2e 33 20 7b 74 63 70 20 63 6f 6e 6e 65 63  -2.3 {tcp connec
2be0: 74 69 6f 6e 20 77 69 74 68 20 63 6c 69 65 6e 74  tion with client
2bf0: 20 69 6e 74 65 72 66 61 63 65 20 73 70 65 63 69   interface speci
2c00: 66 69 65 64 7d 20 7b 73 6f 63 6b 65 74 20 73 74  fied} {socket st
2c10: 64 69 6f 7d 20 7b 0a 20 20 20 20 72 65 6d 6f 76  dio} {.    remov
2c20: 65 46 69 6c 65 20 73 63 72 69 70 74 0a 20 20 20  eFile script.   
2c30: 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72   set f [open scr
2c40: 69 70 74 20 77 5d 0a 20 20 20 20 70 75 74 73 20  ipt w].    puts 
2c50: 24 66 20 7b 0a 09 70 61 63 6b 61 67 65 20 72 65  $f {..package re
2c60: 71 75 69 72 65 20 74 6c 73 0a 09 73 65 74 20 74  quire tls..set t
2c70: 69 6d 65 72 20 5b 61 66 74 65 72 20 32 30 30 30  imer [after 2000
2c80: 20 22 73 65 74 20 78 20 64 6f 6e 65 22 5d 0a 20   "set x done"]. 
2c90: 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20 24 66     }.    puts $f
2ca0: 20 22 73 65 74 20 66 20 5c 5b 74 6c 73 3a 3a 73   "set f \[tls::s
2cb0: 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 61 63  ocket -server ac
2cc0: 63 65 70 74 20 2d 63 65 72 74 66 69 6c 65 20 24  cept -certfile $
2cd0: 73 65 72 76 65 72 43 65 72 74 20 2d 63 61 66 69  serverCert -cafi
2ce0: 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66  le $caCert -keyf
2cf0: 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20 32  ile $serverKey 2
2d00: 38 33 30 20 5c 5d 22 0a 20 20 20 20 70 75 74 73  830 \]".    puts
2d10: 20 24 66 20 7b 0a 09 70 72 6f 63 20 61 63 63 65   $f {..proc acce
2d20: 70 74 20 7b 66 69 6c 65 20 61 64 64 72 20 70 6f  pt {file addr po
2d30: 72 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  rt} {.          
2d40: 20 20 67 6c 6f 62 61 6c 20 78 0a 20 20 20 20 20    global x.     
2d50: 20 20 20 20 20 20 20 70 75 74 73 20 22 5b 67 65         puts "[ge
2d60: 74 73 20 24 66 69 6c 65 5d 20 24 61 64 64 72 22  ts $file] $addr"
2d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f  .            clo
2d80: 73 65 20 24 66 69 6c 65 0a 20 20 20 20 20 20 20  se $file.       
2d90: 20 20 20 20 20 73 65 74 20 78 20 64 6f 6e 65 0a       set x done.
2da0: 09 7d 0a 09 70 75 74 73 20 72 65 61 64 79 0a 09  .}..puts ready..
2db0: 76 77 61 69 74 20 78 0a 09 61 66 74 65 72 20 63  vwait x..after c
2dc0: 61 6e 63 65 6c 20 24 74 69 6d 65 72 0a 09 63 6c  ancel $timer..cl
2dd0: 6f 73 65 20 24 66 0a 20 20 20 20 7d 0a 20 20 20  ose $f.    }.   
2de0: 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65   close $f.    se
2df0: 74 20 66 20 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73  t f [open "|[lis
2e00: 74 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 63  t $::tcltest::tc
2e10: 6c 74 65 73 74 20 73 63 72 69 70 74 5d 22 20 72  ltest script]" r
2e20: 5d 0a 20 20 20 20 67 65 74 73 20 24 66 20 78 0a  ].    gets $f x.
2e30: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
2e40: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 6d 79 61  tls::socket -mya
2e50: 64 64 72 20 31 32 37 2e 30 2e 30 2e 31 20 5c 0a  ddr 127.0.0.1 \.
2e60: 09 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65  .-certfile $clie
2e70: 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24  ntCert -cafile $
2e80: 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65 79 66 69  caCert \..-keyfi
2e90: 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 31 32  le $clientKey 12
2ea0: 37 2e 30 2e 30 2e 31 20 32 38 33 30 7d 20 73 6f  7.0.0.1 2830} so
2eb0: 63 6b 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  ck]} {.        s
2ec0: 65 74 20 78 20 24 73 6f 63 6b 0a 20 20 20 20 7d  et x $sock.    }
2ed0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2ee0: 70 75 74 73 20 24 73 6f 63 6b 20 68 65 6c 6c 6f  puts $sock hello
2ef0: 0a 09 63 61 74 63 68 20 7b 66 6c 75 73 68 20 24  ..catch {flush $
2f00: 73 6f 63 6b 7d 0a 20 20 20 20 20 20 20 20 6c 61  sock}.        la
2f10: 70 70 65 6e 64 20 78 20 5b 67 65 74 73 20 24 66  ppend x [gets $f
2f20: 5d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20  ].        close 
2f30: 24 73 6f 63 6b 0a 20 20 20 20 7d 0a 20 20 20 20  $sock.    }.    
2f40: 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65 74  close $f.    set
2f50: 20 78 0a 7d 20 7b 72 65 61 64 79 20 7b 68 65 6c   x.} {ready {hel
2f60: 6c 6f 20 31 32 37 2e 30 2e 30 2e 31 7d 7d 0a 0a  lo 127.0.0.1}}..
2f70: 74 65 73 74 20 74 6c 73 49 4f 2d 32 2e 34 20 7b  test tlsIO-2.4 {
2f80: 74 63 70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  tcp connection w
2f90: 69 74 68 20 73 65 72 76 65 72 20 69 6e 74 65 72  ith server inter
2fa0: 66 61 63 65 20 73 70 65 63 69 66 69 65 64 7d 20  face specified} 
2fb0: 7b 73 6f 63 6b 65 74 20 73 74 64 69 6f 7d 20 7b  {socket stdio} {
2fc0: 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20  .    removeFile 
2fd0: 73 63 72 69 70 74 0a 20 20 20 20 73 65 74 20 66  script.    set f
2fe0: 20 5b 6f 70 65 6e 20 73 63 72 69 70 74 20 77 5d   [open script w]
2ff0: 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09  .    puts $f {..
3000: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
3010: 74 6c 73 0a 09 73 65 74 20 74 69 6d 65 72 20 5b  tls..set timer [
3020: 61 66 74 65 72 20 32 30 30 30 20 22 73 65 74 20  after 2000 "set 
3030: 78 20 64 6f 6e 65 22 5d 0a 20 20 20 20 7d 0a 20  x done"].    }. 
3040: 20 20 20 70 75 74 73 20 24 66 20 22 73 65 74 20     puts $f "set 
3050: 66 20 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  f \[tls::socket 
3060: 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20 2d  -server accept -
3070: 63 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72  certfile $server
3080: 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61  Cert -cafile $ca
3090: 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73  Cert -keyfile $s
30a0: 65 72 76 65 72 4b 65 79 20 2d 6d 79 61 64 64 72  erverKey -myaddr
30b0: 20 5b 69 6e 66 6f 20 68 6f 73 74 6e 61 6d 65 5d   [info hostname]
30c0: 20 32 38 33 31 20 5c 5d 22 0a 20 20 20 20 70 75   2831 \]".    pu
30d0: 74 73 20 24 66 20 7b 0a 09 70 72 6f 63 20 61 63  ts $f {..proc ac
30e0: 63 65 70 74 20 7b 66 69 6c 65 20 61 64 64 72 20  cept {file addr 
30f0: 70 6f 72 74 7d 20 7b 0a 20 20 20 20 20 20 20 20  port} {.        
3100: 20 20 20 20 67 6c 6f 62 61 6c 20 78 0a 20 20 20      global x.   
3110: 20 20 20 20 20 20 20 20 20 70 75 74 73 20 22 5b           puts "[
3120: 67 65 74 73 20 24 66 69 6c 65 5d 22 0a 20 20 20  gets $file]".   
3130: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20 24           close $
3140: 66 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  file.           
3150: 20 73 65 74 20 78 20 64 6f 6e 65 0a 09 7d 0a 09   set x done..}..
3160: 70 75 74 73 20 72 65 61 64 79 0a 09 76 77 61 69  puts ready..vwai
3170: 74 20 78 0a 09 61 66 74 65 72 20 63 61 6e 63 65  t x..after cance
3180: 6c 20 24 74 69 6d 65 72 0a 09 63 6c 6f 73 65 20  l $timer..close 
3190: 24 66 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f  $f.    }.    clo
31a0: 73 65 20 24 66 0a 20 20 20 20 73 65 74 20 66 20  se $f.    set f 
31b0: 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a  [open "|[list $:
31c0: 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73  :tcltest::tcltes
31d0: 74 20 73 63 72 69 70 74 5d 22 20 72 5d 0a 20 20  t script]" r].  
31e0: 20 20 67 65 74 73 20 24 66 20 78 0a 20 20 20 20    gets $f x.    
31f0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 74 6c 73 3a  if {[catch {tls:
3200: 3a 73 6f 63 6b 65 74 20 2d 63 65 72 74 66 69 6c  :socket -certfil
3210: 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63  e $clientCert -c
3220: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a  afile $caCert \.
3230: 09 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e  .-keyfile $clien
3240: 74 4b 65 79 20 5b 69 6e 66 6f 20 68 6f 73 74 6e  tKey [info hostn
3250: 61 6d 65 5d 20 32 38 33 31 7d 20 73 6f 63 6b 5d  ame] 2831} sock]
3260: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
3270: 78 20 24 73 6f 63 6b 0a 20 20 20 20 7d 20 65 6c  x $sock.    } el
3280: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 70 75 74  se {.        put
3290: 73 20 24 73 6f 63 6b 20 68 65 6c 6c 6f 0a 09 66  s $sock hello..f
32a0: 6c 75 73 68 20 24 73 6f 63 6b 0a 20 20 20 20 20  lush $sock.     
32b0: 20 20 20 6c 61 70 70 65 6e 64 20 78 20 5b 67 65     lappend x [ge
32c0: 74 73 20 24 66 5d 0a 20 20 20 20 20 20 20 20 63  ts $f].        c
32d0: 6c 6f 73 65 20 24 73 6f 63 6b 0a 20 20 20 20 7d  lose $sock.    }
32e0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20  .    close $f.  
32f0: 20 20 73 65 74 20 78 0a 7d 20 7b 72 65 61 64 79    set x.} {ready
3300: 20 68 65 6c 6c 6f 7d 0a 0a 74 65 73 74 20 74 6c   hello}..test tl
3310: 73 49 4f 2d 32 2e 35 20 7b 74 63 70 20 63 6f 6e  sIO-2.5 {tcp con
3320: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 72 65 64  nection with red
3330: 75 6e 64 61 6e 74 20 73 65 72 76 65 72 20 70 6f  undant server po
3340: 72 74 7d 20 7b 73 6f 63 6b 65 74 20 73 74 64 69  rt} {socket stdi
3350: 6f 7d 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46  o} {.    removeF
3360: 69 6c 65 20 73 63 72 69 70 74 0a 20 20 20 20 73  ile script.    s
3370: 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70  et f [open scrip
3380: 74 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24 66  t w].    puts $f
3390: 20 7b 0a 09 70 61 63 6b 61 67 65 20 72 65 71 75   {..package requ
33a0: 69 72 65 20 74 6c 73 0a 09 73 65 74 20 74 69 6d  ire tls..set tim
33b0: 65 72 20 5b 61 66 74 65 72 20 32 30 30 30 20 22  er [after 2000 "
33c0: 73 65 74 20 78 20 64 6f 6e 65 22 5d 0a 20 20 20  set x done"].   
33d0: 20 7d 0a 20 20 20 20 70 75 74 73 20 24 66 20 22   }.    puts $f "
33e0: 73 65 74 20 66 20 5c 5b 74 6c 73 3a 3a 73 6f 63  set f \[tls::soc
33f0: 6b 65 74 20 2d 73 65 72 76 65 72 20 61 63 63 65  ket -server acce
3400: 70 74 20 2d 63 65 72 74 66 69 6c 65 20 24 73 65  pt -certfile $se
3410: 72 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65  rverCert -cafile
3420: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
3430: 65 20 24 73 65 72 76 65 72 4b 65 79 20 32 38 33  e $serverKey 283
3440: 32 20 5c 5d 22 0a 20 20 20 20 70 75 74 73 20 24  2 \]".    puts $
3450: 66 20 7b 0a 09 70 72 6f 63 20 61 63 63 65 70 74  f {..proc accept
3460: 20 7b 66 69 6c 65 20 61 64 64 72 20 70 6f 72 74   {file addr port
3470: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
3480: 67 6c 6f 62 61 6c 20 78 0a 20 20 20 20 20 20 20  global x.       
3490: 20 20 20 20 20 70 75 74 73 20 22 5b 67 65 74 73       puts "[gets
34a0: 20 24 66 69 6c 65 5d 22 0a 20 20 20 20 20 20 20   $file]".       
34b0: 20 20 20 20 20 63 6c 6f 73 65 20 24 66 69 6c 65       close $file
34c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
34d0: 20 78 20 64 6f 6e 65 0a 09 7d 0a 09 70 75 74 73   x done..}..puts
34e0: 20 72 65 61 64 79 0a 09 76 77 61 69 74 20 78 0a   ready..vwait x.
34f0: 09 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74  .after cancel $t
3500: 69 6d 65 72 0a 09 63 6c 6f 73 65 20 24 66 0a 20  imer..close $f. 
3510: 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24     }.    close $
3520: 66 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65  f.    set f [ope
3530: 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c  n "|[list $::tcl
3540: 74 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73 63  test::tcltest sc
3550: 72 69 70 74 5d 22 20 72 5d 0a 20 20 20 20 67 65  ript]" r].    ge
3560: 74 73 20 24 66 20 78 0a 20 20 20 20 69 66 20 7b  ts $f x.    if {
3570: 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63  [catch {tls::soc
3580: 6b 65 74 20 2d 63 65 72 74 66 69 6c 65 20 24 63  ket -certfile $c
3590: 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c  lientCert -cafil
35a0: 65 20 24 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65  e $caCert \..-ke
35b0: 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79  yfile $clientKey
35c0: 20 31 32 37 2e 30 2e 30 2e 31 20 32 38 33 32 7d   127.0.0.1 2832}
35d0: 20 73 6f 63 6b 5d 7d 20 7b 0a 20 20 20 20 20 20   sock]} {.      
35e0: 20 20 73 65 74 20 78 20 24 73 6f 63 6b 0a 20 20    set x $sock.  
35f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
3600: 20 20 20 70 75 74 73 20 24 73 6f 63 6b 20 68 65     puts $sock he
3610: 6c 6c 6f 0a 09 66 6c 75 73 68 20 24 73 6f 63 6b  llo..flush $sock
3620: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
3630: 20 78 20 5b 67 65 74 73 20 24 66 5d 0a 20 20 20   x [gets $f].   
3640: 20 20 20 20 20 63 6c 6f 73 65 20 24 73 6f 63 6b       close $sock
3650: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65  .    }.    close
3660: 20 24 66 0a 20 20 20 20 73 65 74 20 78 0a 7d 20   $f.    set x.} 
3670: 7b 72 65 61 64 79 20 68 65 6c 6c 6f 7d 0a 74 65  {ready hello}.te
3680: 73 74 20 74 6c 73 49 4f 2d 32 2e 36 20 7b 74 63  st tlsIO-2.6 {tc
3690: 70 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7b 73  p connection} {s
36a0: 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20 73 65 74  ocket} {.    set
36b0: 20 73 74 61 74 75 73 20 6f 6b 0a 20 20 20 20 69   status ok.    i
36c0: 66 20 7b 21 5b 63 61 74 63 68 20 7b 73 65 74 20  f {![catch {set 
36d0: 73 6f 63 6b 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65  sock [tls::socke
36e0: 74 20 31 32 37 2e 30 2e 30 2e 31 20 32 38 33 33  t 127.0.0.1 2833
36f0: 5d 7d 5d 7d 20 7b 0a 09 69 66 20 7b 21 5b 63 61  ]}]} {..if {![ca
3700: 74 63 68 20 7b 67 65 74 73 20 24 73 6f 63 6b 7d  tch {gets $sock}
3710: 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74  ]} {..    set st
3720: 61 74 75 73 20 62 72 6f 6b 65 6e 0a 09 7d 0a 09  atus broken..}..
3730: 63 6c 6f 73 65 20 24 73 6f 63 6b 0a 20 20 20 20  close $sock.    
3740: 7d 0a 20 20 20 20 73 65 74 20 73 74 61 74 75 73  }.    set status
3750: 0a 7d 20 6f 6b 0a 0a 74 65 73 74 20 74 6c 73 49  .} ok..test tlsI
3760: 4f 2d 32 2e 37 20 7b 65 63 68 6f 20 73 65 72 76  O-2.7 {echo serv
3770: 65 72 2c 20 6f 6e 65 20 6c 69 6e 65 7d 20 7b 73  er, one line} {s
3780: 6f 63 6b 65 74 20 73 74 64 69 6f 7d 20 7b 0a 20  ocket stdio} {. 
3790: 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20 73 63     removeFile sc
37a0: 72 69 70 74 0a 20 20 20 20 73 65 74 20 66 20 5b  ript.    set f [
37b0: 6f 70 65 6e 20 73 63 72 69 70 74 20 77 5d 0a 20  open script w]. 
37c0: 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09 70 61     puts $f {..pa
37d0: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 74 6c  ckage require tl
37e0: 73 0a 09 73 65 74 20 74 69 6d 65 72 20 5b 61 66  s..set timer [af
37f0: 74 65 72 20 32 30 30 30 20 22 73 65 74 20 78 20  ter 2000 "set x 
3800: 64 6f 6e 65 22 5d 0a 20 20 20 20 7d 0a 20 20 20  done"].    }.   
3810: 20 70 75 74 73 20 24 66 20 22 73 65 74 20 66 20   puts $f "set f 
3820: 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73  \[tls::socket -s
3830: 65 72 76 65 72 20 61 63 63 65 70 74 20 2d 63 65  erver accept -ce
3840: 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65  rtfile $serverCe
3850: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
3860: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72  rt -keyfile $ser
3870: 76 65 72 4b 65 79 20 32 38 33 34 20 5c 5d 22 0a  verKey 2834 \]".
3880: 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09 70      puts $f {..p
3890: 72 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61 20  roc accept {s a 
38a0: 70 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p} {.           
38b0: 20 66 69 6c 65 65 76 65 6e 74 20 24 73 20 72 65   fileevent $s re
38c0: 61 64 61 62 6c 65 20 5b 6c 69 73 74 20 65 63 68  adable [list ech
38d0: 6f 20 24 73 5d 0a 09 20 20 20 20 66 63 6f 6e 66  o $s]..    fconf
38e0: 69 67 75 72 65 20 24 73 20 2d 74 72 61 6e 73 6c  igure $s -transl
38f0: 61 74 69 6f 6e 20 6c 66 20 2d 62 75 66 66 65 72  ation lf -buffer
3900: 69 6e 67 20 6c 69 6e 65 0a 20 20 20 20 20 20 20  ing line.       
3910: 20 7d 0a 09 70 72 6f 63 20 65 63 68 6f 20 7b 73   }..proc echo {s
3920: 7d 20 7b 0a 09 20 20 20 20 20 73 65 74 20 6c 20  } {..     set l 
3930: 5b 67 65 74 73 20 24 73 5d 0a 20 20 20 20 20 20  [gets $s].      
3940: 20 20 20 20 20 20 20 69 66 20 7b 5b 65 6f 66 20         if {[eof 
3950: 24 73 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  $s]} {.         
3960: 20 20 20 20 20 20 20 20 67 6c 6f 62 61 6c 20 78          global x
3970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3980: 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 20    close $s.     
3990: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
39a0: 78 20 64 6f 6e 65 0a 20 20 20 20 20 20 20 20 20  x done.         
39b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75                pu
39d0: 74 73 20 24 73 20 24 6c 0a 20 20 20 20 20 20 20  ts $s $l.       
39e0: 20 20 20 20 20 20 7d 0a 09 7d 0a 09 70 75 74 73        }..}..puts
39f0: 20 72 65 61 64 79 0a 09 76 77 61 69 74 20 78 0a   ready..vwait x.
3a00: 09 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74  .after cancel $t
3a10: 69 6d 65 72 0a 09 63 6c 6f 73 65 20 24 66 0a 09  imer..close $f..
3a20: 70 75 74 73 20 64 6f 6e 65 0a 20 20 20 20 7d 0a  puts done.    }.
3a30: 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 20      close $f.   
3a40: 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 22 7c 5b   set f [open "|[
3a50: 6c 69 73 74 20 24 3a 3a 74 63 6c 74 65 73 74 3a  list $::tcltest:
3a60: 3a 74 63 6c 74 65 73 74 20 73 63 72 69 70 74 5d  :tcltest script]
3a70: 22 20 72 5d 0a 20 20 20 20 67 65 74 73 20 24 66  " r].    gets $f
3a80: 0a 20 20 20 20 73 65 74 20 73 20 5b 74 6c 73 3a  .    set s [tls:
3a90: 3a 73 6f 63 6b 65 74 20 2d 63 65 72 74 66 69 6c  :socket -certfil
3aa0: 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63  e $clientCert -c
3ab0: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a  afile $caCert \.
3ac0: 09 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e  .-keyfile $clien
3ad0: 74 4b 65 79 20 31 32 37 2e 30 2e 30 2e 31 20 32  tKey 127.0.0.1 2
3ae0: 38 33 34 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67  834].    fconfig
3af0: 75 72 65 20 24 73 20 2d 62 75 66 66 65 72 69 6e  ure $s -bufferin
3b00: 67 20 6c 69 6e 65 20 2d 74 72 61 6e 73 6c 61 74  g line -translat
3b10: 69 6f 6e 20 6c 66 0a 20 20 20 20 70 75 74 73 20  ion lf.    puts 
3b20: 24 73 20 22 68 65 6c 6c 6f 20 61 62 63 64 65 66  $s "hello abcdef
3b30: 67 68 69 6a 6b 6c 6d 6e 6f 70 22 0a 20 20 20 20  ghijklmnop".    
3b40: 61 66 74 65 72 20 31 30 30 30 0a 20 20 20 20 73  after 1000.    s
3b50: 65 74 20 78 20 5b 67 65 74 73 20 24 73 5d 0a 20  et x [gets $s]. 
3b60: 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20     close $s.    
3b70: 73 65 74 20 79 20 5b 67 65 74 73 20 24 66 5d 0a  set y [gets $f].
3b80: 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 20      close $f.   
3b90: 20 6c 69 73 74 20 24 78 20 24 79 0a 7d 20 7b 7b   list $x $y.} {{
3ba0: 68 65 6c 6c 6f 20 61 62 63 64 65 66 67 68 69 6a  hello abcdefghij
3bb0: 6b 6c 6d 6e 6f 70 7d 20 64 6f 6e 65 7d 0a 0a 74  klmnop} done}..t
3bc0: 65 73 74 20 74 6c 73 49 4f 2d 32 2e 38 20 7b 65  est tlsIO-2.8 {e
3bd0: 63 68 6f 20 73 65 72 76 65 72 2c 20 6c 6f 6f 70  cho server, loop
3be0: 20 35 30 20 74 69 6d 65 73 2c 20 73 69 6e 67 6c   50 times, singl
3bf0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7b 73  e connection} {s
3c00: 6f 63 6b 65 74 20 73 74 64 69 6f 7d 20 7b 0a 20  ocket stdio} {. 
3c10: 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 73     set f [open s
3c20: 63 72 69 70 74 20 77 5d 0a 20 20 20 20 70 75 74  cript w].    put
3c30: 73 20 24 66 20 7b 0a 20 20 20 20 09 70 61 63 6b  s $f {.    .pack
3c40: 61 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a  age require tls.
3c50: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20 24      }.    puts $
3c60: 66 20 22 73 65 74 20 66 20 5c 5b 74 6c 73 3a 3a  f "set f \[tls::
3c70: 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 61  socket -server a
3c80: 63 63 65 70 74 20 2d 63 65 72 74 66 69 6c 65 20  ccept -certfile 
3c90: 24 73 65 72 76 65 72 43 65 72 74 20 2d 63 61 66  $serverCert -caf
3ca0: 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79  ile $caCert -key
3cb0: 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20  file $serverKey 
3cc0: 32 38 33 35 20 5c 5d 22 0a 20 20 20 20 70 75 74  2835 \]".    put
3cd0: 73 20 24 66 20 7b 0a 09 70 72 6f 63 20 61 63 63  s $f {..proc acc
3ce0: 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a 20 20  ept {s a p} {.  
3cf0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 65 76            fileev
3d00: 65 6e 74 20 24 73 20 72 65 61 64 61 62 6c 65 20  ent $s readable 
3d10: 5b 6c 69 73 74 20 65 63 68 6f 20 24 73 5d 0a 20  [list echo $s]. 
3d20: 20 20 20 20 20 20 20 20 20 20 20 66 63 6f 6e 66             fconf
3d30: 69 67 75 72 65 20 24 73 20 2d 62 75 66 66 65 72  igure $s -buffer
3d40: 69 6e 67 20 6c 69 6e 65 0a 20 20 20 20 20 20 20  ing line.       
3d50: 20 7d 0a 09 70 72 6f 63 20 65 63 68 6f 20 7b 73   }..proc echo {s
3d60: 7d 20 7b 0a 09 20 20 20 20 20 67 6c 6f 62 61 6c  } {..     global
3d70: 20 69 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   i.             
3d80: 73 65 74 20 6c 20 5b 67 65 74 73 20 24 73 5d 0a  set l [gets $s].
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3da0: 7b 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a 20 20 20  {[eof $s]} {.   
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6c                gl
3dc0: 6f 62 61 6c 20 78 0a 20 20 20 20 20 20 20 20 20  obal x.         
3dd0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20 24 73          close $s
3de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3df0: 20 20 73 65 74 20 78 20 64 6f 6e 65 0a 20 20 20    set x done.   
3e00: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
3e10: 20 7b 20 0a 09 20 20 20 20 20 20 20 20 20 69 6e   { ..         in
3e20: 63 72 20 69 0a 20 20 20 20 20 20 20 20 20 20 20  cr i.           
3e30: 20 20 20 20 20 20 70 75 74 73 20 24 73 20 24 6c        puts $s $l
3e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  .             }.
3e50: 09 7d 0a 09 73 65 74 20 69 20 30 0a 09 70 75 74  .}..set i 0..put
3e60: 73 20 72 65 61 64 79 0a 09 73 65 74 20 74 69 6d  s ready..set tim
3e70: 65 72 20 5b 61 66 74 65 72 20 32 30 30 30 30 20  er [after 20000 
3e80: 22 73 65 74 20 78 20 64 6f 6e 65 22 5d 0a 09 76  "set x done"]..v
3e90: 77 61 69 74 20 78 0a 09 61 66 74 65 72 20 63 61  wait x..after ca
3ea0: 6e 63 65 6c 20 24 74 69 6d 65 72 0a 09 63 6c 6f  ncel $timer..clo
3eb0: 73 65 20 24 66 0a 09 70 75 74 73 20 22 64 6f 6e  se $f..puts "don
3ec0: 65 20 24 69 22 0a 20 20 20 20 7d 0a 20 20 20 20  e $i".    }.    
3ed0: 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65 74  close $f.    set
3ee0: 20 66 20 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74   f [open "|[list
3ef0: 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c   $::tcltest::tcl
3f00: 74 65 73 74 20 73 63 72 69 70 74 5d 22 20 72 5d  test script]" r]
3f10: 0a 20 20 20 20 67 65 74 73 20 24 66 0a 20 20 20  .    gets $f.   
3f20: 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63   set s [tls::soc
3f30: 6b 65 74 20 2d 63 65 72 74 66 69 6c 65 20 24 63  ket -certfile $c
3f40: 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c  lientCert -cafil
3f50: 65 20 24 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65  e $caCert \..-ke
3f60: 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79  yfile $clientKey
3f70: 20 31 32 37 2e 30 2e 30 2e 31 20 32 38 33 35 5d   127.0.0.1 2835]
3f80: 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20  .    fconfigure 
3f90: 24 73 20 2d 62 75 66 66 65 72 69 6e 67 20 6c 69  $s -buffering li
3fa0: 6e 65 0a 20 20 20 20 63 61 74 63 68 20 7b 0a 09  ne.    catch {..
3fb0: 66 6f 72 20 7b 73 65 74 20 78 20 30 7d 20 7b 24  for {set x 0} {$
3fc0: 78 20 3c 20 35 30 7d 20 7b 69 6e 63 72 20 78 7d  x < 50} {incr x}
3fd0: 20 7b 0a 09 20 20 20 20 70 75 74 73 20 24 73 20   {..    puts $s 
3fe0: 22 68 65 6c 6c 6f 20 61 62 63 64 65 66 67 68 69  "hello abcdefghi
3ff0: 6a 6b 6c 6d 6e 6f 70 22 0a 09 20 20 20 20 67 65  jklmnop"..    ge
4000: 74 73 20 24 73 0a 09 7d 0a 20 20 20 20 7d 0a 20  ts $s..}.    }. 
4010: 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20     close $s.    
4020: 63 61 74 63 68 20 7b 73 65 74 20 78 20 5b 67 65  catch {set x [ge
4030: 74 73 20 24 66 5d 7d 0a 20 20 20 20 63 6c 6f 73  ts $f]}.    clos
4040: 65 20 24 66 0a 20 20 20 20 73 65 74 20 78 0a 7d  e $f.    set x.}
4050: 20 7b 64 6f 6e 65 20 35 30 7d 0a 0a 74 65 73 74   {done 50}..test
4060: 20 74 6c 73 49 4f 2d 32 2e 39 20 7b 73 6f 63 6b   tlsIO-2.9 {sock
4070: 65 74 20 63 6f 6e 66 6c 69 63 74 7d 20 7b 73 6f  et conflict} {so
4080: 63 6b 65 74 20 73 74 64 69 6f 7d 20 7b 0a 20 20  cket stdio} {.  
4090: 20 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f    set s [tls::so
40a0: 63 6b 65 74 20 2d 73 65 72 76 65 72 20 61 63 63  cket -server acc
40b0: 65 70 74 20 32 38 32 38 5d 0a 20 20 20 20 72 65  ept 2828].    re
40c0: 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74 0a  moveFile script.
40d0: 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20      set f [open 
40e0: 73 63 72 69 70 74 20 77 5d 0a 20 20 20 20 70 75  script w].    pu
40f0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66  ts -nonewline $f
4100: 20 7b 70 61 63 6b 61 67 65 20 72 65 71 75 69 72   {package requir
4110: 65 20 74 6c 73 3b 20 74 6c 73 3a 3a 73 6f 63 6b  e tls; tls::sock
4120: 65 74 20 2d 73 65 72 76 65 72 20 61 63 63 65 70  et -server accep
4130: 74 20 32 38 32 38 7d 0a 20 20 20 20 63 6c 6f 73  t 2828}.    clos
4140: 65 20 24 66 0a 20 20 20 20 73 65 74 20 66 20 5b  e $f.    set f [
4150: 6f 70 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a  open "|[list $::
4160: 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73 74  tcltest::tcltest
4170: 20 73 63 72 69 70 74 5d 22 20 72 5d 0a 20 20 20   script]" r].   
4180: 20 67 65 74 73 20 24 66 0a 20 20 20 20 61 66 74   gets $f.    aft
4190: 65 72 20 31 30 30 0a 20 20 20 20 73 65 74 20 78  er 100.    set x
41a0: 20 5b 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 63   [list [catch {c
41b0: 6c 6f 73 65 20 24 66 7d 20 6d 73 67 5d 20 24 6d  lose $f} msg] $m
41c0: 73 67 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 73  sg].    close $s
41d0: 0a 20 20 20 20 73 65 74 20 78 0a 7d 20 7b 31 20  .    set x.} {1 
41e0: 7b 63 6f 75 6c 64 6e 27 74 20 6f 70 65 6e 20 73  {couldn't open s
41f0: 6f 63 6b 65 74 3a 20 61 64 64 72 65 73 73 20 61  ocket: address a
4200: 6c 72 65 61 64 79 20 69 6e 20 75 73 65 0a 20 20  lready in use.  
4210: 20 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e    while executin
4220: 67 0a 22 3a 3a 73 6f 63 6b 65 74 20 2d 73 65 72  g."::socket -ser
4230: 76 65 72 20 7b 74 6c 73 3a 3a 5f 61 63 63 65 70  ver {tls::_accep
4240: 74 20 7b 2d 73 65 72 76 65 72 20 31 7d 20 61 63  t {-server 1} ac
4250: 63 65 70 74 7d 20 32 38 32 38 22 0a 20 20 20 20  cept} 2828".    
4260: 28 22 65 76 61 6c 22 20 62 6f 64 79 20 6c 69 6e  ("eval" body lin
4270: 65 20 31 29 0a 20 20 20 20 69 6e 76 6f 6b 65 64  e 1).    invoked
4280: 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 22 65 76   from within."ev
4290: 61 6c 20 3a 3a 73 6f 63 6b 65 74 20 24 73 6f 70  al ::socket $sop
42a0: 74 73 22 0a 20 20 20 20 28 70 72 6f 63 65 64 75  ts".    (procedu
42b0: 72 65 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 22  re "tls::socket"
42c0: 20 6c 69 6e 65 20 36 32 29 0a 20 20 20 20 69 6e   line 62).    in
42d0: 76 6f 6b 65 64 20 66 72 6f 6d 20 77 69 74 68 69  voked from withi
42e0: 6e 0a 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d  n."tls::socket -
42f0: 73 65 72 76 65 72 20 61 63 63 65 70 74 20 32 38  server accept 28
4300: 32 38 22 0a 20 20 20 20 28 66 69 6c 65 20 22 73  28".    (file "s
4310: 63 72 69 70 74 22 20 6c 69 6e 65 20 31 29 7d 7d  cript" line 1)}}
4320: 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 32 2e 31  ..test tlsIO-2.1
4330: 30 20 7b 63 6c 6f 73 65 20 6f 6e 20 61 63 63 65  0 {close on acce
4340: 70 74 2c 20 61 63 63 65 70 74 65 64 20 73 6f 63  pt, accepted soc
4350: 6b 65 74 20 6c 69 76 65 73 7d 20 7b 73 6f 63 6b  ket lives} {sock
4360: 65 74 20 6b 6e 6f 77 6e 42 75 67 7d 20 7b 0a 20  et knownBug} {. 
4370: 20 20 20 73 65 74 20 64 6f 6e 65 20 30 0a 20 20     set done 0.  
4380: 20 20 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74    set timer [aft
4390: 65 72 20 32 30 30 30 30 20 22 73 65 74 20 64 6f  er 20000 "set do
43a0: 6e 65 20 74 69 6d 65 64 5f 6f 75 74 22 5d 0a 20  ne timed_out"]. 
43b0: 20 20 20 73 65 74 20 73 73 20 5b 74 6c 73 3a 3a     set ss [tls::
43c0: 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 61  socket -server a
43d0: 63 63 65 70 74 20 2d 63 65 72 74 66 69 6c 65 20  ccept -certfile 
43e0: 24 73 65 72 76 65 72 43 65 72 74 20 2d 63 61 66  $serverCert -caf
43f0: 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a 09 2d  ile $caCert \..-
4400: 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b  keyfile $serverK
4410: 65 79 20 32 38 33 30 5d 0a 20 20 20 20 70 72 6f  ey 2830].    pro
4420: 63 20 61 63 63 65 70 74 20 7b 73 20 61 20 70 7d  c accept {s a p}
4430: 20 7b 0a 09 67 6c 6f 62 61 6c 20 73 73 0a 09 63   {..global ss..c
4440: 6c 6f 73 65 20 24 73 73 0a 09 66 69 6c 65 65 76  lose $ss..fileev
4450: 65 6e 74 20 24 73 20 72 65 61 64 61 62 6c 65 20  ent $s readable 
4460: 22 72 65 61 64 69 74 20 24 73 22 0a 09 66 63 6f  "readit $s"..fco
4470: 6e 66 69 67 75 72 65 20 24 73 20 2d 74 72 61 6e  nfigure $s -tran
4480: 73 20 6c 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  s lf.    }.    p
4490: 72 6f 63 20 72 65 61 64 69 74 20 7b 73 7d 20 7b  roc readit {s} {
44a0: 0a 09 67 6c 6f 62 61 6c 20 64 6f 6e 65 0a 09 67  ..global done..g
44b0: 65 74 73 20 24 73 0a 09 63 6c 6f 73 65 20 24 73  ets $s..close $s
44c0: 0a 09 73 65 74 20 64 6f 6e 65 20 31 0a 20 20 20  ..set done 1.   
44d0: 20 7d 0a 20 20 20 20 73 65 74 20 63 73 20 5b 74   }.    set cs [t
44e0: 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 63 65 72 74  ls::socket -cert
44f0: 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74  file $clientCert
4500: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
4510: 20 5c 0a 09 2d 6b 65 79 66 69 6c 65 20 24 63 6c   \..-keyfile $cl
4520: 69 65 6e 74 4b 65 79 20 5b 69 6e 66 6f 20 68 6f  ientKey [info ho
4530: 73 74 6e 61 6d 65 5d 20 32 38 33 30 5d 0a 20 20  stname] 2830].  
4540: 20 20 63 6c 6f 73 65 20 24 63 73 0a 0a 20 20 20    close $cs..   
4550: 20 76 77 61 69 74 20 64 6f 6e 65 0a 20 20 20 20   vwait done.    
4560: 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74 69  after cancel $ti
4570: 6d 65 72 0a 20 20 20 20 73 65 74 20 64 6f 6e 65  mer.    set done
4580: 0a 7d 20 31 0a 0a 74 65 73 74 20 74 6c 73 49 4f  .} 1..test tlsIO
4590: 2d 32 2e 31 31 20 7b 64 65 74 65 63 74 69 6e 67  -2.11 {detecting
45a0: 20 6e 65 77 20 64 61 74 61 7d 20 7b 73 6f 63 6b   new data} {sock
45b0: 65 74 20 6b 6e 6f 77 6e 42 75 67 7d 20 7b 0a 20  et knownBug} {. 
45c0: 20 20 20 70 72 6f 63 20 61 63 63 65 70 74 20 7b     proc accept {
45d0: 73 20 61 20 70 7d 20 7b 0a 09 67 6c 6f 62 61 6c  s a p} {..global
45e0: 20 73 6f 63 6b 0a 09 73 65 74 20 73 6f 63 6b 20   sock..set sock 
45f0: 24 73 0a 09 73 65 74 20 66 20 5b 6f 70 65 6e 20  $s..set f [open 
4600: 61 77 62 2e 6c 6f 67 20 77 5d 0a 09 70 75 74 73  awb.log w]..puts
4610: 20 24 66 20 5b 63 61 74 63 68 20 7b 74 6c 73 3a   $f [catch {tls:
4620: 3a 68 61 6e 64 73 68 61 6b 65 20 24 73 6f 63 6b  :handshake $sock
4630: 7d 20 65 72 72 5d 0a 09 70 75 74 73 20 24 66 20  } err]..puts $f 
4640: 22 65 72 72 3a 20 24 65 72 72 22 0a 09 70 75 74  "err: $err"..put
4650: 73 20 24 66 20 22 5b 74 6c 73 3a 3a 73 74 61 74  s $f "[tls::stat
4660: 75 73 20 24 73 6f 63 6b 5d 22 0a 09 63 6c 6f 73  us $sock]"..clos
4670: 65 20 24 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e $s.    }..    
4680: 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b  set s [tls::sock
4690: 65 74 20 2d 72 65 71 75 69 72 65 20 30 20 2d 72  et -require 0 -r
46a0: 65 71 75 65 73 74 20 30 20 2d 73 65 72 76 65 72  equest 0 -server
46b0: 20 61 63 63 65 70 74 20 2d 63 65 72 74 66 69 6c   accept -certfil
46c0: 65 20 24 73 65 72 76 65 72 43 65 72 74 20 2d 63  e $serverCert -c
46d0: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a  afile $caCert \.
46e0: 09 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65  .-keyfile $serve
46f0: 72 4b 65 79 20 32 34 30 30 5d 0a 20 20 20 20 73  rKey 2400].    s
4700: 65 74 20 73 6f 63 6b 20 22 22 0a 20 20 20 20 73  et sock "".    s
4710: 65 74 20 73 32 20 5b 74 6c 73 3a 3a 73 6f 63 6b  et s2 [tls::sock
4720: 65 74 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c  et -certfile $cl
4730: 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65  ientCert -cafile
4740: 20 24 63 61 43 65 72 74 20 5c 0a 09 2d 6b 65 79   $caCert \..-key
4750: 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20  file $clientKey 
4760: 31 32 37 2e 30 2e 30 2e 31 20 32 34 30 30 5d 0a  127.0.0.1 2400].
4770: 20 20 20 20 76 77 61 69 74 20 73 6f 63 6b 0a 20      vwait sock. 
4780: 20 20 20 70 75 74 73 20 24 73 32 20 6f 6e 65 0a     puts $s2 one.
4790: 20 20 20 20 66 6c 75 73 68 20 24 73 32 0a 20 20      flush $s2.  
47a0: 20 20 61 66 74 65 72 20 35 30 30 0a 20 20 20 20    after 500.    
47b0: 66 63 6f 6e 66 69 67 75 72 65 20 24 73 6f 63 6b  fconfigure $sock
47c0: 20 2d 62 6c 6f 63 6b 69 6e 67 20 30 0a 20 20 20   -blocking 0.   
47d0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 67 65 74   set result [get
47e0: 73 20 24 73 6f 63 6b 5d 0a 20 20 20 20 6c 61 70  s $sock].    lap
47f0: 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 67 65 74  pend result [get
4800: 73 20 24 73 6f 63 6b 5d 0a 20 20 20 20 66 63 6f  s $sock].    fco
4810: 6e 66 69 67 75 72 65 20 24 73 6f 63 6b 20 2d 62  nfigure $sock -b
4820: 6c 6f 63 6b 69 6e 67 20 31 0a 20 20 20 20 70 75  locking 1.    pu
4830: 74 73 20 24 73 32 20 74 77 6f 0a 20 20 20 20 66  ts $s2 two.    f
4840: 6c 75 73 68 20 24 73 32 0a 20 20 20 20 66 63 6f  lush $s2.    fco
4850: 6e 66 69 67 75 72 65 20 24 73 6f 63 6b 20 2d 62  nfigure $sock -b
4860: 6c 6f 63 6b 69 6e 67 20 30 0a 20 20 20 20 6c 61  locking 0.    la
4870: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 67 65  ppend result [ge
4880: 74 73 20 24 73 6f 63 6b 5d 0a 20 20 20 20 66 63  ts $sock].    fc
4890: 6f 6e 66 69 67 75 72 65 20 24 73 6f 63 6b 20 2d  onfigure $sock -
48a0: 62 6c 6f 63 6b 69 6e 67 20 31 0a 20 20 20 20 63  blocking 1.    c
48b0: 6c 6f 73 65 20 24 73 32 0a 20 20 20 20 63 6c 6f  lose $s2.    clo
48c0: 73 65 20 24 73 0a 20 20 20 20 63 6c 6f 73 65 20  se $s.    close 
48d0: 24 73 6f 63 6b 0a 20 20 20 20 73 65 74 20 72 65  $sock.    set re
48e0: 73 75 6c 74 0a 7d 20 7b 6f 6e 65 20 7b 7d 20 74  sult.} {one {} t
48f0: 77 6f 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d  wo}..test tlsIO-
4900: 32 2e 31 32 20 7b 74 63 70 20 63 6f 6e 6e 65 63  2.12 {tcp connec
4910: 74 69 6f 6e 3b 20 6e 6f 20 63 65 72 74 69 66 69  tion; no certifi
4920: 63 61 74 65 73 20 73 70 65 63 69 66 69 65 64 7d  cates specified}
4930: 20 7b 73 6f 63 6b 65 74 20 73 74 64 69 6f 20 70   {socket stdio p
4940: 63 43 72 61 73 68 7d 20 7b 0a 20 20 20 20 72 65  cCrash} {.    re
4950: 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74 0a  moveFile script.
4960: 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20      set f [open 
4970: 73 63 72 69 70 74 20 77 5d 0a 20 20 20 20 70 75  script w].    pu
4980: 74 73 20 24 66 20 7b 0a 20 20 20 20 09 70 61 63  ts $f {.    .pac
4990: 6b 61 67 65 20 72 65 71 75 69 72 65 20 74 6c 73  kage require tls
49a0: 0a 09 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74  ..set timer [aft
49b0: 65 72 20 32 30 30 30 20 22 73 65 74 20 78 20 74  er 2000 "set x t
49c0: 69 6d 65 64 5f 6f 75 74 22 5d 0a 09 73 65 74 20  imed_out"]..set 
49d0: 66 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d  f [tls::socket -
49e0: 73 65 72 76 65 72 20 61 63 63 65 70 74 20 32 38  server accept 28
49f0: 32 38 5d 0a 09 70 72 6f 63 20 61 63 63 65 70 74  28]..proc accept
4a00: 20 7b 66 69 6c 65 20 61 64 64 72 20 70 6f 72 74   {file addr port
4a10: 7d 20 7b 0a 09 20 20 20 20 67 6c 6f 62 61 6c 20  } {..    global 
4a20: 78 0a 09 20 20 20 20 73 65 74 20 78 20 64 6f 6e  x..    set x don
4a30: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c  e.            cl
4a40: 6f 73 65 20 24 66 69 6c 65 0a 09 7d 0a 09 70 75  ose $file..}..pu
4a50: 74 73 20 72 65 61 64 79 0a 09 76 77 61 69 74 20  ts ready..vwait 
4a60: 78 0a 09 61 66 74 65 72 20 63 61 6e 63 65 6c 20  x..after cancel 
4a70: 24 74 69 6d 65 72 0a 09 63 6c 6f 73 65 20 24 66  $timer..close $f
4a80: 0a 09 70 75 74 73 20 24 78 0a 20 20 20 20 7d 0a  ..puts $x.    }.
4a90: 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 20      close $f.   
4aa0: 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 22 7c 5b   set f [open "|[
4ab0: 6c 69 73 74 20 24 3a 3a 74 63 6c 74 65 73 74 3a  list $::tcltest:
4ac0: 3a 74 63 6c 74 65 73 74 20 73 63 72 69 70 74 5d  :tcltest script]
4ad0: 22 20 72 5d 0a 20 20 20 20 67 65 74 73 20 24 66  " r].    gets $f
4ae0: 20 78 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63   x.    if {[catc
4af0: 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 31  h {tls::socket 1
4b00: 32 37 2e 30 2e 30 2e 31 20 32 38 32 38 7d 20 6d  27.0.0.1 2828} m
4b10: 73 67 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  sg]} {.        s
4b20: 65 74 20 78 20 24 6d 73 67 0a 20 20 20 20 7d 20  et x $msg.    } 
4b30: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 6c  else {.        l
4b40: 61 70 70 65 6e 64 20 78 20 5b 67 65 74 73 20 24  append x [gets $
4b50: 66 5d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  f].        close
4b60: 20 24 6d 73 67 0a 20 20 20 20 7d 0a 20 20 20 20   $msg.    }.    
4b70: 6c 61 70 70 65 6e 64 20 78 20 5b 67 65 74 73 20  lappend x [gets 
4b80: 24 66 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  $f].    close $f
4b90: 0a 20 20 20 20 73 65 74 20 78 0a 7d 20 7b 72 65  .    set x.} {re
4ba0: 61 64 79 20 64 6f 6e 65 20 7b 7d 7d 0a 0a 74 65  ady done {}}..te
4bb0: 73 74 20 74 6c 73 49 4f 2d 33 2e 31 20 7b 73 6f  st tlsIO-3.1 {so
4bc0: 63 6b 65 74 20 63 6f 6e 66 6c 69 63 74 7d 20 7b  cket conflict} {
4bd0: 73 6f 63 6b 65 74 20 73 74 64 69 6f 7d 20 7b 0a  socket stdio} {.
4be0: 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20 73      removeFile s
4bf0: 63 72 69 70 74 0a 20 20 20 20 73 65 74 20 66 20  cript.    set f 
4c00: 5b 6f 70 65 6e 20 73 63 72 69 70 74 20 77 5d 0a  [open script w].
4c10: 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 20 20      puts $f {.  
4c20: 20 20 09 70 61 63 6b 61 67 65 20 72 65 71 75 69    .package requi
4c30: 72 65 20 74 6c 73 0a 20 20 20 20 7d 0a 20 20 20  re tls.    }.   
4c40: 20 70 75 74 73 20 24 66 20 22 73 65 74 20 66 20   puts $f "set f 
4c50: 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73  \[tls::socket -s
4c60: 65 72 76 65 72 20 61 63 63 65 70 74 20 2d 63 65  erver accept -ce
4c70: 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65  rtfile $serverCe
4c80: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
4c90: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72  rt -keyfile $ser
4ca0: 76 65 72 4b 65 79 20 32 38 32 38 20 5c 5d 22 0a  verKey 2828 \]".
4cb0: 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09 70      puts $f {..p
4cc0: 75 74 73 20 72 65 61 64 79 0a 09 67 65 74 73 20  uts ready..gets 
4cd0: 73 74 64 69 6e 0a 09 63 6c 6f 73 65 20 24 66 0a  stdin..close $f.
4ce0: 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20      }.    close 
4cf0: 24 66 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70  $f.    set f [op
4d00: 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63  en "|[list $::tc
4d10: 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73  ltest::tcltest s
4d20: 63 72 69 70 74 5d 22 20 72 2b 5d 0a 20 20 20 20  cript]" r+].    
4d30: 67 65 74 73 20 24 66 0a 20 20 20 20 73 65 74 20  gets $f.    set 
4d40: 78 20 5b 6c 69 73 74 20 5b 63 61 74 63 68 20 7b  x [list [catch {
4d50: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20  tls::socket \.. 
4d60: 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c     -certfile $cl
4d70: 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65  ientCert -cafile
4d80: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
4d90: 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 20  e $clientKey \. 
4da0: 20 20 20 09 2d 73 65 72 76 65 72 20 61 63 63 65     .-server acce
4db0: 70 74 20 32 38 32 38 7d 20 6d 73 67 5d 20 5c 0a  pt 2828} msg] \.
4dc0: 09 09 24 6d 73 67 5d 0a 20 20 20 20 70 75 74 73  ..$msg].    puts
4dd0: 20 24 66 20 62 79 65 0a 20 20 20 20 63 6c 6f 73   $f bye.    clos
4de0: 65 20 24 66 0a 20 20 20 20 73 65 74 20 78 0a 7d  e $f.    set x.}
4df0: 20 7b 31 20 7b 63 6f 75 6c 64 6e 27 74 20 6f 70   {1 {couldn't op
4e00: 65 6e 20 73 6f 63 6b 65 74 3a 20 61 64 64 72 65  en socket: addre
4e10: 73 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  ss already in us
4e20: 65 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d  e}}..test tlsIO-
4e30: 33 2e 32 20 7b 73 65 72 76 65 72 20 77 69 74 68  3.2 {server with
4e40: 20 73 65 76 65 72 61 6c 20 63 6c 69 65 6e 74 73   several clients
4e50: 7d 20 7b 73 6f 63 6b 65 74 20 73 74 64 69 6f 7d  } {socket stdio}
4e60: 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c   {.    removeFil
4e70: 65 20 73 63 72 69 70 74 0a 20 20 20 20 73 65 74  e script.    set
4e80: 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70 74 20   f [open script 
4e90: 77 5d 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b  w].    puts $f {
4ea0: 0a 20 20 20 20 09 70 61 63 6b 61 67 65 20 72 65  .    .package re
4eb0: 71 75 69 72 65 20 74 6c 73 0a 09 73 65 74 20 74  quire tls..set t
4ec0: 31 20 5b 61 66 74 65 72 20 33 30 30 30 30 20 22  1 [after 30000 "
4ed0: 73 65 74 20 78 20 74 69 6d 65 64 5f 6f 75 74 22  set x timed_out"
4ee0: 5d 0a 09 73 65 74 20 74 32 20 5b 61 66 74 65 72  ]..set t2 [after
4ef0: 20 33 31 30 30 30 20 22 73 65 74 20 78 20 74 69   31000 "set x ti
4f00: 6d 65 64 5f 6f 75 74 22 5d 0a 09 73 65 74 20 74  med_out"]..set t
4f10: 33 20 5b 61 66 74 65 72 20 33 32 30 30 30 20 22  3 [after 32000 "
4f20: 73 65 74 20 78 20 74 69 6d 65 64 5f 6f 75 74 22  set x timed_out"
4f30: 5d 0a 09 73 65 74 20 63 6f 75 6e 74 65 72 20 30  ]..set counter 0
4f40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20  .    }.    puts 
4f50: 24 66 20 22 73 65 74 20 73 20 5c 5b 74 6c 73 3a  $f "set s \[tls:
4f60: 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20  :socket -server 
4f70: 61 63 63 65 70 74 20 2d 63 65 72 74 66 69 6c 65  accept -certfile
4f80: 20 24 73 65 72 76 65 72 43 65 72 74 20 2d 63 61   $serverCert -ca
4f90: 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65  file $caCert -ke
4fa0: 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79  yfile $serverKey
4fb0: 20 32 38 32 38 20 5c 5d 22 0a 20 20 20 20 70 75   2828 \]".    pu
4fc0: 74 73 20 24 66 20 7b 0a 09 70 72 6f 63 20 61 63  ts $f {..proc ac
4fd0: 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a 09  cept {s a p} {..
4fe0: 20 20 20 20 66 69 6c 65 65 76 65 6e 74 20 24 73      fileevent $s
4ff0: 20 72 65 61 64 61 62 6c 65 20 5b 6c 69 73 74 20   readable [list 
5000: 65 63 68 6f 20 24 73 5d 0a 09 20 20 20 20 66 63  echo $s]..    fc
5010: 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62 75 66  onfigure $s -buf
5020: 66 65 72 69 6e 67 20 6c 69 6e 65 0a 09 7d 0a 09  fering line..}..
5030: 70 72 6f 63 20 65 63 68 6f 20 7b 73 7d 20 7b 0a  proc echo {s} {.
5040: 09 20 20 20 20 20 67 6c 6f 62 61 6c 20 78 0a 20  .     global x. 
5050: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
5060: 6c 20 5b 67 65 74 73 20 24 73 5d 0a 20 20 20 20  l [gets $s].    
5070: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 65 6f           if {[eo
5080: 66 20 24 73 5d 7d 20 7b 0a 20 20 20 20 20 20 20  f $s]} {.       
5090: 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20            close 
50a0: 24 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  $s.             
50b0: 20 20 20 20 73 65 74 20 78 20 64 6f 6e 65 0a 20      set x done. 
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
50d0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
50e0: 20 20 20 20 20 20 70 75 74 73 20 24 73 20 24 6c        puts $s $l
50f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  .             }.
5100: 09 7d 0a 09 70 75 74 73 20 72 65 61 64 79 0a 09  .}..puts ready..
5110: 76 77 61 69 74 20 78 0a 09 61 66 74 65 72 20 63  vwait x..after c
5120: 61 6e 63 65 6c 20 24 74 31 0a 09 76 77 61 69 74  ancel $t1..vwait
5130: 20 78 0a 09 61 66 74 65 72 20 63 61 6e 63 65 6c   x..after cancel
5140: 20 24 74 32 0a 09 76 77 61 69 74 20 78 0a 09 61   $t2..vwait x..a
5150: 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74 33 0a  fter cancel $t3.
5160: 09 63 6c 6f 73 65 20 24 73 0a 09 70 75 74 73 20  .close $s..puts 
5170: 24 78 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f  $x.    }.    clo
5180: 73 65 20 24 66 0a 20 20 20 20 73 65 74 20 66 20  se $f.    set f 
5190: 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a  [open "|[list $:
51a0: 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73  :tcltest::tcltes
51b0: 74 20 73 63 72 69 70 74 5d 22 20 72 2b 5d 0a 20  t script]" r+]. 
51c0: 20 20 20 73 65 74 20 78 20 5b 67 65 74 73 20 24     set x [gets $
51d0: 66 5d 0a 20 20 20 20 73 65 74 20 73 31 20 5b 74  f].    set s1 [t
51e0: 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20  ls::socket \..  
51f0: 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69    -certfile $cli
5200: 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20  entCert -cafile 
5210: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
5220: 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20   $clientKey \.. 
5230: 20 20 20 31 32 37 2e 30 2e 30 2e 31 20 32 38 32     127.0.0.1 282
5240: 38 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72  8].    fconfigur
5250: 65 20 24 73 31 20 2d 62 75 66 66 65 72 69 6e 67  e $s1 -buffering
5260: 20 6c 69 6e 65 0a 20 20 20 20 73 65 74 20 73 32   line.    set s2
5270: 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a   [tls::socket \.
5280: 09 20 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24  .    -certfile $
5290: 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69  clientCert -cafi
52a0: 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66  le $caCert -keyf
52b0: 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c  ile $clientKey \
52c0: 0a 09 20 20 20 20 31 32 37 2e 30 2e 30 2e 31 20  ..    127.0.0.1 
52d0: 32 38 32 38 5d 0a 20 20 20 20 66 63 6f 6e 66 69  2828].    fconfi
52e0: 67 75 72 65 20 24 73 32 20 2d 62 75 66 66 65 72  gure $s2 -buffer
52f0: 69 6e 67 20 6c 69 6e 65 0a 20 20 20 20 73 65 74  ing line.    set
5300: 20 73 33 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74   s3 [tls::socket
5310: 20 5c 0a 09 20 20 20 20 2d 63 65 72 74 66 69 6c   \..    -certfil
5320: 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63  e $clientCert -c
5330: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b  afile $caCert -k
5340: 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65  eyfile $clientKe
5350: 79 20 5c 0a 09 20 20 20 20 31 32 37 2e 30 2e 30  y \..    127.0.0
5360: 2e 31 20 32 38 32 38 5d 0a 20 20 20 20 66 63 6f  .1 2828].    fco
5370: 6e 66 69 67 75 72 65 20 24 73 33 20 2d 62 75 66  nfigure $s3 -buf
5380: 66 65 72 69 6e 67 20 6c 69 6e 65 0a 20 20 20 20  fering line.    
5390: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
53a0: 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69  i < 100} {incr i
53b0: 7d 20 7b 0a 09 70 75 74 73 20 24 73 31 20 68 65  } {..puts $s1 he
53c0: 6c 6c 6f 2c 73 31 0a 09 67 65 74 73 20 24 73 31  llo,s1..gets $s1
53d0: 0a 09 70 75 74 73 20 24 73 32 20 68 65 6c 6c 6f  ..puts $s2 hello
53e0: 2c 73 32 0a 09 67 65 74 73 20 24 73 32 0a 09 70  ,s2..gets $s2..p
53f0: 75 74 73 20 24 73 33 20 68 65 6c 6c 6f 2c 73 33  uts $s3 hello,s3
5400: 0a 09 67 65 74 73 20 24 73 33 0a 20 20 20 20 7d  ..gets $s3.    }
5410: 0a 20 20 20 20 63 6c 6f 73 65 20 24 73 31 0a 20  .    close $s1. 
5420: 20 20 20 63 6c 6f 73 65 20 24 73 32 0a 20 20 20     close $s2.   
5430: 20 63 6c 6f 73 65 20 24 73 33 0a 20 20 20 20 6c   close $s3.    l
5440: 61 70 70 65 6e 64 20 78 20 5b 67 65 74 73 20 24  append x [gets $
5450: 66 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a  f].    close $f.
5460: 20 20 20 20 73 65 74 20 78 0a 7d 20 7b 72 65 61      set x.} {rea
5470: 64 79 20 64 6f 6e 65 7d 0a 0a 74 65 73 74 20 74  dy done}..test t
5480: 6c 73 49 4f 2d 34 2e 31 20 7b 73 65 72 76 65 72  lsIO-4.1 {server
5490: 20 77 69 74 68 20 73 65 76 65 72 61 6c 20 63 6c   with several cl
54a0: 69 65 6e 74 73 7d 20 7b 73 6f 63 6b 65 74 20 73  ients} {socket s
54b0: 74 64 69 6f 7d 20 7b 0a 20 20 20 20 72 65 6d 6f  tdio} {.    remo
54c0: 76 65 46 69 6c 65 20 73 63 72 69 70 74 0a 20 20  veFile script.  
54d0: 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63    set f [open sc
54e0: 72 69 70 74 20 77 5d 0a 20 20 20 20 70 75 74 73  ript w].    puts
54f0: 20 24 66 20 7b 0a 20 20 20 20 09 70 61 63 6b 61   $f {.    .packa
5500: 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a 09  ge require tls..
5510: 67 65 74 73 20 73 74 64 69 6e 0a 20 20 20 20 7d  gets stdin.    }
5520: 0a 20 20 20 20 70 75 74 73 20 24 66 20 22 73 65  .    puts $f "se
5530: 74 20 73 20 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65  t s \[tls::socke
5540: 74 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69  t -certfile $cli
5550: 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20  entCert -cafile 
5560: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
5570: 20 24 63 6c 69 65 6e 74 4b 65 79 20 31 32 37 2e   $clientKey 127.
5580: 30 2e 30 2e 31 20 32 38 32 38 20 5c 5d 22 0a 20  0.0.1 2828 \]". 
5590: 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09 66 63     puts $f {..fc
55a0: 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62 75 66  onfigure $s -buf
55b0: 66 65 72 69 6e 67 20 6c 69 6e 65 0a 09 66 6f 72  fering line..for
55c0: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
55d0: 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b   100} {incr i} {
55e0: 0a 09 20 20 20 20 70 75 74 73 20 24 73 20 68 65  ..    puts $s he
55f0: 6c 6c 6f 0a 09 20 20 20 20 67 65 74 73 20 24 73  llo..    gets $s
5600: 0a 09 7d 0a 09 63 6c 6f 73 65 20 24 73 0a 09 70  ..}..close $s..p
5610: 75 74 73 20 62 79 65 0a 09 67 65 74 73 20 73 74  uts bye..gets st
5620: 64 69 6e 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c  din.    }.    cl
5630: 6f 73 65 20 24 66 0a 20 20 20 20 73 65 74 20 70  ose $f.    set p
5640: 31 20 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74 20  1 [open "|[list 
5650: 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74  $::tcltest::tclt
5660: 65 73 74 20 73 63 72 69 70 74 5d 22 20 72 2b 5d  est script]" r+]
5670: 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20  .    fconfigure 
5680: 24 70 31 20 2d 62 75 66 66 65 72 69 6e 67 20 6c  $p1 -buffering l
5690: 69 6e 65 0a 20 20 20 20 73 65 74 20 70 32 20 5b  ine.    set p2 [
56a0: 6f 70 65 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a  open "|[list $::
56b0: 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73 74  tcltest::tcltest
56c0: 20 73 63 72 69 70 74 5d 22 20 72 2b 5d 0a 20 20   script]" r+].  
56d0: 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 70 32    fconfigure $p2
56e0: 20 2d 62 75 66 66 65 72 69 6e 67 20 6c 69 6e 65   -buffering line
56f0: 0a 20 20 20 20 73 65 74 20 70 33 20 5b 6f 70 65  .    set p3 [ope
5700: 6e 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c  n "|[list $::tcl
5710: 74 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73 63  test::tcltest sc
5720: 72 69 70 74 5d 22 20 72 2b 5d 0a 20 20 20 20 66  ript]" r+].    f
5730: 63 6f 6e 66 69 67 75 72 65 20 24 70 33 20 2d 62  configure $p3 -b
5740: 75 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 20 20  uffering line.  
5750: 20 20 70 72 6f 63 20 61 63 63 65 70 74 20 7b 73    proc accept {s
5760: 20 61 20 70 7d 20 7b 0a 09 66 63 6f 6e 66 69 67   a p} {..fconfig
5770: 75 72 65 20 24 73 20 2d 62 75 66 66 65 72 69 6e  ure $s -bufferin
5780: 67 20 6c 69 6e 65 0a 09 66 69 6c 65 65 76 65 6e  g line..fileeven
5790: 74 20 24 73 20 72 65 61 64 61 62 6c 65 20 5b 6c  t $s readable [l
57a0: 69 73 74 20 65 63 68 6f 20 24 73 5d 0a 20 20 20  ist echo $s].   
57b0: 20 7d 0a 20 20 20 20 70 72 6f 63 20 65 63 68 6f   }.    proc echo
57c0: 20 7b 73 7d 20 7b 0a 09 67 6c 6f 62 61 6c 20 78   {s} {..global x
57d0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6c 20 5b  .        set l [
57e0: 67 65 74 73 20 24 73 5d 0a 20 20 20 20 20 20 20  gets $s].       
57f0: 20 69 66 20 7b 5b 65 6f 66 20 24 73 5d 7d 20 7b   if {[eof $s]} {
5800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f  .            clo
5810: 73 65 20 24 73 0a 20 20 20 20 20 20 20 20 20 20  se $s.          
5820: 20 20 73 65 74 20 78 20 64 6f 6e 65 0a 20 20 20    set x done.   
5830: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
5840: 20 20 20 20 20 20 20 20 20 20 70 75 74 73 20 24            puts $
5850: 73 20 24 6c 0a 20 20 20 20 20 20 20 20 7d 0a 20  s $l.        }. 
5860: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 74 31 20     }.    set t1 
5870: 5b 61 66 74 65 72 20 33 30 30 30 30 20 22 73 65  [after 30000 "se
5880: 74 20 78 20 74 69 6d 65 64 5f 6f 75 74 22 5d 0a  t x timed_out"].
5890: 20 20 20 20 73 65 74 20 74 32 20 5b 61 66 74 65      set t2 [afte
58a0: 72 20 33 31 30 30 30 20 22 73 65 74 20 78 20 74  r 31000 "set x t
58b0: 69 6d 65 64 5f 6f 75 74 22 5d 0a 20 20 20 20 73  imed_out"].    s
58c0: 65 74 20 74 33 20 5b 61 66 74 65 72 20 33 32 30  et t3 [after 320
58d0: 30 30 20 22 73 65 74 20 78 20 74 69 6d 65 64 5f  00 "set x timed_
58e0: 6f 75 74 22 5d 0a 20 20 20 20 73 65 74 20 73 20  out"].    set s 
58f0: 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09  [tls::socket \..
5900: 20 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 73      -certfile $s
5910: 65 72 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c  erverCert -cafil
5920: 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69  e $caCert -keyfi
5930: 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c 0a  le $serverKey \.
5940: 20 20 20 20 09 2d 73 65 72 76 65 72 20 61 63 63      .-server acc
5950: 65 70 74 20 32 38 32 38 5d 0a 20 20 20 20 70 75  ept 2828].    pu
5960: 74 73 20 24 70 31 20 6f 70 65 6e 0a 20 20 20 20  ts $p1 open.    
5970: 70 75 74 73 20 24 70 32 20 6f 70 65 6e 0a 20 20  puts $p2 open.  
5980: 20 20 70 75 74 73 20 24 70 33 20 6f 70 65 6e 0a    puts $p3 open.
5990: 20 20 20 20 76 77 61 69 74 20 78 0a 20 20 20 20      vwait x.    
59a0: 76 77 61 69 74 20 78 0a 20 20 20 20 76 77 61 69  vwait x.    vwai
59b0: 74 20 78 0a 20 20 20 20 61 66 74 65 72 20 63 61  t x.    after ca
59c0: 6e 63 65 6c 20 24 74 31 0a 20 20 20 20 61 66 74  ncel $t1.    aft
59d0: 65 72 20 63 61 6e 63 65 6c 20 24 74 32 0a 20 20  er cancel $t2.  
59e0: 20 20 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24    after cancel $
59f0: 74 33 0a 20 20 20 20 63 6c 6f 73 65 20 24 73 0a  t3.    close $s.
5a00: 20 20 20 20 73 65 74 20 6c 20 22 22 0a 20 20 20      set l "".   
5a10: 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74   lappend l [list
5a20: 20 70 31 20 5b 67 65 74 73 20 24 70 31 5d 20 24   p1 [gets $p1] $
5a30: 78 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6c  x].    lappend l
5a40: 20 5b 6c 69 73 74 20 70 32 20 5b 67 65 74 73 20   [list p2 [gets 
5a50: 24 70 32 5d 20 24 78 5d 0a 20 20 20 20 6c 61 70  $p2] $x].    lap
5a60: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 70 33 20  pend l [list p3 
5a70: 5b 67 65 74 73 20 24 70 33 5d 20 24 78 5d 0a 20  [gets $p3] $x]. 
5a80: 20 20 20 70 75 74 73 20 24 70 31 20 62 79 65 0a     puts $p1 bye.
5a90: 20 20 20 20 70 75 74 73 20 24 70 32 20 62 79 65      puts $p2 bye
5aa0: 0a 20 20 20 20 70 75 74 73 20 24 70 33 20 62 79  .    puts $p3 by
5ab0: 65 0a 20 20 20 20 63 6c 6f 73 65 20 24 70 31 0a  e.    close $p1.
5ac0: 20 20 20 20 63 6c 6f 73 65 20 24 70 32 0a 20 20      close $p2.  
5ad0: 20 20 63 6c 6f 73 65 20 24 70 33 0a 20 20 20 20    close $p3.    
5ae0: 73 65 74 20 6c 0a 7d 20 7b 7b 70 31 20 62 79 65  set l.} {{p1 bye
5af0: 20 64 6f 6e 65 7d 20 7b 70 32 20 62 79 65 20 64   done} {p2 bye d
5b00: 6f 6e 65 7d 20 7b 70 33 20 62 79 65 20 64 6f 6e  one} {p3 bye don
5b10: 65 7d 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d  e}}..test tlsIO-
5b20: 34 2e 32 20 7b 62 79 74 65 20 6f 72 64 65 72 20  4.2 {byte order 
5b30: 70 72 6f 62 6c 65 6d 73 2c 20 73 6f 63 6b 65 74  problems, socket
5b40: 20 6e 75 6d 62 65 72 73 2c 20 68 74 6f 6e 73 7d   numbers, htons}
5b50: 20 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20   {socket} {.    
5b60: 73 65 74 20 78 20 6f 6b 0a 20 20 20 20 69 66 20  set x ok.    if 
5b70: 7b 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f  {[catch {tls::so
5b80: 63 6b 65 74 20 2d 73 65 72 76 65 72 20 64 6f 64  cket -server dod
5b90: 6f 20 30 78 33 30 30 30 7d 20 6d 73 67 5d 7d 20  o 0x3000} msg]} 
5ba0: 7b 0a 09 73 65 74 20 78 20 24 6d 73 67 0a 20 20  {..set x $msg.  
5bb0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 6c 6f 73    } else {..clos
5bc0: 65 20 24 6d 73 67 0a 20 20 20 20 7d 0a 20 20 20  e $msg.    }.   
5bd0: 20 73 65 74 20 78 0a 7d 20 6f 6b 0a 0a 74 65 73   set x.} ok..tes
5be0: 74 20 74 6c 73 49 4f 2d 35 2e 31 20 7b 62 79 74  t tlsIO-5.1 {byt
5bf0: 65 20 6f 72 64 65 72 20 70 72 6f 62 6c 65 6d 73  e order problems
5c00: 2c 20 73 6f 63 6b 65 74 20 6e 75 6d 62 65 72 73  , socket numbers
5c10: 2c 20 68 74 6f 6e 73 7d 20 5c 0a 09 7b 73 6f 63  , htons} \..{soc
5c20: 6b 65 74 20 75 6e 69 78 4f 6e 6c 79 20 6e 6f 74  ket unixOnly not
5c30: 52 6f 6f 74 7d 20 7b 0a 20 20 20 20 73 65 74 20  Root} {.    set 
5c40: 78 20 7b 63 6f 75 6c 64 6e 27 74 20 6f 70 65 6e  x {couldn't open
5c50: 20 73 6f 63 6b 65 74 3a 20 6e 6f 74 20 6f 77 6e   socket: not own
5c60: 65 72 7d 0a 20 20 20 20 69 66 20 7b 21 5b 63 61  er}.    if {![ca
5c70: 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65 74  tch {tls::socket
5c80: 20 2d 73 65 72 76 65 72 20 64 6f 64 6f 20 30 78   -server dodo 0x
5c90: 31 7d 20 6d 73 67 5d 7d 20 7b 0a 20 20 20 20 20  1} msg]} {.     
5ca0: 20 20 20 73 65 74 20 78 20 7b 68 74 6f 6e 73 20     set x {htons 
5cb0: 70 72 6f 62 6c 65 6d 2c 20 73 68 6f 75 6c 64 20  problem, should 
5cc0: 62 65 20 64 69 73 61 6c 6c 6f 77 65 64 2c 20 61  be disallowed, a
5cd0: 72 65 20 79 6f 75 20 72 75 6e 6e 69 6e 67 20 61  re you running a
5ce0: 73 20 53 55 3f 7d 0a 09 63 6c 6f 73 65 20 24 6d  s SU?}..close $m
5cf0: 73 67 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  sg.    }.    set
5d00: 20 78 0a 7d 20 7b 63 6f 75 6c 64 6e 27 74 20 6f   x.} {couldn't o
5d10: 70 65 6e 20 73 6f 63 6b 65 74 3a 20 6e 6f 74 20  pen socket: not 
5d20: 6f 77 6e 65 72 7d 0a 74 65 73 74 20 74 6c 73 49  owner}.test tlsI
5d30: 4f 2d 35 2e 32 20 7b 62 79 74 65 20 6f 72 64 65  O-5.2 {byte orde
5d40: 72 20 70 72 6f 62 6c 65 6d 73 2c 20 73 6f 63 6b  r problems, sock
5d50: 65 74 20 6e 75 6d 62 65 72 73 2c 20 68 74 6f 6e  et numbers, hton
5d60: 73 7d 20 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20 20  s} {socket} {.  
5d70: 20 20 73 65 74 20 78 20 7b 63 6f 75 6c 64 6e 27    set x {couldn'
5d80: 74 20 6f 70 65 6e 20 73 6f 63 6b 65 74 3a 20 70  t open socket: p
5d90: 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f 6f 20 68  ort number too h
5da0: 69 67 68 7d 0a 20 20 20 20 69 66 20 7b 21 5b 63  igh}.    if {![c
5db0: 61 74 63 68 20 7b 74 6c 73 3a 3a 73 6f 63 6b 65  atch {tls::socke
5dc0: 74 20 2d 73 65 72 76 65 72 20 64 6f 64 6f 20 30  t -server dodo 0
5dd0: 78 31 30 30 30 30 7d 20 6d 73 67 5d 7d 20 7b 0a  x10000} msg]} {.
5de0: 09 73 65 74 20 78 20 7b 70 6f 72 74 20 72 65 73  .set x {port res
5df0: 6f 6c 75 74 69 6f 6e 20 70 72 6f 62 6c 65 6d 2c  olution problem,
5e00: 20 73 68 6f 75 6c 64 20 62 65 20 64 69 73 61 6c   should be disal
5e10: 6c 6f 77 65 64 7d 0a 09 63 6c 6f 73 65 20 24 6d  lowed}..close $m
5e20: 73 67 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  sg.    }.    set
5e30: 20 78 0a 7d 20 7b 63 6f 75 6c 64 6e 27 74 20 6f   x.} {couldn't o
5e40: 70 65 6e 20 73 6f 63 6b 65 74 3a 20 70 6f 72 74  pen socket: port
5e50: 20 6e 75 6d 62 65 72 20 74 6f 6f 20 68 69 67 68   number too high
5e60: 7d 0a 74 65 73 74 20 74 6c 73 49 4f 2d 35 2e 33  }.test tlsIO-5.3
5e70: 20 7b 62 79 74 65 20 6f 72 64 65 72 20 70 72 6f   {byte order pro
5e80: 62 6c 65 6d 73 2c 20 73 6f 63 6b 65 74 20 6e 75  blems, socket nu
5e90: 6d 62 65 72 73 2c 20 68 74 6f 6e 73 7d 20 5c 0a  mbers, htons} \.
5ea0: 09 7b 73 6f 63 6b 65 74 20 75 6e 69 78 4f 6e 6c  .{socket unixOnl
5eb0: 79 20 6e 6f 74 52 6f 6f 74 7d 20 7b 0a 20 20 20  y notRoot} {.   
5ec0: 20 73 65 74 20 78 20 7b 63 6f 75 6c 64 6e 27 74   set x {couldn't
5ed0: 20 6f 70 65 6e 20 73 6f 63 6b 65 74 3a 20 6e 6f   open socket: no
5ee0: 74 20 6f 77 6e 65 72 7d 0a 20 20 20 20 69 66 20  t owner}.    if 
5ef0: 7b 21 5b 63 61 74 63 68 20 7b 74 6c 73 3a 3a 73  {![catch {tls::s
5f00: 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 64 6f  ocket -server do
5f10: 64 6f 20 32 31 7d 20 6d 73 67 5d 7d 20 7b 0a 09  do 21} msg]} {..
5f20: 73 65 74 20 78 20 7b 68 74 6f 6e 73 20 70 72 6f  set x {htons pro
5f30: 62 6c 65 6d 2c 20 73 68 6f 75 6c 64 20 62 65 20  blem, should be 
5f40: 64 69 73 61 6c 6c 6f 77 65 64 2c 20 61 72 65 20  disallowed, are 
5f50: 79 6f 75 20 72 75 6e 6e 69 6e 67 20 61 73 20 53  you running as S
5f60: 55 3f 7d 0a 09 63 6c 6f 73 65 20 24 6d 73 67 0a  U?}..close $msg.
5f70: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 78 0a      }.    set x.
5f80: 7d 20 7b 63 6f 75 6c 64 6e 27 74 20 6f 70 65 6e  } {couldn't open
5f90: 20 73 6f 63 6b 65 74 3a 20 6e 6f 74 20 6f 77 6e   socket: not own
5fa0: 65 72 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d  er}..test tlsIO-
5fb0: 36 2e 31 20 7b 61 63 63 65 70 74 20 63 61 6c 6c  6.1 {accept call
5fc0: 62 61 63 6b 20 65 72 72 6f 72 7d 20 7b 75 6e 65  back error} {une
5fd0: 78 70 6c 61 69 6e 65 64 46 61 69 6c 75 72 65 20  xplainedFailure 
5fe0: 73 6f 63 6b 65 74 20 73 74 64 69 6f 20 70 63 43  socket stdio pcC
5ff0: 72 61 73 68 7d 20 7b 0a 20 20 20 20 72 65 6d 6f  rash} {.    remo
6000: 76 65 46 69 6c 65 20 73 63 72 69 70 74 0a 20 20  veFile script.  
6010: 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 73 63    set f [open sc
6020: 72 69 70 74 20 77 5d 0a 20 20 20 20 70 75 74 73  ript w].    puts
6030: 20 24 66 20 7b 0a 20 20 20 20 09 70 61 63 6b 61   $f {.    .packa
6040: 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a 09  ge require tls..
6050: 67 65 74 73 20 73 74 64 69 6e 0a 09 74 6c 73 3a  gets stdin..tls:
6060: 3a 73 6f 63 6b 65 74 20 31 32 37 2e 30 2e 30 2e  :socket 127.0.0.
6070: 31 20 32 38 34 38 0a 20 20 20 20 7d 0a 20 20 20  1 2848.    }.   
6080: 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65   close $f.    se
6090: 74 20 66 20 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73  t f [open "|[lis
60a0: 74 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 63  t $::tcltest::tc
60b0: 6c 74 65 73 74 20 73 63 72 69 70 74 5d 22 20 72  ltest script]" r
60c0: 2b 5d 0a 20 20 20 20 70 72 6f 63 20 62 67 65 72  +].    proc bger
60d0: 72 6f 72 20 61 72 67 73 20 7b 0a 09 67 6c 6f 62  ror args {..glob
60e0: 61 6c 20 78 0a 09 73 65 74 20 78 20 24 61 72 67  al x..set x $arg
60f0: 73 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 63  s.    }.    proc
6100: 20 61 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20   accept {s a p} 
6110: 7b 65 78 70 72 20 31 30 20 2f 20 30 7d 0a 20 20  {expr 10 / 0}.  
6120: 20 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f    set s [tls::so
6130: 63 6b 65 74 20 2d 73 65 72 76 65 72 20 61 63 63  cket -server acc
6140: 65 70 74 20 32 38 34 38 5d 0a 20 20 20 20 70 75  ept 2848].    pu
6150: 74 73 20 24 66 20 68 65 6c 6c 6f 0a 20 20 20 20  ts $f hello.    
6160: 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65 74  close $f.    set
6170: 20 74 69 6d 65 72 20 5b 61 66 74 65 72 20 31 30   timer [after 10
6180: 30 30 30 20 22 73 65 74 20 78 20 74 69 6d 65 64  000 "set x timed
6190: 5f 6f 75 74 22 5d 0a 20 20 20 20 76 77 61 69 74  _out"].    vwait
61a0: 20 78 0a 20 20 20 20 61 66 74 65 72 20 63 61 6e   x.    after can
61b0: 63 65 6c 20 24 74 69 6d 65 72 0a 20 20 20 20 63  cel $timer.    c
61c0: 6c 6f 73 65 20 24 73 0a 20 20 20 20 72 65 6e 61  lose $s.    rena
61d0: 6d 65 20 62 67 65 72 72 6f 72 20 7b 7d 0a 20 20  me bgerror {}.  
61e0: 20 20 73 65 74 20 78 0a 7d 20 7b 7b 64 69 76 69    set x.} {{divi
61f0: 64 65 20 62 79 20 7a 65 72 6f 7d 7d 0a 0a 23 20  de by zero}}..# 
6200: 62 75 67 20 72 65 70 6f 72 74 20 23 35 38 31 32  bug report #5812
6210: 20 66 63 6f 6e 66 69 67 75 72 65 20 64 6f 65 73   fconfigure does
6220: 6e 27 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  n't return value
6230: 20 66 6f 72 20 27 2d 70 65 65 72 6e 61 6d 65 27   for '-peername'
6240: 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 37 2e 31  ..test tlsIO-7.1
6250: 20 7b 74 65 73 74 69 6e 67 20 73 6f 63 6b 65 74   {testing socket
6260: 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e   specific option
6270: 73 7d 20 7b 6b 6e 6f 77 6e 42 75 67 20 73 6f 63  s} {knownBug soc
6280: 6b 65 74 20 73 74 64 69 6f 7d 20 7b 0a 20 20 20  ket stdio} {.   
6290: 20 72 65 6d 6f 76 65 46 69 6c 65 20 73 63 72 69   removeFile scri
62a0: 70 74 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70  pt.    set f [op
62b0: 65 6e 20 73 63 72 69 70 74 20 77 5d 0a 20 20 20  en script w].   
62c0: 20 70 75 74 73 20 24 66 20 7b 0a 09 70 61 63 6b   puts $f {..pack
62d0: 61 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a  age require tls.
62e0: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20 24      }.    puts $
62f0: 66 20 22 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d  f "tls::socket -
6300: 73 65 72 76 65 72 20 61 63 63 65 70 74 20 2d 63  server accept -c
6310: 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43  ertfile $serverC
6320: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
6330: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65  ert -keyfile $se
6340: 72 76 65 72 4b 65 79 20 32 38 32 30 22 0a 20 20  rverKey 2820".  
6350: 20 20 70 75 74 73 20 24 66 20 7b 0a 09 70 72 6f    puts $f {..pro
6360: 63 20 61 63 63 65 70 74 20 61 72 67 73 20 7b 0a  c accept args {.
6370: 09 20 20 20 20 67 6c 6f 62 61 6c 20 78 0a 09 20  .    global x.. 
6380: 20 20 20 73 65 74 20 78 20 64 6f 6e 65 0a 09 7d     set x done..}
6390: 0a 09 70 75 74 73 20 72 65 61 64 79 0a 09 73 65  ..puts ready..se
63a0: 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72 20 31  t timer [after 1
63b0: 30 30 30 30 20 22 73 65 74 20 78 20 74 69 6d 65  0000 "set x time
63c0: 64 5f 6f 75 74 22 5d 0a 09 76 77 61 69 74 20 78  d_out"]..vwait x
63d0: 0a 09 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24  ..after cancel $
63e0: 74 69 6d 65 72 0a 20 20 20 20 7d 0a 20 20 20 20  timer.    }.    
63f0: 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65 74  close $f.    set
6400: 20 66 20 5b 6f 70 65 6e 20 22 7c 5b 6c 69 73 74   f [open "|[list
6410: 20 24 3a 3a 74 63 6c 74 65 73 74 3a 3a 74 63 6c   $::tcltest::tcl
6420: 74 65 73 74 20 73 63 72 69 70 74 5d 22 20 72 5d  test script]" r]
6430: 0a 20 20 20 20 67 65 74 73 20 24 66 0a 20 20 20  .    gets $f.   
6440: 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63   set s [tls::soc
6450: 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65 72 74  ket \..    -cert
6460: 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74  file $clientCert
6470: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
6480: 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e   -keyfile $clien
6490: 74 4b 65 79 20 5c 0a 09 20 20 20 20 31 32 37 2e  tKey \..    127.
64a0: 30 2e 30 2e 31 20 32 38 32 30 5d 0a 20 20 20 20  0.0.1 2820].    
64b0: 73 65 74 20 70 20 5b 66 63 6f 6e 66 69 67 75 72  set p [fconfigur
64c0: 65 20 24 73 20 2d 70 65 65 72 6e 61 6d 65 5d 0a  e $s -peername].
64d0: 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20      close $s.   
64e0: 20 63 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65   close $f.    se
64f0: 74 20 6c 20 22 22 0a 20 20 20 20 6c 61 70 70 65  t l "".    lappe
6500: 6e 64 20 6c 20 5b 73 74 72 69 6e 67 20 63 6f 6d  nd l [string com
6510: 70 61 72 65 20 5b 6c 69 6e 64 65 78 20 24 70 20  pare [lindex $p 
6520: 30 5d 20 31 32 37 2e 30 2e 30 2e 31 5d 0a 20 20  0] 127.0.0.1].  
6530: 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 73 74 72    lappend l [str
6540: 69 6e 67 20 63 6f 6d 70 61 72 65 20 5b 6c 69 6e  ing compare [lin
6550: 64 65 78 20 24 70 20 32 5d 20 32 38 32 30 5d 0a  dex $p 2] 2820].
6560: 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c      lappend l [l
6570: 6c 65 6e 67 74 68 20 24 70 5d 0a 7d 20 7b 30 20  length $p].} {0 
6580: 30 20 33 7d 0a 0a 23 20 62 75 67 20 72 65 70 6f  0 3}..# bug repo
6590: 72 74 20 23 35 38 31 32 20 66 63 6f 6e 66 69 67  rt #5812 fconfig
65a0: 75 72 65 20 64 6f 65 73 6e 27 74 20 72 65 74 75  ure doesn't retu
65b0: 72 6e 20 76 61 6c 75 65 20 66 6f 72 20 27 2d 73  rn value for '-s
65c0: 6f 63 6b 6e 61 6d 65 27 0a 0a 74 65 73 74 20 74  ockname'..test t
65d0: 6c 73 49 4f 2d 37 2e 32 20 7b 74 65 73 74 69 6e  lsIO-7.2 {testin
65e0: 67 20 73 6f 63 6b 65 74 20 73 70 65 63 69 66 69  g socket specifi
65f0: 63 20 6f 70 74 69 6f 6e 73 7d 20 7b 6b 6e 6f 77  c options} {know
6600: 6e 42 75 67 20 73 6f 63 6b 65 74 20 73 74 64 69  nBug socket stdi
6610: 6f 7d 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46  o} {.    removeF
6620: 69 6c 65 20 73 63 72 69 70 74 0a 20 20 20 20 73  ile script.    s
6630: 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70  et f [open scrip
6640: 74 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24 66  t w].    puts $f
6650: 20 7b 0a 09 70 61 63 6b 61 67 65 20 72 65 71 75   {..package requ
6660: 69 72 65 20 74 6c 73 0a 20 20 20 20 7d 0a 20 20  ire tls.    }.  
6670: 20 20 70 75 74 73 20 24 66 20 22 74 6c 73 3a 3a    puts $f "tls::
6680: 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 61  socket -server a
6690: 63 63 65 70 74 20 2d 63 65 72 74 66 69 6c 65 20  ccept -certfile 
66a0: 24 73 65 72 76 65 72 43 65 72 74 20 2d 63 61 66  $serverCert -caf
66b0: 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79  ile $caCert -key
66c0: 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20  file $serverKey 
66d0: 32 38 32 31 22 0a 20 20 20 20 70 75 74 73 20 24  2821".    puts $
66e0: 66 20 7b 0a 09 70 72 6f 63 20 61 63 63 65 70 74  f {..proc accept
66f0: 20 61 72 67 73 20 7b 0a 09 20 20 20 20 67 6c 6f   args {..    glo
6700: 62 61 6c 20 78 0a 09 20 20 20 20 73 65 74 20 78  bal x..    set x
6710: 20 64 6f 6e 65 0a 09 7d 0a 09 70 75 74 73 20 72   done..}..puts r
6720: 65 61 64 79 0a 09 73 65 74 20 74 69 6d 65 72 20  eady..set timer 
6730: 5b 61 66 74 65 72 20 31 30 30 30 30 20 22 73 65  [after 10000 "se
6740: 74 20 78 20 74 69 6d 65 64 5f 6f 75 74 22 5d 0a  t x timed_out"].
6750: 09 76 77 61 69 74 20 78 0a 09 61 66 74 65 72 20  .vwait x..after 
6760: 63 61 6e 63 65 6c 20 24 74 69 6d 65 72 0a 20 20  cancel $timer.  
6770: 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66    }.    close $f
6780: 0a 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e  .    set f [open
6790: 20 22 7c 5b 6c 69 73 74 20 24 3a 3a 74 63 6c 74   "|[list $::tclt
67a0: 65 73 74 3a 3a 74 63 6c 74 65 73 74 20 73 63 72  est::tcltest scr
67b0: 69 70 74 5d 22 20 72 5d 0a 20 20 20 20 67 65 74  ipt]" r].    get
67c0: 73 20 24 66 0a 20 20 20 20 73 65 74 20 73 20 5b  s $f.    set s [
67d0: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20  tls::socket \.. 
67e0: 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c     -certfile $cl
67f0: 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65  ientCert -cafile
6800: 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c   $caCert -keyfil
6810: 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09  e $clientKey \..
6820: 20 20 20 20 31 32 37 2e 30 2e 30 2e 31 20 32 38      127.0.0.1 28
6830: 32 31 5d 0a 20 20 20 20 73 65 74 20 70 20 5b 66  21].    set p [f
6840: 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 73 6f  configure $s -so
6850: 63 6b 6e 61 6d 65 5d 0a 20 20 20 20 63 6c 6f 73  ckname].    clos
6860: 65 20 24 73 0a 20 20 20 20 63 6c 6f 73 65 20 24  e $s.    close $
6870: 66 0a 20 20 20 20 73 65 74 20 6c 20 22 22 0a 20  f.    set l "". 
6880: 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 6c     lappend l [ll
6890: 65 6e 67 74 68 20 24 70 5d 0a 20 20 20 20 6c 61  ength $p].    la
68a0: 70 70 65 6e 64 20 6c 20 5b 6c 69 6e 64 65 78 20  ppend l [lindex 
68b0: 24 70 20 30 5d 0a 20 20 20 20 6c 61 70 70 65 6e  $p 0].    lappen
68c0: 64 20 6c 20 5b 73 74 72 69 6e 67 20 65 71 75 61  d l [string equa
68d0: 6c 20 5b 6c 69 6e 64 65 78 20 24 70 20 32 5d 20  l [lindex $p 2] 
68e0: 32 38 32 31 5d 0a 7d 20 7b 33 20 31 32 37 2e 30  2821].} {3 127.0
68f0: 2e 30 2e 31 20 30 7d 0a 0a 74 65 73 74 20 74 6c  .0.1 0}..test tl
6900: 73 49 4f 2d 37 2e 33 20 7b 74 65 73 74 69 6e 67  sIO-7.3 {testing
6910: 20 73 6f 63 6b 65 74 20 73 70 65 63 69 66 69 63   socket specific
6920: 20 6f 70 74 69 6f 6e 73 7d 20 7b 73 6f 63 6b 65   options} {socke
6930: 74 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 20 5b  t} {.    set s [
6940: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d  tls::socket \..-
6950: 63 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72  certfile $server
6960: 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61  Cert -cafile $ca
6970: 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73  Cert -keyfile $s
6980: 65 72 76 65 72 4b 65 79 20 5c 0a 20 20 20 20 09  erverKey \.    .
6990: 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20 32  -server accept 2
69a0: 38 32 32 5d 0a 20 20 20 20 73 65 74 20 6c 20 5b  822].    set l [
69b0: 66 63 6f 6e 66 69 67 75 72 65 20 24 73 5d 0a 20  fconfigure $s]. 
69c0: 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20     close $s.    
69d0: 75 70 64 61 74 65 0a 20 20 20 20 6c 6c 65 6e 67  update.    lleng
69e0: 74 68 20 24 6c 0a 7d 20 31 32 0a 0a 23 20 62 75  th $l.} 12..# bu
69f0: 67 20 72 65 70 6f 72 74 20 23 35 38 31 32 20 66  g report #5812 f
6a00: 63 6f 6e 66 69 67 75 72 65 20 64 6f 65 73 6e 27  configure doesn'
6a10: 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  t return value f
6a20: 6f 72 20 27 2d 73 6f 63 6b 6e 61 6d 65 27 0a 0a  or '-sockname'..
6a30: 74 65 73 74 20 74 6c 73 49 4f 2d 37 2e 34 20 7b  test tlsIO-7.4 {
6a40: 74 65 73 74 69 6e 67 20 73 6f 63 6b 65 74 20 73  testing socket s
6a50: 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 73 7d  pecific options}
6a60: 20 7b 6b 6e 6f 77 6e 42 75 67 20 73 6f 63 6b 65   {knownBug socke
6a70: 74 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 20 5b  t} {.    set s [
6a80: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d  tls::socket \..-
6a90: 63 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72  certfile $server
6aa0: 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61  Cert -cafile $ca
6ab0: 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73  Cert -keyfile $s
6ac0: 65 72 76 65 72 4b 65 79 20 5c 0a 20 20 20 20 09  erverKey \.    .
6ad0: 2d 73 65 72 76 65 72 20 61 63 63 65 70 74 20 32  -server accept 2
6ae0: 38 32 33 5d 0a 20 20 20 20 70 72 6f 63 20 61 63  823].    proc ac
6af0: 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a 09  cept {s a p} {..
6b00: 67 6c 6f 62 61 6c 20 78 0a 09 73 65 74 20 78 20  global x..set x 
6b10: 5b 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d  [fconfigure $s -
6b20: 73 6f 63 6b 6e 61 6d 65 5d 0a 09 63 6c 6f 73 65  sockname]..close
6b30: 20 24 73 0a 20 20 20 20 7d 0a 20 20 20 20 73 65   $s.    }.    se
6b40: 74 20 73 31 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65  t s1 [tls::socke
6b50: 74 20 5c 0a 09 2d 63 65 72 74 66 69 6c 65 20 24  t \..-certfile $
6b60: 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69  clientCert -cafi
6b70: 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66  le $caCert -keyf
6b80: 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c  ile $clientKey \
6b90: 0a 20 20 20 20 09 5b 69 6e 66 6f 20 68 6f 73 74  .    .[info host
6ba0: 6e 61 6d 65 5d 20 32 38 32 33 5d 0a 20 20 20 20  name] 2823].    
6bb0: 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72  set timer [after
6bc0: 20 31 30 30 30 30 20 22 73 65 74 20 78 20 74 69   10000 "set x ti
6bd0: 6d 65 64 5f 6f 75 74 22 5d 0a 20 20 20 20 76 77  med_out"].    vw
6be0: 61 69 74 20 78 0a 20 20 20 20 61 66 74 65 72 20  ait x.    after 
6bf0: 63 61 6e 63 65 6c 20 24 74 69 6d 65 72 0a 20 20  cancel $timer.  
6c00: 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 63    close $s.    c
6c10: 6c 6f 73 65 20 24 73 31 0a 20 20 20 20 73 65 74  lose $s1.    set
6c20: 20 6c 20 22 22 0a 20 20 20 20 6c 61 70 70 65 6e   l "".    lappen
6c30: 64 20 6c 20 5b 6c 69 6e 64 65 78 20 24 78 20 32  d l [lindex $x 2
6c40: 5d 20 5b 6c 6c 65 6e 67 74 68 20 24 78 5d 0a 7d  ] [llength $x].}
6c50: 20 7b 32 38 32 33 20 33 7d 0a 0a 23 20 62 75 67   {2823 3}..# bug
6c60: 20 72 65 70 6f 72 74 20 23 35 38 31 32 20 66 63   report #5812 fc
6c70: 6f 6e 66 69 67 75 72 65 20 64 6f 65 73 6e 27 74  onfigure doesn't
6c80: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f   return value fo
6c90: 72 20 27 2d 73 6f 63 6b 6e 61 6d 65 27 0a 0a 74  r '-sockname'..t
6ca0: 65 73 74 20 74 6c 73 49 4f 2d 37 2e 35 20 7b 74  est tlsIO-7.5 {t
6cb0: 65 73 74 69 6e 67 20 73 6f 63 6b 65 74 20 73 70  esting socket sp
6cc0: 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 73 7d 20  ecific options} 
6cd0: 7b 6b 6e 6f 77 6e 42 75 67 20 73 6f 63 6b 65 74  {knownBug socket
6ce0: 20 75 6e 69 78 4f 72 50 63 7d 20 7b 0a 20 20 20   unixOrPc} {.   
6cf0: 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f 63   set s [tls::soc
6d00: 6b 65 74 20 5c 0a 09 2d 63 65 72 74 66 69 6c 65  ket \..-certfile
6d10: 20 24 73 65 72 76 65 72 43 65 72 74 20 2d 63 61   $serverCert -ca
6d20: 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65  file $caCert -ke
6d30: 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79  yfile $serverKey
6d40: 20 5c 0a 20 20 20 20 09 2d 73 65 72 76 65 72 20   \.    .-server 
6d50: 61 63 63 65 70 74 20 32 38 32 39 5d 0a 20 20 20  accept 2829].   
6d60: 20 70 72 6f 63 20 61 63 63 65 70 74 20 7b 73 20   proc accept {s 
6d70: 61 20 70 7d 20 7b 0a 09 67 6c 6f 62 61 6c 20 78  a p} {..global x
6d80: 0a 09 73 65 74 20 78 20 5b 66 63 6f 6e 66 69 67  ..set x [fconfig
6d90: 75 72 65 20 24 73 20 2d 73 6f 63 6b 6e 61 6d 65  ure $s -sockname
6da0: 5d 0a 09 63 6c 6f 73 65 20 24 73 0a 20 20 20 20  ]..close $s.    
6db0: 7d 0a 20 20 20 20 73 65 74 20 73 31 20 5b 74 6c  }.    set s1 [tl
6dc0: 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65  s::socket \..-ce
6dd0: 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65  rtfile $clientCe
6de0: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
6df0: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69  rt -keyfile $cli
6e00: 65 6e 74 4b 65 79 20 5c 0a 20 20 20 20 09 31 32  entKey \.    .12
6e10: 37 2e 30 2e 30 2e 31 20 32 38 32 39 5d 0a 20 20  7.0.0.1 2829].  
6e20: 20 20 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74    set timer [aft
6e30: 65 72 20 31 30 30 30 30 20 22 73 65 74 20 78 20  er 10000 "set x 
6e40: 74 69 6d 65 64 5f 6f 75 74 22 5d 0a 20 20 20 20  timed_out"].    
6e50: 76 77 61 69 74 20 78 0a 20 20 20 20 61 66 74 65  vwait x.    afte
6e60: 72 20 63 61 6e 63 65 6c 20 24 74 69 6d 65 72 0a  r cancel $timer.
6e70: 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20      close $s.   
6e80: 20 63 6c 6f 73 65 20 24 73 31 0a 20 20 20 20 73   close $s1.    s
6e90: 65 74 20 6c 20 22 22 0a 20 20 20 20 6c 61 70 70  et l "".    lapp
6ea0: 65 6e 64 20 6c 20 5b 6c 69 6e 64 65 78 20 24 78  end l [lindex $x
6eb0: 20 30 5d 20 5b 6c 69 6e 64 65 78 20 24 78 20 32   0] [lindex $x 2
6ec0: 5d 20 5b 6c 6c 65 6e 67 74 68 20 24 78 5d 0a 7d  ] [llength $x].}
6ed0: 20 7b 31 32 37 2e 30 2e 30 2e 31 20 32 38 32 39   {127.0.0.1 2829
6ee0: 20 33 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d   3}..test tlsIO-
6ef0: 38 2e 31 20 7b 74 65 73 74 69 6e 67 20 2d 61 73  8.1 {testing -as
6f00: 79 6e 63 20 66 6c 61 67 20 6f 6e 20 73 6f 63 6b  ync flag on sock
6f10: 65 74 73 7d 20 7b 75 6e 65 78 70 6c 61 69 6e 65  ets} {unexplaine
6f20: 64 48 61 6e 67 20 73 6f 63 6b 65 74 7d 20 7b 0a  dHang socket} {.
6f30: 20 20 20 20 23 20 74 65 73 74 20 73 65 65 6d 73      # test seems
6f40: 20 74 6f 20 68 61 6e 67 20 2d 2d 20 61 77 62 20   to hang -- awb 
6f50: 36 2f 32 2f 32 30 30 30 0a 20 20 20 20 23 20 4e  6/2/2000.    # N
6f60: 4f 54 45 3a 20 54 68 69 73 20 74 65 73 74 20 6d  OTE: This test m
6f70: 61 79 20 66 61 69 6c 20 6f 6e 20 73 6f 6d 65 20  ay fail on some 
6f80: 53 6f 6c 61 72 69 73 20 32 2e 34 20 73 79 73 74  Solaris 2.4 syst
6f90: 65 6d 73 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  ems. If it does,
6fa0: 0a 20 20 20 20 23 20 63 68 65 63 6b 20 74 68 61  .    # check tha
6fb0: 74 20 79 6f 75 20 68 61 76 65 20 74 68 65 73 65  t you have these
6fc0: 20 70 61 74 63 68 65 73 20 69 6e 73 74 61 6c 6c   patches install
6fd0: 65 64 20 28 75 73 69 6e 67 20 73 68 6f 77 72 65  ed (using showre
6fe0: 76 20 2d 70 29 3a 0a 20 20 20 20 23 0a 20 20 20  v -p):.    #.   
6ff0: 20 23 20 31 30 31 39 30 37 2d 30 35 2c 20 31 30   # 101907-05, 10
7000: 31 39 32 35 2d 30 32 2c 20 31 30 31 39 34 35 2d  1925-02, 101945-
7010: 31 34 2c 20 31 30 31 39 35 39 2d 30 33 2c 20 31  14, 101959-03, 1
7020: 30 31 39 36 39 2d 30 35 2c 20 31 30 31 39 37 33  01969-05, 101973
7030: 2d 30 33 2c 0a 20 20 20 20 23 20 31 30 31 39 37  -03,.    # 10197
7040: 37 2d 30 33 2c 20 31 30 31 39 38 31 2d 30 32 2c  7-03, 101981-02,
7050: 20 31 30 31 39 38 35 2d 30 31 2c 20 31 30 32 30   101985-01, 1020
7060: 30 31 2d 30 33 2c 20 31 30 32 30 30 33 2d 30 31  01-03, 102003-01
7070: 2c 20 31 30 32 30 30 37 2d 30 31 2c 0a 20 20 20  , 102007-01,.   
7080: 20 23 20 31 30 32 30 31 31 2d 30 32 2c 20 31 30   # 102011-02, 10
7090: 32 30 32 34 2d 30 31 2c 20 31 30 32 30 33 39 2d  2024-01, 102039-
70a0: 30 31 2c 20 31 30 32 30 34 34 2d 30 31 2c 20 31  01, 102044-01, 1
70b0: 30 32 30 34 38 2d 30 31 2c 20 31 30 32 30 36 32  02048-01, 102062
70c0: 2d 30 33 2c 0a 20 20 20 20 23 20 31 30 32 30 36  -03,.    # 10206
70d0: 36 2d 30 34 2c 20 31 30 32 30 37 30 2d 30 31 2c  6-04, 102070-01,
70e0: 20 31 30 32 31 30 35 2d 30 31 2c 20 31 30 32 31   102105-01, 1021
70f0: 35 33 2d 30 33 2c 20 31 30 32 32 31 36 2d 30 31  53-03, 102216-01
7100: 2c 20 31 30 32 32 33 32 2d 30 31 2c 0a 20 20 20  , 102232-01,.   
7110: 20 23 20 31 30 31 38 37 38 2d 30 33 2c 20 31 30   # 101878-03, 10
7120: 31 38 37 39 2d 30 31 2c 20 31 30 31 38 38 30 2d  1879-01, 101880-
7130: 30 33 2c 20 31 30 31 39 33 33 2d 30 31 2c 20 31  03, 101933-01, 1
7140: 30 31 39 35 30 2d 30 31 2c 20 31 30 32 30 33 30  01950-01, 102030
7150: 2d 30 31 2c 0a 20 20 20 20 23 20 31 30 32 30 35  -01,.    # 10205
7160: 37 2d 30 38 2c 20 31 30 32 31 34 30 2d 30 31 2c  7-08, 102140-01,
7170: 20 31 30 31 39 32 30 2d 30 32 2c 20 31 30 31 39   101920-02, 1019
7180: 32 31 2d 30 39 2c 20 31 30 31 39 32 32 2d 30 37  21-09, 101922-07
7190: 2c 20 31 30 31 39 32 33 2d 30 33 0a 20 20 20 20  , 101923-03.    
71a0: 23 0a 20 20 20 20 23 20 49 66 20 61 66 74 65 72  #.    # If after
71b0: 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 73   installing thes
71c0: 65 20 70 61 74 63 68 65 73 20 79 6f 75 20 61 72  e patches you ar
71d0: 65 20 73 74 69 6c 6c 20 65 78 70 65 72 69 65 6e  e still experien
71e0: 63 69 6e 67 20 61 0a 20 20 20 20 23 20 70 72 6f  cing a.    # pro
71f0: 62 6c 65 6d 2c 20 70 6c 65 61 73 65 20 65 6d 61  blem, please ema
7200: 69 6c 20 6a 79 6c 40 65 6e 67 2e 73 75 6e 2e 63  il jyl@eng.sun.c
7210: 6f 6d 2e 20 57 65 20 68 61 76 65 20 6e 6f 74 20  om. We have not 
7220: 6f 62 73 65 72 76 65 64 20 74 68 69 73 0a 20 20  observed this.  
7230: 20 20 23 20 66 61 69 6c 75 72 65 20 6f 6e 20 53    # failure on S
7240: 6f 6c 61 72 69 73 20 32 2e 35 2c 20 73 6f 20 61  olaris 2.5, so a
7250: 6e 6f 74 68 65 72 20 6f 70 74 69 6f 6e 20 28 69  nother option (i
7260: 6e 73 74 65 61 64 20 6f 66 20 69 6e 73 74 61 6c  nstead of instal
7270: 6c 69 6e 67 0a 20 20 20 20 23 20 74 68 65 73 65  ling.    # these
7280: 20 70 61 74 63 68 65 73 29 20 69 73 20 74 6f 20   patches) is to 
7290: 75 70 67 72 61 64 65 20 74 6f 20 53 6f 6c 61 72  upgrade to Solar
72a0: 69 73 20 32 2e 35 2e 0a 20 20 20 20 73 65 74 20  is 2.5..    set 
72b0: 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c  s [tls::socket \
72c0: 0a 09 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72  ..-certfile $ser
72d0: 76 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65 20  verCert -cafile 
72e0: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
72f0: 20 24 73 65 72 76 65 72 4b 65 79 20 5c 0a 20 20   $serverKey \.  
7300: 20 20 09 2d 73 65 72 76 65 72 20 61 63 63 65 70    .-server accep
7310: 74 20 32 38 33 30 5d 0a 20 20 20 20 70 72 6f 63  t 2830].    proc
7320: 20 61 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20   accept {s a p} 
7330: 7b 0a 09 67 6c 6f 62 61 6c 20 78 0a 09 70 75 74  {..global x..put
7340: 73 20 24 73 20 62 79 65 0a 09 63 6c 6f 73 65 20  s $s bye..close 
7350: 24 73 0a 09 73 65 74 20 78 20 64 6f 6e 65 0a 20  $s..set x done. 
7360: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 73 31 20     }.    set s1 
7370: 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09  [tls::socket \..
7380: 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e  -certfile $clien
7390: 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63  tCert -cafile $c
73a0: 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24  aCert -keyfile $
73b0: 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 2d 61 73  clientKey \..-as
73c0: 79 6e 63 20 5b 69 6e 66 6f 20 68 6f 73 74 6e 61  ync [info hostna
73d0: 6d 65 5d 20 32 38 33 30 5d 0a 20 20 20 20 76 77  me] 2830].    vw
73e0: 61 69 74 20 78 0a 20 20 20 20 73 65 74 20 7a 20  ait x.    set z 
73f0: 5b 67 65 74 73 20 24 73 31 5d 0a 20 20 20 20 63  [gets $s1].    c
7400: 6c 6f 73 65 20 24 73 0a 20 20 20 20 63 6c 6f 73  lose $s.    clos
7410: 65 20 24 73 31 0a 20 20 20 20 73 65 74 20 7a 0a  e $s1.    set z.
7420: 7d 20 62 79 65 0a 0a 74 65 73 74 20 74 6c 73 49  } bye..test tlsI
7430: 4f 2d 39 2e 31 20 7b 74 65 73 74 69 6e 67 20 73  O-9.1 {testing s
7440: 70 75 72 69 6f 75 73 20 65 76 65 6e 74 73 7d 20  purious events} 
7450: 7b 75 6e 65 78 70 6c 61 69 6e 65 64 48 61 6e 67  {unexplainedHang
7460: 20 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20 23   socket} {.    #
7470: 20 6c 6f 63 6b 73 20 75 70 20 0a 20 20 20 20 73   locks up .    s
7480: 65 74 20 6c 65 6e 20 30 0a 20 20 20 20 73 65 74  et len 0.    set
7490: 20 73 70 75 72 69 6f 75 73 20 30 0a 20 20 20 20   spurious 0.    
74a0: 73 65 74 20 64 6f 6e 65 20 30 0a 20 20 20 20 70  set done 0.    p
74b0: 72 6f 63 20 72 65 61 64 6c 69 74 74 6c 65 20 7b  roc readlittle {
74c0: 73 7d 20 7b 0a 09 67 6c 6f 62 61 6c 20 73 70 75  s} {..global spu
74d0: 72 69 6f 75 73 20 64 6f 6e 65 20 6c 65 6e 0a 09  rious done len..
74e0: 73 65 74 20 6c 20 5b 72 65 61 64 20 24 73 20 31  set l [read $s 1
74f0: 5d 0a 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c  ]..if {[string l
7500: 65 6e 67 74 68 20 24 6c 5d 20 3d 3d 20 30 7d 20  ength $l] == 0} 
7510: 7b 0a 09 20 20 20 20 69 66 20 7b 21 5b 65 6f 66  {..    if {![eof
7520: 20 24 73 5d 7d 20 7b 0a 09 09 69 6e 63 72 20 73   $s]} {...incr s
7530: 70 75 72 69 6f 75 73 0a 09 20 20 20 20 7d 20 65  purious..    } e
7540: 6c 73 65 20 7b 0a 09 09 63 6c 6f 73 65 20 24 73  lse {...close $s
7550: 0a 09 09 73 65 74 20 64 6f 6e 65 20 31 0a 09 20  ...set done 1.. 
7560: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09     }..} else {..
7570: 20 20 20 20 69 6e 63 72 20 6c 65 6e 20 5b 73 74      incr len [st
7580: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6c 5d 0a  ring length $l].
7590: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f  .}.    }.    pro
75a0: 63 20 61 63 63 65 70 74 20 7b 73 20 61 20 70 7d  c accept {s a p}
75b0: 20 7b 0a 09 66 63 6f 6e 66 69 67 75 72 65 20 24   {..fconfigure $
75c0: 73 20 2d 62 75 66 66 65 72 69 6e 67 20 6e 6f 6e  s -buffering non
75d0: 65 20 2d 62 6c 6f 63 6b 69 6e 67 20 6f 66 66 0a  e -blocking off.
75e0: 09 66 69 6c 65 65 76 65 6e 74 20 24 73 20 72 65  .fileevent $s re
75f0: 61 64 61 62 6c 65 20 5b 6c 69 73 74 20 72 65 61  adable [list rea
7600: 64 6c 69 74 74 6c 65 20 24 73 5d 0a 20 20 20 20  dlittle $s].    
7610: 7d 0a 20 20 20 20 73 65 74 20 73 20 5b 74 6c 73  }.    set s [tls
7620: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72  ::socket \..-cer
7630: 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65 72  tfile $serverCer
7640: 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72  t -cafile $caCer
7650: 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76  t -keyfile $serv
7660: 65 72 4b 65 79 20 5c 0a 20 20 20 09 2d 73 65 72  erKey \.   .-ser
7670: 76 65 72 20 61 63 63 65 70 74 20 32 38 33 31 5d  ver accept 2831]
7680: 0a 20 20 20 20 73 65 74 20 63 20 5b 74 6c 73 3a  .    set c [tls:
7690: 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74  :socket \..-cert
76a0: 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74  file $clientCert
76b0: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
76c0: 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e   -keyfile $clien
76d0: 74 4b 65 79 20 5c 0a 20 20 20 20 09 5b 69 6e 66  tKey \.    .[inf
76e0: 6f 20 68 6f 73 74 6e 61 6d 65 5d 20 32 38 33 31  o hostname] 2831
76f0: 5d 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65  ].    puts -none
7700: 77 6c 69 6e 65 20 24 63 20 30 31 32 33 34 35 36  wline $c 0123456
7710: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
7720: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
7730: 39 30 31 32 33 34 35 36 37 38 39 0a 20 20 20 20  90123456789.    
7740: 63 6c 6f 73 65 20 24 63 0a 20 20 20 20 73 65 74  close $c.    set
7750: 20 74 69 6d 65 72 20 5b 61 66 74 65 72 20 31 30   timer [after 10
7760: 30 30 30 20 22 73 65 74 20 64 6f 6e 65 20 74 69  000 "set done ti
7770: 6d 65 64 5f 6f 75 74 22 5d 0a 20 20 20 20 76 77  med_out"].    vw
7780: 61 69 74 20 64 6f 6e 65 0a 20 20 20 20 61 66 74  ait done.    aft
7790: 65 72 20 63 61 6e 63 65 6c 20 24 74 69 6d 65 72  er cancel $timer
77a0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20  .    close $s.  
77b0: 20 20 6c 69 73 74 20 24 73 70 75 72 69 6f 75 73    list $spurious
77c0: 20 24 6c 65 6e 0a 7d 20 7b 30 20 35 30 7d 0a 0a   $len.} {0 50}..
77d0: 74 65 73 74 20 74 6c 73 49 4f 2d 39 2e 32 20 7b  test tlsIO-9.2 {
77e0: 74 65 73 74 69 6e 67 20 61 73 79 6e 63 20 77 72  testing async wr
77f0: 69 74 65 2c 20 66 69 6c 65 65 76 65 6e 74 73 2c  ite, fileevents,
7800: 20 66 6c 75 73 68 20 6f 6e 20 63 6c 6f 73 65 7d   flush on close}
7810: 20 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20   {socket} {.    
7820: 73 65 74 20 66 69 72 73 74 62 6c 6f 63 6b 20 22  set firstblock "
7830: 22 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69  ".    for {set i
7840: 20 30 7d 20 7b 24 69 20 3c 20 35 7d 20 7b 69 6e   0} {$i < 5} {in
7850: 63 72 20 69 7d 20 7b 73 65 74 20 66 69 72 73 74  cr i} {set first
7860: 62 6c 6f 63 6b 20 22 61 24 66 69 72 73 74 62 6c  block "a$firstbl
7870: 6f 63 6b 24 66 69 72 73 74 62 6c 6f 63 6b 22 7d  ock$firstblock"}
7880: 0a 20 20 20 20 73 65 74 20 73 65 63 6f 6e 64 62  .    set secondb
7890: 6c 6f 63 6b 20 22 22 0a 20 20 20 20 66 6f 72 20  lock "".    for 
78a0: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
78b0: 31 36 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 09  16} {incr i} {..
78c0: 73 65 74 20 73 65 63 6f 6e 64 62 6c 6f 63 6b 20  set secondblock 
78d0: 22 62 24 73 65 63 6f 6e 64 62 6c 6f 63 6b 24 73  "b$secondblock$s
78e0: 65 63 6f 6e 64 62 6c 6f 63 6b 22 0a 20 20 20 20  econdblock".    
78f0: 7d 0a 20 20 20 20 73 65 74 20 6c 20 5b 74 6c 73  }.    set l [tls
7900: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72  ::socket \..-cer
7910: 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65 72  tfile $serverCer
7920: 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72  t -cafile $caCer
7930: 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76  t -keyfile $serv
7940: 65 72 4b 65 79 20 5c 0a 20 20 20 20 09 2d 73 65  erKey \.    .-se
7950: 72 76 65 72 20 61 63 63 65 70 74 20 32 38 33 32  rver accept 2832
7960: 5d 0a 20 20 20 20 70 72 6f 63 20 61 63 63 65 70  ].    proc accep
7970: 74 20 7b 73 20 61 20 70 7d 20 7b 0a 09 66 63 6f  t {s a p} {..fco
7980: 6e 66 69 67 75 72 65 20 24 73 20 2d 62 6c 6f 63  nfigure $s -bloc
7990: 6b 69 6e 67 20 30 20 2d 74 72 61 6e 73 6c 61 74  king 0 -translat
79a0: 69 6f 6e 20 6c 66 20 2d 62 75 66 66 65 72 73 69  ion lf -buffersi
79b0: 7a 65 20 31 36 33 38 34 20 5c 0a 09 09 2d 62 75  ze 16384 \...-bu
79c0: 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 09 66 69  ffering line..fi
79d0: 6c 65 65 76 65 6e 74 20 24 73 20 72 65 61 64 61  leevent $s reada
79e0: 62 6c 65 20 22 72 65 61 64 61 62 6c 65 20 24 73  ble "readable $s
79f0: 22 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 63  ".    }.    proc
7a00: 20 72 65 61 64 61 62 6c 65 20 7b 73 7d 20 7b 0a   readable {s} {.
7a10: 09 73 65 74 20 6c 20 5b 67 65 74 73 20 24 73 5d  .set l [gets $s]
7a20: 0a 09 66 69 6c 65 65 76 65 6e 74 20 24 73 20 72  ..fileevent $s r
7a30: 65 61 64 61 62 6c 65 20 7b 7d 0a 09 61 66 74 65  eadable {}..afte
7a40: 72 20 31 30 30 30 20 72 65 73 70 6f 6e 64 20 24  r 1000 respond $
7a50: 73 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 63  s.    }.    proc
7a60: 20 72 65 73 70 6f 6e 64 20 7b 73 7d 20 7b 0a 09   respond {s} {..
7a70: 67 6c 6f 62 61 6c 20 66 69 72 73 74 62 6c 6f 63  global firstbloc
7a80: 6b 0a 09 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  k..puts -nonewli
7a90: 6e 65 20 24 73 20 24 66 69 72 73 74 62 6c 6f 63  ne $s $firstbloc
7aa0: 6b 0a 09 61 66 74 65 72 20 31 30 30 30 20 77 72  k..after 1000 wr
7ab0: 69 74 65 64 61 74 61 20 24 73 0a 20 20 20 20 7d  itedata $s.    }
7ac0: 0a 20 20 20 20 70 72 6f 63 20 77 72 69 74 65 64  .    proc writed
7ad0: 61 74 61 20 7b 73 7d 20 7b 0a 09 67 6c 6f 62 61  ata {s} {..globa
7ae0: 6c 20 73 65 63 6f 6e 64 62 6c 6f 63 6b 0a 09 70  l secondblock..p
7af0: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
7b00: 73 20 24 73 65 63 6f 6e 64 62 6c 6f 63 6b 0a 09  s $secondblock..
7b10: 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 7d 0a 20  close $s.    }. 
7b20: 20 20 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73     set s [tls::s
7b30: 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74 66 69  ocket \..-certfi
7b40: 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d  le $clientCert -
7b50: 63 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d  cafile $caCert -
7b60: 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b  keyfile $clientK
7b70: 65 79 20 5c 0a 20 20 20 20 09 5b 69 6e 66 6f 20  ey \.    .[info 
7b80: 68 6f 73 74 6e 61 6d 65 5d 20 32 38 33 32 5d 0a  hostname] 2832].
7b90: 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24      fconfigure $
7ba0: 73 20 2d 62 6c 6f 63 6b 69 6e 67 20 30 20 2d 74  s -blocking 0 -t
7bb0: 72 61 6e 73 20 6c 66 20 2d 62 75 66 66 65 72 69  rans lf -bufferi
7bc0: 6e 67 20 6c 69 6e 65 0a 20 20 20 20 73 65 74 20  ng line.    set 
7bd0: 63 6f 75 6e 74 20 30 0a 20 20 20 20 70 75 74 73  count 0.    puts
7be0: 20 24 73 20 68 65 6c 6c 6f 0a 20 20 20 20 70 72   $s hello.    pr
7bf0: 6f 63 20 72 65 61 64 69 74 20 7b 73 7d 20 7b 0a  oc readit {s} {.
7c00: 09 67 6c 6f 62 61 6c 20 63 6f 75 6e 74 20 64 6f  .global count do
7c10: 6e 65 0a 09 73 65 74 20 6c 20 5b 72 65 61 64 20  ne..set l [read 
7c20: 24 73 5d 0a 09 69 6e 63 72 20 63 6f 75 6e 74 20  $s]..incr count 
7c30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
7c40: 6c 5d 0a 09 69 66 20 7b 5b 65 6f 66 20 24 73 5d  l]..if {[eof $s]
7c50: 7d 20 7b 0a 09 20 20 20 20 63 6c 6f 73 65 20 24  } {..    close $
7c60: 73 0a 09 20 20 20 20 73 65 74 20 64 6f 6e 65 20  s..    set done 
7c70: 31 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66  1..}.    }.    f
7c80: 69 6c 65 65 76 65 6e 74 20 24 73 20 72 65 61 64  ileevent $s read
7c90: 61 62 6c 65 20 22 72 65 61 64 69 74 20 24 73 22  able "readit $s"
7ca0: 0a 20 20 20 20 73 65 74 20 74 69 6d 65 72 20 5b  .    set timer [
7cb0: 61 66 74 65 72 20 31 30 30 30 30 20 22 73 65 74  after 10000 "set
7cc0: 20 64 6f 6e 65 20 74 69 6d 65 64 5f 6f 75 74 22   done timed_out"
7cd0: 5d 0a 20 20 20 20 76 77 61 69 74 20 64 6f 6e 65  ].    vwait done
7ce0: 0a 20 20 20 20 61 66 74 65 72 20 63 61 6e 63 65  .    after cance
7cf0: 6c 20 24 74 69 6d 65 72 0a 20 20 20 20 63 6c 6f  l $timer.    clo
7d00: 73 65 20 24 6c 0a 20 20 20 20 73 65 74 20 63 6f  se $l.    set co
7d10: 75 6e 74 0a 7d 20 36 35 35 36 36 0a 0a 74 65 73  unt.} 65566..tes
7d20: 74 20 74 6c 73 49 4f 2d 39 2e 33 20 7b 74 65 73  t tlsIO-9.3 {tes
7d30: 74 69 6e 67 20 45 4f 46 20 73 74 69 63 6b 79 6e  ting EOF stickyn
7d40: 65 73 73 7d 20 7b 75 6e 65 78 70 6c 61 69 6e 65  ess} {unexplaine
7d50: 64 48 61 6e 67 20 73 6f 63 6b 65 74 7d 20 7b 0a  dHang socket} {.
7d60: 20 20 20 20 23 20 68 61 6e 67 73 0a 20 20 20 20      # hangs.    
7d70: 70 72 6f 63 20 63 6f 75 6e 74 5f 74 6f 5f 65 6f  proc count_to_eo
7d80: 66 20 7b 73 7d 20 7b 0a 09 67 6c 6f 62 61 6c 20  f {s} {..global 
7d90: 63 6f 75 6e 74 20 64 6f 6e 65 20 74 69 6d 65 72  count done timer
7da0: 0a 09 73 65 74 20 6c 20 5b 67 65 74 73 20 24 73  ..set l [gets $s
7db0: 5d 0a 09 69 66 20 7b 5b 65 6f 66 20 24 73 5d 7d  ]..if {[eof $s]}
7dc0: 20 7b 0a 09 20 20 20 20 69 6e 63 72 20 63 6f 75   {..    incr cou
7dd0: 6e 74 0a 09 20 20 20 20 69 66 20 7b 24 63 6f 75  nt..    if {$cou
7de0: 6e 74 20 3e 20 39 7d 20 7b 0a 09 09 63 6c 6f 73  nt > 9} {...clos
7df0: 65 20 24 73 0a 09 09 73 65 74 20 64 6f 6e 65 20  e $s...set done 
7e00: 74 72 75 65 0a 09 09 73 65 74 20 63 6f 75 6e 74  true...set count
7e10: 20 7b 65 6f 66 20 69 73 20 73 74 69 63 6b 79 7d   {eof is sticky}
7e20: 0a 09 09 61 66 74 65 72 20 63 61 6e 63 65 6c 20  ...after cancel 
7e30: 24 74 69 6d 65 72 0a 09 20 20 20 20 7d 0a 09 7d  $timer..    }..}
7e40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 63 20  .    }.    proc 
7e50: 74 69 6d 65 72 70 72 6f 63 20 7b 7d 20 7b 0a 09  timerproc {} {..
7e60: 67 6c 6f 62 61 6c 20 64 6f 6e 65 20 63 6f 75 6e  global done coun
7e70: 74 20 63 0a 09 73 65 74 20 64 6f 6e 65 20 74 72  t c..set done tr
7e80: 75 65 0a 09 73 65 74 20 63 6f 75 6e 74 20 7b 74  ue..set count {t
7e90: 69 6d 65 72 20 77 65 6e 74 20 6f 66 66 2c 20 65  imer went off, e
7ea0: 6f 66 20 69 73 20 6e 6f 74 20 73 74 69 63 6b 79  of is not sticky
7eb0: 7d 0a 09 63 6c 6f 73 65 20 24 63 0a 20 20 20 20  }..close $c.    
7ec0: 7d 09 0a 20 20 20 20 73 65 74 20 63 6f 75 6e 74  }..    set count
7ed0: 20 30 0a 20 20 20 20 73 65 74 20 64 6f 6e 65 20   0.    set done 
7ee0: 66 61 6c 73 65 0a 20 20 20 20 70 72 6f 63 20 77  false.    proc w
7ef0: 72 69 74 65 5f 74 68 65 6e 5f 63 6c 6f 73 65 20  rite_then_close 
7f00: 7b 73 7d 20 7b 0a 09 70 75 74 73 20 24 73 20 62  {s} {..puts $s b
7f10: 79 65 0a 09 63 6c 6f 73 65 20 24 73 0a 20 20 20  ye..close $s.   
7f20: 20 7d 0a 20 20 20 20 70 72 6f 63 20 61 63 63 65   }.    proc acce
7f30: 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a 09 66 63  pt {s a p} {..fc
7f40: 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62 75 66  onfigure $s -buf
7f50: 66 65 72 69 6e 67 20 6c 69 6e 65 20 2d 74 72 61  fering line -tra
7f60: 6e 73 6c 61 74 69 6f 6e 20 6c 66 0a 09 66 69 6c  nslation lf..fil
7f70: 65 65 76 65 6e 74 20 24 73 20 77 72 69 74 61 62  eevent $s writab
7f80: 6c 65 20 22 77 72 69 74 65 5f 74 68 65 6e 5f 63  le "write_then_c
7f90: 6c 6f 73 65 20 24 73 22 0a 20 20 20 20 7d 0a 20  lose $s".    }. 
7fa0: 20 20 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73     set s [tls::s
7fb0: 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74 66 69  ocket \..-certfi
7fc0: 6c 65 20 24 73 65 72 76 65 72 43 65 72 74 20 2d  le $serverCert -
7fd0: 63 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d  cafile $caCert -
7fe0: 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b  keyfile $serverK
7ff0: 65 79 20 5c 0a 20 20 20 20 09 2d 73 65 72 76 65  ey \.    .-serve
8000: 72 20 61 63 63 65 70 74 20 32 38 33 33 5d 0a 20  r accept 2833]. 
8010: 20 20 20 73 65 74 20 63 20 5b 74 6c 73 3a 3a 73     set c [tls::s
8020: 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74 66 69  ocket \..-certfi
8030: 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d  le $clientCert -
8040: 63 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d  cafile $caCert -
8050: 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b  keyfile $clientK
8060: 65 79 20 5c 0a 20 20 20 20 09 5b 69 6e 66 6f 20  ey \.    .[info 
8070: 68 6f 73 74 6e 61 6d 65 5d 20 32 38 33 33 5d 0a  hostname] 2833].
8080: 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24      fconfigure $
8090: 63 20 2d 62 6c 6f 63 6b 69 6e 67 20 6f 66 66 20  c -blocking off 
80a0: 2d 62 75 66 66 65 72 69 6e 67 20 6c 69 6e 65 20  -buffering line 
80b0: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6c 66 0a  -translation lf.
80c0: 20 20 20 20 66 69 6c 65 65 76 65 6e 74 20 24 63      fileevent $c
80d0: 20 72 65 61 64 61 62 6c 65 20 22 63 6f 75 6e 74   readable "count
80e0: 5f 74 6f 5f 65 6f 66 20 24 63 22 0a 20 20 20 20  _to_eof $c".    
80f0: 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72  set timer [after
8100: 20 31 30 30 30 20 74 69 6d 65 72 70 72 6f 63 5d   1000 timerproc]
8110: 0a 20 20 20 20 76 77 61 69 74 20 64 6f 6e 65 0a  .    vwait done.
8120: 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20      close $s.   
8130: 20 73 65 74 20 63 6f 75 6e 74 0a 7d 20 7b 65 6f   set count.} {eo
8140: 66 20 69 73 20 73 74 69 63 6b 79 7d 0a 0a 72 65  f is sticky}..re
8150: 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74 0a  moveFile script.
8160: 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31 30 2e 31  .test tlsIO-10.1
8170: 20 7b 74 65 73 74 69 6e 67 20 73 6f 63 6b 65 74   {testing socket
8180: 20 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63 6b   accept callback
8190: 20 65 72 72 6f 72 20 68 61 6e 64 6c 69 6e 67 7d   error handling}
81a0: 20 7b 73 6f 63 6b 65 74 7d 20 7b 0a 20 20 20 20   {socket} {.    
81b0: 73 65 74 20 67 6f 74 65 72 72 6f 72 20 30 0a 20  set goterror 0. 
81c0: 20 20 20 70 72 6f 63 20 62 67 65 72 72 6f 72 20     proc bgerror 
81d0: 61 72 67 73 20 7b 67 6c 6f 62 61 6c 20 67 6f 74  args {global got
81e0: 65 72 72 6f 72 3b 20 73 65 74 20 67 6f 74 65 72  error; set goter
81f0: 72 6f 72 20 31 7d 0a 20 20 20 20 73 65 74 20 73  ror 1}.    set s
8200: 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a   [tls::socket \.
8210: 09 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72 76  .-certfile $serv
8220: 65 72 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24  erCert -cafile $
8230: 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20  caCert -keyfile 
8240: 24 73 65 72 76 65 72 4b 65 79 20 5c 0a 20 20 20  $serverKey \.   
8250: 20 09 2d 73 65 72 76 65 72 20 61 63 63 65 70 74   .-server accept
8260: 20 32 38 39 38 5d 0a 20 20 20 20 70 72 6f 63 20   2898].    proc 
8270: 61 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b  accept {s a p} {
8280: 63 6c 6f 73 65 20 24 73 3b 20 65 72 72 6f 72 7d  close $s; error}
8290: 0a 20 20 20 20 73 65 74 20 63 20 5b 74 6c 73 3a  .    set c [tls:
82a0: 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65 72 74  :socket \..-cert
82b0: 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74  file $clientCert
82c0: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
82d0: 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e   -keyfile $clien
82e0: 74 4b 65 79 20 5c 0a 09 31 32 37 2e 30 2e 30 2e  tKey \..127.0.0.
82f0: 31 20 32 38 39 38 5d 0a 20 20 20 20 76 77 61 69  1 2898].    vwai
8300: 74 20 67 6f 74 65 72 72 6f 72 0a 20 20 20 20 63  t goterror.    c
8310: 6c 6f 73 65 20 24 73 0a 20 20 20 20 63 6c 6f 73  lose $s.    clos
8320: 65 20 24 63 0a 20 20 20 20 73 65 74 20 67 6f 74  e $c.    set got
8330: 65 72 72 6f 72 0a 7d 20 31 0a 0a 74 65 73 74 20  error.} 1..test 
8340: 74 6c 73 49 4f 2d 31 31 2e 31 20 7b 74 63 70 20  tlsIO-11.1 {tcp 
8350: 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7b 73 6f 63  connection} {soc
8360: 6b 65 74 20 64 6f 54 65 73 74 73 57 69 74 68 52  ket doTestsWithR
8370: 65 6d 6f 74 65 53 65 72 76 65 72 7d 20 7b 0a 20  emoteServer} {. 
8380: 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22     sendCommand "
8390: 73 65 74 20 63 61 43 65 72 74 20 24 63 61 43 65  set caCert $caCe
83a0: 72 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  rt".    sendComm
83b0: 61 6e 64 20 22 73 65 74 20 73 65 72 76 65 72 43  and "set serverC
83c0: 65 72 74 20 24 73 65 72 76 65 72 43 65 72 74 22  ert $serverCert"
83d0: 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64  .    sendCommand
83e0: 20 22 73 65 74 20 63 6c 69 65 6e 74 43 65 72 74   "set clientCert
83f0: 20 24 63 6c 69 65 6e 74 43 65 72 74 22 0a 20 20   $clientCert".  
8400: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73    sendCommand "s
8410: 65 74 20 73 65 72 76 65 72 4b 65 79 20 24 73 65  et serverKey $se
8420: 72 76 65 72 4b 65 79 22 0a 20 20 20 20 73 65 6e  rverKey".    sen
8430: 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c  dCommand "set cl
8440: 69 65 6e 74 4b 65 79 20 24 63 6c 69 65 6e 74 4b  ientKey $clientK
8450: 65 79 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  ey".    sendComm
8460: 61 6e 64 20 7b 0a 09 73 65 74 20 73 6f 63 6b 65  and {..set socke
8470: 74 39 5f 31 5f 74 65 73 74 5f 73 65 72 76 65 72  t9_1_test_server
8480: 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73   [tls::socket -s
8490: 65 72 76 65 72 20 61 63 63 65 70 74 20 5c 0a 09  erver accept \..
84a0: 09 2d 63 65 72 74 66 69 6c 65 20 24 73 65 72 76  .-certfile $serv
84b0: 65 72 43 65 72 74 20 5c 0a 09 09 2d 63 61 66 69  erCert \...-cafi
84c0: 6c 65 20 24 63 61 43 65 72 74 20 5c 0a 09 09 2d  le $caCert \...-
84d0: 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65 72 4b  keyfile $serverK
84e0: 65 79 20 5c 0a 09 09 32 38 33 34 5d 0a 09 70 72  ey \...2834]..pr
84f0: 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61 20 70  oc accept {s a p
8500: 7d 20 7b 0a 09 20 20 20 20 70 75 74 73 20 24 73  } {..    puts $s
8510: 20 64 6f 6e 65 0a 09 20 20 20 20 74 6c 73 3a 3a   done..    tls::
8520: 68 61 6e 64 73 68 61 6b 65 20 24 73 0a 09 20 20  handshake $s..  
8530: 20 20 63 6c 6f 73 65 20 24 73 0a 09 7d 0a 20 20    close $s..}.  
8540: 20 20 7d 0a 20 20 20 20 73 65 74 20 73 20 5b 74    }.    set s [t
8550: 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20  ls::socket \..  
8560: 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69    -certfile $cli
8570: 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20  entCert -cafile 
8580: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
8590: 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20   $clientKey \.. 
85a0: 20 20 20 24 72 65 6d 6f 74 65 53 65 72 76 65 72     $remoteServer
85b0: 49 50 20 32 38 33 34 5d 0a 20 20 20 20 73 65 74  IP 2834].    set
85c0: 20 72 20 5b 67 65 74 73 20 24 73 5d 0a 20 20 20   r [gets $s].   
85d0: 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 73 65   close $s.    se
85e0: 6e 64 43 6f 6d 6d 61 6e 64 20 7b 63 6c 6f 73 65  ndCommand {close
85f0: 20 24 73 6f 63 6b 65 74 39 5f 31 5f 74 65 73 74   $socket9_1_test
8600: 5f 73 65 72 76 65 72 7d 0a 20 20 20 20 73 65 74  _server}.    set
8610: 20 72 0a 7d 20 64 6f 6e 65 0a 0a 74 65 73 74 20   r.} done..test 
8620: 74 6c 73 49 4f 2d 31 31 2e 32 20 7b 63 6c 69 65  tlsIO-11.2 {clie
8630: 6e 74 20 73 70 65 63 69 66 69 65 73 20 69 74 73  nt specifies its
8640: 20 70 6f 72 74 7d 20 7b 73 6f 63 6b 65 74 20 64   port} {socket d
8650: 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65  oTestsWithRemote
8660: 53 65 72 76 65 72 7d 20 7b 0a 20 20 20 20 73 65  Server} {.    se
8670: 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63  ndCommand "set c
8680: 61 43 65 72 74 20 24 63 61 43 65 72 74 22 0a 20  aCert $caCert". 
8690: 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22     sendCommand "
86a0: 73 65 74 20 73 65 72 76 65 72 43 65 72 74 20 24  set serverCert $
86b0: 73 65 72 76 65 72 43 65 72 74 22 0a 20 20 20 20  serverCert".    
86c0: 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74  sendCommand "set
86d0: 20 63 6c 69 65 6e 74 43 65 72 74 20 24 63 6c 69   clientCert $cli
86e0: 65 6e 74 43 65 72 74 22 0a 20 20 20 20 73 65 6e  entCert".    sen
86f0: 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73 65  dCommand "set se
8700: 72 76 65 72 4b 65 79 20 24 73 65 72 76 65 72 4b  rverKey $serverK
8710: 65 79 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  ey".    sendComm
8720: 61 6e 64 20 22 73 65 74 20 63 6c 69 65 6e 74 4b  and "set clientK
8730: 65 79 20 24 63 6c 69 65 6e 74 4b 65 79 22 0a 20  ey $clientKey". 
8740: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
8750: 73 74 73 20 70 6f 72 74 5d 7d 20 7b 0a 09 69 6e  sts port]} {..in
8760: 63 72 20 70 6f 72 74 0a 20 20 20 20 7d 20 65 6c  cr port.    } el
8770: 73 65 20 7b 0a 09 73 65 74 20 70 6f 72 74 20 5b  se {..set port [
8780: 65 78 70 72 20 32 30 34 38 20 2b 20 5b 70 69 64  expr 2048 + [pid
8790: 5d 25 31 30 32 34 5d 0a 20 20 20 20 7d 0a 20 20  ]%1024].    }.  
87a0: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 0a    sendCommand {.
87b0: 09 73 65 74 20 73 6f 63 6b 65 74 39 5f 32 5f 74  .set socket9_2_t
87c0: 65 73 74 5f 73 65 72 76 65 72 20 5b 74 6c 73 3a  est_server [tls:
87d0: 3a 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20  :socket -server 
87e0: 61 63 63 65 70 74 20 5c 0a 09 09 2d 63 65 72 74  accept \...-cert
87f0: 66 69 6c 65 20 24 73 65 72 76 65 72 43 65 72 74  file $serverCert
8800: 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20 24 63 61   \...-cafile $ca
8810: 43 65 72 74 20 5c 0a 09 09 2d 6b 65 79 66 69 6c  Cert \...-keyfil
8820: 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c 0a 09  e $serverKey \..
8830: 20 20 20 20 32 38 33 35 5d 0a 09 70 72 6f 63 20      2835]..proc 
8840: 61 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b  accept {s a p} {
8850: 0a 09 20 20 20 20 74 6c 73 3a 3a 68 61 6e 64 73  ..    tls::hands
8860: 68 61 6b 65 20 24 73 0a 09 20 20 20 20 70 75 74  hake $s..    put
8870: 73 20 24 73 20 24 70 0a 09 20 20 20 20 63 6c 6f  s $s $p..    clo
8880: 73 65 20 24 73 0a 09 7d 0a 20 20 20 20 7d 0a 20  se $s..}.    }. 
8890: 20 20 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73     set s [tls::s
88a0: 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65  ocket \..    -ce
88b0: 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65  rtfile $clientCe
88c0: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
88d0: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69  rt -keyfile $cli
88e0: 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 2d 6d  entKey \..    -m
88f0: 79 70 6f 72 74 20 24 70 6f 72 74 20 24 72 65 6d  yport $port $rem
8900: 6f 74 65 53 65 72 76 65 72 49 50 20 32 38 33 35  oteServerIP 2835
8910: 5d 0a 20 20 20 20 73 65 74 20 72 20 5b 67 65 74  ].    set r [get
8920: 73 20 24 73 5d 0a 20 20 20 20 63 6c 6f 73 65 20  s $s].    close 
8930: 24 73 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61  $s.    sendComma
8940: 6e 64 20 7b 63 6c 6f 73 65 20 24 73 6f 63 6b 65  nd {close $socke
8950: 74 39 5f 32 5f 74 65 73 74 5f 73 65 72 76 65 72  t9_2_test_server
8960: 7d 0a 20 20 20 20 69 66 20 7b 24 72 20 3d 3d 20  }.    if {$r == 
8970: 24 70 6f 72 74 7d 20 7b 0a 09 73 65 74 20 72 65  $port} {..set re
8980: 73 75 6c 74 20 6f 6b 0a 20 20 20 20 7d 20 65 6c  sult ok.    } el
8990: 73 65 20 7b 0a 09 73 65 74 20 72 65 73 75 6c 74  se {..set result
89a0: 20 62 72 6f 6b 65 6e 0a 20 20 20 20 7d 0a 20 20   broken.    }.  
89b0: 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 6f    set result.} o
89c0: 6b 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31 31 2e  k.test tlsIO-11.
89d0: 33 20 7b 74 72 79 69 6e 67 20 74 6f 20 63 6f 6e  3 {trying to con
89e0: 6e 65 63 74 2c 20 6e 6f 20 73 65 72 76 65 72 7d  nect, no server}
89f0: 20 7b 73 6f 63 6b 65 74 20 64 6f 54 65 73 74 73   {socket doTests
8a00: 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72  WithRemoteServer
8a10: 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 74 61 74  } {.    set stat
8a20: 75 73 20 6f 6b 0a 20 20 20 20 69 66 20 7b 21 5b  us ok.    if {![
8a30: 63 61 74 63 68 20 7b 73 65 74 20 73 20 5b 74 6c  catch {set s [tl
8a40: 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20  s::socket \..   
8a50: 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65   -certfile $clie
8a60: 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24  ntCert -cafile $
8a70: 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20  caCert -keyfile 
8a80: 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20 20  $clientKey \..  
8a90: 20 20 24 72 65 6d 6f 74 65 53 65 72 76 65 72 49    $remoteServerI
8aa0: 70 20 32 38 33 36 5d 7d 5d 7d 20 7b 0a 09 69 66  p 2836]}]} {..if
8ab0: 20 7b 21 5b 63 61 74 63 68 20 7b 67 65 74 73 20   {![catch {gets 
8ac0: 24 73 7d 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74  $s}]} {..    set
8ad0: 20 73 74 61 74 75 73 20 62 72 6f 6b 65 6e 0a 09   status broken..
8ae0: 7d 0a 09 63 6c 6f 73 65 20 24 73 0a 20 20 20 20  }..close $s.    
8af0: 7d 0a 20 20 20 20 73 65 74 20 73 74 61 74 75 73  }.    set status
8b00: 0a 7d 20 6f 6b 0a 0a 74 65 73 74 20 74 6c 73 49  .} ok..test tlsI
8b10: 4f 2d 31 31 2e 34 20 7b 72 65 6d 6f 74 65 20 65  O-11.4 {remote e
8b20: 63 68 6f 2c 20 6f 6e 65 20 6c 69 6e 65 7d 20 7b  cho, one line} {
8b30: 73 6f 63 6b 65 74 20 64 6f 54 65 73 74 73 57 69  socket doTestsWi
8b40: 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72 7d 20  thRemoteServer} 
8b50: 7b 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e  {.    sendComman
8b60: 64 20 22 73 65 74 20 63 61 43 65 72 74 20 24 63  d "set caCert $c
8b70: 61 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64 43  aCert".    sendC
8b80: 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73 65 72 76  ommand "set serv
8b90: 65 72 43 65 72 74 20 24 73 65 72 76 65 72 43 65  erCert $serverCe
8ba0: 72 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  rt".    sendComm
8bb0: 61 6e 64 20 22 73 65 74 20 63 6c 69 65 6e 74 43  and "set clientC
8bc0: 65 72 74 20 24 63 6c 69 65 6e 74 43 65 72 74 22  ert $clientCert"
8bd0: 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64  .    sendCommand
8be0: 20 22 73 65 74 20 73 65 72 76 65 72 4b 65 79 20   "set serverKey 
8bf0: 24 73 65 72 76 65 72 4b 65 79 22 0a 20 20 20 20  $serverKey".    
8c00: 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74  sendCommand "set
8c10: 20 63 6c 69 65 6e 74 4b 65 79 20 24 63 6c 69 65   clientKey $clie
8c20: 6e 74 4b 65 79 22 0a 20 20 20 20 73 65 6e 64 43  ntKey".    sendC
8c30: 6f 6d 6d 61 6e 64 20 7b 0a 20 20 20 20 09 67 6c  ommand {.    .gl
8c40: 6f 62 61 6c 20 73 65 72 76 65 72 43 65 72 74 0a  obal serverCert.
8c50: 09 67 6c 6f 62 61 6c 20 63 61 43 65 72 74 0a 09  .global caCert..
8c60: 67 6c 6f 62 61 6c 20 73 65 72 76 65 72 4b 65 79  global serverKey
8c70: 0a 09 73 65 74 20 73 6f 63 6b 65 74 31 30 5f 36  ..set socket10_6
8c80: 5f 74 65 73 74 5f 73 65 72 76 65 72 20 5b 74 6c  _test_server [tl
8c90: 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09 2d 63  s::socket \...-c
8ca0: 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43  ertfile $serverC
8cb0: 65 72 74 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20  ert \...-cafile 
8cc0: 24 63 61 43 65 72 74 20 5c 0a 09 09 2d 6b 65 79  $caCert \...-key
8cd0: 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20  file $serverKey 
8ce0: 5c 0a 09 09 2d 73 65 72 76 65 72 20 61 63 63 65  \...-server acce
8cf0: 70 74 20 32 38 33 36 5d 0a 09 70 72 6f 63 20 61  pt 2836]..proc a
8d00: 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a  ccept {s a p} {.
8d10: 09 20 20 20 20 74 6c 73 3a 3a 68 61 6e 64 73 68  .    tls::handsh
8d20: 61 6b 65 20 24 73 0a 09 20 20 20 20 66 69 6c 65  ake $s..    file
8d30: 65 76 65 6e 74 20 24 73 20 72 65 61 64 61 62 6c  event $s readabl
8d40: 65 20 5b 6c 69 73 74 20 65 63 68 6f 20 24 73 5d  e [list echo $s]
8d50: 0a 09 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65  ..    fconfigure
8d60: 20 24 73 20 2d 62 75 66 66 65 72 69 6e 67 20 6c   $s -buffering l
8d70: 69 6e 65 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  ine -translation
8d80: 20 63 72 6c 66 0a 09 7d 0a 09 70 72 6f 63 20 65   crlf..}..proc e
8d90: 63 68 6f 20 7b 73 7d 20 7b 0a 09 20 20 20 20 73  cho {s} {..    s
8da0: 65 74 20 6c 20 5b 67 65 74 73 20 24 73 5d 0a 09  et l [gets $s]..
8db0: 20 20 20 20 69 66 20 7b 5b 65 6f 66 20 24 73 5d      if {[eof $s]
8dc0: 7d 20 7b 0a 09 09 63 6c 6f 73 65 20 24 73 0a 09  } {...close $s..
8dd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 70      } else {...p
8de0: 75 74 73 20 24 73 20 24 6c 0a 09 20 20 20 20 7d  uts $s $l..    }
8df0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  ..}.    }.    se
8e00: 74 20 66 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74  t f [tls::socket
8e10: 20 5c 0a 09 20 20 20 20 2d 63 65 72 74 66 69 6c   \..    -certfil
8e20: 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63  e $clientCert -c
8e30: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b  afile $caCert -k
8e40: 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65  eyfile $clientKe
8e50: 79 20 5c 0a 09 20 20 20 20 24 72 65 6d 6f 74 65  y \..    $remote
8e60: 53 65 72 76 65 72 49 50 20 32 38 33 36 5d 0a 20  ServerIP 2836]. 
8e70: 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66     fconfigure $f
8e80: 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 63 72   -translation cr
8e90: 6c 66 20 2d 62 75 66 66 65 72 69 6e 67 20 6c 69  lf -buffering li
8ea0: 6e 65 0a 20 20 20 20 70 75 74 73 20 24 66 20 68  ne.    puts $f h
8eb0: 65 6c 6c 6f 0a 20 20 20 20 73 65 74 20 72 20 5b  ello.    set r [
8ec0: 67 65 74 73 20 24 66 5d 0a 20 20 20 20 63 6c 6f  gets $f].    clo
8ed0: 73 65 20 24 66 0a 20 20 20 20 73 65 6e 64 43 6f  se $f.    sendCo
8ee0: 6d 6d 61 6e 64 20 7b 63 6c 6f 73 65 20 24 73 6f  mmand {close $so
8ef0: 63 6b 65 74 31 30 5f 36 5f 74 65 73 74 5f 73 65  cket10_6_test_se
8f00: 72 76 65 72 7d 0a 20 20 20 20 73 65 74 20 72 0a  rver}.    set r.
8f10: 7d 20 68 65 6c 6c 6f 0a 0a 74 65 73 74 20 74 6c  } hello..test tl
8f20: 73 49 4f 2d 31 31 2e 35 20 7b 72 65 6d 6f 74 65  sIO-11.5 {remote
8f30: 20 65 63 68 6f 2c 20 35 30 20 6c 69 6e 65 73 7d   echo, 50 lines}
8f40: 20 7b 73 6f 63 6b 65 74 20 64 6f 54 65 73 74 73   {socket doTests
8f50: 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72  WithRemoteServer
8f60: 7d 20 7b 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  } {.    sendComm
8f70: 61 6e 64 20 22 73 65 74 20 63 61 43 65 72 74 20  and "set caCert 
8f80: 24 63 61 43 65 72 74 22 0a 20 20 20 20 73 65 6e  $caCert".    sen
8f90: 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73 65  dCommand "set se
8fa0: 72 76 65 72 43 65 72 74 20 24 73 65 72 76 65 72  rverCert $server
8fb0: 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64 43 6f  Cert".    sendCo
8fc0: 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c 69 65 6e  mmand "set clien
8fd0: 74 43 65 72 74 20 24 63 6c 69 65 6e 74 43 65 72  tCert $clientCer
8fe0: 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61  t".    sendComma
8ff0: 6e 64 20 22 73 65 74 20 73 65 72 76 65 72 4b 65  nd "set serverKe
9000: 79 20 24 73 65 72 76 65 72 4b 65 79 22 0a 20 20  y $serverKey".  
9010: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73    sendCommand "s
9020: 65 74 20 63 6c 69 65 6e 74 4b 65 79 20 24 63 6c  et clientKey $cl
9030: 69 65 6e 74 4b 65 79 22 0a 20 20 20 20 73 65 6e  ientKey".    sen
9040: 64 43 6f 6d 6d 61 6e 64 20 7b 0a 09 73 65 74 20  dCommand {..set 
9050: 73 6f 63 6b 65 74 31 30 5f 37 5f 74 65 73 74 5f  socket10_7_test_
9060: 73 65 72 76 65 72 20 5b 74 6c 73 3a 3a 73 6f 63  server [tls::soc
9070: 6b 65 74 20 2d 73 65 72 76 65 72 20 61 63 63 65  ket -server acce
9080: 70 74 20 5c 0a 09 09 2d 63 65 72 74 66 69 6c 65  pt \...-certfile
9090: 20 24 73 65 72 76 65 72 43 65 72 74 20 5c 0a 09   $serverCert \..
90a0: 09 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74  .-cafile $caCert
90b0: 20 5c 0a 09 09 2d 6b 65 79 66 69 6c 65 20 24 73   \...-keyfile $s
90c0: 65 72 76 65 72 4b 65 79 20 5c 0a 09 09 32 38 33  erverKey \...283
90d0: 36 5d 0a 09 70 72 6f 63 20 61 63 63 65 70 74 20  6]..proc accept 
90e0: 7b 73 20 61 20 70 7d 20 7b 0a 09 20 20 20 20 74  {s a p} {..    t
90f0: 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 20 24 73  ls::handshake $s
9100: 0a 09 20 20 20 20 66 69 6c 65 65 76 65 6e 74 20  ..    fileevent 
9110: 24 73 20 72 65 61 64 61 62 6c 65 20 5b 6c 69 73  $s readable [lis
9120: 74 20 65 63 68 6f 20 24 73 5d 0a 09 20 20 20 20  t echo $s]..    
9130: 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62  fconfigure $s -b
9140: 75 66 66 65 72 69 6e 67 20 6c 69 6e 65 20 2d 74  uffering line -t
9150: 72 61 6e 73 6c 61 74 69 6f 6e 20 63 72 6c 66 0a  ranslation crlf.
9160: 09 7d 0a 09 70 72 6f 63 20 65 63 68 6f 20 7b 73  .}..proc echo {s
9170: 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 6c 20 5b  } {..    set l [
9180: 67 65 74 73 20 24 73 5d 0a 09 20 20 20 20 69 66  gets $s]..    if
9190: 20 7b 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a 09 09   {[eof $s]} {...
91a0: 63 6c 6f 73 65 20 24 73 0a 09 20 20 20 20 7d 20  close $s..    } 
91b0: 65 6c 73 65 20 7b 0a 09 09 70 75 74 73 20 24 73  else {...puts $s
91c0: 20 24 6c 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20   $l..    }..}.  
91d0: 20 20 7d 0a 20 20 20 20 73 65 74 20 66 20 5b 74    }.    set f [t
91e0: 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20  ls::socket \..  
91f0: 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69    -certfile $cli
9200: 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20  entCert -cafile 
9210: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
9220: 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20   $clientKey \.. 
9230: 20 20 20 24 72 65 6d 6f 74 65 53 65 72 76 65 72     $remoteServer
9240: 49 50 20 32 38 33 36 5d 0a 20 20 20 20 66 63 6f  IP 2836].    fco
9250: 6e 66 69 67 75 72 65 20 24 66 20 2d 74 72 61 6e  nfigure $f -tran
9260: 73 6c 61 74 69 6f 6e 20 63 72 6c 66 20 2d 62 75  slation crlf -bu
9270: 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 20 20 20  ffering line.   
9280: 20 66 6f 72 20 7b 73 65 74 20 63 6e 74 20 30 7d   for {set cnt 0}
9290: 20 7b 24 63 6e 74 20 3c 20 35 30 7d 20 7b 69 6e   {$cnt < 50} {in
92a0: 63 72 20 63 6e 74 7d 20 7b 0a 09 70 75 74 73 20  cr cnt} {..puts 
92b0: 24 66 20 22 68 65 6c 6c 6f 2c 20 24 63 6e 74 22  $f "hello, $cnt"
92c0: 0a 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f  ..if {[string co
92d0: 6d 70 61 72 65 20 5b 67 65 74 73 20 24 66 5d 20  mpare [gets $f] 
92e0: 22 68 65 6c 6c 6f 2c 20 24 63 6e 74 22 5d 20 21  "hello, $cnt"] !
92f0: 3d 20 30 7d 20 7b 0a 09 20 20 20 20 62 72 65 61  = 0} {..    brea
9300: 6b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63  k..}.    }.    c
9310: 6c 6f 73 65 20 24 66 0a 20 20 20 20 73 65 6e 64  lose $f.    send
9320: 43 6f 6d 6d 61 6e 64 20 7b 63 6c 6f 73 65 20 24  Command {close $
9330: 73 6f 63 6b 65 74 31 30 5f 37 5f 74 65 73 74 5f  socket10_7_test_
9340: 73 65 72 76 65 72 7d 0a 20 20 20 20 73 65 74 20  server}.    set 
9350: 63 6e 74 0a 7d 20 35 30 0a 0a 23 20 4d 61 63 69  cnt.} 50..# Maci
9360: 6e 74 6f 73 68 20 73 6f 63 6b 65 74 73 20 63 61  ntosh sockets ca
9370: 6e 20 68 61 76 65 20 6d 6f 72 65 20 74 68 61 6e  n have more than
9380: 20 6f 6e 65 20 73 65 72 76 65 72 20 70 65 72 20   one server per 
9390: 70 6f 72 74 0a 69 66 20 7b 24 74 63 6c 5f 70 6c  port.if {$tcl_pl
93a0: 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29  atform(platform)
93b0: 20 3d 3d 20 22 6d 61 63 69 6e 74 6f 73 68 22 7d   == "macintosh"}
93c0: 20 7b 0a 20 20 20 20 73 65 74 20 63 6f 6e 66 6c   {.    set confl
93d0: 69 63 74 52 65 73 75 6c 74 20 7b 30 20 32 38 33  ictResult {0 283
93e0: 36 7d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  6}.} else {.    
93f0: 73 65 74 20 63 6f 6e 66 6c 69 63 74 52 65 73 75  set conflictResu
9400: 6c 74 20 7b 31 20 7b 63 6f 75 6c 64 6e 27 74 20  lt {1 {couldn't 
9410: 6f 70 65 6e 20 73 6f 63 6b 65 74 3a 20 61 64 64  open socket: add
9420: 72 65 73 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ress already in 
9430: 75 73 65 7d 7d 0a 7d 0a 0a 74 65 73 74 20 74 6c  use}}.}..test tl
9440: 73 49 4f 2d 31 31 2e 36 20 7b 73 6f 63 6b 65 74  sIO-11.6 {socket
9450: 20 63 6f 6e 66 6c 69 63 74 7d 20 7b 73 6f 63 6b   conflict} {sock
9460: 65 74 20 64 6f 54 65 73 74 73 57 69 74 68 52 65  et doTestsWithRe
9470: 6d 6f 74 65 53 65 72 76 65 72 7d 20 7b 0a 20 20  moteServer} {.  
9480: 20 20 73 65 74 20 73 31 20 5b 74 6c 73 3a 3a 73    set s1 [tls::s
9490: 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65  ocket \..    -ce
94a0: 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65  rtfile $serverCe
94b0: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
94c0: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72  rt -keyfile $ser
94d0: 76 65 72 4b 65 79 20 5c 0a 09 20 20 20 20 2d 73  verKey \..    -s
94e0: 65 72 76 65 72 20 61 63 63 65 70 74 20 32 38 33  erver accept 283
94f0: 36 5d 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63  6].    if {[catc
9500: 68 20 7b 73 65 74 20 73 32 20 5b 74 6c 73 3a 3a  h {set s2 [tls::
9510: 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63  socket \..    -c
9520: 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43  ertfile $serverC
9530: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
9540: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65  ert -keyfile $se
9550: 72 76 65 72 4b 65 79 20 5c 0a 09 20 20 20 20 2d  rverKey \..    -
9560: 73 65 72 76 65 72 20 61 63 63 65 70 74 20 32 38  server accept 28
9570: 33 36 5d 7d 20 6d 73 67 5d 7d 20 7b 0a 09 73 65  36]} msg]} {..se
9580: 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 31  t result [list 1
9590: 20 24 6d 73 67 5d 0a 20 20 20 20 7d 20 65 6c 73   $msg].    } els
95a0: 65 20 7b 0a 09 73 65 74 20 72 65 73 75 6c 74 20  e {..set result 
95b0: 5b 6c 69 73 74 20 30 20 5b 6c 69 6e 64 65 78 20  [list 0 [lindex 
95c0: 5b 66 63 6f 6e 66 69 67 75 72 65 20 24 73 32 20  [fconfigure $s2 
95d0: 2d 73 6f 63 6b 6e 61 6d 65 5d 20 32 5d 5d 0a 09  -sockname] 2]]..
95e0: 63 6c 6f 73 65 20 24 73 32 0a 20 20 20 20 7d 0a  close $s2.    }.
95f0: 20 20 20 20 63 6c 6f 73 65 20 24 73 31 0a 20 20      close $s1.  
9600: 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 24    set result.} $
9610: 63 6f 6e 66 6c 69 63 74 52 65 73 75 6c 74 0a 0a  conflictResult..
9620: 74 65 73 74 20 74 6c 73 49 4f 2d 31 31 2e 37 20  test tlsIO-11.7 
9630: 7b 73 65 72 76 65 72 20 77 69 74 68 20 73 65 76  {server with sev
9640: 65 72 61 6c 20 63 6c 69 65 6e 74 73 7d 20 7b 73  eral clients} {s
9650: 6f 63 6b 65 74 20 64 6f 54 65 73 74 73 57 69 74  ocket doTestsWit
9660: 68 52 65 6d 6f 74 65 53 65 72 76 65 72 7d 20 7b  hRemoteServer} {
9670: 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64  .    sendCommand
9680: 20 7b 0a 09 73 65 74 20 73 6f 63 6b 65 74 31 30   {..set socket10
9690: 5f 39 5f 74 65 73 74 5f 73 65 72 76 65 72 20 5b  _9_test_server [
96a0: 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09  tls::socket \...
96b0: 2d 63 65 72 74 66 69 6c 65 20 5b 66 69 6c 65 20  -certfile [file 
96c0: 6a 6f 69 6e 20 5b 70 77 64 5d 20 63 65 72 74 73  join [pwd] certs
96d0: 20 73 65 72 76 65 72 2e 70 65 6d 5d 20 5c 0a 09   server.pem] \..
96e0: 09 2d 63 61 66 69 6c 65 20 5b 66 69 6c 65 20 6a  .-cafile [file j
96f0: 6f 69 6e 20 5b 70 77 64 5d 20 63 65 72 74 73 20  oin [pwd] certs 
9700: 63 61 46 69 6c 65 2e 70 65 6d 5d 20 5c 0a 09 09  caFile.pem] \...
9710: 2d 6b 65 79 66 69 6c 65 20 5b 66 69 6c 65 20 6a  -keyfile [file j
9720: 6f 69 6e 20 5b 70 77 64 5d 20 63 65 72 74 73 20  oin [pwd] certs 
9730: 73 6b 65 79 2e 70 65 6d 5d 20 5c 0a 09 09 2d 73  skey.pem] \...-s
9740: 65 72 76 65 72 20 61 63 63 65 70 74 20 32 38 33  erver accept 283
9750: 36 5d 0a 09 70 72 6f 63 20 61 63 63 65 70 74 20  6]..proc accept 
9760: 7b 73 20 61 20 70 7d 20 7b 0a 09 20 20 20 20 23  {s a p} {..    #
9770: 20 68 61 6e 64 73 68 61 6b 65 20 6c 6f 63 6b 73   handshake locks
9780: 20 75 70 20 74 68 65 20 74 68 72 65 65 20 73 79   up the three sy
9790: 6e 63 68 72 6f 6e 6f 75 73 20 63 6c 69 65 6e 74  nchronous client
97a0: 73 0a 09 20 20 20 20 23 20 74 6c 73 3a 3a 68 61  s..    # tls::ha
97b0: 6e 64 73 68 61 6b 65 20 24 73 0a 09 20 20 20 20  ndshake $s..    
97c0: 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62  fconfigure $s -b
97d0: 75 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 09 20  uffering line.. 
97e0: 20 20 20 66 69 6c 65 65 76 65 6e 74 20 24 73 20     fileevent $s 
97f0: 72 65 61 64 61 62 6c 65 20 5b 6c 69 73 74 20 65  readable [list e
9800: 63 68 6f 20 24 73 5d 0a 09 7d 0a 09 70 72 6f 63  cho $s]..}..proc
9810: 20 65 63 68 6f 20 7b 73 7d 20 7b 0a 09 20 20 20   echo {s} {..   
9820: 20 73 65 74 20 6c 20 5b 67 65 74 73 20 24 73 5d   set l [gets $s]
9830: 0a 09 20 20 20 20 69 66 20 7b 5b 65 6f 66 20 24  ..    if {[eof $
9840: 73 5d 7d 20 7b 0a 09 09 63 6c 6f 73 65 20 24 73  s]} {...close $s
9850: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
9860: 09 70 75 74 73 20 24 73 20 24 6c 0a 09 20 20 20  .puts $s $l..   
9870: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20   }..}.    }.    
9880: 73 65 74 20 73 31 20 5b 74 6c 73 3a 3a 73 6f 63  set s1 [tls::soc
9890: 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65 72 74  ket \..    -cert
98a0: 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72 74  file $clientCert
98b0: 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72 74   -cafile $caCert
98c0: 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65 6e   -keyfile $clien
98d0: 74 4b 65 79 20 5c 0a 09 20 20 20 20 24 72 65 6d  tKey \..    $rem
98e0: 6f 74 65 53 65 72 76 65 72 49 50 20 32 38 33 36  oteServerIP 2836
98f0: 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65  ].    fconfigure
9900: 20 24 73 31 20 2d 62 75 66 66 65 72 69 6e 67 20   $s1 -buffering 
9910: 6c 69 6e 65 0a 20 20 20 20 73 65 74 20 73 32 20  line.    set s2 
9920: 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09  [tls::socket \..
9930: 20 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63      -certfile $c
9940: 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c  lientCert -cafil
9950: 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69  e $caCert -keyfi
9960: 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a  le $clientKey \.
9970: 09 20 20 20 20 24 72 65 6d 6f 74 65 53 65 72 76  .    $remoteServ
9980: 65 72 49 50 20 32 38 33 36 5d 0a 20 20 20 20 66  erIP 2836].    f
9990: 63 6f 6e 66 69 67 75 72 65 20 24 73 32 20 2d 62  configure $s2 -b
99a0: 75 66 66 65 72 69 6e 67 20 6c 69 6e 65 0a 20 20  uffering line.  
99b0: 20 20 73 65 74 20 73 33 20 5b 74 6c 73 3a 3a 73    set s3 [tls::s
99c0: 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65  ocket \..    -ce
99d0: 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65  rtfile $clientCe
99e0: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
99f0: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69  rt -keyfile $cli
9a00: 65 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 24 72  entKey \..    $r
9a10: 65 6d 6f 74 65 53 65 72 76 65 72 49 50 20 32 38  emoteServerIP 28
9a20: 33 36 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67 75  36].    fconfigu
9a30: 72 65 20 24 73 33 20 2d 62 75 66 66 65 72 69 6e  re $s3 -bufferin
9a40: 67 20 6c 69 6e 65 0a 20 20 20 20 66 6f 72 20 7b  g line.    for {
9a50: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31  set i 0} {$i < 1
9a60: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 09  00} {incr i} {..
9a70: 70 75 74 73 20 24 73 31 20 68 65 6c 6c 6f 2c 73  puts $s1 hello,s
9a80: 31 0a 09 67 65 74 73 20 24 73 31 0a 09 70 75 74  1..gets $s1..put
9a90: 73 20 24 73 32 20 68 65 6c 6c 6f 2c 73 32 0a 09  s $s2 hello,s2..
9aa0: 67 65 74 73 20 24 73 32 0a 09 70 75 74 73 20 24  gets $s2..puts $
9ab0: 73 33 20 68 65 6c 6c 6f 2c 73 33 0a 09 67 65 74  s3 hello,s3..get
9ac0: 73 20 24 73 33 0a 20 20 20 20 7d 0a 20 20 20 20  s $s3.    }.    
9ad0: 63 6c 6f 73 65 20 24 73 31 0a 20 20 20 20 63 6c  close $s1.    cl
9ae0: 6f 73 65 20 24 73 32 0a 20 20 20 20 63 6c 6f 73  ose $s2.    clos
9af0: 65 20 24 73 33 0a 20 20 20 20 73 65 6e 64 43 6f  e $s3.    sendCo
9b00: 6d 6d 61 6e 64 20 7b 63 6c 6f 73 65 20 24 73 6f  mmand {close $so
9b10: 63 6b 65 74 31 30 5f 39 5f 74 65 73 74 5f 73 65  cket10_9_test_se
9b20: 72 76 65 72 7d 0a 20 20 20 20 73 65 74 20 69 0a  rver}.    set i.
9b30: 7d 20 31 30 30 20 20 20 20 0a 0a 74 65 73 74 20  } 100    ..test 
9b40: 74 6c 73 49 4f 2d 31 31 2e 38 20 7b 63 6c 69 65  tlsIO-11.8 {clie
9b50: 6e 74 20 77 69 74 68 20 73 65 76 65 72 61 6c 20  nt with several 
9b60: 73 65 72 76 65 72 73 7d 20 7b 75 6e 65 78 70 6c  servers} {unexpl
9b70: 61 69 6e 65 64 48 61 6e 67 20 73 6f 63 6b 65 74  ainedHang socket
9b80: 20 64 6f 54 65 73 74 73 57 69 74 68 52 65 6d 6f   doTestsWithRemo
9b90: 74 65 53 65 72 76 65 72 7d 20 7b 0a 20 20 20 20  teServer} {.    
9ba0: 23 20 74 68 69 73 20 6f 6e 65 20 73 65 65 6d 73  # this one seems
9bb0: 20 74 6f 20 68 61 6e 67 20 2d 2d 20 61 77 62 20   to hang -- awb 
9bc0: 36 2f 32 2f 32 30 30 30 0a 20 20 20 20 73 65 6e  6/2/2000.    sen
9bd0: 64 43 6f 6d 6d 61 6e 64 20 7b 0a 09 73 65 74 20  dCommand {..set 
9be0: 73 31 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20  s1 [tls::socket 
9bf0: 5c 0a 09 09 2d 63 65 72 74 66 69 6c 65 20 5b 66  \...-certfile [f
9c00: 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d 20 63  ile join [pwd] c
9c10: 65 72 74 73 20 73 65 72 76 65 72 2e 70 65 6d 5d  erts server.pem]
9c20: 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20 5b 66 69   \...-cafile [fi
9c30: 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d 20 63 65  le join [pwd] ce
9c40: 72 74 73 20 63 61 46 69 6c 65 2e 70 65 6d 5d 20  rts caFile.pem] 
9c50: 5c 0a 09 09 2d 6b 65 79 66 69 6c 65 20 5b 66 69  \...-keyfile [fi
9c60: 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d 20 63 65  le join [pwd] ce
9c70: 72 74 73 20 73 6b 65 79 2e 70 65 6d 5d 20 5c 0a  rts skey.pem] \.
9c80: 09 09 2d 73 65 72 76 65 72 20 22 61 63 63 65 70  ..-server "accep
9c90: 74 20 34 30 30 33 22 20 34 30 30 33 5d 0a 09 73  t 4003" 4003]..s
9ca0: 65 74 20 73 32 20 5b 74 6c 73 3a 3a 73 6f 63 6b  et s2 [tls::sock
9cb0: 65 74 20 5c 0a 09 09 2d 63 65 72 74 66 69 6c 65  et \...-certfile
9cc0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64   [file join [pwd
9cd0: 5d 20 63 65 72 74 73 20 73 65 72 76 65 72 2e 70  ] certs server.p
9ce0: 65 6d 5d 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20  em] \...-cafile 
9cf0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d  [file join [pwd]
9d00: 20 63 65 72 74 73 20 63 61 46 69 6c 65 2e 70 65   certs caFile.pe
9d10: 6d 5d 20 5c 0a 09 09 2d 6b 65 79 66 69 6c 65 20  m] \...-keyfile 
9d20: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d  [file join [pwd]
9d30: 20 63 65 72 74 73 20 73 6b 65 79 2e 70 65 6d 5d   certs skey.pem]
9d40: 20 5c 0a 09 09 2d 73 65 72 76 65 72 20 22 61 63   \...-server "ac
9d50: 63 65 70 74 20 34 30 30 34 22 20 34 30 30 34 5d  cept 4004" 4004]
9d60: 0a 09 73 65 74 20 73 33 20 5b 74 6c 73 3a 3a 73  ..set s3 [tls::s
9d70: 6f 63 6b 65 74 20 5c 0a 09 09 2d 63 65 72 74 66  ocket \...-certf
9d80: 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ile [file join [
9d90: 70 77 64 5d 20 63 65 72 74 73 20 73 65 72 76 65  pwd] certs serve
9da0: 72 2e 70 65 6d 5d 20 5c 0a 09 09 2d 63 61 66 69  r.pem] \...-cafi
9db0: 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70  le [file join [p
9dc0: 77 64 5d 20 63 65 72 74 73 20 63 61 46 69 6c 65  wd] certs caFile
9dd0: 2e 70 65 6d 5d 20 5c 0a 09 09 2d 6b 65 79 66 69  .pem] \...-keyfi
9de0: 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70  le [file join [p
9df0: 77 64 5d 20 63 65 72 74 73 20 73 6b 65 79 2e 70  wd] certs skey.p
9e00: 65 6d 5d 20 5c 0a 09 09 2d 73 65 72 76 65 72 20  em] \...-server 
9e10: 22 61 63 63 65 70 74 20 34 30 30 35 22 20 34 30  "accept 4005" 40
9e20: 30 35 5d 0a 09 70 72 6f 63 20 61 63 63 65 70 74  05]..proc accept
9e30: 20 7b 6d 70 20 73 20 61 20 70 7d 20 7b 0a 09 20   {mp s a p} {.. 
9e40: 20 20 20 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b     tls::handshak
9e50: 65 20 24 73 0a 09 20 20 20 20 70 75 74 73 20 24  e $s..    puts $
9e60: 73 20 24 6d 70 0a 09 20 20 20 20 63 6c 6f 73 65  s $mp..    close
9e70: 20 24 73 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20   $s..}.    }.   
9e80: 20 73 65 74 20 73 31 20 5b 74 6c 73 3a 3a 73 6f   set s1 [tls::so
9e90: 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65 72  cket \..    -cer
9ea0: 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72  tfile $clientCer
9eb0: 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72  t -cafile $caCer
9ec0: 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65  t -keyfile $clie
9ed0: 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 24 72 65  ntKey \..    $re
9ee0: 6d 6f 74 65 53 65 72 76 65 72 49 50 20 34 30 30  moteServerIP 400
9ef0: 33 5d 0a 20 20 20 20 73 65 74 20 73 32 20 5b 74  3].    set s2 [t
9f00: 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20  ls::socket \..  
9f10: 20 20 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69    -certfile $cli
9f20: 65 6e 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20  entCert -cafile 
9f30: 24 63 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65  $caCert -keyfile
9f40: 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 09 20   $clientKey \.. 
9f50: 20 20 20 24 72 65 6d 6f 74 65 53 65 72 76 65 72     $remoteServer
9f60: 49 50 20 34 30 30 34 5d 0a 20 20 20 20 73 65 74  IP 4004].    set
9f70: 20 73 33 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74   s3 [tls::socket
9f80: 20 5c 0a 09 20 20 20 20 2d 63 65 72 74 66 69 6c   \..    -certfil
9f90: 65 20 24 63 6c 69 65 6e 74 43 65 72 74 20 2d 63  e $clientCert -c
9fa0: 61 66 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b  afile $caCert -k
9fb0: 65 79 66 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65  eyfile $clientKe
9fc0: 79 20 5c 0a 09 20 20 20 20 24 72 65 6d 6f 74 65  y \..    $remote
9fd0: 53 65 72 76 65 72 49 50 20 34 30 30 35 5d 0a 20  ServerIP 4005]. 
9fe0: 20 20 20 73 65 74 20 6c 20 22 22 0a 20 20 20 20     set l "".    
9ff0: 6c 61 70 70 65 6e 64 20 6c 20 5b 67 65 74 73 20  lappend l [gets 
a000: 24 73 31 5d 20 5b 67 65 74 73 20 24 73 31 5d 20  $s1] [gets $s1] 
a010: 5b 65 6f 66 20 24 73 31 5d 20 5b 67 65 74 73 20  [eof $s1] [gets 
a020: 24 73 32 5d 20 5b 67 65 74 73 20 24 73 32 5d 20  $s2] [gets $s2] 
a030: 5b 65 6f 66 20 24 73 32 5d 20 5c 0a 09 5b 67 65  [eof $s2] \..[ge
a040: 74 73 20 24 73 33 5d 20 5b 67 65 74 73 20 24 73  ts $s3] [gets $s
a050: 33 5d 20 5b 65 6f 66 20 24 73 33 5d 0a 20 20 20  3] [eof $s3].   
a060: 20 63 6c 6f 73 65 20 24 73 31 0a 20 20 20 20 63   close $s1.    c
a070: 6c 6f 73 65 20 24 73 32 0a 20 20 20 20 63 6c 6f  lose $s2.    clo
a080: 73 65 20 24 73 33 0a 20 20 20 20 73 65 6e 64 43  se $s3.    sendC
a090: 6f 6d 6d 61 6e 64 20 7b 0a 09 63 6c 6f 73 65 20  ommand {..close 
a0a0: 24 73 31 0a 09 63 6c 6f 73 65 20 24 73 32 0a 09  $s1..close $s2..
a0b0: 63 6c 6f 73 65 20 24 73 33 0a 20 20 20 20 7d 0a  close $s3.    }.
a0c0: 20 20 20 20 73 65 74 20 6c 0a 7d 20 7b 34 30 30      set l.} {400
a0d0: 33 20 7b 7d 20 31 20 34 30 30 34 20 7b 7d 20 31  3 {} 1 4004 {} 1
a0e0: 20 34 30 30 35 20 7b 7d 20 31 7d 0a 0a 74 65 73   4005 {} 1}..tes
a0f0: 74 20 74 6c 73 49 4f 2d 31 31 2e 39 20 7b 61 63  t tlsIO-11.9 {ac
a100: 63 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 65 72  cept callback er
a110: 72 6f 72 7d 20 7b 73 6f 63 6b 65 74 20 64 6f 54  ror} {socket doT
a120: 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65 53 65  estsWithRemoteSe
a130: 72 76 65 72 7d 20 7b 0a 20 20 20 20 73 65 74 20  rver} {.    set 
a140: 73 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c  s [tls::socket \
a150: 0a 09 20 20 20 20 2d 63 65 72 74 66 69 6c 65 20  ..    -certfile 
a160: 24 73 65 72 76 65 72 43 65 72 74 20 2d 63 61 66  $serverCert -caf
a170: 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79  ile $caCert -key
a180: 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20  file $serverKey 
a190: 5c 0a 09 20 20 20 20 2d 73 65 72 76 65 72 20 61  \..    -server a
a1a0: 63 63 65 70 74 20 32 38 33 36 5d 0a 20 20 20 20  ccept 2836].    
a1b0: 70 72 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61  proc accept {s a
a1c0: 20 70 7d 20 7b 65 78 70 72 20 31 30 20 2f 20 30   p} {expr 10 / 0
a1d0: 7d 0a 20 20 20 20 70 72 6f 63 20 62 67 65 72 72  }.    proc bgerr
a1e0: 6f 72 20 61 72 67 73 20 7b 0a 09 67 6c 6f 62 61  or args {..globa
a1f0: 6c 20 78 0a 09 73 65 74 20 78 20 24 61 72 67 73  l x..set x $args
a200: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6e 64 43  .    }.    sendC
a210: 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 61 43 65  ommand "set caCe
a220: 72 74 20 24 63 61 43 65 72 74 22 0a 20 20 20 20  rt $caCert".    
a230: 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74  sendCommand "set
a240: 20 73 65 72 76 65 72 43 65 72 74 20 24 73 65 72   serverCert $ser
a250: 76 65 72 43 65 72 74 22 0a 20 20 20 20 73 65 6e  verCert".    sen
a260: 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c  dCommand "set cl
a270: 69 65 6e 74 43 65 72 74 20 24 63 6c 69 65 6e 74  ientCert $client
a280: 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64 43 6f  Cert".    sendCo
a290: 6d 6d 61 6e 64 20 22 73 65 74 20 73 65 72 76 65  mmand "set serve
a2a0: 72 4b 65 79 20 24 73 65 72 76 65 72 4b 65 79 22  rKey $serverKey"
a2b0: 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64  .    sendCommand
a2c0: 20 22 73 65 74 20 63 6c 69 65 6e 74 4b 65 79 20   "set clientKey 
a2d0: 24 63 6c 69 65 6e 74 4b 65 79 22 0a 20 20 20 20  $clientKey".    
a2e0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 65 6e 64  if {[catch {send
a2f0: 43 6f 6d 6d 61 6e 64 20 7b 0a 09 20 20 20 20 73  Command {..    s
a300: 65 74 20 70 65 65 72 6e 61 6d 65 20 5b 66 63 6f  et peername [fco
a310: 6e 66 69 67 75 72 65 20 24 63 61 6c 6c 65 72 53  nfigure $callerS
a320: 6f 63 6b 65 74 20 2d 70 65 65 72 6e 61 6d 65 5d  ocket -peername]
a330: 0a 09 20 20 20 20 73 65 74 20 73 20 5b 74 6c 73  ..    set s [tls
a340: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09 2d 63 65  ::socket \...-ce
a350: 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65  rtfile $clientCe
a360: 72 74 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20 24  rt \...-cafile $
a370: 63 61 43 65 72 74 20 5c 0a 09 09 2d 6b 65 79 66  caCert \...-keyf
a380: 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c  ile $clientKey \
a390: 0a 09 20 20 20 20 09 5b 6c 69 6e 64 65 78 20 24  ..    .[lindex $
a3a0: 70 65 65 72 6e 61 6d 65 20 30 5d 20 32 38 33 36  peername 0] 2836
a3b0: 5d 0a 09 20 20 20 20 63 6c 6f 73 65 20 24 73 0a  ]..    close $s.
a3c0: 20 20 20 20 09 20 7d 7d 20 6d 73 67 5d 7d 20 7b      . }} msg]} {
a3d0: 0a 09 63 6c 6f 73 65 20 24 73 0a 09 65 72 72 6f  ..close $s..erro
a3e0: 72 20 24 6d 73 67 0a 20 20 20 20 7d 0a 20 20 20  r $msg.    }.   
a3f0: 20 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65   set timer [afte
a400: 72 20 31 30 30 30 30 20 22 73 65 74 20 78 20 74  r 10000 "set x t
a410: 69 6d 65 64 5f 6f 75 74 22 5d 0a 20 20 20 20 76  imed_out"].    v
a420: 77 61 69 74 20 78 0a 20 20 20 20 61 66 74 65 72  wait x.    after
a430: 20 63 61 6e 63 65 6c 20 24 74 69 6d 65 72 0a 20   cancel $timer. 
a440: 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20     close $s.    
a450: 72 65 6e 61 6d 65 20 62 67 65 72 72 6f 72 20 7b  rename bgerror {
a460: 7d 0a 20 20 20 20 73 65 74 20 78 0a 7d 20 7b 7b  }.    set x.} {{
a470: 64 69 76 69 64 65 20 62 79 20 7a 65 72 6f 7d 7d  divide by zero}}
a480: 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31 31 2e  ..test tlsIO-11.
a490: 31 30 20 7b 74 65 73 74 69 6e 67 20 73 6f 63 6b  10 {testing sock
a4a0: 65 74 20 73 70 65 63 69 66 69 63 20 6f 70 74 69  et specific opti
a4b0: 6f 6e 73 7d 20 7b 73 6f 63 6b 65 74 20 64 6f 54  ons} {socket doT
a4c0: 65 73 74 73 57 69 74 68 52 65 6d 6f 74 65 53 65  estsWithRemoteSe
a4d0: 72 76 65 72 7d 20 7b 0a 20 20 20 20 73 65 6e 64  rver} {.    send
a4e0: 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 61 43  Command "set caC
a4f0: 65 72 74 20 24 63 61 43 65 72 74 22 0a 20 20 20  ert $caCert".   
a500: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65   sendCommand "se
a510: 74 20 73 65 72 76 65 72 43 65 72 74 20 24 73 65  t serverCert $se
a520: 72 76 65 72 43 65 72 74 22 0a 20 20 20 20 73 65  rverCert".    se
a530: 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63  ndCommand "set c
a540: 6c 69 65 6e 74 43 65 72 74 20 24 63 6c 69 65 6e  lientCert $clien
a550: 74 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64 43  tCert".    sendC
a560: 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73 65 72 76  ommand "set serv
a570: 65 72 4b 65 79 20 24 73 65 72 76 65 72 4b 65 79  erKey $serverKey
a580: 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e  ".    sendComman
a590: 64 20 22 73 65 74 20 63 6c 69 65 6e 74 4b 65 79  d "set clientKey
a5a0: 20 24 63 6c 69 65 6e 74 4b 65 79 22 0a 20 20 20   $clientKey".   
a5b0: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 0a 09   sendCommand {..
a5c0: 73 65 74 20 73 6f 63 6b 65 74 31 30 5f 31 32 5f  set socket10_12_
a5d0: 74 65 73 74 5f 73 65 72 76 65 72 20 5b 74 6c 73  test_server [tls
a5e0: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09 2d 63 65  ::socket \...-ce
a5f0: 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65  rtfile $serverCe
a600: 72 74 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20 24  rt \...-cafile $
a610: 63 61 43 65 72 74 20 5c 0a 09 09 2d 6b 65 79 66  caCert \...-keyf
a620: 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20 5c  ile $serverKey \
a630: 0a 09 09 2d 73 65 72 76 65 72 20 61 63 63 65 70  ...-server accep
a640: 74 20 32 38 33 36 5d 0a 09 70 72 6f 63 20 61 63  t 2836]..proc ac
a650: 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 63 6c  cept {s a p} {cl
a660: 6f 73 65 20 24 73 7d 0a 20 20 20 20 7d 0a 20 20  ose $s}.    }.  
a670: 20 20 73 65 74 20 73 20 5b 74 6c 73 3a 3a 73 6f    set s [tls::so
a680: 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65 72  cket \..    -cer
a690: 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72  tfile $clientCer
a6a0: 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72  t -cafile $caCer
a6b0: 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65  t -keyfile $clie
a6c0: 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 24 72 65  ntKey \..    $re
a6d0: 6d 6f 74 65 53 65 72 76 65 72 49 50 20 32 38 33  moteServerIP 283
a6e0: 36 5d 0a 20 20 20 20 73 65 74 20 70 20 5b 66 63  6].    set p [fc
a6f0: 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 70 65 65  onfigure $s -pee
a700: 72 6e 61 6d 65 5d 0a 20 20 20 20 73 65 74 20 6e  rname].    set n
a710: 20 5b 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20   [fconfigure $s 
a720: 2d 73 6f 63 6b 6e 61 6d 65 5d 0a 20 20 20 20 73  -sockname].    s
a730: 65 74 20 6c 20 22 22 0a 20 20 20 20 6c 61 70 70  et l "".    lapp
a740: 65 6e 64 20 6c 20 5b 6c 69 6e 64 65 78 20 24 70  end l [lindex $p
a750: 20 32 5d 20 5b 6c 6c 65 6e 67 74 68 20 24 70 5d   2] [llength $p]
a760: 20 5b 6c 6c 65 6e 67 74 68 20 24 70 5d 0a 20 20   [llength $p].  
a770: 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20 20 73    close $s.    s
a780: 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 63 6c 6f 73  endCommand {clos
a790: 65 20 24 73 6f 63 6b 65 74 31 30 5f 31 32 5f 74  e $socket10_12_t
a7a0: 65 73 74 5f 73 65 72 76 65 72 7d 0a 20 20 20 20  est_server}.    
a7b0: 73 65 74 20 6c 0a 7d 20 7b 32 38 33 36 20 33 20  set l.} {2836 3 
a7c0: 33 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31  3}..test tlsIO-1
a7d0: 31 2e 31 31 20 7b 74 65 73 74 69 6e 67 20 73 70  1.11 {testing sp
a7e0: 75 72 69 6f 75 73 20 65 76 65 6e 74 73 7d 20 7b  urious events} {
a7f0: 75 6e 65 78 70 6c 61 69 6e 65 64 48 61 6e 67 20  unexplainedHang 
a800: 73 6f 63 6b 65 74 20 64 6f 54 65 73 74 73 57 69  socket doTestsWi
a810: 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72 7d 20  thRemoteServer} 
a820: 7b 0a 20 20 20 20 23 20 68 61 6e 67 73 0a 20 20  {.    # hangs.  
a830: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73    sendCommand "s
a840: 65 74 20 63 61 43 65 72 74 20 24 63 61 43 65 72  et caCert $caCer
a850: 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61  t".    sendComma
a860: 6e 64 20 22 73 65 74 20 73 65 72 76 65 72 43 65  nd "set serverCe
a870: 72 74 20 24 73 65 72 76 65 72 43 65 72 74 22 0a  rt $serverCert".
a880: 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20      sendCommand 
a890: 22 73 65 74 20 63 6c 69 65 6e 74 43 65 72 74 20  "set clientCert 
a8a0: 24 63 6c 69 65 6e 74 43 65 72 74 22 0a 20 20 20  $clientCert".   
a8b0: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65   sendCommand "se
a8c0: 74 20 73 65 72 76 65 72 4b 65 79 20 24 73 65 72  t serverKey $ser
a8d0: 76 65 72 4b 65 79 22 0a 20 20 20 20 73 65 6e 64  verKey".    send
a8e0: 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c 69  Command "set cli
a8f0: 65 6e 74 4b 65 79 20 24 63 6c 69 65 6e 74 4b 65  entKey $clientKe
a900: 79 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61  y".    sendComma
a910: 6e 64 20 7b 0a 09 73 65 74 20 73 6f 63 6b 65 74  nd {..set socket
a920: 31 30 5f 31 33 5f 74 65 73 74 5f 73 65 72 76 65  10_13_test_serve
a930: 72 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c  r [tls::socket \
a940: 0a 09 09 2d 63 65 72 74 66 69 6c 65 20 24 73 65  ...-certfile $se
a950: 72 76 65 72 43 65 72 74 20 5c 0a 09 09 2d 63 61  rverCert \...-ca
a960: 66 69 6c 65 20 24 63 61 43 65 72 74 20 5c 0a 09  file $caCert \..
a970: 09 2d 6b 65 79 66 69 6c 65 20 24 73 65 72 76 65  .-keyfile $serve
a980: 72 4b 65 79 20 5c 0a 09 09 2d 73 65 72 76 65 72  rKey \...-server
a990: 20 61 63 63 65 70 74 20 32 38 33 36 5d 0a 09 70   accept 2836]..p
a9a0: 72 6f 63 20 61 63 63 65 70 74 20 7b 73 20 61 20  roc accept {s a 
a9b0: 70 7d 20 7b 0a 09 20 20 20 20 74 6c 73 3a 3a 68  p} {..    tls::h
a9c0: 61 6e 64 73 68 61 6b 65 20 24 73 0a 09 20 20 20  andshake $s..   
a9d0: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d   fconfigure $s -
a9e0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 22 61 75 74  translation "aut
a9f0: 6f 20 6c 66 22 0a 09 20 20 20 20 61 66 74 65 72  o lf"..    after
aa00: 20 31 30 30 20 77 72 69 74 65 73 6f 6d 65 20 24   100 writesome $
aa10: 73 0a 09 7d 0a 09 70 72 6f 63 20 77 72 69 74 65  s..}..proc write
aa20: 73 6f 6d 65 20 7b 73 7d 20 7b 0a 09 20 20 20 20  some {s} {..    
aa30: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
aa40: 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69  i < 100} {incr i
aa50: 7d 20 7b 0a 09 09 70 75 74 73 20 24 73 20 22 6c  } {...puts $s "l
aa60: 69 6e 65 20 24 69 20 66 72 6f 6d 20 72 65 6d 6f  ine $i from remo
aa70: 74 65 20 73 65 72 76 65 72 22 0a 09 20 20 20 20  te server"..    
aa80: 7d 0a 09 20 20 20 20 63 6c 6f 73 65 20 24 73 0a  }..    close $s.
aa90: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  .}.    }.    set
aaa0: 20 6c 65 6e 20 30 0a 20 20 20 20 73 65 74 20 73   len 0.    set s
aab0: 70 75 72 69 6f 75 73 20 30 0a 20 20 20 20 73 65  purious 0.    se
aac0: 74 20 64 6f 6e 65 20 30 0a 20 20 20 20 70 72 6f  t done 0.    pro
aad0: 63 20 72 65 61 64 6c 69 74 74 6c 65 20 7b 73 7d  c readlittle {s}
aae0: 20 7b 0a 09 67 6c 6f 62 61 6c 20 73 70 75 72 69   {..global spuri
aaf0: 6f 75 73 20 64 6f 6e 65 20 6c 65 6e 0a 09 73 65  ous done len..se
ab00: 74 20 6c 20 5b 72 65 61 64 20 24 73 20 31 5d 0a  t l [read $s 1].
ab10: 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  .if {[string len
ab20: 67 74 68 20 24 6c 5d 20 3d 3d 20 30 7d 20 7b 0a  gth $l] == 0} {.
ab30: 09 20 20 20 20 69 66 20 7b 21 5b 65 6f 66 20 24  .    if {![eof $
ab40: 73 5d 7d 20 7b 0a 09 09 69 6e 63 72 20 73 70 75  s]} {...incr spu
ab50: 72 69 6f 75 73 0a 09 20 20 20 20 7d 20 65 6c 73  rious..    } els
ab60: 65 20 7b 0a 09 09 63 6c 6f 73 65 20 24 73 0a 09  e {...close $s..
ab70: 09 73 65 74 20 64 6f 6e 65 20 31 0a 09 20 20 20  .set done 1..   
ab80: 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20   }..} else {..  
ab90: 20 20 69 6e 63 72 20 6c 65 6e 20 5b 73 74 72 69    incr len [stri
aba0: 6e 67 20 6c 65 6e 67 74 68 20 24 6c 5d 0a 09 7d  ng length $l]..}
abb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 63  .    }.    set c
abc0: 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a   [tls::socket \.
abd0: 09 20 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24  .    -certfile $
abe0: 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69  clientCert -cafi
abf0: 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66  le $caCert -keyf
ac00: 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c  ile $clientKey \
ac10: 0a 09 20 20 20 20 24 72 65 6d 6f 74 65 53 65 72  ..    $remoteSer
ac20: 76 65 72 49 50 20 32 38 33 36 5d 0a 20 20 20 20  verIP 2836].    
ac30: 66 69 6c 65 65 76 65 6e 74 20 24 63 20 72 65 61  fileevent $c rea
ac40: 64 61 62 6c 65 20 22 72 65 61 64 6c 69 74 74 6c  dable "readlittl
ac50: 65 20 24 63 22 0a 20 20 20 20 73 65 74 20 74 69  e $c".    set ti
ac60: 6d 65 72 20 5b 61 66 74 65 72 20 31 30 30 30 30  mer [after 10000
ac70: 20 22 73 65 74 20 64 6f 6e 65 20 74 69 6d 65 64   "set done timed
ac80: 5f 6f 75 74 22 5d 0a 20 20 20 20 76 77 61 69 74  _out"].    vwait
ac90: 20 64 6f 6e 65 0a 20 20 20 20 61 66 74 65 72 20   done.    after 
aca0: 63 61 6e 63 65 6c 20 24 74 69 6d 65 72 0a 20 20  cancel $timer.  
acb0: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 7b 63    sendCommand {c
acc0: 6c 6f 73 65 20 24 73 6f 63 6b 65 74 31 30 5f 31  lose $socket10_1
acd0: 33 5f 74 65 73 74 5f 73 65 72 76 65 72 7d 0a 20  3_test_server}. 
ace0: 20 20 20 6c 69 73 74 20 24 73 70 75 72 69 6f 75     list $spuriou
acf0: 73 20 24 6c 65 6e 0a 7d 20 7b 30 20 32 36 39 30  s $len.} {0 2690
ad00: 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31 31  }..test tlsIO-11
ad10: 2e 31 32 20 7b 74 65 73 74 69 6e 67 20 45 4f 46  .12 {testing EOF
ad20: 20 73 74 69 63 6b 79 6e 65 73 73 7d 20 7b 73 6f   stickyness} {so
ad30: 63 6b 65 74 20 64 6f 54 65 73 74 73 57 69 74 68  cket doTestsWith
ad40: 52 65 6d 6f 74 65 53 65 72 76 65 72 7d 20 7b 0a  RemoteServer} {.
ad50: 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 20      set counter 
ad60: 30 0a 20 20 20 20 73 65 74 20 64 6f 6e 65 20 30  0.    set done 0
ad70: 0a 20 20 20 20 70 72 6f 63 20 63 6f 75 6e 74 5f  .    proc count_
ad80: 75 70 20 7b 73 7d 20 7b 0a 09 67 6c 6f 62 61 6c  up {s} {..global
ad90: 20 63 6f 75 6e 74 65 72 20 64 6f 6e 65 20 61 66   counter done af
ada0: 74 65 72 5f 69 64 0a 09 73 65 74 20 6c 20 5b 67  ter_id..set l [g
adb0: 65 74 73 20 24 73 5d 0a 09 69 66 20 7b 5b 65 6f  ets $s]..if {[eo
adc0: 66 20 24 73 5d 7d 20 7b 0a 09 20 20 20 20 69 6e  f $s]} {..    in
add0: 63 72 20 63 6f 75 6e 74 65 72 0a 09 20 20 20 20  cr counter..    
ade0: 69 66 20 7b 24 63 6f 75 6e 74 65 72 20 3e 20 39  if {$counter > 9
adf0: 7d 20 7b 0a 09 09 73 65 74 20 64 6f 6e 65 20 7b  } {...set done {
ae00: 45 4f 46 20 69 73 20 73 74 69 63 6b 79 7d 0a 09  EOF is sticky}..
ae10: 09 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 61  .after cancel $a
ae20: 66 74 65 72 5f 69 64 0a 09 09 63 6c 6f 73 65 20  fter_id...close 
ae30: 24 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  $s..    }..}.   
ae40: 20 7d 0a 20 20 20 20 70 72 6f 63 20 74 69 6d 65   }.    proc time
ae50: 64 5f 6f 75 74 20 7b 7d 20 7b 0a 09 67 6c 6f 62  d_out {} {..glob
ae60: 61 6c 20 63 20 64 6f 6e 65 0a 09 73 65 74 20 64  al c done..set d
ae70: 6f 6e 65 20 7b 74 69 6d 65 64 5f 6f 75 74 2c 20  one {timed_out, 
ae80: 45 4f 46 20 69 73 20 6e 6f 74 20 73 74 69 63 6b  EOF is not stick
ae90: 79 7d 0a 09 63 6c 6f 73 65 20 24 63 0a 20 20 20  y}..close $c.   
aea0: 20 7d 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61   }.    sendComma
aeb0: 6e 64 20 22 73 65 74 20 63 61 43 65 72 74 20 24  nd "set caCert $
aec0: 63 61 43 65 72 74 22 0a 20 20 20 20 73 65 6e 64  caCert".    send
aed0: 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 73 65 72  Command "set ser
aee0: 76 65 72 43 65 72 74 20 24 73 65 72 76 65 72 43  verCert $serverC
aef0: 65 72 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d  ert".    sendCom
af00: 6d 61 6e 64 20 22 73 65 74 20 63 6c 69 65 6e 74  mand "set client
af10: 43 65 72 74 20 24 63 6c 69 65 6e 74 43 65 72 74  Cert $clientCert
af20: 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e  ".    sendComman
af30: 64 20 22 73 65 74 20 73 65 72 76 65 72 4b 65 79  d "set serverKey
af40: 20 24 73 65 72 76 65 72 4b 65 79 22 0a 20 20 20   $serverKey".   
af50: 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73 65   sendCommand "se
af60: 74 20 63 6c 69 65 6e 74 4b 65 79 20 24 63 6c 69  t clientKey $cli
af70: 65 6e 74 4b 65 79 22 0a 20 20 20 20 73 65 6e 64  entKey".    send
af80: 43 6f 6d 6d 61 6e 64 20 7b 0a 09 73 65 74 20 73  Command {..set s
af90: 6f 63 6b 65 74 31 30 5f 31 34 5f 74 65 73 74 5f  ocket10_14_test_
afa0: 73 65 72 76 65 72 20 5b 74 6c 73 3a 3a 73 6f 63  server [tls::soc
afb0: 6b 65 74 20 5c 0a 09 09 2d 63 65 72 74 66 69 6c  ket \...-certfil
afc0: 65 20 24 73 65 72 76 65 72 43 65 72 74 20 5c 0a  e $serverCert \.
afd0: 09 09 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72  ..-cafile $caCer
afe0: 74 20 5c 0a 09 09 2d 6b 65 79 66 69 6c 65 20 24  t \...-keyfile $
aff0: 73 65 72 76 65 72 4b 65 79 20 5c 0a 09 09 2d 73  serverKey \...-s
b000: 65 72 76 65 72 20 61 63 63 65 70 74 20 32 38 33  erver accept 283
b010: 36 5d 0a 09 70 72 6f 63 20 61 63 63 65 70 74 20  6]..proc accept 
b020: 7b 73 20 61 20 70 7d 20 7b 0a 09 20 20 20 20 74  {s a p} {..    t
b030: 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 20 24 73  ls::handshake $s
b040: 0a 09 20 20 20 20 61 66 74 65 72 20 31 30 30 20  ..    after 100 
b050: 63 6c 6f 73 65 20 24 73 0a 09 7d 0a 20 20 20 20  close $s..}.    
b060: 7d 0a 20 20 20 20 73 65 74 20 63 20 5b 74 6c 73  }.    set c [tls
b070: 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 20 20 20 20  ::socket \..    
b080: 2d 63 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e  -certfile $clien
b090: 74 43 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63  tCert -cafile $c
b0a0: 61 43 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24  aCert -keyfile $
b0b0: 63 6c 69 65 6e 74 4b 65 79 20 5c 0a 20 20 20 20  clientKey \.    
b0c0: 09 24 72 65 6d 6f 74 65 53 65 72 76 65 72 49 50  .$remoteServerIP
b0d0: 20 32 38 33 36 5d 0a 20 20 20 20 66 69 6c 65 65   2836].    filee
b0e0: 76 65 6e 74 20 24 63 20 72 65 61 64 61 62 6c 65  vent $c readable
b0f0: 20 22 63 6f 75 6e 74 5f 75 70 20 24 63 22 0a 20   "count_up $c". 
b100: 20 20 20 73 65 74 20 61 66 74 65 72 5f 69 64 20     set after_id 
b110: 5b 61 66 74 65 72 20 31 30 30 30 20 74 69 6d 65  [after 1000 time
b120: 64 5f 6f 75 74 5d 0a 20 20 20 20 76 77 61 69 74  d_out].    vwait
b130: 20 64 6f 6e 65 0a 20 20 20 20 73 65 6e 64 43 6f   done.    sendCo
b140: 6d 6d 61 6e 64 20 7b 63 6c 6f 73 65 20 24 73 6f  mmand {close $so
b150: 63 6b 65 74 31 30 5f 31 34 5f 74 65 73 74 5f 73  cket10_14_test_s
b160: 65 72 76 65 72 7d 0a 20 20 20 20 73 65 74 20 64  erver}.    set d
b170: 6f 6e 65 0a 7d 20 7b 45 4f 46 20 69 73 20 73 74  one.} {EOF is st
b180: 69 63 6b 79 7d 0a 0a 74 65 73 74 20 74 6c 73 49  icky}..test tlsI
b190: 4f 2d 31 31 2e 31 33 20 7b 74 65 73 74 69 6e 67  O-11.13 {testing
b1a0: 20 61 73 79 6e 63 20 77 72 69 74 65 2c 20 61 73   async write, as
b1b0: 79 6e 63 20 66 6c 75 73 68 2c 20 61 73 79 6e 63  ync flush, async
b1c0: 20 63 6c 6f 73 65 7d 20 5c 0a 09 7b 73 6f 63 6b   close} \..{sock
b1d0: 65 74 20 64 6f 54 65 73 74 73 57 69 74 68 52 65  et doTestsWithRe
b1e0: 6d 6f 74 65 53 65 72 76 65 72 7d 20 7b 0a 20 20  moteServer} {.  
b1f0: 20 20 70 72 6f 63 20 72 65 61 64 69 74 20 7b 73    proc readit {s
b200: 7d 20 7b 0a 09 67 6c 6f 62 61 6c 20 63 6f 75 6e  } {..global coun
b210: 74 20 64 6f 6e 65 0a 09 73 65 74 20 6c 20 5b 72  t done..set l [r
b220: 65 61 64 20 24 73 5d 0a 09 69 6e 63 72 20 63 6f  ead $s]..incr co
b230: 75 6e 74 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  unt [string leng
b240: 74 68 20 24 6c 5d 0a 09 69 66 20 7b 5b 65 6f 66  th $l]..if {[eof
b250: 20 24 73 5d 7d 20 7b 0a 09 20 20 20 20 63 6c 6f   $s]} {..    clo
b260: 73 65 20 24 73 0a 09 20 20 20 20 73 65 74 20 64  se $s..    set d
b270: 6f 6e 65 20 31 0a 09 7d 0a 20 20 20 20 7d 0a 20  one 1..}.    }. 
b280: 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22     sendCommand "
b290: 73 65 74 20 63 61 43 65 72 74 20 24 63 61 43 65  set caCert $caCe
b2a0: 72 74 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  rt".    sendComm
b2b0: 61 6e 64 20 22 73 65 74 20 73 65 72 76 65 72 43  and "set serverC
b2c0: 65 72 74 20 24 73 65 72 76 65 72 43 65 72 74 22  ert $serverCert"
b2d0: 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64  .    sendCommand
b2e0: 20 22 73 65 74 20 63 6c 69 65 6e 74 43 65 72 74   "set clientCert
b2f0: 20 24 63 6c 69 65 6e 74 43 65 72 74 22 0a 20 20   $clientCert".  
b300: 20 20 73 65 6e 64 43 6f 6d 6d 61 6e 64 20 22 73    sendCommand "s
b310: 65 74 20 73 65 72 76 65 72 4b 65 79 20 24 73 65  et serverKey $se
b320: 72 76 65 72 4b 65 79 22 0a 20 20 20 20 73 65 6e  rverKey".    sen
b330: 64 43 6f 6d 6d 61 6e 64 20 22 73 65 74 20 63 6c  dCommand "set cl
b340: 69 65 6e 74 4b 65 79 20 24 63 6c 69 65 6e 74 4b  ientKey $clientK
b350: 65 79 22 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  ey".    sendComm
b360: 61 6e 64 20 7b 0a 09 73 65 74 20 66 69 72 73 74  and {..set first
b370: 62 6c 6f 63 6b 20 22 22 0a 09 66 6f 72 20 7b 73  block ""..for {s
b380: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 35 7d  et i 0} {$i < 5}
b390: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 09 09 73 65   {incr i} {...se
b3a0: 74 20 66 69 72 73 74 62 6c 6f 63 6b 20 22 61 24  t firstblock "a$
b3b0: 66 69 72 73 74 62 6c 6f 63 6b 24 66 69 72 73 74  firstblock$first
b3c0: 62 6c 6f 63 6b 22 0a 09 7d 0a 09 73 65 74 20 73  block"..}..set s
b3d0: 65 63 6f 6e 64 62 6c 6f 63 6b 20 22 22 0a 09 66  econdblock ""..f
b3e0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
b3f0: 20 3c 20 31 36 7d 20 7b 69 6e 63 72 20 69 7d 20   < 16} {incr i} 
b400: 7b 0a 09 20 20 20 20 73 65 74 20 73 65 63 6f 6e  {..    set secon
b410: 64 62 6c 6f 63 6b 20 22 62 24 73 65 63 6f 6e 64  dblock "b$second
b420: 62 6c 6f 63 6b 24 73 65 63 6f 6e 64 62 6c 6f 63  block$secondbloc
b430: 6b 22 0a 09 7d 0a 09 73 65 74 20 6c 20 5b 74 6c  k"..}..set l [tl
b440: 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 09 2d 63  s::socket \...-c
b450: 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43  ertfile $serverC
b460: 65 72 74 20 5c 0a 09 09 2d 63 61 66 69 6c 65 20  ert \...-cafile 
b470: 24 63 61 43 65 72 74 20 5c 0a 09 09 2d 6b 65 79  $caCert \...-key
b480: 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20  file $serverKey 
b490: 5c 0a 09 09 2d 73 65 72 76 65 72 20 61 63 63 65  \...-server acce
b4a0: 70 74 20 32 38 34 35 5d 0a 09 70 72 6f 63 20 61  pt 2845]..proc a
b4b0: 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b 0a  ccept {s a p} {.
b4c0: 09 20 20 20 20 74 6c 73 3a 3a 68 61 6e 64 73 68  .    tls::handsh
b4d0: 61 6b 65 20 24 73 0a 09 20 20 20 20 66 63 6f 6e  ake $s..    fcon
b4e0: 66 69 67 75 72 65 20 24 73 20 2d 62 6c 6f 63 6b  figure $s -block
b4f0: 69 6e 67 20 30 20 2d 74 72 61 6e 73 6c 61 74 69  ing 0 -translati
b500: 6f 6e 20 6c 66 20 2d 62 75 66 66 65 72 73 69 7a  on lf -buffersiz
b510: 65 20 31 36 33 38 34 20 5c 0a 09 09 2d 62 75 66  e 16384 \...-buf
b520: 66 65 72 69 6e 67 20 6c 69 6e 65 0a 09 20 20 20  fering line..   
b530: 20 66 69 6c 65 65 76 65 6e 74 20 24 73 20 72 65   fileevent $s re
b540: 61 64 61 62 6c 65 20 22 72 65 61 64 61 62 6c 65  adable "readable
b550: 20 24 73 22 0a 09 7d 0a 09 70 72 6f 63 20 72 65   $s"..}..proc re
b560: 61 64 61 62 6c 65 20 7b 73 7d 20 7b 0a 09 20 20  adable {s} {..  
b570: 20 20 73 65 74 20 6c 20 5b 67 65 74 73 20 24 73    set l [gets $s
b580: 5d 0a 09 20 20 20 20 66 69 6c 65 65 76 65 6e 74  ]..    fileevent
b590: 20 24 73 20 72 65 61 64 61 62 6c 65 20 7b 7d 0a   $s readable {}.
b5a0: 09 20 20 20 20 61 66 74 65 72 20 31 30 30 30 20  .    after 1000 
b5b0: 72 65 73 70 6f 6e 64 20 24 73 0a 09 7d 0a 09 70  respond $s..}..p
b5c0: 72 6f 63 20 72 65 73 70 6f 6e 64 20 7b 73 7d 20  roc respond {s} 
b5d0: 7b 0a 09 20 20 20 20 67 6c 6f 62 61 6c 20 66 69  {..    global fi
b5e0: 72 73 74 62 6c 6f 63 6b 0a 09 20 20 20 20 70 75  rstblock..    pu
b5f0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 73  ts -nonewline $s
b600: 20 24 66 69 72 73 74 62 6c 6f 63 6b 0a 09 20 20   $firstblock..  
b610: 20 20 61 66 74 65 72 20 31 30 30 30 20 77 72 69    after 1000 wri
b620: 74 65 64 61 74 61 20 24 73 0a 09 7d 0a 09 70 72  tedata $s..}..pr
b630: 6f 63 20 77 72 69 74 65 64 61 74 61 20 7b 73 7d  oc writedata {s}
b640: 20 7b 0a 09 20 20 20 20 67 6c 6f 62 61 6c 20 73   {..    global s
b650: 65 63 6f 6e 64 62 6c 6f 63 6b 0a 09 20 20 20 20  econdblock..    
b660: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
b670: 24 73 20 24 73 65 63 6f 6e 64 62 6c 6f 63 6b 0a  $s $secondblock.
b680: 09 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 09 7d  .    close $s..}
b690: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 73  .    }.    set s
b6a0: 20 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a   [tls::socket \.
b6b0: 09 20 20 20 20 2d 63 65 72 74 66 69 6c 65 20 24  .    -certfile $
b6c0: 63 6c 69 65 6e 74 43 65 72 74 20 2d 63 61 66 69  clientCert -cafi
b6d0: 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79 66  le $caCert -keyf
b6e0: 69 6c 65 20 24 63 6c 69 65 6e 74 4b 65 79 20 5c  ile $clientKey \
b6f0: 0a 20 20 20 20 09 24 72 65 6d 6f 74 65 53 65 72  .    .$remoteSer
b700: 76 65 72 49 50 20 32 38 34 35 5d 0a 20 20 20 20  verIP 2845].    
b710: 66 63 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62  fconfigure $s -b
b720: 6c 6f 63 6b 69 6e 67 20 30 20 2d 74 72 61 6e 73  locking 0 -trans
b730: 20 6c 66 20 2d 62 75 66 66 65 72 69 6e 67 20 6c   lf -buffering l
b740: 69 6e 65 0a 20 20 20 20 73 65 74 20 63 6f 75 6e  ine.    set coun
b750: 74 20 30 0a 20 20 20 20 70 75 74 73 20 24 73 20  t 0.    puts $s 
b760: 68 65 6c 6c 6f 0a 20 20 20 20 66 69 6c 65 65 76  hello.    fileev
b770: 65 6e 74 20 24 73 20 72 65 61 64 61 62 6c 65 20  ent $s readable 
b780: 22 72 65 61 64 69 74 20 24 73 22 0a 20 20 20 20  "readit $s".    
b790: 73 65 74 20 74 69 6d 65 72 20 5b 61 66 74 65 72  set timer [after
b7a0: 20 31 30 30 30 30 20 22 73 65 74 20 64 6f 6e 65   10000 "set done
b7b0: 20 74 69 6d 65 64 5f 6f 75 74 22 5d 0a 20 20 20   timed_out"].   
b7c0: 20 76 77 61 69 74 20 64 6f 6e 65 0a 20 20 20 20   vwait done.    
b7d0: 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 74 69  after cancel $ti
b7e0: 6d 65 72 0a 20 20 20 20 73 65 6e 64 43 6f 6d 6d  mer.    sendComm
b7f0: 61 6e 64 20 7b 63 6c 6f 73 65 20 24 6c 7d 0a 20  and {close $l}. 
b800: 20 20 20 73 65 74 20 63 6f 75 6e 74 0a 7d 20 36     set count.} 6
b810: 35 35 36 36 0a 0a 74 65 73 74 20 74 6c 73 49 4f  5566..test tlsIO
b820: 2d 31 32 2e 31 20 7b 74 65 73 74 69 6e 67 20 69  -12.1 {testing i
b830: 6e 68 65 72 69 74 61 6e 63 65 20 6f 66 20 73 65  nheritance of se
b840: 72 76 65 72 20 73 6f 63 6b 65 74 73 7d 20 5c 0a  rver sockets} \.
b850: 09 7b 73 6f 63 6b 65 74 20 64 6f 54 65 73 74 73  .{socket doTests
b860: 57 69 74 68 52 65 6d 6f 74 65 53 65 72 76 65 72  WithRemoteServer
b870: 7d 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46 69  } {.    removeFi
b880: 6c 65 20 73 63 72 69 70 74 31 0a 20 20 20 20 72  le script1.    r
b890: 65 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74  emoveFile script
b8a0: 32 0a 0a 20 20 20 20 23 20 53 63 72 69 70 74 31  2..    # Script1
b8b0: 20 69 73 20 6a 75 73 74 20 61 20 31 30 20 73 65   is just a 10 se
b8c0: 63 6f 6e 64 20 64 65 6c 61 79 2e 20 20 49 66 20  cond delay.  If 
b8d0: 74 68 65 20 73 65 72 76 65 72 20 73 6f 63 6b 65  the server socke
b8e0: 74 0a 20 20 20 20 23 20 69 73 20 69 6e 68 65 72  t.    # is inher
b8f0: 69 74 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  ited, it will be
b900: 20 68 65 6c 64 20 6f 70 65 6e 20 66 6f 72 20 31   held open for 1
b910: 30 20 73 65 63 6f 6e 64 73 0a 0a 20 20 20 20 73  0 seconds..    s
b920: 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70  et f [open scrip
b930: 74 31 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24  t1 w].    puts $
b940: 66 20 7b 0a 09 61 66 74 65 72 20 31 30 30 30 30  f {..after 10000
b950: 20 65 78 69 74 0a 09 76 77 61 69 74 20 66 6f 72   exit..vwait for
b960: 65 76 65 72 0a 20 20 20 20 7d 0a 20 20 20 20 63  ever.    }.    c
b970: 6c 6f 73 65 20 24 66 0a 0a 20 20 20 20 23 20 53  lose $f..    # S
b980: 63 72 69 70 74 32 20 63 72 65 61 74 65 73 20 74  cript2 creates t
b990: 68 65 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74  he server socket
b9a0: 2c 20 6c 61 75 6e 63 68 65 73 20 73 63 72 69 70  , launches scrip
b9b0: 74 31 2c 0a 20 20 20 20 23 20 77 61 69 74 73 20  t1,.    # waits 
b9c0: 61 20 73 65 63 6f 6e 64 2c 20 61 6e 64 20 65 78  a second, and ex
b9d0: 69 74 73 2e 20 20 54 68 65 20 73 65 72 76 65 72  its.  The server
b9e0: 20 73 6f 63 6b 65 74 20 77 69 6c 6c 20 6e 6f 77   socket will now
b9f0: 0a 20 20 20 20 23 20 62 65 20 63 6c 6f 73 65 64  .    # be closed
ba00: 20 75 6e 6c 65 73 73 20 73 63 72 69 70 74 31 20   unless script1 
ba10: 69 6e 68 65 72 69 74 65 64 20 69 74 2e 0a 0a 20  inherited it... 
ba20: 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 73     set f [open s
ba30: 63 72 69 70 74 32 20 77 5d 0a 20 20 20 20 23 20  cript2 w].    # 
ba40: 70 75 74 73 20 24 66 20 5b 6c 69 73 74 20 73 65  puts $f [list se
ba50: 74 20 74 63 6c 74 65 73 74 20 24 3a 3a 74 63 6c  t tcltest $::tcl
ba60: 74 65 73 74 3a 3a 74 63 6c 74 65 73 74 5d 0a 20  test::tcltest]. 
ba70: 20 20 20 70 75 74 73 20 24 66 20 5b 6c 69 73 74     puts $f [list
ba80: 20 73 65 74 20 74 63 6c 73 68 20 5b 69 6e 66 6f   set tclsh [info
ba90: 20 6e 61 6d 65 6f 66 65 78 65 63 75 74 61 62 6c   nameofexecutabl
baa0: 65 5d 5d 0a 20 20 20 20 70 75 74 73 20 24 66 20  e]].    puts $f 
bab0: 7b 0a 09 70 61 63 6b 61 67 65 20 72 65 71 75 69  {..package requi
bac0: 72 65 20 74 63 6c 74 65 73 74 0a 09 70 61 63 6b  re tcltest..pack
bad0: 61 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a  age require tls.
bae0: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20 24      }.    puts $
baf0: 66 20 22 73 65 74 20 66 20 5c 5b 74 6c 73 3a 3a  f "set f \[tls::
bb00: 73 6f 63 6b 65 74 20 2d 73 65 72 76 65 72 20 61  socket -server a
bb10: 63 63 65 70 74 20 2d 63 65 72 74 66 69 6c 65 20  ccept -certfile 
bb20: 24 73 65 72 76 65 72 43 65 72 74 20 2d 63 61 66  $serverCert -caf
bb30: 69 6c 65 20 24 63 61 43 65 72 74 20 2d 6b 65 79  ile $caCert -key
bb40: 66 69 6c 65 20 24 73 65 72 76 65 72 4b 65 79 20  file $serverKey 
bb50: 32 38 32 38 20 5c 5d 22 0a 20 20 20 20 70 75 74  2828 \]".    put
bb60: 73 20 24 66 20 7b 0a 09 70 72 6f 63 20 61 63 63  s $f {..proc acc
bb70: 65 70 74 20 7b 20 66 69 6c 65 20 61 64 64 72 20  ept { file addr 
bb80: 70 6f 72 74 20 7d 20 7b 0a 09 20 20 20 20 63 6c  port } {..    cl
bb90: 6f 73 65 20 24 66 69 6c 65 0a 09 7d 0a 09 23 20  ose $file..}..# 
bba0: 65 78 65 63 20 24 3a 3a 74 63 6c 74 65 73 74 3a  exec $::tcltest:
bbb0: 3a 74 63 6c 74 65 73 74 20 73 63 72 69 70 74 31  :tcltest script1
bbc0: 20 26 0a 09 65 78 65 63 20 24 74 63 6c 73 68 20   &..exec $tclsh 
bbd0: 73 63 72 69 70 74 31 20 26 0a 09 63 6c 6f 73 65  script1 &..close
bbe0: 20 24 66 0a 09 61 66 74 65 72 20 31 30 30 30 20   $f..after 1000 
bbf0: 65 78 69 74 0a 09 76 77 61 69 74 20 66 6f 72 65  exit..vwait fore
bc00: 76 65 72 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c  ver.    }.    cl
bc10: 6f 73 65 20 24 66 0a 09 0a 20 20 20 20 23 20 4c  ose $f...    # L
bc20: 61 75 6e 63 68 20 73 63 72 69 70 74 32 20 61 6e  aunch script2 an
bc30: 64 20 77 61 69 74 20 35 20 73 65 63 6f 6e 64 73  d wait 5 seconds
bc40: 0a 0a 20 20 20 20 23 20 65 78 65 63 20 24 3a 3a  ..    # exec $::
bc50: 74 63 6c 74 65 73 74 3a 3a 74 63 6c 74 65 73 74  tcltest::tcltest
bc60: 20 73 63 72 69 70 74 32 20 26 0a 20 20 20 20 65   script2 &.    e
bc70: 78 65 63 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66  xec [info nameof
bc80: 65 78 65 63 75 74 61 62 6c 65 5d 20 73 63 72 69  executable] scri
bc90: 70 74 32 20 26 0a 20 20 20 20 61 66 74 65 72 20  pt2 &.    after 
bca0: 35 30 30 30 20 7b 20 73 65 74 20 6f 6b 5f 74 6f  5000 { set ok_to
bcb0: 5f 70 72 6f 63 65 65 64 20 31 20 7d 0a 20 20 20  _proceed 1 }.   
bcc0: 20 76 77 61 69 74 20 6f 6b 5f 74 6f 5f 70 72 6f   vwait ok_to_pro
bcd0: 63 65 65 64 0a 0a 20 20 20 20 23 20 49 66 20 77  ceed..    # If w
bce0: 65 20 63 61 6e 20 73 74 69 6c 6c 20 63 6f 6e 6e  e can still conn
bcf0: 65 63 74 20 74 6f 20 74 68 65 20 73 65 72 76 65  ect to the serve
bd00: 72 2c 20 74 68 65 20 73 6f 63 6b 65 74 20 67 6f  r, the socket go
bd10: 74 20 69 6e 68 65 72 69 74 65 64 2e 0a 0a 20 20  t inherited...  
bd20: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 74 6c    if {[catch {tl
bd30: 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63 65  s::socket \..-ce
bd40: 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65  rtfile $clientCe
bd50: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
bd60: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69  rt -keyfile $cli
bd70: 65 6e 74 4b 65 79 20 5c 0a 20 20 20 09 20 31 32  entKey \.   . 12
bd80: 37 2e 30 2e 30 2e 31 20 32 38 32 38 7d 20 6d 73  7.0.0.1 2828} ms
bd90: 67 5d 7d 20 7b 0a 09 73 65 74 20 78 20 7b 73 65  g]} {..set x {se
bda0: 72 76 65 72 20 73 6f 63 6b 65 74 20 77 61 73 20  rver socket was 
bdb0: 6e 6f 74 20 69 6e 68 65 72 69 74 65 64 7d 0a 20  not inherited}. 
bdc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 6c 6f     } else {..clo
bdd0: 73 65 20 24 6d 73 67 0a 09 73 65 74 20 78 20 7b  se $msg..set x {
bde0: 73 65 72 76 65 72 20 73 6f 63 6b 65 74 20 77 61  server socket wa
bdf0: 73 20 69 6e 68 65 72 69 74 65 64 7d 0a 20 20 20  s inherited}.   
be00: 20 7d 0a 0a 20 20 20 20 72 65 6d 6f 76 65 46 69   }..    removeFi
be10: 6c 65 20 73 63 72 69 70 74 31 0a 20 20 20 20 72  le script1.    r
be20: 65 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74  emoveFile script
be30: 32 0a 20 20 20 20 73 65 74 20 78 0a 7d 20 7b 73  2.    set x.} {s
be40: 65 72 76 65 72 20 73 6f 63 6b 65 74 20 77 61 73  erver socket was
be50: 20 6e 6f 74 20 69 6e 68 65 72 69 74 65 64 7d 0a   not inherited}.
be60: 0a 74 65 73 74 20 74 6c 73 49 4f 2d 31 32 2e 32  .test tlsIO-12.2
be70: 20 7b 74 65 73 74 69 6e 67 20 69 6e 68 65 72 69   {testing inheri
be80: 74 61 6e 63 65 20 6f 66 20 63 6c 69 65 6e 74 20  tance of client 
be90: 73 6f 63 6b 65 74 73 7d 20 5c 0a 09 7b 73 6f 63  sockets} \..{soc
bea0: 6b 65 74 20 64 6f 54 65 73 74 73 57 69 74 68 52  ket doTestsWithR
beb0: 65 6d 6f 74 65 53 65 72 76 65 72 7d 20 7b 0a 20  emoteServer} {. 
bec0: 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20 73 63     removeFile sc
bed0: 72 69 70 74 31 0a 20 20 20 20 72 65 6d 6f 76 65  ript1.    remove
bee0: 46 69 6c 65 20 73 63 72 69 70 74 32 0a 0a 20 20  File script2..  
bef0: 20 20 23 20 53 63 72 69 70 74 31 20 69 73 20 6a    # Script1 is j
bf00: 75 73 74 20 61 20 31 30 20 73 65 63 6f 6e 64 20  ust a 10 second 
bf10: 64 65 6c 61 79 2e 20 20 49 66 20 74 68 65 20 73  delay.  If the s
bf20: 65 72 76 65 72 20 73 6f 63 6b 65 74 0a 20 20 20  erver socket.   
bf30: 20 23 20 69 73 20 69 6e 68 65 72 69 74 65 64 2c   # is inherited,
bf40: 20 69 74 20 77 69 6c 6c 20 62 65 20 68 65 6c 64   it will be held
bf50: 20 6f 70 65 6e 20 66 6f 72 20 31 30 20 73 65 63   open for 10 sec
bf60: 6f 6e 64 73 0a 0a 20 20 20 20 73 65 74 20 66 20  onds..    set f 
bf70: 5b 6f 70 65 6e 20 73 63 72 69 70 74 31 20 77 5d  [open script1 w]
bf80: 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09  .    puts $f {..
bf90: 61 66 74 65 72 20 31 30 30 30 30 20 65 78 69 74  after 10000 exit
bfa0: 0a 09 76 77 61 69 74 20 66 6f 72 65 76 65 72 0a  ..vwait forever.
bfb0: 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 20      }.    close 
bfc0: 24 66 0a 0a 20 20 20 20 23 20 53 63 72 69 70 74  $f..    # Script
bfd0: 32 20 6f 70 65 6e 73 20 74 68 65 20 63 6c 69 65  2 opens the clie
bfe0: 6e 74 20 73 6f 63 6b 65 74 20 61 6e 64 20 77 72  nt socket and wr
bff0: 69 74 65 73 20 74 6f 20 69 74 2e 20 20 49 74 20  ites to it.  It 
c000: 74 68 65 6e 0a 20 20 20 20 23 20 6c 61 75 6e 63  then.    # launc
c010: 68 65 73 20 73 63 72 69 70 74 31 20 61 6e 64 20  hes script1 and 
c020: 65 78 69 74 73 2e 20 20 49 66 20 74 68 65 20 63  exits.  If the c
c030: 68 69 6c 64 20 70 72 6f 63 65 73 73 20 69 6e 68  hild process inh
c040: 65 72 69 74 65 64 20 74 68 65 0a 20 20 20 20 23  erited the.    #
c050: 20 63 6c 69 65 6e 74 20 73 6f 63 6b 65 74 2c 20   client socket, 
c060: 74 68 65 20 73 6f 63 6b 65 74 20 77 69 6c 6c 20  the socket will 
c070: 73 74 69 6c 6c 20 62 65 20 6f 70 65 6e 2e 0a 0a  still be open...
c080: 20 20 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20      set f [open 
c090: 73 63 72 69 70 74 32 20 77 5d 0a 20 20 20 20 70  script2 w].    p
c0a0: 75 74 73 20 24 66 20 5b 6c 69 73 74 20 73 65 74  uts $f [list set
c0b0: 20 74 63 6c 73 68 20 5b 69 6e 66 6f 20 6e 61 6d   tclsh [info nam
c0c0: 65 6f 66 65 78 65 63 75 74 61 62 6c 65 5d 5d 0a  eofexecutable]].
c0d0: 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 20 20      puts $f {.  
c0e0: 20 20 09 70 61 63 6b 61 67 65 20 72 65 71 75 69    .package requi
c0f0: 72 65 20 74 6c 73 0a 20 20 20 20 7d 0a 20 20 20  re tls.    }.   
c100: 20 70 75 74 73 20 24 66 20 22 73 65 74 20 66 20   puts $f "set f 
c110: 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 63  \[tls::socket -c
c120: 65 72 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43  ertfile $clientC
c130: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
c140: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c  ert -keyfile $cl
c150: 69 65 6e 74 4b 65 79 20 31 32 37 2e 30 2e 30 2e  ientKey 127.0.0.
c160: 31 20 32 38 32 39 20 5c 5d 22 0a 20 20 20 20 70  1 2829 \]".    p
c170: 75 74 73 20 24 66 20 7b 0a 09 65 78 65 63 20 24  uts $f {..exec $
c180: 74 63 6c 73 68 20 73 63 72 69 70 74 31 20 26 0a  tclsh script1 &.
c190: 09 70 75 74 73 20 24 66 20 74 65 73 74 69 6e 67  .puts $f testing
c1a0: 0a 09 66 6c 75 73 68 20 24 66 0a 09 61 66 74 65  ..flush $f..afte
c1b0: 72 20 31 30 30 30 20 65 78 69 74 0a 09 76 77 61  r 1000 exit..vwa
c1c0: 69 74 20 66 6f 72 65 76 65 72 0a 20 20 20 20 7d  it forever.    }
c1d0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 0a 20  .    close $f.. 
c1e0: 20 20 20 23 20 43 72 65 61 74 65 20 74 68 65 20     # Create the 
c1f0: 73 65 72 76 65 72 20 73 6f 63 6b 65 74 0a 0a 20  server socket.. 
c200: 20 20 20 73 65 74 20 73 65 72 76 65 72 20 5b 74     set server [t
c210: 6c 73 3a 3a 73 6f 63 6b 65 74 20 5c 0a 09 2d 63  ls::socket \..-c
c220: 65 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43  ertfile $serverC
c230: 65 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43  ert -cafile $caC
c240: 65 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65  ert -keyfile $se
c250: 72 76 65 72 4b 65 79 20 5c 0a 09 2d 73 65 72 76  rverKey \..-serv
c260: 65 72 20 61 63 63 65 70 74 20 32 38 32 39 5d 0a  er accept 2829].
c270: 20 20 20 20 70 72 6f 63 20 61 63 63 65 70 74 20      proc accept 
c280: 7b 20 66 69 6c 65 20 68 6f 73 74 20 70 6f 72 74  { file host port
c290: 20 7d 20 7b 0a 0a 09 23 20 57 68 65 6e 20 74 68   } {...# When th
c2a0: 65 20 63 6c 69 65 6e 74 20 63 6f 6e 6e 65 63 74  e client connect
c2b0: 73 2c 20 65 73 74 61 62 6c 69 73 68 20 74 68 65  s, establish the
c2c0: 20 72 65 61 64 20 68 61 6e 64 6c 65 72 0a 09 67   read handler..g
c2d0: 6c 6f 62 61 6c 20 73 65 72 76 65 72 0a 09 63 6c  lobal server..cl
c2e0: 6f 73 65 20 24 73 65 72 76 65 72 0a 09 66 69 6c  ose $server..fil
c2f0: 65 65 76 65 6e 74 20 24 66 69 6c 65 20 72 65 61  eevent $file rea
c300: 64 61 62 6c 65 20 5b 6c 69 73 74 20 67 65 74 64  dable [list getd
c310: 61 74 61 20 24 66 69 6c 65 5d 0a 09 66 63 6f 6e  ata $file]..fcon
c320: 66 69 67 75 72 65 20 24 66 69 6c 65 20 2d 62 75  figure $file -bu
c330: 66 66 65 72 69 6e 67 20 6c 69 6e 65 20 2d 62 6c  ffering line -bl
c340: 6f 63 6b 69 6e 67 20 30 0a 09 72 65 74 75 72 6e  ocking 0..return
c350: 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 63 20  .    }.    proc 
c360: 67 65 74 64 61 74 61 20 7b 20 66 69 6c 65 20 7d  getdata { file }
c370: 20 7b 0a 0a 09 23 20 52 65 61 64 20 68 61 6e 64   {...# Read hand
c380: 6c 65 72 20 6f 6e 20 74 68 65 20 61 63 63 65 70  ler on the accep
c390: 74 65 64 20 73 6f 63 6b 65 74 2e 0a 09 67 6c 6f  ted socket...glo
c3a0: 62 61 6c 20 78 0a 09 67 6c 6f 62 61 6c 20 66 61  bal x..global fa
c3b0: 69 6c 65 64 0a 09 73 65 74 20 73 74 61 74 75 73  iled..set status
c3c0: 20 5b 63 61 74 63 68 20 7b 72 65 61 64 20 24 66   [catch {read $f
c3d0: 69 6c 65 7d 20 64 61 74 61 5d 0a 09 69 66 20 7b  ile} data]..if {
c3e0: 24 73 74 61 74 75 73 20 21 3d 20 30 7d 20 7b 0a  $status != 0} {.
c3f0: 09 20 20 20 20 73 65 74 20 78 20 7b 72 65 61 64  .    set x {read
c400: 20 66 61 69 6c 65 64 2c 20 65 72 72 6f 72 20 77   failed, error w
c410: 61 73 20 24 64 61 74 61 7d 0a 09 20 20 20 20 63  as $data}..    c
c420: 61 74 63 68 20 7b 20 63 6c 6f 73 65 20 24 66 69  atch { close $fi
c430: 6c 65 20 7d 0a 09 7d 20 65 6c 73 65 69 66 20 7b  le }..} elseif {
c440: 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 20  [string compare 
c450: 7b 7d 20 24 64 61 74 61 5d 7d 20 7b 0a 09 7d 20  {} $data]} {..} 
c460: 65 6c 73 65 69 66 20 7b 5b 66 62 6c 6f 63 6b 65  elseif {[fblocke
c470: 64 20 24 66 69 6c 65 5d 7d 20 7b 0a 09 7d 20 65  d $file]} {..} e
c480: 6c 73 65 69 66 20 7b 5b 65 6f 66 20 24 66 69 6c  lseif {[eof $fil
c490: 65 5d 7d 20 7b 0a 09 20 20 20 20 69 66 20 7b 24  e]} {..    if {$
c4a0: 66 61 69 6c 65 64 7d 20 7b 0a 09 09 73 65 74 20  failed} {...set 
c4b0: 78 20 7b 63 6c 69 65 6e 74 20 73 6f 63 6b 65 74  x {client socket
c4c0: 20 77 61 73 20 69 6e 68 65 72 69 74 65 64 7d 0a   was inherited}.
c4d0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
c4e0: 73 65 74 20 78 20 7b 63 6c 69 65 6e 74 20 73 6f  set x {client so
c4f0: 63 6b 65 74 20 77 61 73 20 6e 6f 74 20 69 6e 68  cket was not inh
c500: 65 72 69 74 65 64 7d 0a 09 20 20 20 20 7d 0a 09  erited}..    }..
c510: 20 20 20 20 63 61 74 63 68 20 7b 20 63 6c 6f 73      catch { clos
c520: 65 20 24 66 69 6c 65 20 7d 0a 09 7d 20 65 6c 73  e $file }..} els
c530: 65 20 7b 0a 09 20 20 20 20 73 65 74 20 78 20 7b  e {..    set x {
c540: 69 6d 70 6f 73 73 69 62 6c 65 20 63 61 73 65 7d  impossible case}
c550: 0a 09 20 20 20 20 63 61 74 63 68 20 7b 20 63 6c  ..    catch { cl
c560: 6f 73 65 20 24 66 69 6c 65 20 7d 0a 09 7d 0a 09  ose $file }..}..
c570: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
c580: 20 20 23 20 49 66 20 74 68 65 20 73 6f 63 6b 65    # If the socke
c590: 74 20 64 6f 65 73 6e 27 74 20 68 69 74 20 65 6e  t doesn't hit en
c5a0: 64 2d 6f 66 2d 66 69 6c 65 20 69 6e 20 35 20 73  d-of-file in 5 s
c5b0: 65 63 6f 6e 64 73 2c 20 74 68 65 0a 20 20 20 20  econds, the.    
c5c0: 23 20 73 63 72 69 70 74 31 20 70 72 6f 63 65 73  # script1 proces
c5d0: 73 20 6d 75 73 74 20 68 61 76 65 20 69 6e 68 65  s must have inhe
c5e0: 72 69 74 65 64 20 74 68 65 20 63 6c 69 65 6e 74  rited the client
c5f0: 2e 0a 0a 20 20 20 20 73 65 74 20 66 61 69 6c 65  ...    set faile
c600: 64 20 30 0a 20 20 20 20 61 66 74 65 72 20 35 30  d 0.    after 50
c610: 30 30 20 5b 6c 69 73 74 20 73 65 74 20 66 61 69  00 [list set fai
c620: 6c 65 64 20 31 5d 0a 0a 20 20 20 20 23 20 4c 61  led 1]..    # La
c630: 75 6e 63 68 20 74 68 65 20 73 63 72 69 70 74 32  unch the script2
c640: 20 70 72 6f 63 65 73 73 0a 0a 20 20 20 20 65 78   process..    ex
c650: 65 63 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65  ec [info nameofe
c660: 78 65 63 75 74 61 62 6c 65 5d 20 73 63 72 69 70  xecutable] scrip
c670: 74 32 20 26 0a 0a 20 20 20 20 76 77 61 69 74 20  t2 &..    vwait 
c680: 78 0a 20 20 20 20 69 66 20 7b 21 24 66 61 69 6c  x.    if {!$fail
c690: 65 64 7d 20 7b 0a 09 76 77 61 69 74 20 66 61 69  ed} {..vwait fai
c6a0: 6c 65 64 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  led.    }.    re
c6b0: 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70 74 31  moveFile script1
c6c0: 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65 20  .    removeFile 
c6d0: 73 63 72 69 70 74 32 0a 20 20 20 20 73 65 74 20  script2.    set 
c6e0: 78 0a 7d 20 7b 63 6c 69 65 6e 74 20 73 6f 63 6b  x.} {client sock
c6f0: 65 74 20 77 61 73 20 6e 6f 74 20 69 6e 68 65 72  et was not inher
c700: 69 74 65 64 7d 0a 0a 74 65 73 74 20 74 6c 73 49  ited}..test tlsI
c710: 4f 2d 31 32 2e 33 20 7b 74 65 73 74 69 6e 67 20  O-12.3 {testing 
c720: 69 6e 68 65 72 69 74 61 6e 63 65 20 6f 66 20 61  inheritance of a
c730: 63 63 65 70 74 65 64 20 73 6f 63 6b 65 74 73 7d  ccepted sockets}
c740: 20 5c 0a 09 7b 73 6f 63 6b 65 74 20 64 6f 54 65   \..{socket doTe
c750: 73 74 73 57 69 74 68 52 65 6d 6f 74 65 53 65 72  stsWithRemoteSer
c760: 76 65 72 7d 20 7b 0a 20 20 20 20 23 20 68 61 6e  ver} {.    # han
c770: 67 73 20 6f 6e 20 4c 69 6e 75 78 0a 20 20 20 20  gs on Linux.    
c780: 72 65 6d 6f 76 65 46 69 6c 65 20 73 63 72 69 70  removeFile scrip
c790: 74 31 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c  t1.    removeFil
c7a0: 65 20 73 63 72 69 70 74 32 0a 0a 20 20 20 20 73  e script2..    s
c7b0: 65 74 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70  et f [open scrip
c7c0: 74 31 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24  t1 w].    puts $
c7d0: 66 20 7b 0a 09 61 66 74 65 72 20 31 30 30 30 30  f {..after 10000
c7e0: 20 65 78 69 74 0a 09 76 77 61 69 74 20 66 6f 72   exit..vwait for
c7f0: 65 76 65 72 0a 20 20 20 20 7d 0a 20 20 20 20 63  ever.    }.    c
c800: 6c 6f 73 65 20 24 66 0a 0a 20 20 20 20 73 65 74  lose $f..    set
c810: 20 66 20 5b 6f 70 65 6e 20 73 63 72 69 70 74 32   f [open script2
c820: 20 77 5d 0a 20 20 20 20 70 75 74 73 20 24 66 20   w].    puts $f 
c830: 5b 6c 69 73 74 20 73 65 74 20 74 63 6c 73 68 20  [list set tclsh 
c840: 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63  [info nameofexec
c850: 75 74 61 62 6c 65 5d 5d 0a 20 20 20 20 70 75 74  utable]].    put
c860: 73 20 24 66 20 7b 0a 20 20 20 20 09 70 61 63 6b  s $f {.    .pack
c870: 61 67 65 20 72 65 71 75 69 72 65 20 74 6c 73 0a  age require tls.
c880: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20 24      }.    puts $
c890: 66 20 22 63 61 74 63 68 20 7b 73 65 74 20 66 20  f "catch {set f 
c8a0: 5c 5b 74 6c 73 3a 3a 73 6f 63 6b 65 74 20 2d 73  \[tls::socket -s
c8b0: 65 72 76 65 72 20 61 63 63 65 70 74 20 2d 63 65  erver accept -ce
c8c0: 72 74 66 69 6c 65 20 24 73 65 72 76 65 72 43 65  rtfile $serverCe
c8d0: 72 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65  rt -cafile $caCe
c8e0: 72 74 20 2d 6b 65 79 66 69 6c 65 20 24 73 65 72  rt -keyfile $ser
c8f0: 76 65 72 4b 65 79 20 32 39 33 30 20 5c 5d 7d 22  verKey 2930 \]}"
c900: 0a 20 20 20 20 70 75 74 73 20 24 66 20 7b 0a 09  .    puts $f {..
c910: 70 72 6f 63 20 61 63 63 65 70 74 20 7b 20 66 69  proc accept { fi
c920: 6c 65 20 68 6f 73 74 20 70 6f 72 74 20 7d 20 7b  le host port } {
c930: 0a 09 20 20 20 20 67 6c 6f 62 61 6c 20 74 63 6c  ..    global tcl
c940: 73 68 0a 09 20 20 20 20 70 75 74 73 20 24 66 69  sh..    puts $fi
c950: 6c 65 20 7b 74 65 73 74 20 64 61 74 61 20 6f 6e  le {test data on
c960: 20 73 6f 63 6b 65 74 7d 0a 09 20 20 20 20 65 78   socket}..    ex
c970: 65 63 20 24 74 63 6c 73 68 20 73 63 72 69 70 74  ec $tclsh script
c980: 31 20 26 0a 09 20 20 20 20 61 66 74 65 72 20 31  1 &..    after 1
c990: 30 30 30 20 65 78 69 74 0a 09 7d 0a 09 63 61 74  000 exit..}..cat
c9a0: 63 68 20 7b 76 77 61 69 74 20 66 6f 72 65 76 65  ch {vwait foreve
c9b0: 72 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f  r}.    }.    clo
c9c0: 73 65 20 24 66 0a 0a 20 20 20 20 23 20 4c 61 75  se $f..    # Lau
c9d0: 6e 63 68 20 74 68 65 20 73 63 72 69 70 74 32 20  nch the script2 
c9e0: 70 72 6f 63 65 73 73 20 61 6e 64 20 63 6f 6e 6e  process and conn
c9f0: 65 63 74 20 74 6f 20 69 74 2e 20 20 53 65 65 20  ect to it.  See 
ca00: 68 6f 77 20 6c 6f 6e 67 0a 20 20 20 20 23 20 74  how long.    # t
ca10: 68 65 20 73 6f 63 6b 65 74 20 73 74 61 79 73 20  he socket stays 
ca20: 6f 70 65 6e 0a 0a 20 20 20 20 65 78 65 63 20 5b  open..    exec [
ca30: 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63 75  info nameofexecu
ca40: 74 61 62 6c 65 5d 20 73 63 72 69 70 74 32 20 26  table] script2 &
ca50: 0a 0a 20 20 20 20 61 66 74 65 72 20 31 30 30 30  ..    after 1000
ca60: 20 73 65 74 20 6f 6b 5f 74 6f 5f 70 72 6f 63 65   set ok_to_proce
ca70: 65 64 20 31 0a 20 20 20 20 76 77 61 69 74 20 6f  ed 1.    vwait o
ca80: 6b 5f 74 6f 5f 70 72 6f 63 65 65 64 0a 0a 20 20  k_to_proceed..  
ca90: 20 20 73 65 74 20 66 20 5b 74 6c 73 3a 3a 73 6f    set f [tls::so
caa0: 63 6b 65 74 20 5c 0a 09 20 20 20 20 2d 63 65 72  cket \..    -cer
cab0: 74 66 69 6c 65 20 24 63 6c 69 65 6e 74 43 65 72  tfile $clientCer
cac0: 74 20 2d 63 61 66 69 6c 65 20 24 63 61 43 65 72  t -cafile $caCer
cad0: 74 20 2d 6b 65 79 66 69 6c 65 20 24 63 6c 69 65  t -keyfile $clie
cae0: 6e 74 4b 65 79 20 5c 0a 09 20 20 20 20 31 32 37  ntKey \..    127
caf0: 2e 30 2e 30 2e 31 20 32 39 33 30 5d 0a 20 20 20  .0.0.1 2930].   
cb00: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 20 2d   fconfigure $f -
cb10: 62 75 66 66 65 72 69 6e 67 20 66 75 6c 6c 20 2d  buffering full -
cb20: 62 6c 6f 63 6b 69 6e 67 20 30 0a 20 20 20 20 66  blocking 0.    f
cb30: 69 6c 65 65 76 65 6e 74 20 24 66 20 72 65 61 64  ileevent $f read
cb40: 61 62 6c 65 20 5b 6c 69 73 74 20 67 65 74 64 61  able [list getda
cb50: 74 61 20 24 66 5d 0a 0a 20 20 20 20 23 20 49 66  ta $f]..    # If
cb60: 20 74 68 65 20 73 6f 63 6b 65 74 20 69 73 20 73   the socket is s
cb70: 74 69 6c 6c 20 6f 70 65 6e 20 61 66 74 65 72 20  till open after 
cb80: 35 20 73 65 63 6f 6e 64 73 2c 20 74 68 65 20 73  5 seconds, the s
cb90: 63 72 69 70 74 31 20 70 72 6f 63 65 73 73 0a 20  cript1 process. 
cba0: 20 20 20 23 20 6d 75 73 74 20 68 61 76 65 20 69     # must have i
cbb0: 6e 68 65 72 69 74 65 64 20 74 68 65 20 61 63 63  nherited the acc
cbc0: 65 70 74 65 64 20 73 6f 63 6b 65 74 2e 0a 0a 20  epted socket... 
cbd0: 20 20 20 73 65 74 20 66 61 69 6c 65 64 20 30 0a     set failed 0.
cbe0: 20 20 20 20 61 66 74 65 72 20 35 30 30 30 20 73      after 5000 s
cbf0: 65 74 20 66 61 69 6c 65 64 20 31 0a 0a 20 20 20  et failed 1..   
cc00: 20 70 72 6f 63 20 67 65 74 64 61 74 61 20 7b 20   proc getdata { 
cc10: 66 69 6c 65 20 7d 20 7b 0a 0a 09 23 20 52 65 61  file } {...# Rea
cc20: 64 20 68 61 6e 64 6c 65 72 20 6f 6e 20 74 68 65  d handler on the
cc30: 20 63 6c 69 65 6e 74 20 73 6f 63 6b 65 74 2e 0a   client socket..
cc40: 09 67 6c 6f 62 61 6c 20 78 0a 09 67 6c 6f 62 61  .global x..globa
cc50: 6c 20 66 61 69 6c 65 64 0a 09 73 65 74 20 73 74  l failed..set st
cc60: 61 74 75 73 20 5b 63 61 74 63 68 20 7b 72 65 61  atus [catch {rea
cc70: 64 20 24 66 69 6c 65 7d 20 64 61 74 61 5d 0a 09  d $file} data]..
cc80: 69 66 20 7b 24 73 74 61 74 75 73 20 21 3d 20 30  if {$status != 0
cc90: 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 78 20 7b  } {..    set x {
cca0: 72 65 61 64 20 66 61 69 6c 65 64 2c 20 65 72 72  read failed, err
ccb0: 6f 72 20 77 61 73 20 24 64 61 74 61 7d 0a 09 20  or was $data}.. 
ccc0: 20 20 20 63 61 74 63 68 20 7b 20 63 6c 6f 73 65     catch { close
ccd0: 20 24 66 69 6c 65 20 7d 0a 09 7d 20 65 6c 73 65   $file }..} else
cce0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f 6d 70  if {[string comp
ccf0: 61 72 65 20 7b 7d 20 24 64 61 74 61 5d 7d 20 7b  are {} $data]} {
cd00: 0a 09 7d 20 65 6c 73 65 69 66 20 7b 5b 66 62 6c  ..} elseif {[fbl
cd10: 6f 63 6b 65 64 20 24 66 69 6c 65 5d 7d 20 7b 0a  ocked $file]} {.
cd20: 09 7d 20 65 6c 73 65 69 66 20 7b 5b 65 6f 66 20  .} elseif {[eof 
cd30: 24 66 69 6c 65 5d 7d 20 7b 0a 09 20 20 20 20 69  $file]} {..    i
cd40: 66 20 7b 24 66 61 69 6c 65 64 7d 20 7b 0a 09 09  f {$failed} {...
cd50: 73 65 74 20 78 20 7b 61 63 63 65 70 74 65 64 20  set x {accepted 
cd60: 73 6f 63 6b 65 74 20 77 61 73 20 69 6e 68 65 72  socket was inher
cd70: 69 74 65 64 7d 0a 09 20 20 20 20 7d 20 65 6c 73  ited}..    } els
cd80: 65 20 7b 0a 09 09 73 65 74 20 78 20 7b 61 63 63  e {...set x {acc
cd90: 65 70 74 65 64 20 73 6f 63 6b 65 74 20 77 61 73  epted socket was
cda0: 20 6e 6f 74 20 69 6e 68 65 72 69 74 65 64 7d 0a   not inherited}.
cdb0: 09 20 20 20 20 7d 0a 09 20 20 20 20 63 61 74 63  .    }..    catc
cdc0: 68 20 7b 20 63 6c 6f 73 65 20 24 66 69 6c 65 20  h { close $file 
cdd0: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  }..} else {..   
cde0: 20 73 65 74 20 78 20 7b 69 6d 70 6f 73 73 69 62   set x {impossib
cdf0: 6c 65 20 63 61 73 65 7d 0a 09 20 20 20 20 63 61  le case}..    ca
ce00: 74 63 68 20 7b 20 63 6c 6f 73 65 20 24 66 69 6c  tch { close $fil
ce10: 65 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  e }..}..return. 
ce20: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 76 77     }.    .    vw
ce30: 61 69 74 20 78 0a 0a 20 20 20 20 72 65 6d 6f 76  ait x..    remov
ce40: 65 46 69 6c 65 20 73 63 72 69 70 74 31 0a 20 20  eFile script1.  
ce50: 20 20 72 65 6d 6f 76 65 46 69 6c 65 20 73 63 72    removeFile scr
ce60: 69 70 74 32 0a 20 20 20 20 73 65 74 20 78 0a 7d  ipt2.    set x.}
ce70: 20 7b 61 63 63 65 70 74 65 64 20 73 6f 63 6b 65   {accepted socke
ce80: 74 20 77 61 73 20 6e 6f 74 20 69 6e 68 65 72 69  t was not inheri
ce90: 74 65 64 7d 0a 0a 74 65 73 74 20 74 6c 73 49 4f  ted}..test tlsIO
cea0: 2d 31 33 2e 31 20 7b 54 65 73 74 69 6e 67 20 75  -13.1 {Testing u
ceb0: 73 65 20 6f 66 20 73 68 61 72 65 64 20 73 6f 63  se of shared soc
cec0: 6b 65 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ket between two 
ced0: 74 68 72 65 61 64 73 7d 20 5c 0a 09 7b 73 6f 63  threads} \..{soc
cee0: 6b 65 74 20 74 65 73 74 74 68 72 65 61 64 7d 20  ket testthread} 
cef0: 7b 0a 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c  {..    removeFil
cf00: 65 20 73 63 72 69 70 74 0a 20 20 20 20 74 68 72  e script.    thr
cf10: 65 61 64 52 65 61 70 0a 0a 20 20 20 20 6d 61 6b  eadReap..    mak
cf20: 65 46 69 6c 65 20 7b 0a 20 20 20 20 09 70 61 63  eFile {.    .pac
cf30: 6b 61 67 65 20 72 65 71 75 69 72 65 20 74 6c 73  kage require tls
cf40: 0a 09 73 65 74 20 66 20 5b 74 6c 73 3a 3a 73 6f  ..set f [tls::so
cf50: 63 6b 65 74 20 2d 73 65 72 76 65 72 20 61 63 63  cket -server acc
cf60: 65 70 74 20 32 38 32 38 5d 0a 09 70 72 6f 63 20  ept 2828]..proc 
cf70: 61 63 63 65 70 74 20 7b 73 20 61 20 70 7d 20 7b  accept {s a p} {
cf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
cf90: 65 65 76 65 6e 74 20 24 73 20 72 65 61 64 61 62  eevent $s readab
cfa0: 6c 65 20 5b 6c 69 73 74 20 65 63 68 6f 20 24 73  le [list echo $s
cfb0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 63  ].            fc
cfc0: 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62 75 66  onfigure $s -buf
cfd0: 66 65 72 69 6e 67 20 6c 69 6e 65 0a 20 20 20 20  fering line.    
cfe0: 20 20 20 20 7d 0a 09 70 72 6f 63 20 65 63 68 6f      }..proc echo
cff0: 20 7b 73 7d 20 7b 0a 09 20 20 20 20 20 67 6c 6f   {s} {..     glo
d000: 62 61 6c 20 69 0a 20 20 20 20 20 20 20 20 20 20  bal i.          
d010: 20 20 20 73 65 74 20 6c 20 5b 67 65 74 73 20 24     set l [gets $
d020: 73 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s].             
d030: 69 66 20 7b 5b 65 6f 66 20 24 73 5d 7d 20 7b 0a  if {[eof $s]} {.
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 67 6c 6f 62 61 6c 20 78 0a 20 20 20 20 20 20   global x.      
d060: 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
d070: 20 24 73 0a 20 20 20 20 20 20 20 20 20 20 20 20   $s.            
d080: 20 20 20 20 20 73 65 74 20 78 20 64 6f 6e 65 0a       set x done.
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
d0a0: 6c 73 65 20 7b 20 0a 09 20 20 20 20 20 20 20 20  lse { ..        
d0b0: 20 69 6e 63 72 20 69 0a 20 20 20 20 20 20 20 20   incr i.        
d0c0: 20 20 20 20 20 20 20 20 20 70 75 74 73 20 24 73           puts $s
d0d0: 20 24 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20   $l.            
d0e0: 20 7d 0a 09 7d 0a 09 73 65 74 20 69 20 30 0a 09   }..}..set i 0..
d0f0: 76 77 61 69 74 20 78 0a 09 63 6c 6f 73 65 20 24  vwait x..close $
d100: 66 0a 0a 09 23 20 74 68 72 65 61 64 20 63 6c 65  f...# thread cle
d110: 61 6e 73 20 69 74 73 65 6c 66 20 75 70 2e 0a 09  ans itself up...
d120: 74 65 73 74 74 68 72 65 61 64 20 65 78 69 74 0a  testthread exit.
d130: 20 20 20 20 7d 20 73 63 72 69 70 74 0a 20 20 20      } script.   
d140: 20 0a 20 20 20 20 23 20 63 72 65 61 74 65 20 61   .    # create a
d150: 20 74 68 72 65 61 64 0a 20 20 20 20 73 65 74 20   thread.    set 
d160: 73 65 72 76 65 72 74 68 72 65 61 64 20 5b 74 65  serverthread [te
d170: 73 74 74 68 72 65 61 64 20 63 72 65 61 74 65 20  stthread create 
d180: 7b 20 73 6f 75 72 63 65 20 73 63 72 69 70 74 20  { source script 
d190: 7d 20 5d 0a 20 20 20 20 75 70 64 61 74 65 0a 20  } ].    update. 
d1a0: 20 20 20 0a 20 20 20 20 61 66 74 65 72 20 31 30     .    after 10
d1b0: 30 30 0a 20 20 20 20 73 65 74 20 73 20 5b 74 6c  00.    set s [tl
d1c0: 73 3a 3a 73 6f 63 6b 65 74 20 31 32 37 2e 30 2e  s::socket 127.0.
d1d0: 30 2e 31 20 32 38 32 38 5d 0a 20 20 20 20 66 63  0.1 2828].    fc
d1e0: 6f 6e 66 69 67 75 72 65 20 24 73 20 2d 62 75 66  onfigure $s -buf
d1f0: 66 65 72 69 6e 67 20 6c 69 6e 65 0a 0a 20 20 20  fering line..   
d200: 20 63 61 74 63 68 20 7b 0a 09 70 75 74 73 20 24   catch {..puts $
d210: 73 20 22 68 65 6c 6c 6f 22 0a 09 67 65 74 73 20  s "hello"..gets 
d220: 24 73 20 72 65 73 75 6c 74 0a 20 20 20 20 7d 0a  $s result.    }.
d230: 20 20 20 20 63 6c 6f 73 65 20 24 73 0a 20 20 20      close $s.   
d240: 20 75 70 64 61 74 65 0a 0a 20 20 20 20 61 66 74   update..    aft
d250: 65 72 20 32 30 30 30 0a 20 20 20 20 6c 61 70 70  er 2000.    lapp
d260: 65 6e 64 20 72 65 73 75 6c 74 20 5b 74 68 72 65  end result [thre
d270: 61 64 52 65 61 70 5d 0a 20 20 20 20 0a 20 20 20  adReap].    .   
d280: 20 73 65 74 20 72 65 73 75 6c 74 0a 0a 7d 20 7b   set result..} {
d290: 68 65 6c 6c 6f 20 31 7d 0a 0a 23 20 63 6c 65 61  hello 1}..# clea
d2a0: 6e 75 70 0a 69 66 20 7b 5b 73 74 72 69 6e 67 20  nup.if {[string 
d2b0: 6d 61 74 63 68 20 73 6f 63 6b 2a 20 24 63 6f 6d  match sock* $com
d2c0: 6d 61 6e 64 53 6f 63 6b 65 74 5d 20 3d 3d 20 31  mandSocket] == 1
d2d0: 7d 20 7b 0a 20 20 20 70 75 74 73 20 24 63 6f 6d  } {.   puts $com
d2e0: 6d 61 6e 64 53 6f 63 6b 65 74 20 65 78 69 74 0a  mandSocket exit.
d2f0: 20 20 20 66 6c 75 73 68 20 24 63 6f 6d 6d 61 6e     flush $comman
d300: 64 53 6f 63 6b 65 74 0a 7d 0a 63 61 74 63 68 20  dSocket.}.catch 
d310: 7b 63 6c 6f 73 65 20 24 63 6f 6d 6d 61 6e 64 53  {close $commandS
d320: 6f 63 6b 65 74 7d 0a 63 61 74 63 68 20 7b 63 6c  ocket}.catch {cl
d330: 6f 73 65 20 24 72 65 6d 6f 74 65 50 72 6f 63 43  ose $remoteProcC
d340: 68 61 6e 7d 0a 3a 3a 74 63 6c 74 65 73 74 3a 3a  han}.::tcltest::
d350: 63 6c 65 61 6e 75 70 54 65 73 74 73 0a 66 6c 75  cleanupTests.flu
d360: 73 68 20 73 74 64 6f 75 74 0a 72 65 74 75 72 6e  sh stdout.return
d370: 0a 0a                                            ..