Tcl Source Code

Hex Artifact Content
Login

Artifact 93b295548fb0c76239b4383cfe2b67b9d9f2a0ef622d62da63e8515ddcbdaffd:


0000: 2f 2a 0a 20 2a 20 74 63 6c 57 69 6e 53 6f 63 6b  /*. * tclWinSock
0010: 2e 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  .c --. *. *.This
0020: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 57   file contains W
0030: 69 6e 64 6f 77 73 2d 73 70 65 63 69 66 69 63 20  indows-specific 
0040: 73 6f 63 6b 65 74 20 72 65 6c 61 74 65 64 20 63  socket related c
0050: 6f 64 65 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72  ode.. *. * Copyr
0060: 69 67 68 74 20 28 63 29 20 31 39 39 35 2d 31 39  ight (c) 1995-19
0070: 39 37 20 53 75 6e 20 4d 69 63 72 6f 73 79 73 74  97 Sun Microsyst
0080: 65 6d 73 2c 20 49 6e 63 2e 0a 20 2a 0a 20 2a 20  ems, Inc.. *. * 
0090: 53 65 65 20 74 68 65 20 66 69 6c 65 20 22 6c 69  See the file "li
00a0: 63 65 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f 72  cense.terms" for
00b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
00c0: 75 73 61 67 65 20 61 6e 64 20 72 65 64 69 73 74  usage and redist
00d0: 72 69 62 75 74 69 6f 6e 20 6f 66 0a 20 2a 20 74  ribution of. * t
00e0: 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f  his file, and fo
00f0: 72 20 61 20 44 49 53 43 4c 41 49 4d 45 52 20 4f  r a DISCLAIMER O
0100: 46 20 41 4c 4c 20 57 41 52 52 41 4e 54 49 45 53  F ALL WARRANTIES
0110: 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  .. *. * --------
0120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0160: 20 2a 20 54 68 65 20 6f 72 64 65 72 20 61 6e 64   * The order and
0170: 20 6e 61 6d 69 6e 67 20 6f 66 20 66 75 6e 63 74   naming of funct
0180: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ions in this fil
0190: 65 20 73 68 6f 75 6c 64 20 6d 69 6e 69 6d 69 7a  e should minimiz
01a0: 65 0a 20 2a 20 74 68 65 20 66 69 6c 65 20 64 69  e. * the file di
01b0: 66 66 20 74 6f 20 74 63 6c 55 6e 69 78 53 6f 63  ff to tclUnixSoc
01c0: 6b 2e 63 2e 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  k.c.. * --------
01d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0210: 20 2a 0a 20 2a 20 47 65 6e 65 72 61 6c 20 69 6e   *. * General in
0220: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 68 6f 77  formation on how
0230: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 77 6f 72   this module wor
0240: 6b 73 2e 0a 20 2a 0a 20 2a 20 2d 20 45 61 63 68  ks.. *. * - Each
0250: 20 54 63 6c 2d 74 68 72 65 61 64 20 77 69 74 68   Tcl-thread with
0260: 20 69 74 73 20 73 6f 63 6b 65 74 73 20 6d 61 69   its sockets mai
0270: 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 72 6e  ntains an intern
0280: 61 6c 20 77 69 6e 64 6f 77 20 74 6f 20 72 65 63  al window to rec
0290: 65 69 76 65 0a 20 2a 20 20 20 73 6f 63 6b 65 74  eive. *   socket
02a0: 20 6d 65 73 73 61 67 65 73 20 66 72 6f 6d 20 74   messages from t
02b0: 68 65 20 4f 53 2e 0a 20 2a 0a 20 2a 20 2d 20 54  he OS.. *. * - T
02c0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 6d 65  o ensure that me
02d0: 73 73 61 67 65 20 72 65 63 65 70 74 69 6f 6e 20  ssage reception 
02e0: 69 73 20 61 6c 77 61 79 73 20 72 75 6e 6e 69 6e  is always runnin
02f0: 67 20 74 68 69 73 20 77 69 6e 64 6f 77 20 69 73  g this window is
0300: 0a 20 2a 20 20 20 61 63 74 75 61 6c 6c 79 20 6f  . *   actually o
0310: 77 6e 65 64 20 61 6e 64 20 68 61 6e 64 6c 65 64  wned and handled
0320: 20 62 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   by an internal 
0330: 74 68 72 65 61 64 2e 20 54 68 69 73 20 77 65 20  thread. This we 
0340: 63 61 6c 6c 20 74 68 65 0a 20 2a 20 20 20 63 6f  call the. *   co
0350: 2d 74 68 72 65 61 64 20 6f 66 20 54 63 6c 27 73  -thread of Tcl's
0360: 20 74 68 72 65 61 64 2e 0a 20 2a 0a 20 2a 20 2d   thread.. *. * -
0370: 20 54 68 65 20 77 68 6f 6c 65 20 73 74 72 75 63   The whole struc
0380: 74 75 72 65 20 69 73 20 73 65 74 20 75 70 20 62  ture is set up b
0390: 79 20 49 6e 69 74 53 6f 63 6b 65 74 73 28 29 20  y InitSockets() 
03a0: 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 20  which is called 
03b0: 66 6f 72 20 65 61 63 68 0a 20 2a 20 20 20 54 63  for each. *   Tc
03c0: 6c 20 74 68 72 65 61 64 2e 20 54 68 65 20 69 6d  l thread. The im
03d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
03e0: 74 68 65 20 63 6f 2d 74 68 72 65 61 64 20 69 73  the co-thread is
03f0: 20 69 6e 20 53 6f 63 6b 65 74 54 68 72 65 61 64   in SocketThread
0400: 28 29 2c 0a 20 2a 20 20 20 61 6e 64 20 74 68 65  (),. *   and the
0410: 20 6d 65 73 73 61 67 65 73 20 61 72 65 20 68 61   messages are ha
0420: 6e 64 6c 65 64 20 62 79 20 53 6f 63 6b 65 74 50  ndled by SocketP
0430: 72 6f 63 28 29 2e 20 54 68 65 20 63 6f 6e 6e 65  roc(). The conne
0440: 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 0a 20 2a  ction between. *
0450: 20 20 20 62 6f 74 68 20 69 73 20 6e 6f 74 20 64     both is not d
0460: 69 72 65 63 74 6c 79 20 76 69 73 69 62 6c 65 2c  irectly visible,
0470: 20 69 74 20 69 73 20 64 6f 6e 65 20 74 68 72 6f   it is done thro
0480: 75 67 68 20 61 20 57 69 6e 33 32 20 77 69 6e 64  ugh a Win32 wind
0490: 6f 77 20 63 6c 61 73 73 2e 0a 20 2a 20 20 20 54  ow class.. *   T
04a0: 68 69 73 20 63 6c 61 73 73 20 69 73 20 69 6e 69  his class is ini
04b0: 74 69 61 6c 69 7a 65 64 20 62 79 20 49 6e 69 74  tialized by Init
04c0: 53 6f 63 6b 65 74 73 28 29 20 61 73 20 77 65 6c  Sockets() as wel
04d0: 6c 2c 20 61 6e 64 20 75 73 65 64 20 69 6e 20 74  l, and used in t
04e0: 68 65 0a 20 2a 20 20 20 63 72 65 61 74 69 6f 6e  he. *   creation
04f0: 20 6f 66 20 74 68 65 20 6d 65 73 73 61 67 65 20   of the message 
0500: 72 65 63 65 69 76 65 72 20 77 69 6e 64 6f 77 73  receiver windows
0510: 2e 0a 20 2a 0a 20 2a 20 2d 20 41 6e 20 69 6d 70  .. *. * - An imp
0520: 6f 72 74 61 6e 74 20 74 68 69 6e 67 20 74 6f 20  ortant thing to 
0530: 6e 6f 74 65 20 69 73 20 74 68 61 74 20 2a 62 6f  note is that *bo
0540: 74 68 2a 20 74 68 72 65 61 64 20 61 6e 64 20 63  th* thread and c
0550: 6f 2d 74 68 72 65 61 64 20 68 61 76 65 0a 20 2a  o-thread have. *
0560: 20 20 20 61 63 63 65 73 73 20 74 6f 20 74 68 65     access to the
0570: 20 6c 69 73 74 20 6f 66 20 73 6f 63 6b 65 74 73   list of sockets
0580: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 74   maintained in t
0590: 68 65 20 70 72 69 76 61 74 65 20 54 53 44 20 64  he private TSD d
05a0: 61 74 61 20 6f 66 20 74 68 65 0a 20 2a 20 20 20  ata of the. *   
05b0: 74 68 72 65 61 64 2e 20 54 68 65 20 63 6f 2d 74  thread. The co-t
05c0: 68 72 65 61 64 20 77 61 73 20 67 69 76 65 6e 20  hread was given 
05d0: 61 63 63 65 73 73 20 74 6f 20 69 74 20 75 70 6f  access to it upo
05e0: 6e 20 63 72 65 61 74 69 6f 6e 20 74 68 72 6f 75  n creation throu
05f0: 67 68 20 74 68 65 0a 20 2a 20 20 20 6e 65 77 20  gh the. *   new 
0600: 74 68 72 65 61 64 27 73 20 63 6c 69 65 6e 74 2d  thread's client-
0610: 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 20 20 42 65  data.. *. *   Be
0620: 63 61 75 73 65 20 6f 66 20 74 68 69 73 20 64 75  cause of this du
0630: 61 6c 20 61 63 63 65 73 73 20 74 68 65 20 54 53  al access the TS
0640: 44 20 64 61 74 61 20 63 6f 6e 74 61 69 6e 73 20  D data contains 
0650: 61 6e 20 4f 53 20 6d 75 74 65 78 2c 20 74 68 65  an OS mutex, the
0660: 0a 20 2a 20 20 20 22 73 6f 63 6b 65 74 4c 69 73  . *   "socketLis
0670: 74 4c 6f 63 6b 22 2c 20 74 6f 20 6d 65 64 69 61  tLock", to media
0680: 74 65 20 65 78 63 6c 75 73 69 6f 6e 20 62 65 74  te exclusion bet
0690: 77 65 65 6e 20 74 68 72 65 61 64 20 61 6e 64 20  ween thread and 
06a0: 63 6f 2d 74 68 72 65 61 64 2e 0a 20 2a 0a 20 2a  co-thread.. *. *
06b0: 20 20 20 54 68 65 20 63 6f 2d 74 68 72 65 61 64     The co-thread
06c0: 27 73 20 61 63 63 65 73 73 20 69 73 20 61 6c 6c  's access is all
06d0: 20 69 6e 20 53 6f 63 6b 65 74 50 72 6f 63 28 29   in SocketProc()
06e0: 2e 20 54 68 65 20 74 68 72 65 61 64 27 73 20 61  . The thread's a
06f0: 63 63 65 73 73 20 69 73 0a 20 2a 20 20 20 74 68  ccess is. *   th
0700: 72 6f 75 67 68 20 53 6f 63 6b 65 74 45 76 65 6e  rough SocketEven
0710: 74 50 72 6f 63 28 29 20 28 31 29 20 61 6e 64 20  tProc() (1) and 
0720: 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  the functions ca
0730: 6c 6c 65 64 20 62 79 20 69 74 2e 0a 20 2a 0a 20  lled by it.. *. 
0740: 2a 20 20 20 28 41 64 20 31 29 20 54 68 69 73 20  *   (Ad 1) This 
0750: 69 73 20 74 68 65 20 68 61 6e 64 6c 65 72 20 66  is the handler f
0760: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20  unction for all 
0770: 71 75 65 75 65 64 20 73 6f 63 6b 65 74 20 65 76  queued socket ev
0780: 65 6e 74 73 2c 20 77 68 69 63 68 0a 20 2a 20 20  ents, which. *  
0790: 20 20 20 20 20 20 20 20 61 6c 6c 20 74 68 65 20          all the 
07a0: 4f 53 20 6d 65 73 73 61 67 65 73 20 61 72 65 20  OS messages are 
07b0: 74 72 61 6e 73 6c 61 74 65 64 20 74 6f 20 74 68  translated to th
07c0: 72 6f 75 67 68 20 74 68 65 20 45 76 65 6e 74 53  rough the EventS
07d0: 6f 75 72 63 65 20 28 32 29 0a 20 2a 20 20 20 20  ource (2). *    
07e0: 20 20 20 20 20 20 64 72 69 76 65 6e 20 62 79 20        driven by 
07f0: 74 68 65 20 4f 53 20 6d 65 73 73 61 67 65 73 2e  the OS messages.
0800: 0a 20 2a 0a 20 2a 20 20 20 28 41 64 20 32 29 20  . *. *   (Ad 2) 
0810: 54 68 65 20 6d 61 69 6e 20 66 75 6e 63 74 69 6f  The main functio
0820: 6e 73 20 66 6f 72 20 74 68 69 73 20 61 72 65 20  ns for this are 
0830: 53 6f 63 6b 65 74 53 65 74 75 70 50 72 6f 63 28  SocketSetupProc(
0840: 29 20 61 6e 64 0a 20 2a 20 20 20 20 20 20 20 20  ) and. *        
0850: 20 20 53 6f 63 6b 65 74 43 68 65 63 6b 50 72 6f    SocketCheckPro
0860: 63 28 29 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75  c().. */..#inclu
0870: 64 65 20 22 74 63 6c 57 69 6e 49 6e 74 2e 68 22  de "tclWinInt.h"
0880: 0a 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  ..#ifdef _MSC_VE
0890: 52 0a 23 20 20 20 70 72 61 67 6d 61 20 63 6f 6d  R.#   pragma com
08a0: 6d 65 6e 74 20 28 6c 69 62 2c 20 22 77 73 32 5f  ment (lib, "ws2_
08b0: 33 32 22 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  32").#endif../*.
08c0: 20 2a 20 53 75 70 70 6f 72 74 20 66 6f 72 20 63   * Support for c
08d0: 6f 6e 74 72 6f 6c 20 6f 76 65 72 20 73 6f 63 6b  ontrol over sock
08e0: 65 74 73 27 20 4b 45 45 50 41 4c 49 56 45 20 61  ets' KEEPALIVE a
08f0: 6e 64 20 4e 4f 44 45 4c 41 59 20 62 65 68 61 76  nd NODELAY behav
0900: 69 6f 72 20 69 73 0a 20 2a 20 63 75 72 72 65 6e  ior is. * curren
0910: 74 6c 79 20 64 69 73 61 62 6c 65 64 2e 0a 20 2a  tly disabled.. *
0920: 2f 0a 0a 23 75 6e 64 65 66 20 54 43 4c 5f 46 45  /..#undef TCL_FE
0930: 41 54 55 52 45 5f 4b 45 45 50 41 4c 49 56 45 5f  ATURE_KEEPALIVE_
0940: 4e 41 47 4c 45 0a 0a 2f 2a 0a 20 2a 20 4d 61 6b  NAGLE../*. * Mak
0950: 65 20 73 75 72 65 20 74 6f 20 72 65 6d 6f 76 65  e sure to remove
0960: 20 74 68 65 20 72 65 64 69 72 65 63 74 69 6f 6e   the redirection
0970: 20 64 65 66 69 6e 65 73 20 73 65 74 20 69 6e 20   defines set in 
0980: 74 63 6c 57 69 6e 50 6f 72 74 2e 68 20 74 68 61  tclWinPort.h tha
0990: 74 20 69 73 20 69 6e 0a 20 2a 20 75 73 65 20 69  t is in. * use i
09a0: 6e 20 6f 74 68 65 72 20 73 65 63 74 69 6f 6e 73  n other sections
09b0: 20 6f 66 20 74 68 65 20 63 6f 72 65 2c 20 65 78   of the core, ex
09c0: 63 65 70 74 20 66 6f 72 20 75 73 2e 0a 20 2a 2f  cept for us.. */
09d0: 0a 0a 23 75 6e 64 65 66 20 67 65 74 73 65 72 76  ..#undef getserv
09e0: 62 79 6e 61 6d 65 0a 23 75 6e 64 65 66 20 67 65  byname.#undef ge
09f0: 74 73 6f 63 6b 6f 70 74 0a 23 75 6e 64 65 66 20  tsockopt.#undef 
0a00: 73 65 74 73 6f 63 6b 6f 70 74 0a 0a 2f 2a 0a 20  setsockopt../*. 
0a10: 2a 20 48 65 6c 70 65 72 20 6d 61 63 72 6f 73 20  * Helper macros 
0a20: 74 6f 20 6d 61 6b 65 20 70 61 72 74 73 20 6f 66  to make parts of
0a30: 20 74 68 69 73 20 66 69 6c 65 20 63 6c 65 61 72   this file clear
0a40: 65 72 2e 20 54 68 65 20 6d 61 63 72 6f 73 20 64  er. The macros d
0a50: 6f 20 65 78 61 63 74 6c 79 0a 20 2a 20 77 68 61  o exactly. * wha
0a60: 74 20 74 68 65 79 20 73 61 79 20 6f 6e 20 74 68  t they say on th
0a70: 65 20 74 69 6e 2e 20 3a 2d 29 20 54 68 65 79 20  e tin. :-) They 
0a80: 61 6c 73 6f 20 6f 6e 6c 79 20 65 76 65 72 20 72  also only ever r
0a90: 65 66 65 72 20 74 6f 20 74 68 65 69 72 20 61 72  efer to their ar
0aa0: 67 75 6d 65 6e 74 73 0a 20 2a 20 6f 6e 63 65 2c  guments. * once,
0ab0: 20 61 6e 64 20 73 6f 20 63 61 6e 20 62 65 20 75   and so can be u
0ac0: 73 65 64 20 77 69 74 68 6f 75 74 20 72 65 67 61  sed without rega
0ad0: 72 64 20 74 6f 20 73 69 64 65 20 65 66 66 65 63  rd to side effec
0ae0: 74 73 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  ts.. */..#define
0af0: 20 53 45 54 5f 42 49 54 53 28 76 61 72 2c 20 62   SET_BITS(var, b
0b00: 69 74 73 29 09 28 28 76 61 72 29 20 7c 3d 20 28  its).((var) |= (
0b10: 62 69 74 73 29 29 0a 23 64 65 66 69 6e 65 20 43  bits)).#define C
0b20: 4c 45 41 52 5f 42 49 54 53 28 76 61 72 2c 20 62  LEAR_BITS(var, b
0b30: 69 74 73 29 09 28 28 76 61 72 29 20 26 3d 20 7e  its).((var) &= ~
0b40: 28 62 69 74 73 29 29 0a 23 64 65 66 69 6e 65 20  (bits)).#define 
0b50: 47 4f 54 5f 42 49 54 53 28 76 61 72 2c 20 62 69  GOT_BITS(var, bi
0b60: 74 73 29 20 20 20 20 20 28 28 28 76 61 72 29 20  ts)     (((var) 
0b70: 26 20 28 62 69 74 73 29 29 20 21 3d 20 30 29 0a  & (bits)) != 0).
0b80: 0a 2f 2a 20 22 73 6f 63 6b 22 20 2b 20 61 20 70  ./* "sock" + a p
0b90: 6f 69 6e 74 65 72 20 69 6e 20 68 65 78 20 2b 20  ointer in hex + 
0ba0: 5c 30 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 4f  \0 */.#define SO
0bb0: 43 4b 5f 43 48 41 4e 5f 4c 45 4e 47 54 48 20 20  CK_CHAN_LENGTH  
0bc0: 20 20 20 20 20 20 28 34 20 2b 20 73 69 7a 65 6f        (4 + sizeo
0bd0: 66 28 76 6f 69 64 20 2a 29 20 2a 20 32 20 2b 20  f(void *) * 2 + 
0be0: 31 29 0a 23 64 65 66 69 6e 65 20 53 4f 43 4b 5f  1).#define SOCK_
0bf0: 54 45 4d 50 4c 41 54 45 20 20 20 20 20 20 20 20  TEMPLATE        
0c00: 20 20 20 22 73 6f 63 6b 25 70 22 0a 0a 2f 2a 0a     "sock%p"../*.
0c10: 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67   * The following
0c20: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
0c30: 64 20 74 6f 20 74 65 6c 6c 20 77 68 65 74 68 65  d to tell whethe
0c40: 72 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61  r this module ha
0c50: 73 20 62 65 65 6e 0a 20 2a 20 69 6e 69 74 69 61  s been. * initia
0c60: 6c 69 7a 65 64 2e 20 20 49 66 20 31 2c 20 69 6e  lized.  If 1, in
0c70: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
0c80: 73 6f 63 6b 65 74 73 20 77 61 73 20 73 75 63 63  sockets was succ
0c90: 65 73 73 66 75 6c 2c 20 69 66 20 2d 31 20 74 68  essful, if -1 th
0ca0: 65 6e 0a 20 2a 20 73 6f 63 6b 65 74 20 69 6e 69  en. * socket ini
0cb0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c  tialization fail
0cc0: 65 64 20 28 57 53 41 53 74 61 72 74 75 70 20 66  ed (WSAStartup f
0cd0: 61 69 6c 65 64 29 2e 0a 20 2a 2f 0a 0a 73 74 61  ailed).. */..sta
0ce0: 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69  tic int initiali
0cf0: 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  zed = 0;.static 
0d00: 63 6f 6e 73 74 20 57 43 48 41 52 20 63 6c 61 73  const WCHAR clas
0d10: 73 4e 61 6d 65 5b 5d 20 3d 20 4c 22 54 63 6c 53  sName[] = L"TclS
0d20: 6f 63 6b 65 74 22 3b 0a 54 43 4c 5f 44 45 43 4c  ocket";.TCL_DECL
0d30: 41 52 45 5f 4d 55 54 45 58 28 73 6f 63 6b 65 74  ARE_MUTEX(socket
0d40: 4d 75 74 65 78 29 0a 0a 2f 2a 0a 20 2a 20 54 68  Mutex)../*. * Th
0d50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 66 69  e following defi
0d60: 6e 65 73 20 64 65 63 6c 61 72 65 20 74 68 65 20  nes declare the 
0d70: 6d 65 73 73 61 67 65 73 20 75 73 65 64 20 6f 6e  messages used on
0d80: 20 73 6f 63 6b 65 74 20 77 69 6e 64 6f 77 73 2e   socket windows.
0d90: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 53 4f  . */..#define SO
0da0: 43 4b 45 54 5f 4d 45 53 53 41 47 45 09 09 57 4d  CKET_MESSAGE..WM
0db0: 5f 55 53 45 52 2b 31 0a 23 64 65 66 69 6e 65 20  _USER+1.#define 
0dc0: 53 4f 43 4b 45 54 5f 53 45 4c 45 43 54 09 09 57  SOCKET_SELECT..W
0dd0: 4d 5f 55 53 45 52 2b 32 0a 23 64 65 66 69 6e 65  M_USER+2.#define
0de0: 20 53 4f 43 4b 45 54 5f 54 45 52 4d 49 4e 41 54   SOCKET_TERMINAT
0df0: 45 09 57 4d 5f 55 53 45 52 2b 33 0a 23 64 65 66  E.WM_USER+3.#def
0e00: 69 6e 65 20 53 45 4c 45 43 54 09 09 09 54 52 55  ine SELECT...TRU
0e10: 45 0a 23 64 65 66 69 6e 65 20 55 4e 53 45 4c 45  E.#define UNSELE
0e20: 43 54 09 09 46 41 4c 53 45 0a 0a 2f 2a 0a 20 2a  CT..FALSE../*. *
0e30: 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
0e40: 74 6f 20 63 6f 6d 70 6c 79 20 77 69 74 68 20 74  to comply with t
0e50: 68 65 20 73 74 72 69 63 74 20 61 6c 69 61 73 69  he strict aliasi
0e60: 6e 67 20 72 75 6c 65 73 20 6f 66 20 47 43 43 2c  ng rules of GCC,
0e70: 20 62 75 74 20 69 74 20 61 6c 73 6f 0a 20 2a 20   but it also. * 
0e80: 73 69 6d 70 6c 69 66 69 65 73 20 63 61 73 74 69  simplifies casti
0e90: 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20 64  ng between the d
0ea0: 69 66 66 65 72 65 6e 74 20 73 6f 63 6b 61 64 64  ifferent sockadd
0eb0: 72 20 74 79 70 65 73 2e 0a 20 2a 2f 0a 0a 74 79  r types.. */..ty
0ec0: 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 0a 20 20  pedef union {.  
0ed0: 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64    struct sockadd
0ee0: 72 20 73 61 3b 0a 20 20 20 20 73 74 72 75 63 74  r sa;.    struct
0ef0: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 73 61 34   sockaddr_in sa4
0f00: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 6f 63  ;.    struct soc
0f10: 6b 61 64 64 72 5f 69 6e 36 20 73 61 36 3b 0a 20  kaddr_in6 sa6;. 
0f20: 20 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64     struct sockad
0f30: 64 72 5f 73 74 6f 72 61 67 65 20 73 61 73 3b 0a  dr_storage sas;.
0f40: 7d 20 61 64 64 72 65 73 73 3b 0a 0a 23 69 66 6e  } address;..#ifn
0f50: 64 65 66 20 49 4e 36 5f 41 52 45 5f 41 44 44 52  def IN6_ARE_ADDR
0f60: 5f 45 51 55 41 4c 0a 23 64 65 66 69 6e 65 20 49  _EQUAL.#define I
0f70: 4e 36 5f 41 52 45 5f 41 44 44 52 5f 45 51 55 41  N6_ARE_ADDR_EQUA
0f80: 4c 20 49 4e 36 5f 41 44 44 52 5f 45 51 55 41 4c  L IN6_ADDR_EQUAL
0f90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
0fa0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 64 65  his structure de
0fb0: 73 63 72 69 62 65 73 20 70 65 72 2d 69 6e 73 74  scribes per-inst
0fc0: 61 6e 63 65 20 73 74 61 74 65 20 6f 66 20 61 20  ance state of a 
0fd0: 74 63 70 20 62 61 73 65 64 20 63 68 61 6e 6e 65  tcp based channe
0fe0: 6c 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20  l.. */..typedef 
0ff0: 73 74 72 75 63 74 20 54 63 70 53 74 61 74 65 20  struct TcpState 
1000: 54 63 70 53 74 61 74 65 3b 0a 0a 74 79 70 65 64  TcpState;..typed
1010: 65 66 20 73 74 72 75 63 74 20 54 63 70 46 64 4c  ef struct TcpFdL
1020: 69 73 74 20 7b 0a 20 20 20 20 54 63 70 53 74 61  ist {.    TcpSta
1030: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20  te *statePtr;.  
1040: 20 20 53 4f 43 4b 45 54 20 66 64 3b 0a 20 20 20    SOCKET fd;.   
1050: 20 73 74 72 75 63 74 20 54 63 70 46 64 4c 69 73   struct TcpFdLis
1060: 74 20 2a 6e 65 78 74 3b 0a 7d 20 54 63 70 46 64  t *next;.} TcpFd
1070: 4c 69 73 74 3b 0a 0a 73 74 72 75 63 74 20 54 63  List;..struct Tc
1080: 70 53 74 61 74 65 20 7b 0a 20 20 20 20 54 63 6c  pState {.    Tcl
1090: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
10a0: 3b 09 2f 2a 20 43 68 61 6e 6e 65 6c 20 61 73 73  ;./* Channel ass
10b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
10c0: 73 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 20 20 20  s socket. */.   
10d0: 20 73 74 72 75 63 74 20 54 63 70 46 64 4c 69 73   struct TcpFdLis
10e0: 74 20 2a 73 6f 63 6b 65 74 73 3b 09 2f 2a 20 57  t *sockets;./* W
10f0: 69 6e 64 6f 77 73 20 53 4f 43 4b 45 54 20 68 61  indows SOCKET ha
1100: 6e 64 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ndle. */.    int
1110: 20 66 6c 61 67 73 3b 09 09 09 2f 2a 20 42 69 74   flags;.../* Bit
1120: 20 66 69 65 6c 64 20 63 6f 6d 70 72 69 73 65 64   field comprised
1130: 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 64 65   of the flags de
1140: 73 63 72 69 62 65 64 0a 09 09 09 09 20 2a 20 62  scribed..... * b
1150: 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  elow. */.    int
1160: 20 77 61 74 63 68 45 76 65 6e 74 73 3b 09 09 2f   watchEvents;../
1170: 2a 20 4f 52 27 65 64 20 63 6f 6d 62 69 6e 61 74  * OR'ed combinat
1180: 69 6f 6e 20 6f 66 20 46 44 5f 52 45 41 44 2c 20  ion of FD_READ, 
1190: 46 44 5f 57 52 49 54 45 2c 0a 09 09 09 09 20 2a  FD_WRITE,..... *
11a0: 20 46 44 5f 43 4c 4f 53 45 2c 20 46 44 5f 41 43   FD_CLOSE, FD_AC
11b0: 43 45 50 54 20 61 6e 64 20 46 44 5f 43 4f 4e 4e  CEPT and FD_CONN
11c0: 45 43 54 20 74 68 61 74 0a 09 09 09 09 20 2a 20  ECT that..... * 
11d0: 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 65  indicate which e
11e0: 76 65 6e 74 73 20 61 72 65 20 69 6e 74 65 72 65  vents are intere
11f0: 73 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 76 6f  sting. */.    vo
1200: 6c 61 74 69 6c 65 20 69 6e 74 20 72 65 61 64 79  latile int ready
1210: 45 76 65 6e 74 73 3b 09 2f 2a 20 4f 52 27 65 64  Events;./* OR'ed
1220: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1230: 46 44 5f 52 45 41 44 2c 20 46 44 5f 57 52 49 54  FD_READ, FD_WRIT
1240: 45 2c 0a 09 09 09 09 20 2a 20 46 44 5f 43 4c 4f  E,..... * FD_CLO
1250: 53 45 2c 20 46 44 5f 41 43 43 45 50 54 20 61 6e  SE, FD_ACCEPT an
1260: 64 20 46 44 5f 43 4f 4e 4e 45 43 54 20 74 68 61  d FD_CONNECT tha
1270: 74 0a 09 09 09 09 20 2a 20 69 6e 64 69 63 61 74  t..... * indicat
1280: 65 20 77 68 69 63 68 20 65 76 65 6e 74 73 20 68  e which events h
1290: 61 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 09 09  ave occurred....
12a0: 09 09 20 2a 20 53 65 74 20 62 79 20 6e 6f 74 69  .. * Set by noti
12b0: 66 69 65 72 20 74 68 72 65 61 64 2c 20 61 63 63  fier thread, acc
12c0: 65 73 73 20 6d 75 73 74 20 62 65 0a 09 09 09 09  ess must be.....
12d0: 20 2a 20 70 72 6f 74 65 63 74 65 64 20 62 79 20   * protected by 
12e0: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 20  semaphore */.   
12f0: 20 69 6e 74 20 73 65 6c 65 63 74 45 76 65 6e 74   int selectEvent
1300: 73 3b 09 09 2f 2a 20 4f 52 27 65 64 20 63 6f 6d  s;../* OR'ed com
1310: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 46 44 5f 52  bination of FD_R
1320: 45 41 44 2c 20 46 44 5f 57 52 49 54 45 2c 0a 09  EAD, FD_WRITE,..
1330: 09 09 09 20 2a 20 46 44 5f 43 4c 4f 53 45 2c 20  ... * FD_CLOSE, 
1340: 46 44 5f 41 43 43 45 50 54 20 61 6e 64 20 46 44  FD_ACCEPT and FD
1350: 5f 43 4f 4e 4e 45 43 54 20 74 68 61 74 0a 09 09  _CONNECT that...
1360: 09 09 20 2a 20 69 6e 64 69 63 61 74 65 20 77 68  .. * indicate wh
1370: 69 63 68 20 65 76 65 6e 74 73 20 61 72 65 20 63  ich events are c
1380: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 0a 09  urrently being..
1390: 09 09 09 20 2a 20 73 65 6c 65 63 74 65 64 2e 20  ... * selected. 
13a0: 2a 2f 0a 20 20 20 20 76 6f 6c 61 74 69 6c 65 20  */.    volatile 
13b0: 69 6e 74 20 61 63 63 65 70 74 45 76 65 6e 74 43  int acceptEventC
13c0: 6f 75 6e 74 3b 0a 09 09 09 09 2f 2a 20 43 6f 75  ount;...../* Cou
13d0: 6e 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  nt of the curren
13e0: 74 20 6e 75 6d 62 65 72 20 6f 66 20 46 44 5f 41  t number of FD_A
13f0: 43 43 45 50 54 73 0a 09 09 09 09 20 2a 20 74 68  CCEPTs..... * th
1400: 61 74 20 68 61 76 65 20 61 72 72 69 76 65 64 20  at have arrived 
1410: 61 6e 64 20 6e 6f 74 20 79 65 74 20 70 72 6f 63  and not yet proc
1420: 65 73 73 65 64 2e 0a 09 09 09 09 20 2a 20 53 65  essed...... * Se
1430: 74 20 62 79 20 6e 6f 74 69 66 69 65 72 20 74 68  t by notifier th
1440: 72 65 61 64 2c 20 61 63 63 65 73 73 20 6d 75 73  read, access mus
1450: 74 20 62 65 0a 09 09 09 09 20 2a 20 70 72 6f 74  t be..... * prot
1460: 65 63 74 65 64 20 62 79 20 73 65 6d 61 70 68 6f  ected by semapho
1470: 72 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 54 63  re */.    Tcl_Tc
1480: 70 41 63 63 65 70 74 50 72 6f 63 20 2a 61 63 63  pAcceptProc *acc
1490: 65 70 74 50 72 6f 63 3b 0a 09 09 09 09 2f 2a 20  eptProc;...../* 
14a0: 50 72 6f 63 20 74 6f 20 63 61 6c 6c 20 6f 6e 20  Proc to call on 
14b0: 61 63 63 65 70 74 2e 20 2a 2f 0a 20 20 20 20 76  accept. */.    v
14c0: 6f 69 64 20 2a 61 63 63 65 70 74 50 72 6f 63 44  oid *acceptProcD
14d0: 61 74 61 3b 09 2f 2a 20 54 68 65 20 64 61 74 61  ata;./* The data
14e0: 20 66 6f 72 20 74 68 65 20 61 63 63 65 70 74 20   for the accept 
14f0: 70 72 6f 63 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  proc. */..    /*
1500: 0a 20 20 20 20 20 2a 20 4f 6e 6c 79 20 6e 65 65  .     * Only nee
1510: 64 65 64 20 66 6f 72 20 63 6c 69 65 6e 74 20 73  ded for client s
1520: 6f 63 6b 65 74 73 0a 20 20 20 20 20 2a 2f 0a 0a  ockets.     */..
1530: 20 20 20 20 73 74 72 75 63 74 20 61 64 64 72 69      struct addri
1540: 6e 66 6f 20 2a 61 64 64 72 6c 69 73 74 3b 09 2f  nfo *addrlist;./
1550: 2a 20 41 64 64 72 65 73 73 65 73 20 74 6f 20 63  * Addresses to c
1560: 6f 6e 6e 65 63 74 20 74 6f 2e 20 2a 2f 0a 20 20  onnect to. */.  
1570: 20 20 73 74 72 75 63 74 20 61 64 64 72 69 6e 66    struct addrinf
1580: 6f 20 2a 61 64 64 72 3b 09 2f 2a 20 49 74 65 72  o *addr;./* Iter
1590: 61 74 6f 72 20 6f 76 65 72 20 61 64 64 72 6c 69  ator over addrli
15a0: 73 74 2e 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  st. */.    struc
15b0: 74 20 61 64 64 72 69 6e 66 6f 20 2a 6d 79 61 64  t addrinfo *myad
15c0: 64 72 6c 69 73 74 3b 2f 2a 20 4c 6f 63 61 6c 20  drlist;/* Local 
15d0: 61 64 64 72 65 73 73 2e 20 2a 2f 0a 20 20 20 20  address. */.    
15e0: 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20  struct addrinfo 
15f0: 2a 6d 79 61 64 64 72 3b 09 2f 2a 20 49 74 65 72  *myaddr;./* Iter
1600: 61 74 6f 72 20 6f 76 65 72 20 6d 79 61 64 64 72  ator over myaddr
1610: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  list. */.    int
1620: 20 63 6f 6e 6e 65 63 74 45 72 72 6f 72 3b 09 09   connectError;..
1630: 2f 2a 20 43 61 63 68 65 20 73 74 61 74 75 73 20  /* Cache status 
1640: 6f 66 20 61 73 79 6e 63 20 73 6f 63 6b 65 74 2e  of async socket.
1650: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 61 63 68   */.    int cach
1660: 65 64 42 6c 6f 63 6b 69 6e 67 3b 20 20 20 20 20  edBlocking;     
1670: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 62 6c 6f      /* Cache blo
1680: 63 6b 69 6e 67 20 6d 6f 64 65 20 6f 66 20 61 73  cking mode of as
1690: 79 6e 63 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 20  ync socket. */. 
16a0: 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20     volatile int 
16b0: 6e 6f 74 69 66 69 65 72 43 6f 6e 6e 65 63 74 45  notifierConnectE
16c0: 72 72 6f 72 3b 0a 09 09 09 09 2f 2a 20 41 73 79  rror;...../* Asy
16d0: 6e 63 20 63 6f 6e 6e 65 63 74 20 65 72 72 6f 72  nc connect error
16e0: 20 73 65 74 20 62 79 20 6e 6f 74 69 66 69 65 72   set by notifier
16f0: 20 74 68 72 65 61 64 2e 0a 09 09 09 09 20 2a 20   thread...... * 
1700: 54 68 69 73 20 65 72 72 6f 72 20 69 73 20 73 74  This error is st
1710: 69 6c 6c 20 61 20 77 69 6e 64 6f 77 73 20 65 72  ill a windows er
1720: 72 6f 72 20 63 6f 64 65 2e 0a 09 09 09 09 20 2a  ror code...... *
1730: 20 41 63 63 65 73 73 20 6d 75 73 74 20 62 65 20   Access must be 
1740: 70 72 6f 74 65 63 74 65 64 20 62 79 20 73 65 6d  protected by sem
1750: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 20 20 73 74  aphore */.    st
1760: 72 75 63 74 20 54 63 70 53 74 61 74 65 20 2a 6e  ruct TcpState *n
1770: 65 78 74 50 74 72 3b 09 2f 2a 20 54 68 65 20 6e  extPtr;./* The n
1780: 65 78 74 20 73 6f 63 6b 65 74 20 6f 6e 20 74 68  ext socket on th
1790: 65 20 70 65 72 2d 74 68 72 65 61 64 20 73 6f 63  e per-thread soc
17a0: 6b 65 74 0a 09 09 09 09 20 2a 20 6c 69 73 74 2e  ket..... * list.
17b0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 54 68   */.};../*. * Th
17c0: 65 73 65 20 62 69 74 73 20 6d 61 79 20 62 65 20  ese bits may be 
17d0: 4f 52 65 64 20 74 6f 67 65 74 68 65 72 20 69 6e  ORed together in
17e0: 74 6f 20 74 68 65 20 22 66 6c 61 67 73 22 20 66  to the "flags" f
17f0: 69 65 6c 64 20 6f 66 20 61 20 54 63 70 53 74 61  ield of a TcpSta
1800: 74 65 0a 20 2a 20 73 74 72 75 63 74 75 72 65 2e  te. * structure.
1810: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 54 43  . */..#define TC
1820: 50 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 09 09 28  P_NONBLOCKING..(
1830: 31 3c 3c 30 29 09 2f 2a 20 53 6f 63 6b 65 74 20  1<<0)./* Socket 
1840: 77 69 74 68 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e  with non-blockin
1850: 67 20 49 2f 4f 20 2a 2f 0a 23 64 65 66 69 6e 65  g I/O */.#define
1860: 20 54 43 50 5f 41 53 59 4e 43 5f 43 4f 4e 4e 45   TCP_ASYNC_CONNE
1870: 43 54 09 28 31 3c 3c 31 29 09 2f 2a 20 41 73 79  CT.(1<<1)./* Asy
1880: 6e 63 20 63 6f 6e 6e 65 63 74 20 69 6e 20 70 72  nc connect in pr
1890: 6f 67 72 65 73 73 2e 20 2a 2f 0a 23 64 65 66 69  ogress. */.#defi
18a0: 6e 65 20 53 4f 43 4b 45 54 5f 45 4f 46 09 09 28  ne SOCKET_EOF..(
18b0: 31 3c 3c 32 29 09 2f 2a 20 41 20 7a 65 72 6f 20  1<<2)./* A zero 
18c0: 72 65 61 64 20 68 61 70 70 65 6e 65 64 20 6f 6e  read happened on
18d0: 20 74 68 65 0a 09 09 09 09 09 20 2a 20 73 6f 63   the...... * soc
18e0: 6b 65 74 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ket. */.#define 
18f0: 53 4f 43 4b 45 54 5f 50 45 4e 44 49 4e 47 09 09  SOCKET_PENDING..
1900: 28 31 3c 3c 33 29 09 2f 2a 20 41 20 6d 65 73 73  (1<<3)./* A mess
1910: 61 67 65 20 68 61 73 20 62 65 65 6e 20 73 65 6e  age has been sen
1920: 74 20 66 6f 72 20 74 68 69 73 0a 09 09 09 09 09  t for this......
1930: 20 2a 20 73 6f 63 6b 65 74 20 2a 2f 0a 23 64 65   * socket */.#de
1940: 66 69 6e 65 20 54 43 50 5f 41 53 59 4e 43 5f 50  fine TCP_ASYNC_P
1950: 45 4e 44 49 4e 47 09 28 31 3c 3c 34 29 09 2f 2a  ENDING.(1<<4)./*
1960: 20 54 63 70 43 6f 6e 6e 65 63 74 20 77 61 73 20   TcpConnect was 
1970: 63 61 6c 6c 65 64 20 74 6f 0a 09 09 09 09 09 20  called to...... 
1980: 2a 20 70 72 6f 63 65 73 73 20 61 6e 20 61 73 79  * process an asy
1990: 6e 63 20 63 6f 6e 6e 65 63 74 2e 20 54 68 69 73  nc connect. This
19a0: 0a 09 09 09 09 09 20 2a 20 66 6c 61 67 20 69 6e  ...... * flag in
19b0: 64 69 63 61 74 65 73 20 74 68 61 74 20 72 65 65  dicates that ree
19c0: 6e 74 72 79 20 69 73 0a 09 09 09 09 09 20 2a 20  ntry is...... * 
19d0: 73 74 69 6c 6c 20 70 65 6e 64 69 6e 67 20 2a 2f  still pending */
19e0: 0a 23 64 65 66 69 6e 65 20 54 43 50 5f 41 53 59  .#define TCP_ASY
19f0: 4e 43 5f 46 41 49 4c 45 44 09 28 31 3c 3c 35 29  NC_FAILED.(1<<5)
1a00: 09 2f 2a 20 41 6e 20 61 73 79 6e 63 20 63 6f 6e  ./* An async con
1a10: 6e 65 63 74 20 66 69 6e 61 6c 6c 79 20 66 61 69  nect finally fai
1a20: 6c 65 64 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68  led */../*. * Th
1a30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1a40: 63 74 75 72 65 20 69 73 20 77 68 61 74 20 69 73  cture is what is
1a50: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 54 63   added to the Tc
1a60: 6c 20 65 76 65 6e 74 20 71 75 65 75 65 20 77 68  l event queue wh
1a70: 65 6e 20 61 0a 20 2a 20 73 6f 63 6b 65 74 20 65  en a. * socket e
1a80: 76 65 6e 74 20 6f 63 63 75 72 73 2e 0a 20 2a 2f  vent occurs.. */
1a90: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
1aa0: 20 7b 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74   {.    Tcl_Event
1ab0: 20 68 65 61 64 65 72 3b 09 09 2f 2a 20 49 6e 66   header;../* Inf
1ac0: 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 69 73  ormation that is
1ad0: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 20 61 6c   standard for al
1ae0: 6c 0a 09 09 09 09 20 2a 20 65 76 65 6e 74 73 2e  l..... * events.
1af0: 20 2a 2f 0a 20 20 20 20 53 4f 43 4b 45 54 20 73   */.    SOCKET s
1b00: 6f 63 6b 65 74 3b 09 09 2f 2a 20 53 6f 63 6b 65  ocket;../* Socke
1b10: 74 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  t descriptor tha
1b20: 74 20 69 73 20 72 65 61 64 79 2e 20 55 73 65 64  t is ready. Used
1b30: 20 74 6f 0a 09 09 09 09 20 2a 20 66 69 6e 64 20   to..... * find 
1b40: 74 68 65 20 54 63 70 53 74 61 74 65 20 73 74 72  the TcpState str
1b50: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 66  ucture for the f
1b60: 69 6c 65 0a 09 09 09 09 20 2a 20 28 63 61 6e 27  ile..... * (can'
1b70: 74 20 70 6f 69 6e 74 20 64 69 72 65 63 74 6c 79  t point directly
1b80: 20 74 6f 20 74 68 65 20 54 63 70 53 74 61 74 65   to the TcpState
1b90: 0a 09 09 09 09 20 2a 20 73 74 72 75 63 74 75 72  ..... * structur
1ba0: 65 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 75  e because it cou
1bb0: 6c 64 20 67 6f 20 61 77 61 79 20 77 68 69 6c 65  ld go away while
1bc0: 0a 09 09 09 09 20 2a 20 74 68 65 20 65 76 65 6e  ..... * the even
1bd0: 74 20 69 73 20 71 75 65 75 65 64 29 2e 20 2a 2f  t is queued). */
1be0: 0a 7d 20 53 6f 63 6b 65 74 45 76 65 6e 74 3b 0a  .} SocketEvent;.
1bf0: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 64 65 66 69  ./*. * This defi
1c00: 6e 65 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  nes the minimum 
1c10: 62 75 66 66 65 72 73 69 7a 65 20 6d 61 69 6e 74  buffersize maint
1c20: 61 69 6e 65 64 20 62 79 20 74 68 65 20 6b 65 72  ained by the ker
1c30: 6e 65 6c 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e  nel.. */..#defin
1c40: 65 20 54 43 50 5f 42 55 46 46 45 52 5f 53 49 5a  e TCP_BUFFER_SIZ
1c50: 45 20 34 30 39 36 0a 0a 0a 74 79 70 65 64 65 66  E 4096...typedef
1c60: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 48 57   struct {.    HW
1c70: 4e 44 20 68 77 6e 64 3b 09 09 09 2f 2a 20 48 61  ND hwnd;.../* Ha
1c80: 6e 64 6c 65 20 74 6f 20 77 69 6e 64 6f 77 20 66  ndle to window f
1c90: 6f 72 20 73 6f 63 6b 65 74 20 6d 65 73 73 61 67  or socket messag
1ca0: 65 73 2e 20 2a 2f 0a 20 20 20 20 48 41 4e 44 4c  es. */.    HANDL
1cb0: 45 20 73 6f 63 6b 65 74 54 68 72 65 61 64 3b 09  E socketThread;.
1cc0: 2f 2a 20 54 68 72 65 61 64 20 68 61 6e 64 6c 69  /* Thread handli
1cd0: 6e 67 20 74 68 65 20 77 69 6e 64 6f 77 20 2a 2f  ng the window */
1ce0: 0a 20 20 20 20 54 63 6c 5f 54 68 72 65 61 64 49  .    Tcl_ThreadI
1cf0: 64 20 74 68 72 65 61 64 49 64 3b 09 2f 2a 20 50  d threadId;./* P
1d00: 61 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f  arent thread. */
1d10: 0a 20 20 20 20 48 41 4e 44 4c 45 20 72 65 61 64  .    HANDLE read
1d20: 79 45 76 65 6e 74 3b 09 09 2f 2a 20 45 76 65 6e  yEvent;../* Even
1d30: 74 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  t indicating tha
1d40: 74 20 61 20 73 6f 63 6b 65 74 20 65 76 65 6e 74  t a socket event
1d50: 20 69 73 0a 09 09 09 09 20 2a 20 72 65 61 64 79   is..... * ready
1d60: 2e 20 41 6c 73 6f 20 75 73 65 64 20 74 6f 20 69  . Also used to i
1d70: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1d80: 0a 09 09 09 09 20 2a 20 73 6f 63 6b 65 74 54 68  ..... * socketTh
1d90: 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 69 6e  read has been in
1da0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 68 61  itialized and ha
1db0: 73 0a 09 09 09 09 20 2a 20 73 74 61 72 74 65 64  s..... * started
1dc0: 2e 20 2a 2f 0a 20 20 20 20 48 41 4e 44 4c 45 20  . */.    HANDLE 
1dd0: 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 3b 09  socketListLock;.
1de0: 2f 2a 20 57 69 6e 33 32 20 45 76 65 6e 74 20 74  /* Win32 Event t
1df0: 6f 20 6c 6f 63 6b 20 74 68 65 20 73 6f 63 6b 65  o lock the socke
1e00: 74 4c 69 73 74 20 2a 2f 0a 20 20 20 20 54 63 70  tList */.    Tcp
1e10: 53 74 61 74 65 20 2a 70 65 6e 64 69 6e 67 54 63  State *pendingTc
1e20: 70 53 74 61 74 65 3b 0a 09 09 09 09 2f 2a 20 54  pState;...../* T
1e30: 68 69 73 20 73 6f 63 6b 65 74 20 69 73 20 6f 70  his socket is op
1e40: 65 6e 65 64 20 62 75 74 20 6e 6f 74 20 6a 65 74  ened but not jet
1e50: 20 69 6e 20 74 68 65 0a 09 09 09 09 20 2a 20 6c   in the..... * l
1e60: 69 73 74 2e 20 54 68 69 73 20 76 61 6c 75 65 20  ist. This value 
1e70: 69 73 20 61 6c 73 6f 20 63 68 65 63 6b 65 64 20  is also checked 
1e80: 62 79 0a 09 09 09 09 20 2a 20 74 68 65 20 65 76  by..... * the ev
1e90: 65 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ent structure. *
1ea0: 2f 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a  /.    TcpState *
1eb0: 73 6f 63 6b 65 74 4c 69 73 74 3b 09 2f 2a 20 45  socketList;./* E
1ec0: 76 65 72 79 20 6f 70 65 6e 20 73 6f 63 6b 65 74  very open socket
1ed0: 20 69 6e 20 74 68 69 73 20 74 68 72 65 61 64 20   in this thread 
1ee0: 68 61 73 20 61 6e 0a 09 09 09 09 20 2a 20 65 6e  has an..... * en
1ef0: 74 72 79 20 6f 6e 20 74 68 69 73 20 6c 69 73 74  try on this list
1f00: 2e 20 2a 2f 0a 7d 20 54 68 72 65 61 64 53 70 65  . */.} ThreadSpe
1f10: 63 69 66 69 63 44 61 74 61 3b 0a 0a 73 74 61 74  cificData;..stat
1f20: 69 63 20 54 63 6c 5f 54 68 72 65 61 64 44 61 74  ic Tcl_ThreadDat
1f30: 61 4b 65 79 20 64 61 74 61 4b 65 79 3b 0a 73 74  aKey dataKey;.st
1f40: 61 74 69 63 20 57 4e 44 43 4c 41 53 53 57 20 77  atic WNDCLASSW w
1f50: 69 6e 64 6f 77 43 6c 61 73 73 3b 0a 0a 2f 2a 0a  indowClass;../*.
1f60: 20 2a 20 53 74 61 74 69 63 20 72 6f 75 74 69 6e   * Static routin
1f70: 65 73 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  es for this file
1f80: 3a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  :. */..static in
1f90: 74 09 09 54 63 70 43 6f 6e 6e 65 63 74 28 54 63  t..TcpConnect(Tc
1fa0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1fb0: 2c 0a 09 09 09 20 20 20 20 54 63 70 53 74 61 74  ,....    TcpStat
1fc0: 65 20 2a 73 74 61 74 65 29 3b 0a 73 74 61 74 69  e *state);.stati
1fd0: 63 20 76 6f 69 64 09 09 49 6e 69 74 53 6f 63 6b  c void..InitSock
1fe0: 65 74 73 28 76 6f 69 64 29 3b 0a 73 74 61 74 69  ets(void);.stati
1ff0: 63 20 54 63 70 53 74 61 74 65 20 2a 09 4e 65 77  c TcpState *.New
2000: 53 6f 63 6b 65 74 49 6e 66 6f 28 53 4f 43 4b 45  SocketInfo(SOCKE
2010: 54 20 73 6f 63 6b 65 74 29 3b 0a 73 74 61 74 69  T socket);.stati
2020: 63 20 76 6f 69 64 09 09 53 6f 63 6b 65 74 45 78  c void..SocketEx
2030: 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  itHandler(void *
2040: 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 73 74 61  clientData);.sta
2050: 74 69 63 20 4c 52 45 53 55 4c 54 20 43 41 4c 4c  tic LRESULT CALL
2060: 42 41 43 4b 09 53 6f 63 6b 65 74 50 72 6f 63 28  BACK.SocketProc(
2070: 48 57 4e 44 20 68 77 6e 64 2c 20 55 49 4e 54 20  HWND hwnd, UINT 
2080: 6d 65 73 73 61 67 65 2c 20 57 50 41 52 41 4d 20  message, WPARAM 
2090: 77 50 61 72 61 6d 2c 0a 09 09 09 20 20 20 20 4c  wParam,....    L
20a0: 50 41 52 41 4d 20 6c 50 61 72 61 6d 29 3b 0a 73  PARAM lParam);.s
20b0: 74 61 74 69 63 20 69 6e 74 09 09 53 6f 63 6b 65  tatic int..Socke
20c0: 74 73 45 6e 61 62 6c 65 64 28 76 6f 69 64 29 3b  tsEnabled(void);
20d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 54 63  .static void..Tc
20e0: 70 41 63 63 65 70 74 28 54 63 70 46 64 4c 69 73  pAccept(TcpFdLis
20f0: 74 20 2a 66 64 73 2c 20 53 4f 43 4b 45 54 20 6e  t *fds, SOCKET n
2100: 65 77 53 6f 63 6b 65 74 2c 20 61 64 64 72 65 73  ewSocket, addres
2110: 73 20 61 64 64 72 29 3b 0a 73 74 61 74 69 63 20  s addr);.static 
2120: 69 6e 74 09 09 57 61 69 74 46 6f 72 43 6f 6e 6e  int..WaitForConn
2130: 65 63 74 28 54 63 70 53 74 61 74 65 20 2a 73 74  ect(TcpState *st
2140: 61 74 65 50 74 72 2c 20 69 6e 74 20 2a 65 72 72  atePtr, int *err
2150: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 73 74 61 74  orCodePtr);.stat
2160: 69 63 20 69 6e 74 09 09 57 61 69 74 46 6f 72 53  ic int..WaitForS
2170: 6f 63 6b 65 74 45 76 65 6e 74 28 54 63 70 53 74  ocketEvent(TcpSt
2180: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69  ate *statePtr, i
2190: 6e 74 20 65 76 65 6e 74 73 2c 0a 09 09 09 20 20  nt events,....  
21a0: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
21b0: 50 74 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  Ptr);.static voi
21c0: 64 09 09 41 64 64 53 6f 63 6b 65 74 49 6e 66 6f  d..AddSocketInfo
21d0: 46 64 28 54 63 70 53 74 61 74 65 20 2a 73 74 61  Fd(TcpState *sta
21e0: 74 65 50 74 72 2c 20 20 53 4f 43 4b 45 54 20 73  tePtr,  SOCKET s
21f0: 6f 63 6b 65 74 29 3b 0a 73 74 61 74 69 63 20 69  ocket);.static i
2200: 6e 74 09 09 46 69 6e 64 46 44 49 6e 4c 69 73 74  nt..FindFDInList
2210: 28 54 63 70 53 74 61 74 65 20 2a 73 74 61 74 65  (TcpState *state
2220: 50 74 72 2c 20 53 4f 43 4b 45 54 20 73 6f 63 6b  Ptr, SOCKET sock
2230: 65 74 29 3b 0a 73 74 61 74 69 63 20 44 57 4f 52  et);.static DWOR
2240: 44 20 57 49 4e 41 50 49 09 53 6f 63 6b 65 74 54  D WINAPI.SocketT
2250: 68 72 65 61 64 28 4c 50 56 4f 49 44 20 61 72 67  hread(LPVOID arg
2260: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09  );.static void..
2270: 54 63 70 54 68 72 65 61 64 41 63 74 69 6f 6e 50  TcpThreadActionP
2280: 72 6f 63 28 76 6f 69 64 20 2a 69 6e 73 74 61 6e  roc(void *instan
2290: 63 65 44 61 74 61 2c 0a 09 09 09 20 20 20 20 69  ceData,....    i
22a0: 6e 74 20 61 63 74 69 6f 6e 29 3b 0a 0a 73 74 61  nt action);..sta
22b0: 74 69 63 20 54 63 6c 5f 45 76 65 6e 74 43 68 65  tic Tcl_EventChe
22c0: 63 6b 50 72 6f 63 09 53 6f 63 6b 65 74 43 68 65  ckProc.SocketChe
22d0: 63 6b 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 54  ckProc;.static T
22e0: 63 6c 5f 45 76 65 6e 74 50 72 6f 63 09 09 53 6f  cl_EventProc..So
22f0: 63 6b 65 74 45 76 65 6e 74 50 72 6f 63 3b 0a 73  cketEventProc;.s
2300: 74 61 74 69 63 20 54 63 6c 5f 45 76 65 6e 74 53  tatic Tcl_EventS
2310: 65 74 75 70 50 72 6f 63 09 53 6f 63 6b 65 74 53  etupProc.SocketS
2320: 65 74 75 70 50 72 6f 63 3b 0a 73 74 61 74 69 63  etupProc;.static
2330: 20 54 63 6c 5f 44 72 69 76 65 72 42 6c 6f 63 6b   Tcl_DriverBlock
2340: 4d 6f 64 65 50 72 6f 63 09 54 63 70 42 6c 6f 63  ModeProc.TcpBloc
2350: 6b 4d 6f 64 65 50 72 6f 63 3b 0a 73 74 61 74 69  kModeProc;.stati
2360: 63 20 54 63 6c 5f 44 72 69 76 65 72 43 6c 6f 73  c Tcl_DriverClos
2370: 65 50 72 6f 63 09 54 63 70 43 6c 6f 73 65 50 72  eProc.TcpClosePr
2380: 6f 63 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 44  oc;.static Tcl_D
2390: 72 69 76 65 72 43 6c 6f 73 65 32 50 72 6f 63 09  riverClose2Proc.
23a0: 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 3b 0a 73  TcpClose2Proc;.s
23b0: 74 61 74 69 63 20 54 63 6c 5f 44 72 69 76 65 72  tatic Tcl_Driver
23c0: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 09 54 63  SetOptionProc.Tc
23d0: 70 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a  pSetOptionProc;.
23e0: 73 74 61 74 69 63 20 54 63 6c 5f 44 72 69 76 65  static Tcl_Drive
23f0: 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 09 54  rGetOptionProc.T
2400: 63 70 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b  cpGetOptionProc;
2410: 0a 73 74 61 74 69 63 20 54 63 6c 5f 44 72 69 76  .static Tcl_Driv
2420: 65 72 49 6e 70 75 74 50 72 6f 63 09 54 63 70 49  erInputProc.TcpI
2430: 6e 70 75 74 50 72 6f 63 3b 0a 73 74 61 74 69 63  nputProc;.static
2440: 20 54 63 6c 5f 44 72 69 76 65 72 4f 75 74 70 75   Tcl_DriverOutpu
2450: 74 50 72 6f 63 09 54 63 70 4f 75 74 70 75 74 50  tProc.TcpOutputP
2460: 72 6f 63 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f  roc;.static Tcl_
2470: 44 72 69 76 65 72 57 61 74 63 68 50 72 6f 63 09  DriverWatchProc.
2480: 54 63 70 57 61 74 63 68 50 72 6f 63 3b 0a 73 74  TcpWatchProc;.st
2490: 61 74 69 63 20 54 63 6c 5f 44 72 69 76 65 72 47  atic Tcl_DriverG
24a0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 09 54 63 70  etHandleProc.Tcp
24b0: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 3b 0a 0a  GetHandleProc;..
24c0: 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63  /*. * This struc
24d0: 74 75 72 65 20 64 65 73 63 72 69 62 65 73 20 74  ture describes t
24e0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 20  he channel type 
24f0: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 54 43  structure for TC
2500: 50 20 73 6f 63 6b 65 74 0a 20 2a 20 62 61 73 65  P socket. * base
2510: 64 20 49 4f 3a 0a 20 2a 2f 0a 0a 73 74 61 74 69  d IO:. */..stati
2520: 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e  c const Tcl_Chan
2530: 6e 65 6c 54 79 70 65 20 74 63 70 43 68 61 6e 6e  nelType tcpChann
2540: 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 22  elType = {.    "
2550: 74 63 70 22 2c 09 09 09 2f 2a 20 54 79 70 65 20  tcp",.../* Type 
2560: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 43 4c  name. */.    TCL
2570: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
2580: 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 6e 6e 65  _5,./* v5 channe
2590: 6c 20 2a 2f 0a 20 20 20 20 54 63 70 43 6c 6f 73  l */.    TcpClos
25a0: 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65  eProc,../* Close
25b0: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 54 63   proc. */.    Tc
25c0: 70 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20  pInputProc,../* 
25d0: 49 6e 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20  Input proc. */. 
25e0: 20 20 20 54 63 70 4f 75 74 70 75 74 50 72 6f 63     TcpOutputProc
25f0: 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f  ,../* Output pro
2600: 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09  c. */.    NULL,.
2610: 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 2e 20  ../* Seek proc. 
2620: 2a 2f 0a 20 20 20 20 54 63 70 53 65 74 4f 70 74  */.    TcpSetOpt
2630: 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74  ionProc,../* Set
2640: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f   option proc. */
2650: 0a 20 20 20 20 54 63 70 47 65 74 4f 70 74 69 6f  .    TcpGetOptio
2660: 6e 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 6f  nProc,../* Get o
2670: 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20  ption proc. */. 
2680: 20 20 20 54 63 70 57 61 74 63 68 50 72 6f 63 2c     TcpWatchProc,
2690: 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
26a0: 6e 6f 74 69 66 69 65 72 2e 20 2a 2f 0a 20 20 20  notifier. */.   
26b0: 20 54 63 70 47 65 74 48 61 6e 64 6c 65 50 72 6f   TcpGetHandlePro
26c0: 63 2c 09 09 2f 2a 20 47 65 74 20 4f 53 20 68 61  c,../* Get OS ha
26d0: 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61  ndles out of cha
26e0: 6e 6e 65 6c 2e 20 2a 2f 0a 20 20 20 20 54 63 70  nnel. */.    Tcp
26f0: 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20  Close2Proc,../* 
2700: 43 6c 6f 73 65 32 20 70 72 6f 63 2e 20 2a 2f 0a  Close2 proc. */.
2710: 20 20 20 20 54 63 70 42 6c 6f 63 6b 4d 6f 64 65      TcpBlockMode
2720: 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20 62 6c  Proc,../* Set bl
2730: 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 2d 62 6c  ocking or non-bl
2740: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a 20  ocking mode.*/. 
2750: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 66 6c     NULL,.../* fl
2760: 75 73 68 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20  ush proc. */.   
2770: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 68 61 6e 64   NULL,.../* hand
2780: 6c 65 72 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20  ler proc. */.   
2790: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 77 69 64 65   NULL,.../* wide
27a0: 20 73 65 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a 20   seek proc. */. 
27b0: 20 20 20 54 63 70 54 68 72 65 61 64 41 63 74 69     TcpThreadActi
27c0: 6f 6e 50 72 6f 63 2c 09 2f 2a 20 74 68 72 65 61  onProc,./* threa
27d0: 64 20 61 63 74 69 6f 6e 20 70 72 6f 63 2e 20 2a  d action proc. *
27e0: 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20  /.    NULL.../* 
27f0: 74 72 75 6e 63 61 74 65 20 70 72 6f 63 2e 20 2a  truncate proc. *
2800: 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  /.};../*. * The 
2810: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
2820: 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 6e 65 74  le holds the net
2830: 77 6f 72 6b 20 6e 61 6d 65 20 6f 66 20 74 68 69  work name of thi
2840: 73 20 68 6f 73 74 2e 0a 20 2a 2f 0a 0a 73 74 61  s host.. */..sta
2850: 74 69 63 20 54 63 6c 49 6e 69 74 50 72 6f 63 65  tic TclInitProce
2860: 73 73 47 6c 6f 62 61 6c 56 61 6c 75 65 50 72 6f  ssGlobalValuePro
2870: 63 20 49 6e 69 74 69 61 6c 69 7a 65 48 6f 73 74  c InitializeHost
2880: 4e 61 6d 65 3b 0a 73 74 61 74 69 63 20 50 72 6f  Name;.static Pro
2890: 63 65 73 73 47 6c 6f 62 61 6c 56 61 6c 75 65 20  cessGlobalValue 
28a0: 68 6f 73 74 4e 61 6d 65 20 3d 0a 09 7b 30 2c 20  hostName =..{0, 
28b0: 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 49  0, NULL, NULL, I
28c0: 6e 69 74 69 61 6c 69 7a 65 48 6f 73 74 4e 61 6d  nitializeHostNam
28d0: 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 7d 3b 0a  e, NULL, NULL};.
28e0: 0a 2f 2a 0a 20 2a 20 53 69 6d 70 6c 65 20 77 72  ./*. * Simple wr
28f0: 61 70 70 65 72 20 72 6f 75 6e 64 20 74 68 65 20  apper round the 
2900: 53 65 6e 64 4d 65 73 73 61 67 65 20 73 79 73 63  SendMessage sysc
2910: 61 6c 6c 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e  all.. */..#defin
2920: 65 20 53 65 6e 64 53 65 6c 65 63 74 4d 65 73 73  e SendSelectMess
2930: 61 67 65 28 74 73 64 50 74 72 2c 20 6d 65 73 73  age(tsdPtr, mess
2940: 61 67 65 2c 20 70 61 79 6c 6f 61 64 29 20 20 20  age, payload)   
2950: 20 20 5c 0a 20 20 20 20 53 65 6e 64 4d 65 73 73    \.    SendMess
2960: 61 67 65 57 28 28 74 73 64 50 74 72 29 2d 3e 68  ageW((tsdPtr)->h
2970: 77 6e 64 2c 20 53 4f 43 4b 45 54 5f 53 45 4c 45  wnd, SOCKET_SELE
2980: 43 54 2c 20 20 20 20 20 20 20 20 20 20 5c 0a 20  CT,          \. 
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
29a0: 57 50 41 52 41 4d 29 20 28 6d 65 73 73 61 67 65  WPARAM) (message
29b0: 29 2c 20 28 4c 50 41 52 41 4d 29 20 28 70 61 79  ), (LPARAM) (pay
29c0: 6c 6f 61 64 29 29 0a 0a 0c 0a 2f 2a 0a 20 2a 20  load))..../*. * 
29d0: 41 64 64 72 65 73 73 20 70 72 69 6e 74 20 64 65  Address print de
29e0: 62 75 67 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  bug functions. *
29f0: 2f 0a 23 69 66 20 30 0a 76 6f 69 64 0a 70 72 69  /.#if 0.void.pri
2a00: 6e 74 61 64 64 72 69 6e 66 6f 28 0a 20 20 20 20  ntaddrinfo(.    
2a10: 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20  struct addrinfo 
2a20: 2a 61 69 2c 0a 20 20 20 20 63 68 61 72 20 2a 70  *ai,.    char *p
2a30: 72 65 66 69 78 29 0a 7b 0a 20 20 20 20 63 68 61  refix).{.    cha
2a40: 72 20 68 6f 73 74 5b 4e 49 5f 4d 41 58 48 4f 53  r host[NI_MAXHOS
2a50: 54 5d 2c 20 70 6f 72 74 5b 4e 49 5f 4d 41 58 53  T], port[NI_MAXS
2a60: 45 52 56 5d 3b 0a 0a 20 20 20 20 67 65 74 6e 61  ERV];..    getna
2a70: 6d 65 69 6e 66 6f 28 61 69 2d 3e 61 69 5f 61 64  meinfo(ai->ai_ad
2a80: 64 72 2c 20 61 69 2d 3e 61 69 5f 61 64 64 72 6c  dr, ai->ai_addrl
2a90: 65 6e 2c 0a 09 20 20 20 20 68 6f 73 74 2c 20 73  en,..    host, s
2aa0: 69 7a 65 6f 66 28 68 6f 73 74 29 2c 20 70 6f 72  izeof(host), por
2ab0: 74 2c 20 73 69 7a 65 6f 66 28 70 6f 72 74 29 2c  t, sizeof(port),
2ac0: 0a 09 20 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43  ..    NI_NUMERIC
2ad0: 48 4f 53 54 7c 4e 49 5f 4e 55 4d 45 52 49 43 53  HOST|NI_NUMERICS
2ae0: 45 52 56 29 3b 0a 7d 0a 0a 76 6f 69 64 0a 70 72  ERV);.}..void.pr
2af0: 69 6e 74 61 64 64 72 69 6e 66 6f 6c 69 73 74 28  intaddrinfolist(
2b00: 0a 20 20 20 20 73 74 72 75 63 74 20 61 64 64 72  .    struct addr
2b10: 69 6e 66 6f 20 2a 61 64 64 72 6c 69 73 74 2c 0a  info *addrlist,.
2b20: 20 20 20 20 63 68 61 72 20 2a 70 72 65 66 69 78      char *prefix
2b30: 29 0a 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61  ).{.    struct a
2b40: 64 64 72 69 6e 66 6f 20 2a 61 69 3b 0a 0a 20 20  ddrinfo *ai;..  
2b50: 20 20 66 6f 72 20 28 61 69 20 3d 20 61 64 64 72    for (ai = addr
2b60: 6c 69 73 74 3b 20 61 69 20 21 3d 20 4e 55 4c 4c  list; ai != NULL
2b70: 3b 20 61 69 20 3d 20 61 69 2d 3e 61 69 5f 6e 65  ; ai = ai->ai_ne
2b80: 78 74 29 20 7b 0a 09 70 72 69 6e 74 61 64 64 72  xt) {..printaddr
2b90: 69 6e 66 6f 28 61 69 2c 20 70 72 65 66 69 78 29  info(ai, prefix)
2ba0: 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ;.    }.}.#endif
2bb0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2c00: 2a 0a 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 48  *. * InitializeH
2c10: 6f 73 74 4e 61 6d 65 20 2d 2d 0a 20 2a 0a 20 2a  ostName --. *. *
2c20: 09 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65  .This routine se
2c30: 74 73 20 74 68 65 20 70 72 6f 63 65 73 73 20 67  ts the process g
2c40: 6c 6f 62 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  lobal value of t
2c50: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6c  he name of the l
2c60: 6f 63 61 6c 0a 20 2a 09 68 6f 73 74 20 6f 6e 20  ocal. *.host on 
2c70: 77 68 69 63 68 20 74 68 65 20 70 72 6f 63 65 73  which the proces
2c80: 73 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 20 2a  s is running.. *
2c90: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
2ca0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cf0: 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 49 6e 69 74  -. */..void.Init
2d00: 69 61 6c 69 7a 65 48 6f 73 74 4e 61 6d 65 28 0a  ializeHostName(.
2d10: 20 20 20 20 63 68 61 72 20 2a 2a 76 61 6c 75 65      char **value
2d20: 50 74 72 2c 0a 20 20 20 20 69 6e 74 20 2a 6c 65  Ptr,.    int *le
2d30: 6e 67 74 68 50 74 72 2c 0a 20 20 20 20 54 63 6c  ngthPtr,.    Tcl
2d40: 5f 45 6e 63 6f 64 69 6e 67 20 2a 65 6e 63 6f 64  _Encoding *encod
2d50: 69 6e 67 50 74 72 29 0a 7b 0a 20 20 20 20 57 43  ingPtr).{.    WC
2d60: 48 41 52 20 77 62 75 66 5b 32 35 36 5d 3b 0a 20  HAR wbuf[256];. 
2d70: 20 20 20 44 57 4f 52 44 20 6c 65 6e 67 74 68 20     DWORD length 
2d80: 3d 20 73 69 7a 65 6f 66 28 77 62 75 66 29 2f 73  = sizeof(wbuf)/s
2d90: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20  izeof(WCHAR);.  
2da0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73    Tcl_DString ds
2db0: 3b 0a 0a 20 20 20 20 69 66 20 28 47 65 74 43 6f  ;..    if (GetCo
2dc0: 6d 70 75 74 65 72 4e 61 6d 65 45 78 57 28 43 6f  mputerNameExW(Co
2dd0: 6d 70 75 74 65 72 4e 61 6d 65 50 68 79 73 69 63  mputerNamePhysic
2de0: 61 6c 44 6e 73 46 75 6c 6c 79 51 75 61 6c 69 66  alDnsFullyQualif
2df0: 69 65 64 2c 20 77 62 75 66 2c 20 26 6c 65 6e 67  ied, wbuf, &leng
2e00: 74 68 29 20 21 3d 20 30 29 20 7b 0a 09 2f 2a 0a  th) != 0) {../*.
2e10: 09 20 2a 20 43 6f 6e 76 65 72 74 20 73 74 72 69  . * Convert stri
2e20: 6e 67 20 66 72 6f 6d 20 6e 61 74 69 76 65 20 74  ng from native t
2e30: 6f 20 55 54 46 20 74 68 65 6e 20 63 68 61 6e 67  o UTF then chang
2e40: 65 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 2e 0a  e to lowercase..
2e50: 09 20 2a 2f 0a 0a 09 54 63 6c 5f 55 74 66 54 6f  . */...Tcl_UtfTo
2e60: 4c 6f 77 65 72 28 54 63 6c 5f 57 69 6e 54 43 68  Lower(Tcl_WinTCh
2e70: 61 72 54 6f 55 74 66 28 28 54 43 48 41 52 20 2a  arToUtf((TCHAR *
2e80: 29 77 62 75 66 2c 20 2d 31 2c 20 26 64 73 29 29  )wbuf, -1, &ds))
2e90: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
2ea0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74  .Tcl_DStringInit
2eb0: 28 26 64 73 29 3b 0a 09 69 66 20 28 54 63 6c 70  (&ds);..if (Tclp
2ec0: 48 61 73 53 6f 63 6b 65 74 73 28 4e 55 4c 4c 29  HasSockets(NULL)
2ed0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   == TCL_OK) {.. 
2ee0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68     /*..     * Th
2ef0: 65 20 62 75 66 66 65 72 20 73 69 7a 65 20 6f 66  e buffer size of
2f00: 20 32 35 36 20 69 73 20 72 65 63 6f 6d 6d 65 6e   256 is recommen
2f10: 64 65 64 20 62 79 20 74 68 65 20 4d 53 44 4e 20  ded by the MSDN 
2f20: 70 61 67 65 20 74 68 61 74 0a 09 20 20 20 20 20  page that..     
2f30: 2a 20 64 6f 63 75 6d 65 6e 74 73 20 67 65 74 68  * documents geth
2f40: 6f 73 74 6e 61 6d 65 28 29 20 61 73 20 62 65 69  ostname() as bei
2f50: 6e 67 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  ng always adequa
2f60: 74 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  te...     */... 
2f70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 69     Tcl_DString i
2f80: 6e 44 73 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 44  nDs;...    Tcl_D
2f90: 53 74 72 69 6e 67 49 6e 69 74 28 26 69 6e 44 73  StringInit(&inDs
2fa0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
2fb0: 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 26 69 6e  ingSetLength(&in
2fc0: 44 73 2c 20 32 35 36 29 3b 0a 09 20 20 20 20 69  Ds, 256);..    i
2fd0: 66 20 28 67 65 74 68 6f 73 74 6e 61 6d 65 28 54  f (gethostname(T
2fe0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
2ff0: 26 69 6e 44 73 29 2c 0a 09 09 20 20 20 20 54 63  &inDs),...    Tc
3000: 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28  l_DStringLength(
3010: 26 69 6e 44 73 29 29 20 3d 3d 20 30 29 20 7b 0a  &inDs)) == 0) {.
3020: 09 09 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f  ..Tcl_ExternalTo
3030: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
3040: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
3050: 65 28 26 69 6e 44 73 29 2c 0a 09 09 09 2d 31 2c  e(&inDs),....-1,
3060: 20 26 64 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20   &ds);..    }.. 
3070: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
3080: 65 65 28 26 69 6e 44 73 29 3b 0a 09 7d 0a 20 20  ee(&inDs);..}.  
3090: 20 20 7d 0a 0a 20 20 20 20 2a 65 6e 63 6f 64 69    }..    *encodi
30a0: 6e 67 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45  ngPtr = Tcl_GetE
30b0: 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c 20 22 75  ncoding(NULL, "u
30c0: 74 66 2d 38 22 29 3b 0a 20 20 20 20 2a 6c 65 6e  tf-8");.    *len
30d0: 67 74 68 50 74 72 20 3d 20 54 63 6c 5f 44 53 74  gthPtr = Tcl_DSt
30e0: 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 3b  ringLength(&ds);
30f0: 0a 20 20 20 20 2a 76 61 6c 75 65 50 74 72 20 3d  .    *valuePtr =
3100: 20 28 63 68 61 72 20 2a 29 63 6b 61 6c 6c 6f 63   (char *)ckalloc
3110: 28 2a 6c 65 6e 67 74 68 50 74 72 20 2b 20 31 29  (*lengthPtr + 1)
3120: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 2a 76 61  ;.    memcpy(*va
3130: 6c 75 65 50 74 72 2c 20 54 63 6c 5f 44 53 74 72  luePtr, Tcl_DStr
3140: 69 6e 67 56 61 6c 75 65 28 26 64 73 29 2c 20 2a  ingValue(&ds), *
3150: 6c 65 6e 67 74 68 50 74 72 20 2b 20 31 29 3b 0a  lengthPtr + 1);.
3160: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
3170: 72 65 65 28 26 64 73 29 3b 0a 7d 0a 0c 0a 2f 2a  ree(&ds);.}.../*
3180: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
31d0: 54 63 6c 5f 47 65 74 48 6f 73 74 4e 61 6d 65 20  Tcl_GetHostName 
31e0: 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 73  --. *. *.Returns
31f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
3200: 20 6c 6f 63 61 6c 20 68 6f 73 74 2e 0a 20 2a 0a   local host.. *.
3210: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
3220: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
3230: 6e 67 20 74 68 65 20 6e 65 74 77 6f 72 6b 20 6e  ng the network n
3240: 61 6d 65 20 66 6f 72 20 74 68 69 73 20 6d 61 63  ame for this mac
3250: 68 69 6e 65 2c 20 6f 72 20 61 6e 20 65 6d 70 74  hine, or an empt
3260: 79 0a 20 2a 09 73 74 72 69 6e 67 20 69 66 20 77  y. *.string if w
3270: 65 20 63 61 6e 27 74 20 66 69 67 75 72 65 20 6f  e can't figure o
3280: 75 74 20 74 68 65 20 6e 61 6d 65 2e 20 54 68 65  ut the name. The
3290: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 6e 6f 74   caller must not
32a0: 20 6d 6f 64 69 66 79 20 6f 72 0a 20 2a 09 66 72   modify or. *.fr
32b0: 65 65 20 74 68 69 73 20 73 74 72 69 6e 67 2e 0a  ee this string..
32c0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
32d0: 74 73 3a 0a 20 2a 09 43 61 63 68 65 73 20 74 68  ts:. *.Caches th
32e0: 65 20 6e 61 6d 65 20 74 6f 20 72 65 74 75 72 6e  e name to return
32f0: 20 66 6f 72 20 66 75 74 75 72 65 20 63 61 6c 6c   for future call
3300: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3350: 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  */..const char *
3360: 0a 54 63 6c 5f 47 65 74 48 6f 73 74 4e 61 6d 65  .Tcl_GetHostName
3370: 28 76 6f 69 64 29 0a 7b 0a 20 20 20 20 72 65 74  (void).{.    ret
3380: 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  urn Tcl_GetStrin
3390: 67 28 54 63 6c 47 65 74 50 72 6f 63 65 73 73 47  g(TclGetProcessG
33a0: 6c 6f 62 61 6c 56 61 6c 75 65 28 26 68 6f 73 74  lobalValue(&host
33b0: 4e 61 6d 65 29 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  Name));.}.../*. 
33c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63  -------. *. * Tc
3410: 6c 70 48 61 73 53 6f 63 6b 65 74 73 20 2d 2d 0a  lpHasSockets --.
3420: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
3430: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
3440: 68 65 74 68 65 72 20 73 6f 63 6b 65 74 73 20 61  hether sockets a
3450: 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
3460: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 2a 09 73  the current. *.s
3470: 79 73 74 65 6d 20 61 6e 64 20 72 65 74 75 72 6e  ystem and return
3480: 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 69 6e  s an error in in
3490: 74 65 72 70 20 69 66 20 74 68 65 79 20 61 72 65  terp if they are
34a0: 20 6e 6f 74 2e 20 4e 6f 74 65 20 74 68 61 74 0a   not. Note that.
34b0: 20 2a 09 69 6e 74 65 72 70 20 6d 61 79 20 62 65   *.interp may be
34c0: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73   NULL.. *. * Res
34d0: 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73  ults:. *.Returns
34e0: 20 54 43 4c 5f 4f 4b 20 69 66 20 74 68 65 20 73   TCL_OK if the s
34f0: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 73  ystem supports s
3500: 6f 63 6b 65 74 73 2c 20 6f 72 20 54 43 4c 5f 45  ockets, or TCL_E
3510: 52 52 4f 52 20 77 69 74 68 20 61 6e 0a 20 2a 09  RROR with an. *.
3520: 65 72 72 6f 72 20 69 6e 20 69 6e 74 65 72 70 20  error in interp 
3530: 28 69 66 20 6e 6f 6e 2d 4e 55 4c 4c 29 2e 0a 20  (if non-NULL).. 
3540: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3550: 73 3a 0a 20 2a 09 49 66 20 6e 6f 74 20 61 6c 72  s:. *.If not alr
3560: 65 61 64 79 20 70 72 65 70 61 72 65 64 2c 20 69  eady prepared, i
3570: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 54  nitializes the T
3580: 53 44 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  SD structure and
3590: 20 73 6f 63 6b 65 74 0a 20 2a 09 6d 65 73 73 61   socket. *.messa
35a0: 67 65 20 68 61 6e 64 6c 69 6e 67 20 74 68 72 65  ge handling thre
35b0: 61 64 20 61 73 73 6f 63 69 61 74 65 64 20 74 6f  ad associated to
35c0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 74 68 72   the calling thr
35d0: 65 61 64 20 66 6f 72 20 74 68 65 0a 20 2a 09 73  ead for the. *.s
35e0: 75 62 73 79 73 74 65 6d 20 6f 66 20 74 68 65 20  ubsystem of the 
35f0: 64 72 69 76 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d  driver.. *. *---
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c  ---. */..int.Tcl
3650: 70 48 61 73 53 6f 63 6b 65 74 73 28 0a 20 20 20  pHasSockets(.   
3660: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3670: 65 72 70 29 09 09 2f 2a 20 57 68 65 72 65 20 74  erp)../* Where t
3680: 6f 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  o write an error
3690: 20 6d 65 73 73 61 67 65 20 69 66 20 73 6f 63 6b   message if sock
36a0: 65 74 73 0a 09 09 09 09 20 2a 20 61 72 65 20 6e  ets..... * are n
36b0: 6f 74 20 70 72 65 73 65 6e 74 2c 20 6f 72 20 4e  ot present, or N
36c0: 55 4c 4c 20 69 66 20 6e 6f 20 73 75 63 68 20 6d  ULL if no such m
36d0: 65 73 73 61 67 65 0a 09 09 09 09 20 2a 20 69 73  essage..... * is
36e0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 2e 20   to be written. 
36f0: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4d 75 74  */.{.    Tcl_Mut
3700: 65 78 4c 6f 63 6b 28 26 73 6f 63 6b 65 74 4d 75  exLock(&socketMu
3710: 74 65 78 29 3b 0a 20 20 20 20 49 6e 69 74 53 6f  tex);.    InitSo
3720: 63 6b 65 74 73 28 29 3b 0a 20 20 20 20 54 63 6c  ckets();.    Tcl
3730: 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 73 6f  _MutexUnlock(&so
3740: 63 6b 65 74 4d 75 74 65 78 29 3b 0a 0a 20 20 20  cketMutex);..   
3750: 20 69 66 20 28 53 6f 63 6b 65 74 73 45 6e 61 62   if (SocketsEnab
3760: 6c 65 64 28 29 29 20 7b 0a 09 72 65 74 75 72 6e  led()) {..return
3770: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
3780: 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 21 3d     if (interp !=
3790: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 53 65   NULL) {..Tcl_Se
37a0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
37b0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
37c0: 4f 62 6a 28 0a 09 09 22 73 6f 63 6b 65 74 73 20  Obj(..."sockets 
37d0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
37e0: 65 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d  e on this system
37f0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20  ", -1));.    }. 
3800: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3810: 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ROR;.}.../*. *--
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 46  ----. *. * TclpF
3870: 69 6e 61 6c 69 7a 65 53 6f 63 6b 65 74 73 20 2d  inalizeSockets -
3880: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
3890: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
38a0: 66 72 6f 6d 20 54 63 6c 5f 46 69 6e 61 6c 69 7a  from Tcl_Finaliz
38b0: 65 54 68 72 65 61 64 20 74 6f 20 66 69 6e 61 6c  eThread to final
38c0: 69 7a 65 20 74 68 65 0a 20 2a 09 70 6c 61 74 66  ize the. *.platf
38d0: 6f 72 6d 20 73 70 65 63 69 66 69 63 20 73 6f 63  orm specific soc
38e0: 6b 65 74 20 73 75 62 73 79 73 74 65 6d 2e 20 41  ket subsystem. A
38f0: 6c 73 6f 2c 20 69 74 20 6d 61 79 20 62 65 20 63  lso, it may be c
3900: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
3910: 6e 0a 20 2a 09 74 68 69 73 20 6d 6f 64 75 6c 65  n. *.this module
3920: 20 74 6f 20 63 6c 65 61 6e 75 70 20 74 68 65 20   to cleanup the 
3930: 73 74 61 74 65 20 69 66 20 75 6e 61 62 6c 65 20  state if unable 
3940: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
3950: 65 20 73 6f 63 6b 65 74 73 0a 20 2a 09 73 75 62  e sockets. *.sub
3960: 73 79 73 74 65 6d 2e 0a 20 2a 0a 20 2a 20 52 65  system.. *. * Re
3970: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
3980: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3990: 74 73 3a 0a 20 2a 09 44 65 6c 65 74 65 73 20 74  ts:. *.Deletes t
39a0: 68 65 20 65 76 65 6e 74 20 73 6f 75 72 63 65 20  he event source 
39b0: 61 6e 64 20 64 65 73 74 72 6f 79 73 20 74 68 65  and destroys the
39c0: 20 73 6f 63 6b 65 74 20 74 68 72 65 61 64 2e 0a   socket thread..
39d0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3a20: 0a 76 6f 69 64 0a 54 63 6c 70 46 69 6e 61 6c 69  .void.TclpFinali
3a30: 7a 65 53 6f 63 6b 65 74 73 28 76 6f 69 64 29 0a  zeSockets(void).
3a40: 7b 0a 20 20 20 20 54 68 72 65 61 64 53 70 65 63  {.    ThreadSpec
3a50: 69 66 69 63 44 61 74 61 20 2a 74 73 64 50 74 72  ificData *tsdPtr
3a60: 20 3d 20 28 54 68 72 65 61 64 53 70 65 63 69 66   = (ThreadSpecif
3a70: 69 63 44 61 74 61 20 2a 29 54 63 6c 54 68 72 65  icData *)TclThre
3a80: 61 64 44 61 74 61 4b 65 79 47 65 74 28 26 64 61  adDataKeyGet(&da
3a90: 74 61 4b 65 79 29 3b 0a 0a 20 20 20 20 2f 2a 0a  taKey);..    /*.
3aa0: 20 20 20 20 20 2a 20 43 61 72 65 66 75 6c 21 20       * Careful! 
3ab0: 54 68 69 73 20 69 73 20 61 20 66 69 6e 61 6c 69  This is a finali
3ac0: 7a 65 72 21 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  zer!.     */..  
3ad0: 20 20 69 66 20 28 74 73 64 50 74 72 20 3d 3d 20    if (tsdPtr == 
3ae0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NULL) {..return;
3af0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
3b00: 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 54 68  tsdPtr->socketTh
3b10: 72 65 61 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  read != NULL) {.
3b20: 09 69 66 20 28 74 73 64 50 74 72 2d 3e 68 77 6e  .if (tsdPtr->hwn
3b30: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  d != NULL) {..  
3b40: 20 20 50 6f 73 74 4d 65 73 73 61 67 65 57 28 74    PostMessageW(t
3b50: 73 64 50 74 72 2d 3e 68 77 6e 64 2c 20 53 4f 43  sdPtr->hwnd, SOC
3b60: 4b 45 54 5f 54 45 52 4d 49 4e 41 54 45 2c 20 30  KET_TERMINATE, 0
3b70: 2c 20 30 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09  , 0);...    /*..
3b80: 20 20 20 20 20 2a 20 57 61 69 74 20 66 6f 72 20       * Wait for 
3b90: 74 68 65 20 74 68 72 65 61 64 20 74 6f 20 65 78  the thread to ex
3ba0: 69 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  it. This ensures
3bb0: 20 74 68 61 74 20 77 65 20 61 72 65 0a 09 20 20   that we are..  
3bc0: 20 20 20 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20     * completely 
3bd0: 63 6c 65 61 6e 65 64 20 75 70 20 62 65 66 6f 72  cleaned up befor
3be0: 65 20 77 65 20 6c 65 61 76 65 20 74 68 69 73 20  e we leave this 
3bf0: 66 75 6e 63 74 69 6f 6e 2e 0a 09 20 20 20 20 20  function...     
3c00: 2a 2f 0a 0a 09 20 20 20 20 57 61 69 74 46 6f 72  */...    WaitFor
3c10: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64  SingleObject(tsd
3c20: 50 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 2c  Ptr->readyEvent,
3c30: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 09 20 20 20   INFINITE);..   
3c40: 20 74 73 64 50 74 72 2d 3e 68 77 6e 64 20 3d 20   tsdPtr->hwnd = 
3c50: 4e 55 4c 4c 3b 0a 09 7d 0a 09 43 6c 6f 73 65 48  NULL;..}..CloseH
3c60: 61 6e 64 6c 65 28 74 73 64 50 74 72 2d 3e 73 6f  andle(tsdPtr->so
3c70: 63 6b 65 74 54 68 72 65 61 64 29 3b 0a 09 74 73  cketThread);..ts
3c80: 64 50 74 72 2d 3e 73 6f 63 6b 65 74 54 68 72 65  dPtr->socketThre
3c90: 61 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ad = NULL;.    }
3ca0: 0a 20 20 20 20 69 66 20 28 74 73 64 50 74 72 2d  .    if (tsdPtr-
3cb0: 3e 72 65 61 64 79 45 76 65 6e 74 20 21 3d 20 4e  >readyEvent != N
3cc0: 55 4c 4c 29 20 7b 0a 09 43 6c 6f 73 65 48 61 6e  ULL) {..CloseHan
3cd0: 64 6c 65 28 74 73 64 50 74 72 2d 3e 72 65 61 64  dle(tsdPtr->read
3ce0: 79 45 76 65 6e 74 29 3b 0a 09 74 73 64 50 74 72  yEvent);..tsdPtr
3cf0: 2d 3e 72 65 61 64 79 45 76 65 6e 74 20 3d 20 4e  ->readyEvent = N
3d00: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
3d10: 66 20 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65  f (tsdPtr->socke
3d20: 74 4c 69 73 74 4c 6f 63 6b 20 21 3d 20 4e 55 4c  tListLock != NUL
3d30: 4c 29 20 7b 0a 09 43 6c 6f 73 65 48 61 6e 64 6c  L) {..CloseHandl
3d40: 65 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74  e(tsdPtr->socket
3d50: 4c 69 73 74 4c 6f 63 6b 29 3b 0a 09 74 73 64 50  ListLock);..tsdP
3d60: 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f  tr->socketListLo
3d70: 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ck = NULL;.    }
3d80: 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 45  .    Tcl_DeleteE
3d90: 76 65 6e 74 53 6f 75 72 63 65 28 53 6f 63 6b 65  ventSource(Socke
3da0: 74 53 65 74 75 70 50 72 6f 63 2c 20 53 6f 63 6b  tSetupProc, Sock
3db0: 65 74 43 68 65 63 6b 50 72 6f 63 2c 20 4e 55 4c  etCheckProc, NUL
3dc0: 4c 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  L);.}.../*. *---
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e10: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 70 42 6c 6f  ---. *. * TcpBlo
3e20: 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a  ckModeProc --. *
3e30: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
3e40: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  n is invoked by 
3e50: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
3e60: 65 76 65 6c 20 74 6f 20 73 65 74 20 62 6c 6f 63  evel to set bloc
3e70: 6b 69 6e 67 20 61 6e 64 0a 20 2a 09 6e 6f 6e 62  king and. *.nonb
3e80: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 6f 6e 20  locking mode on 
3e90: 61 20 54 43 50 20 73 6f 63 6b 65 74 20 62 61 73  a TCP socket bas
3ea0: 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  ed channel.. *. 
3eb0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20  * Results:. *.0 
3ec0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65  if successful, e
3ed0: 72 72 6e 6f 20 77 68 65 6e 20 66 61 69 6c 65 64  rrno when failed
3ee0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
3ef0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68  ects:. *.Sets th
3f00: 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c  e device into bl
3f10: 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f  ocking or nonblo
3f20: 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20  cking mode.. *. 
3f30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f70: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
3f80: 74 69 63 20 69 6e 74 0a 54 63 70 42 6c 6f 63 6b  tic int.TcpBlock
3f90: 4d 6f 64 65 50 72 6f 63 28 0a 20 20 20 20 76 6f  ModeProc(.    vo
3fa0: 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61  id *instanceData
3fb0: 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74  ,./* Socket stat
3fc0: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f  e. */.    int mo
3fd0: 64 65 29 09 09 09 2f 2a 20 54 68 65 20 6d 6f 64  de).../* The mod
3fe0: 65 20 74 6f 20 73 65 74 2e 20 43 61 6e 20 62 65  e to set. Can be
3ff0: 20 6f 6e 65 20 6f 66 0a 09 09 09 09 20 2a 20 54   one of..... * T
4000: 43 4c 5f 4d 4f 44 45 5f 42 4c 4f 43 4b 49 4e 47  CL_MODE_BLOCKING
4010: 20 6f 72 0a 09 09 09 09 20 2a 20 54 43 4c 5f 4d   or..... * TCL_M
4020: 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 2e  ODE_NONBLOCKING.
4030: 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 70 53 74 61   */.{.    TcpSta
4040: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
4050: 54 63 70 53 74 61 74 65 20 2a 29 69 6e 73 74 61  TcpState *)insta
4060: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66  nceData;..    if
4070: 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f   (mode == TCL_MO
4080: 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20  DE_NONBLOCKING) 
4090: 7b 0a 09 53 45 54 5f 42 49 54 53 28 73 74 61 74  {..SET_BITS(stat
40a0: 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50  ePtr->flags, TCP
40b0: 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 3b 0a 20  _NONBLOCKING);. 
40c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 43 4c 45     } else {..CLE
40d0: 41 52 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  AR_BITS(statePtr
40e0: 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f 4e 4f 4e  ->flags, TCP_NON
40f0: 42 4c 4f 43 4b 49 4e 47 29 3b 0a 20 20 20 20 7d  BLOCKING);.    }
4100: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
4110: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4160: 2a 0a 20 2a 20 57 61 69 74 46 6f 72 43 6f 6e 6e  *. * WaitForConn
4170: 65 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09 43 68 65  ect --. *. *.Che
4180: 63 6b 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ck the state of 
4190: 61 6e 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74  an async connect
41a0: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 61 20 63   process. If a c
41b0: 6f 6e 6e 65 63 74 69 6f 6e 20 61 74 74 65 6d 70  onnection attemp
41c0: 74 0a 20 2a 09 74 65 72 6d 69 6e 61 74 65 64 2c  t. *.terminated,
41d0: 20 70 72 6f 63 65 73 73 20 69 74 2c 20 77 68 69   process it, whi
41e0: 63 68 20 6d 61 79 20 66 69 6e 61 6c 69 7a 65 20  ch may finalize 
41f0: 69 74 20 6f 72 20 6d 61 79 20 73 74 61 72 74 20  it or may start 
4200: 74 68 65 20 6e 65 78 74 0a 20 2a 09 61 74 74 65  the next. *.atte
4210: 6d 70 74 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63  mpt. If a connec
4220: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65 73 2c  t error occures,
4230: 20 69 74 20 69 73 20 73 61 76 65 64 20 69 6e 0a   it is saved in.
4240: 20 2a 09 73 74 61 74 65 50 74 72 2d 3e 63 6f 6e   *.statePtr->con
4250: 6e 65 63 74 45 72 72 6f 72 20 74 6f 20 62 65 20  nectError to be 
4260: 72 65 70 6f 72 74 65 64 20 62 79 20 27 66 63 6f  reported by 'fco
4270: 6e 66 69 67 75 72 65 20 2d 65 72 72 6f 72 27 2e  nfigure -error'.
4280: 0a 20 2a 0a 20 2a 09 54 68 65 72 65 20 61 72 65  . *. *.There are
4290: 20 74 77 6f 20 6d 6f 64 65 73 20 6f 66 20 6f 70   two modes of op
42a0: 65 72 61 74 69 6f 6e 2c 20 64 65 66 69 6e 65 64  eration, defined
42b0: 20 62 79 20 65 72 72 6f 72 43 6f 64 65 50 74 72   by errorCodePtr
42c0: 3a 0a 20 2a 09 20 2a 20 20 6e 6f 6e 2d 4e 55 4c  :. *. *  non-NUL
42d0: 4c 3a 20 43 61 6c 6c 65 64 20 62 79 20 65 78 70  L: Called by exp
42e0: 6c 69 63 69 74 65 20 72 65 61 64 2f 77 72 69 74  licite read/writ
42f0: 65 20 63 6f 6d 6d 61 6e 64 2e 20 42 6c 6f 63 6b  e command. Block
4300: 20 69 66 20 73 6f 63 6b 65 74 0a 20 2a 09 20 20   if socket. *.  
4310: 20 20 69 73 20 62 6c 6f 63 6b 69 6e 67 2e 0a 20    is blocking.. 
4320: 2a 09 20 20 20 20 4d 61 79 20 72 65 74 75 72 6e  *.    May return
4330: 20 74 77 6f 20 65 72 72 6f 72 20 63 6f 64 65 73   two error codes
4340: 3a 0a 20 2a 09 20 20 20 20 20 2a 09 45 57 4f 55  :. *.     *.EWOU
4350: 4c 44 42 4c 4f 43 4b 3a 20 69 66 20 63 6f 6e 6e  LDBLOCK: if conn
4360: 65 63 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20  ect is still in 
4370: 70 72 6f 67 72 65 73 73 0a 20 2a 09 20 20 20 20  progress. *.    
4380: 20 2a 09 45 4e 4f 54 43 4f 4e 4e 3a 20 69 66 20   *.ENOTCONN: if 
4390: 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 2e 20  connect failed. 
43a0: 54 68 69 73 20 77 6f 75 6c 64 20 62 65 20 74 68  This would be th
43b0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  e error message.
43c0: 20 2a 09 09 6f 66 20 61 20 72 65 63 74 20 6f 72   *..of a rect or
43d0: 20 73 65 6e 64 74 6f 20 73 79 73 63 61 6c 6c 20   sendto syscall 
43e0: 73 6f 20 74 68 69 73 20 69 73 20 65 6d 75 6c 61  so this is emula
43f0: 74 65 64 20 68 65 72 65 2e 0a 20 2a 09 20 2a 20  ted here.. *. * 
4400: 20 4e 75 6c 6c 3a 20 43 61 6c 6c 65 64 20 62 79   Null: Called by
4410: 20 61 20 62 61 63 6b 72 6f 75 6e 64 20 6f 70 65   a backround ope
4420: 72 61 74 69 6f 6e 2e 20 44 6f 20 6e 6f 74 20 62  ration. Do not b
4430: 6c 6f 63 6b 20 61 6e 64 20 64 6f 6e 27 74 0a 20  lock and don't. 
4440: 2a 09 20 20 20 20 72 65 74 75 72 6e 20 61 6e 79  *.    return any
4450: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a   error code.. *.
4460: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 09   * Results:. * .
4470: 30 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  0 if the connect
4480: 69 6f 6e 20 68 61 73 20 63 6f 6d 70 6c 65 74 65  ion has complete
4490: 64 2c 20 2d 31 20 69 66 20 73 74 69 6c 6c 20 69  d, -1 if still i
44a0: 6e 20 70 72 6f 67 72 65 73 73 20 6f 72 20 74 68  n progress or th
44b0: 65 72 65 20 69 73 0a 20 2a 20 09 61 6e 20 65 72  ere is. * .an er
44c0: 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ror.. *. * Side 
44d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 50 72 6f 63  effects:. *.Proc
44e0: 65 73 73 65 73 20 73 6f 63 6b 65 74 20 65 76 65  esses socket eve
44f0: 6e 74 73 20 6f 66 66 20 74 68 65 20 73 79 73 74  nts off the syst
4500: 65 6d 20 71 75 65 75 65 2e 20 4d 61 79 20 70 72  em queue. May pr
4510: 6f 63 65 73 73 0a 20 2a 09 61 73 79 6e 63 68 72  ocess. *.asynchr
4520: 6f 6e 6f 75 73 20 63 6f 6e 6e 65 63 74 2e 0a 20  onous connect.. 
4530: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
4580: 73 74 61 74 69 63 20 69 6e 74 0a 57 61 69 74 46  static int.WaitF
4590: 6f 72 43 6f 6e 6e 65 63 74 28 0a 20 20 20 20 54  orConnect(.    T
45a0: 63 70 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  cpState *statePt
45b0: 72 2c 09 09 2f 2a 20 53 74 61 74 65 20 6f 66 20  r,../* State of 
45c0: 74 68 65 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 20  the socket. */. 
45d0: 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64     int *errorCod
45e0: 65 50 74 72 29 09 09 2f 2a 20 57 68 65 72 65 20  ePtr)../* Where 
45f0: 74 6f 20 73 74 6f 72 65 20 65 72 72 6f 72 73 3f  to store errors?
4600: 20 41 20 70 61 73 73 65 64 0a 09 09 09 09 20 2a   A passed..... *
4610: 20 6e 75 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 63   null-pointer ac
4620: 74 69 76 61 74 65 73 20 62 61 63 6b 67 72 6f 75  tivates backgrou
4630: 6e 64 20 6d 6f 64 65 2e 20 2a 2f 0a 7b 0a 20 20  nd mode. */.{.  
4640: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20    int result;.  
4650: 20 20 69 6e 74 20 6f 6c 64 4d 6f 64 65 3b 0a 20    int oldMode;. 
4660: 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69     ThreadSpecifi
4670: 63 44 61 74 61 20 2a 74 73 64 50 74 72 3b 0a 0a  cData *tsdPtr;..
4680: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68      /*.     * Ch
4690: 65 63 6b 20 69 66 20 61 6e 20 61 73 79 6e 63 20  eck if an async 
46a0: 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 20 61  connect failed a
46b0: 6c 72 65 61 64 79 20 61 6e 64 20 65 72 72 6f 72  lready and error
46c0: 20 72 65 70 6f 72 74 69 6e 67 20 69 73 0a 20 20   reporting is.  
46d0: 20 20 20 2a 20 64 65 6d 61 6e 64 65 64 2c 20 72     * demanded, r
46e0: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
46f0: 45 4e 4f 54 43 4f 4e 4e 2e 0a 20 20 20 20 20 2a  ENOTCONN..     *
4700: 2f 0a 0a 20 20 20 20 69 66 20 28 65 72 72 6f 72  /..    if (error
4710: 43 6f 64 65 50 74 72 20 21 3d 20 4e 55 4c 4c 20  CodePtr != NULL 
4720: 26 26 20 47 4f 54 5f 42 49 54 53 28 73 74 61 74  && GOT_BITS(stat
4730: 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50  ePtr->flags, TCP
4740: 5f 41 53 59 4e 43 5f 46 41 49 4c 45 44 29 29 20  _ASYNC_FAILED)) 
4750: 7b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  {..*errorCodePtr
4760: 20 3d 20 45 4e 4f 54 43 4f 4e 4e 3b 0a 09 72 65   = ENOTCONN;..re
4770: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
4780: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68      /*.     * Ch
4790: 65 63 6b 20 69 66 20 61 6e 20 61 73 79 6e 63 20  eck if an async 
47a0: 63 6f 6e 6e 65 63 74 20 69 73 20 72 75 6e 6e 69  connect is runni
47b0: 6e 67 2e 20 49 66 20 6e 6f 74 20 72 65 74 75 72  ng. If not retur
47c0: 6e 20 6f 6b 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  n ok.     */..  
47d0: 20 20 69 66 20 28 21 47 4f 54 5f 42 49 54 53 28    if (!GOT_BITS(
47e0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c  statePtr->flags,
47f0: 20 54 43 50 5f 41 53 59 4e 43 5f 43 4f 4e 4e 45   TCP_ASYNC_CONNE
4800: 43 54 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 30  CT)) {..return 0
4810: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
4820: 20 20 20 20 20 2a 20 42 65 20 73 75 72 65 20 74       * Be sure t
4830: 6f 20 64 69 73 61 62 6c 65 20 65 76 65 6e 74 20  o disable event 
4840: 73 65 72 76 69 63 69 6e 67 20 73 6f 20 77 65 20  servicing so we 
4850: 61 72 65 20 74 72 75 6c 79 20 6d 6f 64 61 6c 2e  are truly modal.
4860: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6f 6c  .     */..    ol
4870: 64 4d 6f 64 65 20 3d 20 54 63 6c 5f 53 65 74 53  dMode = Tcl_SetS
4880: 65 72 76 69 63 65 4d 6f 64 65 28 54 43 4c 5f 53  erviceMode(TCL_S
4890: 45 52 56 49 43 45 5f 4e 4f 4e 45 29 3b 0a 0a 20  ERVICE_NONE);.. 
48a0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4c 6f 6f     /*.     * Loo
48b0: 70 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 69 6e  p in the blockin
48c0: 67 20 63 61 73 65 20 75 6e 74 69 6c 20 74 68 65  g case until the
48d0: 20 63 6f 6e 6e 65 63 74 20 73 69 67 6e 61 6c 20   connect signal 
48e0: 69 73 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20  is present.     
48f0: 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31  */..    while (1
4900: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 47 65 74 20  ) {../*.. * Get 
4910: 74 68 65 20 73 74 61 74 65 50 74 72 20 6c 6f 63  the statePtr loc
4920: 6b 2e 0a 09 20 2a 2f 0a 0a 09 74 73 64 50 74 72  k... */...tsdPtr
4930: 20 3d 20 28 54 68 72 65 61 64 53 70 65 63 69 66   = (ThreadSpecif
4940: 69 63 44 61 74 61 20 2a 29 54 63 6c 54 68 72 65  icData *)TclThre
4950: 61 64 44 61 74 61 4b 65 79 47 65 74 28 26 64 61  adDataKeyGet(&da
4960: 74 61 4b 65 79 29 3b 0a 09 57 61 69 74 46 6f 72  taKey);..WaitFor
4970: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64  SingleObject(tsd
4980: 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c  Ptr->socketListL
4990: 6f 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a  ock, INFINITE);.
49a0: 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20 66  ../*.. * Check f
49b0: 6f 72 20 63 6f 6e 6e 65 63 74 20 65 76 65 6e 74  or connect event
49c0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 47 4f 54  ... */...if (GOT
49d0: 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e  _BITS(statePtr->
49e0: 72 65 61 64 79 45 76 65 6e 74 73 2c 20 46 44 5f  readyEvents, FD_
49f0: 43 4f 4e 4e 45 43 54 29 29 20 7b 0a 09 20 20 20  CONNECT)) {..   
4a00: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 6f 6e 73   /*..     * Cons
4a10: 75 6d 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 20  ume the connect 
4a20: 65 76 65 6e 74 2e 0a 09 20 20 20 20 20 2a 2f 0a  event...     */.
4a30: 0a 09 20 20 20 20 43 4c 45 41 52 5f 42 49 54 53  ..    CLEAR_BITS
4a40: 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64 79  (statePtr->ready
4a50: 45 76 65 6e 74 73 2c 20 46 44 5f 43 4f 4e 4e 45  Events, FD_CONNE
4a60: 43 54 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20  CT);...    /*.. 
4a70: 20 20 20 20 2a 20 46 6f 72 20 62 6c 6f 63 6b 69      * For blocki
4a80: 6e 67 20 73 6f 63 6b 65 74 73 20 61 6e 64 20 66  ng sockets and f
4a90: 6f 72 65 67 72 6f 75 6e 64 20 70 72 6f 63 65 73  oreground proces
4aa0: 73 69 6e 67 2c 20 64 69 73 61 62 6c 65 20 61 73  sing, disable as
4ab0: 79 6e 63 0a 09 20 20 20 20 20 2a 20 63 6f 6e 6e  ync..     * conn
4ac0: 65 63 74 20 61 73 20 77 65 20 63 6f 6e 74 69 6e  ect as we contin
4ad0: 75 65 20 6e 6f 77 20 73 79 6e 63 68 6f 6e 65 6f  ue now synchoneo
4ae0: 75 73 6c 79 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  usly...     */..
4af0: 09 20 20 20 20 69 66 20 28 65 72 72 6f 72 43 6f  .    if (errorCo
4b00: 64 65 50 74 72 20 21 3d 20 4e 55 4c 4c 20 26 26  dePtr != NULL &&
4b10: 0a 09 09 20 20 20 20 21 47 4f 54 5f 42 49 54 53  ...    !GOT_BITS
4b20: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
4b30: 2c 20 54 43 50 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e  , TCP_NONBLOCKIN
4b40: 47 29 29 20 7b 0a 09 09 43 4c 45 41 52 5f 42 49  G)) {...CLEAR_BI
4b50: 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  TS(statePtr->fla
4b60: 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 43 4f  gs, TCP_ASYNC_CO
4b70: 4e 4e 45 43 54 29 3b 0a 09 20 20 20 20 7d 0a 0a  NNECT);..    }..
4b80: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
4b90: 46 72 65 65 20 6c 69 73 74 20 6c 6f 63 6b 2e 0a  Free list lock..
4ba0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 53  .     */...    S
4bb0: 65 74 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e  etEvent(tsdPtr->
4bc0: 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b  socketListLock);
4bd0: 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  ...    /*..     
4be0: 2a 20 43 6f 6e 74 69 6e 75 65 20 63 6f 6e 6e 65  * Continue conne
4bf0: 63 74 2e 20 49 66 20 73 77 69 74 63 68 65 64 20  ct. If switched 
4c00: 74 6f 20 73 79 6e 63 68 72 6f 6e 65 6f 75 73 20  to synchroneous 
4c10: 63 6f 6e 6e 65 63 74 2c 20 74 68 65 0a 09 20 20  connect, the..  
4c20: 20 20 20 2a 20 63 6f 6e 6e 65 63 74 20 69 73 20     * connect is 
4c30: 74 65 72 6d 69 6e 61 74 65 64 2e 0a 09 20 20 20  terminated...   
4c40: 20 20 2a 2f 0a 0a 09 20 20 20 20 72 65 73 75 6c    */...    resul
4c50: 74 20 3d 20 54 63 70 43 6f 6e 6e 65 63 74 28 4e  t = TcpConnect(N
4c60: 55 4c 4c 2c 20 73 74 61 74 65 50 74 72 29 3b 0a  ULL, statePtr);.
4c70: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
4c80: 20 52 65 73 74 6f 72 65 20 65 76 65 6e 74 20 73   Restore event s
4c90: 65 72 76 69 63 65 20 6d 6f 64 65 2e 0a 09 20 20  ervice mode...  
4ca0: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 28 76 6f 69     */...    (voi
4cb0: 64 29 20 54 63 6c 5f 53 65 74 53 65 72 76 69 63  d) Tcl_SetServic
4cc0: 65 4d 6f 64 65 28 6f 6c 64 4d 6f 64 65 29 3b 0a  eMode(oldMode);.
4cd0: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
4ce0: 20 43 68 65 63 6b 20 66 6f 72 20 53 75 63 63 65   Check for Succe
4cf0: 73 66 75 6c 6c 20 63 6f 6e 6e 65 63 74 20 6f 72  sfull connect or
4d00: 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20 72   async connect r
4d10: 65 73 74 61 72 74 0a 09 20 20 20 20 20 2a 2f 0a  estart..     */.
4d20: 0a 09 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  ..    if (result
4d30: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   == TCL_OK) {...
4d40: 2f 2a 0a 09 09 20 2a 20 43 68 65 63 6b 20 66 6f  /*... * Check fo
4d50: 72 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20  r async connect 
4d60: 72 65 73 74 61 72 74 20 28 6e 6f 74 20 70 6f 73  restart (not pos
4d70: 73 69 62 6c 65 20 66 6f 72 0a 09 09 20 2a 20 66  sible for... * f
4d80: 6f 72 65 67 72 6f 75 6e 64 20 62 6c 6f 63 6b 69  oreground blocki
4d90: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 29 0a 09 09  ng operation)...
4da0: 20 2a 2f 0a 0a 09 09 69 66 20 28 47 4f 54 5f 42   */....if (GOT_B
4db0: 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  ITS(statePtr->fl
4dc0: 61 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 50  ags, TCP_ASYNC_P
4dd0: 45 4e 44 49 4e 47 29 29 20 7b 0a 09 09 20 20 20  ENDING)) {...   
4de0: 20 69 66 20 28 65 72 72 6f 72 43 6f 64 65 50 74   if (errorCodePt
4df0: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  r != NULL) {....
4e00: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
4e10: 45 57 4f 55 4c 44 42 4c 4f 43 4b 3b 0a 09 09 20  EWOULDBLOCK;... 
4e20: 20 20 20 7d 0a 09 09 20 20 20 20 72 65 74 75 72     }...    retur
4e30: 6e 20 2d 31 3b 0a 09 09 7d 0a 09 09 72 65 74 75  n -1;...}...retu
4e40: 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  rn 0;..    }... 
4e50: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 6f     /*..     * Co
4e60: 6e 6e 65 63 74 20 66 69 6e 61 6c 6c 79 20 66 61  nnect finally fa
4e70: 69 6c 65 64 2e 20 46 6f 72 20 66 6f 72 65 67 72  iled. For foregr
4e80: 6f 75 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 72  ound operation r
4e90: 65 74 75 72 6e 0a 09 20 20 20 20 20 2a 20 45 4e  eturn..     * EN
4ea0: 4f 54 43 4f 4e 4e 2e 0a 09 20 20 20 20 20 2a 2f  OTCONN...     */
4eb0: 0a 0a 09 20 20 20 20 69 66 20 28 65 72 72 6f 72  ...    if (error
4ec0: 43 6f 64 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29  CodePtr != NULL)
4ed0: 20 7b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50   {...*errorCodeP
4ee0: 74 72 20 3d 20 45 4e 4f 54 43 4f 4e 4e 3b 0a 09  tr = ENOTCONN;..
4ef0: 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72      }..    retur
4f00: 6e 20 2d 31 3b 0a 09 7d 0a 0a 20 20 20 20 20 20  n -1;..}..      
4f10: 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 20 2a 20    /*.         * 
4f20: 46 72 65 65 20 6c 69 73 74 20 6c 6f 63 6b 2e 0a  Free list lock..
4f30: 20 20 20 20 20 20 20 20 20 2a 2f 0a 0a 20 20 20           */..   
4f40: 20 20 20 20 20 53 65 74 45 76 65 6e 74 28 74 73       SetEvent(ts
4f50: 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74  dPtr->socketList
4f60: 4c 6f 63 6b 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20  Lock);.../*.. * 
4f70: 42 61 63 6b 67 72 6f 75 6e 64 20 6f 70 65 72 61  Background opera
4f80: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
4f90: 68 20 6e 6f 20 61 63 74 69 6f 6e 20 61 73 20 74  h no action as t
4fa0: 68 65 72 65 20 77 61 73 20 6e 6f 20 63 6f 6e 6e  here was no conn
4fb0: 65 63 74 0a 09 20 2a 20 65 76 65 6e 74 0a 09 20  ect.. * event.. 
4fc0: 2a 2f 0a 0a 09 69 66 20 28 65 72 72 6f 72 43 6f  */...if (errorCo
4fd0: 64 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  dePtr == NULL) {
4fe0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
4ff0: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 41 20 6e  ..}.../*.. * A n
5000: 6f 6e 20 62 6c 6f 63 6b 69 6e 67 20 73 6f 63 6b  on blocking sock
5010: 65 74 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61  et waiting for a
5020: 6e 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 63  n asynchronous c
5030: 6f 6e 6e 65 63 74 0a 09 20 2a 20 72 65 74 75 72  onnect.. * retur
5040: 6e 73 20 64 69 72 65 63 74 6c 79 20 74 68 65 20  ns directly the 
5050: 65 72 72 6f 72 20 45 57 4f 55 4c 44 42 4c 4f 43  error EWOULDBLOC
5060: 4b 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 47 4f 54  K.. */...if (GOT
5070: 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e  _BITS(statePtr->
5080: 66 6c 61 67 73 2c 20 54 43 50 5f 4e 4f 4e 42 4c  flags, TCP_NONBL
5090: 4f 43 4b 49 4e 47 29 29 20 7b 0a 09 20 20 20 20  OCKING)) {..    
50a0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
50b0: 45 57 4f 55 4c 44 42 4c 4f 43 4b 3b 0a 09 20 20  EWOULDBLOCK;..  
50c0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
50d0: 0a 09 2f 2a 0a 09 20 2a 20 57 61 69 74 20 75 6e  ../*.. * Wait un
50e0: 74 69 6c 20 73 6f 6d 65 74 68 69 6e 67 20 68 61  til something ha
50f0: 70 70 65 6e 73 2e 0a 09 20 2a 2f 0a 0a 09 57 61  ppens... */...Wa
5100: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
5110: 74 28 74 73 64 50 74 72 2d 3e 72 65 61 64 79 45  t(tsdPtr->readyE
5120: 76 65 6e 74 2c 20 49 4e 46 49 4e 49 54 45 29 3b  vent, INFINITE);
5130: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 70  ------. *. * Tcp
5190: 49 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a  InputProc --. *.
51a0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
51b0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74   is invoked by t
51c0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65  he generic IO le
51d0: 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
51e0: 74 20 66 72 6f 6d 20 61 0a 20 2a 09 54 43 50 20  t from a. *.TCP 
51f0: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
5200: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nnel.. *. * Resu
5210: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 75 6d 62  lts:. *.The numb
5220: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
5230: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 72 20   is returned or 
5240: 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 41 6e 20  -1 on error. An 
5250: 6f 75 74 70 75 74 0a 20 2a 09 61 72 67 75 6d 65  output. *.argume
5260: 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  nt contains the 
5270: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65  POSIX error code
5280: 20 6f 6e 20 65 72 72 6f 72 2c 20 6f 72 20 7a 65   on error, or ze
5290: 72 6f 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 20  ro if no error. 
52a0: 2a 09 6f 63 63 75 72 72 65 64 2e 0a 20 2a 0a 20  *.occurred.. *. 
52b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
52c0: 20 2a 09 52 65 61 64 73 20 69 6e 70 75 74 20 66   *.Reads input f
52d0: 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 64 65  rom the input de
52e0: 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e  vice of the chan
52f0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
5350: 0a 54 63 70 49 6e 70 75 74 50 72 6f 63 28 0a 20  .TcpInputProc(. 
5360: 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63     void *instanc
5370: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74  eData,./* Socket
5380: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 63   state. */.    c
5390: 68 61 72 20 2a 62 75 66 2c 09 09 09 2f 2a 20 57  har *buf,.../* W
53a0: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 64 61  here to store da
53b0: 74 61 20 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  ta read. */.    
53c0: 69 6e 74 20 62 75 66 53 69 7a 65 2c 09 09 2f 2a  int bufSize,../*
53d0: 20 48 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   How much space 
53e0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
53f0: 74 68 65 0a 09 09 09 09 20 2a 20 62 75 66 66 65  the..... * buffe
5400: 72 3f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 65  r? */.    int *e
5410: 72 72 6f 72 43 6f 64 65 50 74 72 29 09 09 2f 2a  rrorCodePtr)../*
5420: 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20   Where to store 
5430: 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 7b  error code. */.{
5440: 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73  .    TcpState *s
5450: 74 61 74 65 50 74 72 20 3d 20 28 54 63 70 53 74  tatePtr = (TcpSt
5460: 61 74 65 20 2a 29 69 6e 73 74 61 6e 63 65 44 61  ate *)instanceDa
5470: 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 65  ta;.    int byte
5480: 73 52 65 61 64 3b 0a 20 20 20 20 44 57 4f 52 44  sRead;.    DWORD
5490: 20 65 72 72 6f 72 3b 0a 20 20 20 20 54 68 72 65   error;.    Thre
54a0: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a  adSpecificData *
54b0: 74 73 64 50 74 72 20 3d 20 28 54 68 72 65 61 64  tsdPtr = (Thread
54c0: 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 29 54  SpecificData *)T
54d0: 63 6c 54 68 72 65 61 64 44 61 74 61 4b 65 79 47  clThreadDataKeyG
54e0: 65 74 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 20  et(&dataKey);.. 
54f0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
5500: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20   = 0;..    /*.  
5510: 20 20 20 2a 20 43 68 65 63 6b 20 74 68 61 74 20     * Check that 
5520: 57 69 6e 53 6f 63 6b 20 69 73 20 69 6e 69 74 69  WinSock is initi
5530: 61 6c 69 7a 65 64 3b 20 64 6f 20 6e 6f 74 20 63  alized; do not c
5540: 61 6c 6c 20 69 74 20 69 66 20 6e 6f 74 2c 20 74  all it if not, t
5550: 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20 20 2a  o prevent.     *
5560: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 2e   system crashes.
5570: 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
5580: 20 61 74 20 65 78 69 74 20 74 69 6d 65 20 69 66   at exit time if
5590: 20 74 68 65 20 65 78 69 74 20 68 61 6e 64 6c 65   the exit handle
55a0: 72 20 66 6f 72 0a 20 20 20 20 20 2a 20 57 69 6e  r for.     * Win
55b0: 53 6f 63 6b 20 72 61 6e 20 62 65 66 6f 72 65 20  Sock ran before 
55c0: 6f 74 68 65 72 20 65 78 69 74 20 68 61 6e 64 6c  other exit handl
55d0: 65 72 73 20 74 68 61 74 20 77 61 6e 74 20 74 6f  ers that want to
55e0: 20 75 73 65 20 73 6f 63 6b 65 74 73 2e 0a 20 20   use sockets..  
55f0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21     */..    if (!
5600: 53 6f 63 6b 65 74 73 45 6e 61 62 6c 65 64 28 29  SocketsEnabled()
5610: 29 20 7b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50  ) {..*errorCodeP
5620: 74 72 20 3d 20 45 46 41 55 4c 54 3b 0a 09 72 65  tr = EFAULT;..re
5630: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
5640: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 69      /*.     * Fi
5650: 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
5660: 20 69 66 20 45 4f 46 20 77 61 73 20 61 6c 72 65   if EOF was alre
5670: 61 64 79 20 64 65 74 65 63 74 65 64 2c 20 74 6f  ady detected, to
5680: 20 70 72 65 76 65 6e 74 20 63 61 6c 6c 69 6e 67   prevent calling
5690: 20 74 68 65 0a 20 20 20 20 20 2a 20 73 6f 63 6b   the.     * sock
56a0: 65 74 20 73 74 61 63 6b 20 61 66 74 65 72 20 74  et stack after t
56b0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 45 4f  he first time EO
56c0: 46 20 69 73 20 64 65 74 65 63 74 65 64 2e 0a 20  F is detected.. 
56d0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
56e0: 47 4f 54 5f 42 49 54 53 28 73 74 61 74 65 50 74  GOT_BITS(statePt
56f0: 72 2d 3e 66 6c 61 67 73 2c 20 53 4f 43 4b 45 54  r->flags, SOCKET
5700: 5f 45 4f 46 29 29 20 7b 0a 09 72 65 74 75 72 6e  _EOF)) {..return
5710: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
5720: 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b 20 69  *.     * Check i
5730: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 73  f there is an as
5740: 79 6e 63 20 63 6f 6e 6e 65 63 74 20 72 75 6e 6e  ync connect runn
5750: 69 6e 67 2e 0a 20 20 20 20 20 2a 20 46 6f 72 20  ing..     * For 
5760: 62 6c 6f 63 6b 69 6e 67 20 73 6f 63 6b 65 74 73  blocking sockets
5770: 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65   terminate conne
5780: 63 74 2c 20 6f 74 68 65 72 77 69 73 65 20 64 6f  ct, otherwise do
5790: 20 6f 6e 65 20 73 74 65 70 2e 0a 20 20 20 20 20   one step..     
57a0: 2a 20 46 6f 72 20 61 20 6e 6f 6e 20 62 6c 6f 63  * For a non bloc
57b0: 6b 69 6e 67 20 73 6f 63 6b 65 74 20 72 65 74 75  king socket retu
57c0: 72 6e 20 45 57 4f 55 4c 44 42 4c 4f 43 4b 20 69  rn EWOULDBLOCK i
57d0: 66 20 63 6f 6e 6e 65 63 74 20 6e 6f 74 20 74 65  f connect not te
57e0: 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 20 2a 2f  rminated.     */
57f0: 0a 0a 20 20 20 20 69 66 20 28 57 61 69 74 46 6f  ..    if (WaitFo
5800: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  rConnect(statePt
5810: 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 29  r, errorCodePtr)
5820: 20 21 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 6e   != 0) {..return
5830: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
5840: 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 20 45 4f 46  /*.     * No EOF
5850: 2c 20 61 6e 64 20 69 74 20 69 73 20 63 6f 6e 6e  , and it is conn
5860: 65 63 74 65 64 2c 20 73 6f 20 74 72 79 20 74 6f  ected, so try to
5870: 20 72 65 61 64 20 6d 6f 72 65 20 66 72 6f 6d 20   read more from 
5880: 74 68 65 20 73 6f 63 6b 65 74 2e 20 4e 6f 74 65  the socket. Note
5890: 0a 20 20 20 20 20 2a 20 74 68 61 74 20 77 65 20  .     * that we 
58a0: 63 6c 65 61 72 20 74 68 65 20 46 44 5f 52 45 41  clear the FD_REA
58b0: 44 20 62 69 74 20 62 65 63 61 75 73 65 20 72 65  D bit because re
58c0: 61 64 20 65 76 65 6e 74 73 20 61 72 65 20 6c 65  ad events are le
58d0: 76 65 6c 20 74 72 69 67 67 65 72 65 64 0a 20 20  vel triggered.  
58e0: 20 20 20 2a 20 73 6f 20 61 20 6e 65 77 20 65 76     * so a new ev
58f0: 65 6e 74 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ent will be gene
5900: 72 61 74 65 64 20 69 66 20 74 68 65 72 65 20 69  rated if there i
5910: 73 20 73 74 69 6c 6c 20 64 61 74 61 20 61 76 61  s still data ava
5920: 69 6c 61 62 6c 65 20 74 6f 20 62 65 0a 20 20 20  ilable to be.   
5930: 20 20 2a 20 72 65 61 64 2e 20 57 65 20 68 61 76    * read. We hav
5940: 65 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 62 6c  e to simulate bl
5950: 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20  ocking behavior 
5960: 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 61 72  here since we ar
5970: 65 20 61 6c 77 61 79 73 0a 20 20 20 20 20 2a 20  e always.     * 
5980: 75 73 69 6e 67 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  using non-blocki
5990: 6e 67 20 73 6f 63 6b 65 74 73 2e 0a 20 20 20 20  ng sockets..    
59a0: 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 20 28   */..    while (
59b0: 31 29 20 7b 0a 09 53 65 6e 64 53 65 6c 65 63 74  1) {..SendSelect
59c0: 4d 65 73 73 61 67 65 28 74 73 64 50 74 72 2c 20  Message(tsdPtr, 
59d0: 55 4e 53 45 4c 45 43 54 2c 20 73 74 61 74 65 50  UNSELECT, stateP
59e0: 74 72 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 69  tr);.../*.. * Si
59f0: 6e 67 6c 65 20 66 64 20 6f 70 65 72 61 74 69 6f  ngle fd operatio
5a00: 6e 3a 20 74 68 69 73 20 70 72 6f 63 20 69 73 20  n: this proc is 
5a10: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
5a20: 61 20 63 6f 6e 6e 65 63 74 65 64 0a 09 20 2a 20  a connected.. * 
5a30: 73 6f 63 6b 65 74 2e 0a 09 20 2a 2f 0a 0a 09 62  socket... */...b
5a40: 79 74 65 73 52 65 61 64 20 3d 20 72 65 63 76 28  ytesRead = recv(
5a50: 73 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74  statePtr->socket
5a60: 73 2d 3e 66 64 2c 20 62 75 66 2c 20 62 75 66 53  s->fd, buf, bufS
5a70: 69 7a 65 2c 20 30 29 3b 0a 09 43 4c 45 41 52 5f  ize, 0);..CLEAR_
5a80: 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 72  BITS(statePtr->r
5a90: 65 61 64 79 45 76 65 6e 74 73 2c 20 46 44 5f 52  eadyEvents, FD_R
5aa0: 45 41 44 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 43  EAD);.../*.. * C
5ab0: 68 65 63 6b 20 66 6f 72 20 65 6e 64 2d 6f 66 2d  heck for end-of-
5ac0: 66 69 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 20 6f  file condition o
5ad0: 72 20 73 75 63 63 65 73 73 66 75 6c 20 72 65 61  r successful rea
5ae0: 64 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 62 79  d... */...if (by
5af0: 74 65 73 52 65 61 64 20 3d 3d 20 30 29 20 7b 0a  tesRead == 0) {.
5b00: 09 20 20 20 20 53 45 54 5f 42 49 54 53 28 73 74  .    SET_BITS(st
5b10: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 53  atePtr->flags, S
5b20: 4f 43 4b 45 54 5f 45 4f 46 29 3b 0a 09 7d 0a 09  OCKET_EOF);..}..
5b30: 69 66 20 28 62 79 74 65 73 52 65 61 64 20 21 3d  if (bytesRead !=
5b40: 20 53 4f 43 4b 45 54 5f 45 52 52 4f 52 29 20 7b   SOCKET_ERROR) {
5b50: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a  ..    break;..}.
5b60: 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 61 6e 20 65  ../*.. * If an e
5b70: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 66 74 65  rror occurs afte
5b80: 72 20 74 68 65 20 46 44 5f 43 4c 4f 53 45 20 68  r the FD_CLOSE h
5b90: 61 73 20 61 72 72 69 76 65 64 2c 20 74 68 65 6e  as arrived, then
5ba0: 20 69 67 6e 6f 72 65 20 74 68 65 0a 09 20 2a 20   ignore the.. * 
5bb0: 65 72 72 6f 72 20 61 6e 64 20 72 65 70 6f 72 74  error and report
5bc0: 20 61 6e 20 45 4f 46 2e 0a 09 20 2a 2f 0a 0a 09   an EOF... */...
5bd0: 69 66 20 28 47 4f 54 5f 42 49 54 53 28 73 74 61  if (GOT_BITS(sta
5be0: 74 65 50 74 72 2d 3e 72 65 61 64 79 45 76 65 6e  tePtr->readyEven
5bf0: 74 73 2c 20 46 44 5f 43 4c 4f 53 45 29 29 20 7b  ts, FD_CLOSE)) {
5c00: 0a 09 20 20 20 20 53 45 54 5f 42 49 54 53 28 73  ..    SET_BITS(s
5c10: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20  tatePtr->flags, 
5c20: 53 4f 43 4b 45 54 5f 45 4f 46 29 3b 0a 09 20 20  SOCKET_EOF);..  
5c30: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b    bytesRead = 0;
5c40: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a  ..    break;..}.
5c50: 0a 09 65 72 72 6f 72 20 3d 20 57 53 41 47 65 74  ..error = WSAGet
5c60: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 0a 09 2f  LastError();.../
5c70: 2a 0a 09 20 2a 20 49 66 20 61 6e 20 52 53 54 20  *.. * If an RST 
5c80: 63 6f 6d 65 73 2c 20 74 68 65 6e 20 69 67 6e 6f  comes, then igno
5c90: 72 65 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  re the error and
5ca0: 20 72 65 70 6f 72 74 20 61 6e 20 45 4f 46 20 6a   report an EOF j
5cb0: 75 73 74 20 6c 69 6b 65 0a 09 20 2a 20 6f 6e 20  ust like.. * on 
5cc0: 75 6e 69 78 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  unix... */...if 
5cd0: 28 65 72 72 6f 72 20 3d 3d 20 57 53 41 45 43 4f  (error == WSAECO
5ce0: 4e 4e 52 45 53 45 54 29 20 7b 0a 09 20 20 20 20  NNRESET) {..    
5cf0: 53 45 54 5f 42 49 54 53 28 73 74 61 74 65 50 74  SET_BITS(statePt
5d00: 72 2d 3e 66 6c 61 67 73 2c 20 53 4f 43 4b 45 54  r->flags, SOCKET
5d10: 5f 45 4f 46 29 3b 0a 09 20 20 20 20 62 79 74 65  _EOF);..    byte
5d20: 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20  sRead = 0;..    
5d30: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  break;..}.../*..
5d40: 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72   * Check for err
5d50: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 72 20  or condition or 
5d60: 75 6e 64 65 72 66 6c 6f 77 20 69 6e 20 6e 6f 6e  underflow in non
5d70: 2d 62 6c 6f 63 6b 69 6e 67 20 63 61 73 65 2e 0a  -blocking case..
5d80: 09 20 2a 2f 0a 0a 09 69 66 20 28 47 4f 54 5f 42  . */...if (GOT_B
5d90: 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  ITS(statePtr->fl
5da0: 61 67 73 2c 20 54 43 50 5f 4e 4f 4e 42 4c 4f 43  ags, TCP_NONBLOC
5db0: 4b 49 4e 47 29 0a 09 20 20 20 20 20 20 20 20 7c  KING)..        |
5dc0: 7c 20 28 65 72 72 6f 72 20 21 3d 20 57 53 41 45  | (error != WSAE
5dd0: 57 4f 55 4c 44 42 4c 4f 43 4b 29 29 20 7b 0a 09  WOULDBLOCK)) {..
5de0: 20 20 20 20 54 63 6c 57 69 6e 43 6f 6e 76 65 72      TclWinConver
5df0: 74 45 72 72 6f 72 28 65 72 72 6f 72 29 3b 0a 09  tError(error);..
5e00: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
5e10: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  r = Tcl_GetErrno
5e20: 28 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65  ();..    bytesRe
5e30: 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72  ad = -1;..    br
5e40: 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  eak;..}.../*.. *
5e50: 20 49 6e 20 74 68 65 20 62 6c 6f 63 6b 69 6e 67   In the blocking
5e60: 20 63 61 73 65 2c 20 77 61 69 74 20 75 6e 74 69   case, wait unti
5e70: 6c 20 74 68 65 20 66 69 6c 65 20 62 65 63 6f 6d  l the file becom
5e80: 65 73 20 72 65 61 64 61 62 6c 65 20 6f 72 0a 09  es readable or..
5e90: 20 2a 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 72   * closed and tr
5ea0: 79 20 61 67 61 69 6e 2e 0a 09 20 2a 2f 0a 0a 09  y again... */...
5eb0: 69 66 20 28 21 57 61 69 74 46 6f 72 53 6f 63 6b  if (!WaitForSock
5ec0: 65 74 45 76 65 6e 74 28 73 74 61 74 65 50 74 72  etEvent(statePtr
5ed0: 2c 20 46 44 5f 52 45 41 44 7c 46 44 5f 43 4c 4f  , FD_READ|FD_CLO
5ee0: 53 45 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72  SE, errorCodePtr
5ef0: 29 29 20 7b 0a 09 20 20 20 20 62 79 74 65 73 52  )) {..    bytesR
5f00: 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 62  ead = -1;..    b
5f10: 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  reak;..}.    }..
5f20: 20 20 20 20 53 65 6e 64 53 65 6c 65 63 74 4d 65      SendSelectMe
5f30: 73 73 61 67 65 28 74 73 64 50 74 72 2c 20 53 45  ssage(tsdPtr, SE
5f40: 4c 45 43 54 2c 20 73 74 61 74 65 50 74 72 29 3b  LECT, statePtr);
5f50: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 62 79 74  ..    return byt
5f60: 65 73 52 65 61 64 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  esRead;.}.../*. 
5f70: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63  -------. *. * Tc
5fc0: 70 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20  pOutputProc --. 
5fd0: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
5fe0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
5ff0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
6000: 65 76 65 6c 20 74 6f 20 77 72 69 74 65 20 64 61  evel to write da
6010: 74 61 20 74 6f 20 61 0a 20 2a 09 73 6f 63 6b 65  ta to a. *.socke
6020: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e  t based channel.
6030: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
6040: 20 2a 09 54 68 65 20 6e 75 6d 62 65 72 20 6f 66   *.The number of
6050: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 6f   bytes written o
6060: 72 20 2d 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e  r -1 on failure.
6070: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
6080: 63 74 73 3a 0a 20 2a 09 50 72 6f 64 75 63 65 73  cts:. *.Produces
6090: 20 6f 75 74 70 75 74 20 6f 6e 20 74 68 65 20 73   output on the s
60a0: 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ocket.. *. *----
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
6100: 6e 74 0a 54 63 70 4f 75 74 70 75 74 50 72 6f 63  nt.TcpOutputProc
6110: 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 74  (.    void *inst
6120: 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63  anceData,./* Soc
6130: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ket state. */.  
6140: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75    const char *bu
6150: 66 2c 09 09 2f 2a 20 54 68 65 20 64 61 74 61 20  f,../* The data 
6160: 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20 20 69  buffer. */.    i
6170: 6e 74 20 74 6f 57 72 69 74 65 2c 09 09 2f 2a 20  nt toWrite,../* 
6180: 48 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 74  How many bytes t
6190: 6f 20 77 72 69 74 65 3f 20 2a 2f 0a 20 20 20 20  o write? */.    
61a0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
61b0: 72 29 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20  r)../* Where to 
61c0: 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f 64 65  store error code
61d0: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 70 53 74  . */.{.    TcpSt
61e0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
61f0: 28 54 63 70 53 74 61 74 65 20 2a 29 69 6e 73 74  (TcpState *)inst
6200: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e  anceData;.    in
6210: 74 20 77 72 69 74 74 65 6e 3b 0a 20 20 20 20 44  t written;.    D
6220: 57 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 20 20  WORD error;.    
6230: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
6240: 74 61 20 2a 74 73 64 50 74 72 20 3d 20 28 54 68  ta *tsdPtr = (Th
6250: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
6260: 20 2a 29 54 63 6c 54 68 72 65 61 64 44 61 74 61   *)TclThreadData
6270: 4b 65 79 47 65 74 28 26 64 61 74 61 4b 65 79 29  KeyGet(&dataKey)
6280: 3b 0a 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
6290: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  ePtr = 0;..    /
62a0: 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b 20 74  *.     * Check t
62b0: 68 61 74 20 57 69 6e 53 6f 63 6b 20 69 73 20 69  hat WinSock is i
62c0: 6e 69 74 69 61 6c 69 7a 65 64 3b 20 64 6f 20 6e  nitialized; do n
62d0: 6f 74 20 63 61 6c 6c 20 69 74 20 69 66 20 6e 6f  ot call it if no
62e0: 74 2c 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20  t, to prevent.  
62f0: 20 20 20 2a 20 73 79 73 74 65 6d 20 63 72 61 73     * system cras
6300: 68 65 73 2e 20 54 68 69 73 20 63 61 6e 20 68 61  hes. This can ha
6310: 70 70 65 6e 20 61 74 20 65 78 69 74 20 74 69 6d  ppen at exit tim
6320: 65 20 69 66 20 74 68 65 20 65 78 69 74 20 68 61  e if the exit ha
6330: 6e 64 6c 65 72 20 66 6f 72 0a 20 20 20 20 20 2a  ndler for.     *
6340: 20 57 69 6e 53 6f 63 6b 20 72 61 6e 20 62 65 66   WinSock ran bef
6350: 6f 72 65 20 6f 74 68 65 72 20 65 78 69 74 20 68  ore other exit h
6360: 61 6e 64 6c 65 72 73 20 74 68 61 74 20 77 61 6e  andlers that wan
6370: 74 20 74 6f 20 75 73 65 20 73 6f 63 6b 65 74 73  t to use sockets
6380: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
6390: 66 20 28 21 53 6f 63 6b 65 74 73 45 6e 61 62 6c  f (!SocketsEnabl
63a0: 65 64 28 29 29 20 7b 0a 09 2a 65 72 72 6f 72 43  ed()) {..*errorC
63b0: 6f 64 65 50 74 72 20 3d 20 45 46 41 55 4c 54 3b  odePtr = EFAULT;
63c0: 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ..return -1;.   
63d0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
63e0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65  * Check if there
63f0: 20 69 73 20 61 6e 20 61 73 79 6e 63 20 63 6f 6e   is an async con
6400: 6e 65 63 74 20 72 75 6e 6e 69 6e 67 2e 0a 20 20  nect running..  
6410: 20 20 20 2a 20 46 6f 72 20 62 6c 6f 63 6b 69 6e     * For blockin
6420: 67 20 73 6f 63 6b 65 74 73 20 74 65 72 6d 69 6e  g sockets termin
6430: 61 74 65 20 63 6f 6e 6e 65 63 74 2c 20 6f 74 68  ate connect, oth
6440: 65 72 77 69 73 65 20 64 6f 20 6f 6e 65 20 73 74  erwise do one st
6450: 65 70 2e 0a 20 20 20 20 20 2a 20 46 6f 72 20 61  ep..     * For a
6460: 20 6e 6f 6e 20 62 6c 6f 63 6b 69 6e 67 20 73 6f   non blocking so
6470: 63 6b 65 74 20 72 65 74 75 72 6e 20 45 57 4f 55  cket return EWOU
6480: 4c 44 42 4c 4f 43 4b 20 69 66 20 63 6f 6e 6e 65  LDBLOCK if conne
6490: 63 74 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  ct not terminate
64a0: 64 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  d.     */..    i
64b0: 66 20 28 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  f (WaitForConnec
64c0: 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 72 6f  t(statePtr, erro
64d0: 72 43 6f 64 65 50 74 72 29 20 21 3d 20 30 29 20  rCodePtr) != 0) 
64e0: 7b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20  {..return -1;.  
64f0: 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 20 28    }..    while (
6500: 31 29 20 7b 0a 09 53 65 6e 64 53 65 6c 65 63 74  1) {..SendSelect
6510: 4d 65 73 73 61 67 65 28 74 73 64 50 74 72 2c 20  Message(tsdPtr, 
6520: 55 4e 53 45 4c 45 43 54 2c 20 73 74 61 74 65 50  UNSELECT, stateP
6530: 74 72 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 69  tr);.../*.. * Si
6540: 6e 67 6c 65 20 66 64 20 6f 70 65 72 61 74 69 6f  ngle fd operatio
6550: 6e 3a 20 74 68 69 73 20 70 72 6f 63 20 69 73 20  n: this proc is 
6560: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
6570: 61 20 63 6f 6e 6e 65 63 74 65 64 0a 09 20 2a 20  a connected.. * 
6580: 73 6f 63 6b 65 74 2e 0a 09 20 2a 2f 0a 0a 09 77  socket... */...w
6590: 72 69 74 74 65 6e 20 3d 20 73 65 6e 64 28 73 74  ritten = send(st
65a0: 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d  atePtr->sockets-
65b0: 3e 66 64 2c 20 62 75 66 2c 20 74 6f 57 72 69 74  >fd, buf, toWrit
65c0: 65 2c 20 30 29 3b 0a 09 69 66 20 28 77 72 69 74  e, 0);..if (writ
65d0: 74 65 6e 20 21 3d 20 53 4f 43 4b 45 54 5f 45 52  ten != SOCKET_ER
65e0: 52 4f 52 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  ROR) {..    /*..
65f0: 20 20 20 20 20 2a 20 53 69 6e 63 65 20 57 69 6e       * Since Win
6600: 64 6f 77 73 20 77 6f 6e 27 74 20 67 65 6e 65 72  dows won't gener
6610: 61 74 65 20 61 20 6e 65 77 20 77 72 69 74 65 20  ate a new write 
6620: 65 76 65 6e 74 20 75 6e 74 69 6c 20 77 65 20 68  event until we h
6630: 69 74 20 61 6e 0a 09 20 20 20 20 20 2a 20 6f 76  it an..     * ov
6640: 65 72 66 6c 6f 77 20 63 6f 6e 64 69 74 69 6f 6e  erflow condition
6650: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 66 6f 72  , we need to for
6660: 63 65 20 74 68 65 20 65 76 65 6e 74 20 6c 6f 6f  ce the event loo
6670: 70 20 74 6f 20 70 6f 6c 6c 0a 09 20 20 20 20 20  p to poll..     
6680: 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e 64  * until the cond
6690: 69 74 69 6f 6e 20 63 68 61 6e 67 65 73 2e 0a 09  ition changes...
66a0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66       */...    if
66b0: 20 28 47 4f 54 5f 42 49 54 53 28 73 74 61 74 65   (GOT_BITS(state
66c0: 50 74 72 2d 3e 77 61 74 63 68 45 76 65 6e 74 73  Ptr->watchEvents
66d0: 2c 20 46 44 5f 57 52 49 54 45 29 29 20 7b 0a 09  , FD_WRITE)) {..
66e0: 09 54 63 6c 5f 54 69 6d 65 20 62 6c 6f 63 6b 54  .Tcl_Time blockT
66f0: 69 6d 65 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a  ime = { 0, 0 };.
6700: 0a 09 09 54 63 6c 5f 53 65 74 4d 61 78 42 6c 6f  ...Tcl_SetMaxBlo
6710: 63 6b 54 69 6d 65 28 26 62 6c 6f 63 6b 54 69 6d  ckTime(&blockTim
6720: 65 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  e);..    }..    
6730: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  break;..}.../*..
6740: 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72   * Check for err
6750: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 72 20  or condition or 
6760: 6f 76 65 72 66 6c 6f 77 2e 20 49 6e 20 74 68 65  overflow. In the
6770: 20 65 76 65 6e 74 20 6f 66 20 6f 76 65 72 66 6c   event of overfl
6780: 6f 77 2c 20 77 65 0a 09 20 2a 20 6e 65 65 64 20  ow, we.. * need 
6790: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 46 44 5f  to clear the FD_
67a0: 57 52 49 54 45 20 66 6c 61 67 20 73 6f 20 77 65  WRITE flag so we
67b0: 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
67c0: 6e 65 78 74 20 77 72 69 74 61 62 6c 65 0a 09 20  next writable.. 
67d0: 2a 20 65 76 65 6e 74 2e 20 4e 6f 74 65 20 74 68  * event. Note th
67e0: 61 74 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 20  at Windows only 
67f0: 73 65 6e 64 73 20 61 20 6e 65 77 20 77 72 69 74  sends a new writ
6800: 61 62 6c 65 20 65 76 65 6e 74 20 61 66 74 65 72  able event after
6810: 20 61 0a 09 20 2a 20 73 65 6e 64 20 66 61 69 6c   a.. * send fail
6820: 73 20 77 69 74 68 20 57 53 41 45 57 4f 55 4c 44  s with WSAEWOULD
6830: 42 4c 4f 43 4b 2e 0a 09 20 2a 2f 0a 0a 09 65 72  BLOCK... */...er
6840: 72 6f 72 20 3d 20 57 53 41 47 65 74 4c 61 73 74  ror = WSAGetLast
6850: 45 72 72 6f 72 28 29 3b 0a 09 69 66 20 28 65 72  Error();..if (er
6860: 72 6f 72 20 3d 3d 20 57 53 41 45 57 4f 55 4c 44  ror == WSAEWOULD
6870: 42 4c 4f 43 4b 29 20 7b 0a 09 20 20 20 20 43 4c  BLOCK) {..    CL
6880: 45 41 52 5f 42 49 54 53 28 73 74 61 74 65 50 74  EAR_BITS(statePt
6890: 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 73 2c 20  r->readyEvents, 
68a0: 46 44 5f 57 52 49 54 45 29 3b 0a 09 20 20 20 20  FD_WRITE);..    
68b0: 69 66 20 28 47 4f 54 5f 42 49 54 53 28 73 74 61  if (GOT_BITS(sta
68c0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43  tePtr->flags, TC
68d0: 50 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 29 20  P_NONBLOCKING)) 
68e0: 7b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  {...*errorCodePt
68f0: 72 20 3d 20 45 57 4f 55 4c 44 42 4c 4f 43 4b 3b  r = EWOULDBLOCK;
6900: 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b  ...written = -1;
6910: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d  ...break;..    }
6920: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
6930: 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72  TclWinConvertErr
6940: 6f 72 28 65 72 72 6f 72 29 3b 0a 09 20 20 20 20  or(error);..    
6950: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
6960: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a  Tcl_GetErrno();.
6970: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d  .    written = -
6980: 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  1;..    break;..
6990: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 20 74 68  }.../*.. * In th
69a0: 65 20 62 6c 6f 63 6b 69 6e 67 20 63 61 73 65 2c  e blocking case,
69b0: 20 77 61 69 74 20 75 6e 74 69 6c 20 74 68 65 20   wait until the 
69c0: 66 69 6c 65 20 62 65 63 6f 6d 65 73 20 77 72 69  file becomes wri
69d0: 74 61 62 6c 65 20 6f 72 0a 09 20 2a 20 63 6c 6f  table or.. * clo
69e0: 73 65 64 20 61 6e 64 20 74 72 79 20 61 67 61 69  sed and try agai
69f0: 6e 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21 57  n... */...if (!W
6a00: 61 69 74 46 6f 72 53 6f 63 6b 65 74 45 76 65 6e  aitForSocketEven
6a10: 74 28 73 74 61 74 65 50 74 72 2c 20 46 44 5f 57  t(statePtr, FD_W
6a20: 52 49 54 45 7c 46 44 5f 43 4c 4f 53 45 2c 20 65  RITE|FD_CLOSE, e
6a30: 72 72 6f 72 43 6f 64 65 50 74 72 29 29 20 7b 0a  rrorCodePtr)) {.
6a40: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d  .    written = -
6a50: 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  1;..    break;..
6a60: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 65 6e  }.    }..    Sen
6a70: 64 53 65 6c 65 63 74 4d 65 73 73 61 67 65 28 74  dSelectMessage(t
6a80: 73 64 50 74 72 2c 20 53 45 4c 45 43 54 2c 20 73  sdPtr, SELECT, s
6a90: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 72  tatePtr);..    r
6aa0: 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a 7d  eturn written;.}
6ab0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6b00: 2a 0a 20 2a 20 54 63 70 43 6c 6f 73 65 50 72 6f  *. * TcpClosePro
6b10: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
6b20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6b30: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
6b40: 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65  c IO level to pe
6b50: 72 66 6f 72 6d 20 63 68 61 6e 6e 65 6c 0a 20 2a  rform channel. *
6b60: 09 74 79 70 65 20 73 70 65 63 69 66 69 63 20 63  .type specific c
6b70: 6c 65 61 6e 75 70 20 6f 6e 20 61 20 73 6f 63 6b  leanup on a sock
6b80: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
6b90: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 6e 65   when the channe
6ba0: 6c 20 69 73 0a 20 2a 09 63 6c 6f 73 65 64 2e 0a  l is. *.closed..
6bb0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
6bc0: 2a 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75  *.0 if successfu
6bd0: 6c 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  l, the value of 
6be0: 65 72 72 6e 6f 20 69 66 20 66 61 69 6c 65 64 2e  errno if failed.
6bf0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
6c00: 63 74 73 3a 0a 20 2a 09 43 6c 6f 73 65 73 20 74  cts:. *.Closes t
6c10: 68 65 20 73 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a  he socket.. *. *
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
6c70: 69 63 20 69 6e 74 0a 54 63 70 43 6c 6f 73 65 50  ic int.TcpCloseP
6c80: 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69  roc(.    void *i
6c90: 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20  nstanceData,./* 
6ca0: 54 68 65 20 73 6f 63 6b 65 74 20 74 6f 20 63 6c  The socket to cl
6cb0: 6f 73 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ose. */.    Tcl_
6cc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 09  Interp *interp).
6cd0: 09 2f 2a 20 55 6e 75 73 65 64 2e 20 2a 2f 0a 7b  ./* Unused. */.{
6ce0: 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73  .    TcpState *s
6cf0: 74 61 74 65 50 74 72 20 3d 20 28 54 63 70 53 74  tatePtr = (TcpSt
6d00: 61 74 65 20 2a 29 69 6e 73 74 61 6e 63 65 44 61  ate *)instanceDa
6d10: 74 61 3b 0a 20 20 20 20 2f 2a 20 54 49 50 20 23  ta;.    /* TIP #
6d20: 32 31 38 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  218 */.    int e
6d30: 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  rrorCode = 0;.  
6d40: 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69 63    ThreadSpecific
6d50: 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20 54  Data *tsdPtr = T
6d60: 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64 61 74  CL_TSD_INIT(&dat
6d70: 61 4b 65 79 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  aKey);..    /*. 
6d80: 20 20 20 20 2a 20 43 68 65 63 6b 20 74 68 61 74      * Check that
6d90: 20 57 69 6e 53 6f 63 6b 20 69 73 20 69 6e 69 74   WinSock is init
6da0: 69 61 6c 69 7a 65 64 3b 20 64 6f 20 6e 6f 74 20  ialized; do not 
6db0: 63 61 6c 6c 20 69 74 20 69 66 20 6e 6f 74 2c 20  call it if not, 
6dc0: 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20 20  to prevent.     
6dd0: 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  * system crashes
6de0: 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  . This can happe
6df0: 6e 20 61 74 20 65 78 69 74 20 74 69 6d 65 20 69  n at exit time i
6e00: 66 20 74 68 65 20 65 78 69 74 20 68 61 6e 64 6c  f the exit handl
6e10: 65 72 20 66 6f 72 0a 20 20 20 20 20 2a 20 57 69  er for.     * Wi
6e20: 6e 53 6f 63 6b 20 72 61 6e 20 62 65 66 6f 72 65  nSock ran before
6e30: 20 6f 74 68 65 72 20 65 78 69 74 20 68 61 6e 64   other exit hand
6e40: 6c 65 72 73 20 74 68 61 74 20 77 61 6e 74 20 74  lers that want t
6e50: 6f 20 75 73 65 20 73 6f 63 6b 65 74 73 2e 0a 20  o use sockets.. 
6e60: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
6e70: 53 6f 63 6b 65 74 73 45 6e 61 62 6c 65 64 28 29  SocketsEnabled()
6e80: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 43 6c 65 61  ) {../*.. * Clea
6e90: 6e 20 75 70 20 74 68 65 20 4f 53 20 73 6f 63 6b  n up the OS sock
6ea0: 65 74 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 64  et handle. The d
6eb0: 65 66 61 75 6c 74 20 57 69 6e 64 6f 77 73 20 73  efault Windows s
6ec0: 65 74 74 69 6e 67 20 66 6f 72 20 61 0a 09 20 2a  etting for a.. *
6ed0: 20 73 6f 63 6b 65 74 20 69 73 20 53 4f 5f 44 4f   socket is SO_DO
6ee0: 4e 54 4c 49 4e 47 45 52 2c 20 77 68 69 63 68 20  NTLINGER, which 
6ef0: 64 6f 65 73 20 61 20 67 72 61 63 65 66 75 6c 20  does a graceful 
6f00: 73 68 75 74 64 6f 77 6e 20 69 6e 20 74 68 65 0a  shutdown in the.
6f10: 09 20 2a 20 62 61 63 6b 67 72 6f 75 6e 64 2e 0a  . * background..
6f20: 09 20 2a 2f 0a 0a 09 77 68 69 6c 65 20 28 73 74  . */...while (st
6f30: 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 20  atePtr->sockets 
6f40: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
6f50: 54 63 70 46 64 4c 69 73 74 20 2a 74 68 69 73 66  TcpFdList *thisf
6f60: 64 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 6f  d = statePtr->so
6f70: 63 6b 65 74 73 3b 0a 0a 09 20 20 20 20 73 74 61  ckets;...    sta
6f80: 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 20 3d  tePtr->sockets =
6f90: 20 74 68 69 73 66 64 2d 3e 6e 65 78 74 3b 0a 09   thisfd->next;..
6fa0: 20 20 20 20 69 66 20 28 63 6c 6f 73 65 73 6f 63      if (closesoc
6fb0: 6b 65 74 28 74 68 69 73 66 64 2d 3e 66 64 29 20  ket(thisfd->fd) 
6fc0: 3d 3d 20 53 4f 43 4b 45 54 5f 45 52 52 4f 52 29  == SOCKET_ERROR)
6fd0: 20 7b 0a 09 09 54 63 6c 57 69 6e 43 6f 6e 76 65   {...TclWinConve
6fe0: 72 74 45 72 72 6f 72 28 28 44 57 4f 52 44 29 20  rtError((DWORD) 
6ff0: 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f 72 28  WSAGetLastError(
7000: 29 29 3b 0a 09 09 65 72 72 6f 72 43 6f 64 65 20  ));...errorCode 
7010: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  = Tcl_GetErrno()
7020: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 63 6b  ;..    }..    ck
7030: 66 72 65 65 28 74 68 69 73 66 64 29 3b 0a 09 7d  free(thisfd);..}
7040: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
7050: 73 74 61 74 65 50 74 72 2d 3e 61 64 64 72 6c 69  statePtr->addrli
7060: 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20  st != NULL) {.  
7070: 20 20 20 20 20 20 66 72 65 65 61 64 64 72 69 6e        freeaddrin
7080: 66 6f 28 73 74 61 74 65 50 74 72 2d 3e 61 64 64  fo(statePtr->add
7090: 72 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rlist);.    }.  
70a0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
70b0: 6d 79 61 64 64 72 6c 69 73 74 20 21 3d 20 4e 55  myaddrlist != NU
70c0: 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 66 72  LL) {.        fr
70d0: 65 65 61 64 64 72 69 6e 66 6f 28 73 74 61 74 65  eeaddrinfo(state
70e0: 50 74 72 2d 3e 6d 79 61 64 64 72 6c 69 73 74 29  Ptr->myaddrlist)
70f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
7100: 20 20 20 20 20 2a 20 43 6c 65 61 72 20 61 6e 20       * Clear an 
7110: 65 76 65 6e 74 75 61 6c 20 74 73 64 20 69 6e 66  eventual tsd inf
7120: 6f 20 6c 69 73 74 20 70 6f 69 6e 74 65 72 2e 0a  o list pointer..
7130: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68       *.     * Th
7140: 69 73 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  is may be called
7150: 2c 20 69 66 20 61 6e 20 61 73 79 6e 63 20 73 6f  , if an async so
7160: 63 6b 65 74 20 63 6f 6e 6e 65 63 74 20 66 61 69  cket connect fai
7170: 6c 73 20 6f 72 20 69 73 20 63 6c 6f 73 65 64 0a  ls or is closed.
7180: 20 20 20 20 20 2a 20 62 65 74 77 65 65 6e 20 63       * between c
7190: 6f 6e 6e 65 63 74 20 61 6e 64 20 74 68 72 65 61  onnect and threa
71a0: 64 20 61 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63  d action callbac
71b0: 6b 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  k..     */..    
71c0: 69 66 20 28 74 73 64 50 74 72 2d 3e 70 65 6e 64  if (tsdPtr->pend
71d0: 69 6e 67 54 63 70 53 74 61 74 65 20 21 3d 20 4e  ingTcpState != N
71e0: 55 4c 4c 0a 09 20 20 20 20 26 26 20 74 73 64 50  ULL..    && tsdP
71f0: 74 72 2d 3e 70 65 6e 64 69 6e 67 54 63 70 53 74  tr->pendingTcpSt
7200: 61 74 65 20 3d 3d 20 73 74 61 74 65 50 74 72 29  ate == statePtr)
7210: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 47 65 74 20 69   {../*.. * Get i
7220: 6e 66 6f 50 74 72 20 6c 6f 63 6b 2c 20 62 65 63  nfoPtr lock, bec
7230: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 63 65 72  ause this concer
7240: 6e 73 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  ns the notifier 
7250: 74 68 72 65 61 64 2e 0a 09 20 2a 2f 0a 0a 09 57  thread... */...W
7260: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
7270: 63 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65  ct(tsdPtr->socke
7280: 74 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e  tListLock, INFIN
7290: 49 54 45 29 3b 0a 0a 09 74 73 64 50 74 72 2d 3e  ITE);...tsdPtr->
72a0: 70 65 6e 64 69 6e 67 54 63 70 53 74 61 74 65 20  pendingTcpState 
72b0: 3d 20 4e 55 4c 4c 3b 0a 0a 09 2f 2a 0a 09 20 2a  = NULL;.../*.. *
72c0: 20 46 72 65 65 20 6c 69 73 74 20 6c 6f 63 6b 2e   Free list lock.
72d0: 0a 09 20 2a 2f 0a 0a 09 53 65 74 45 76 65 6e 74  .. */...SetEvent
72e0: 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c  (tsdPtr->socketL
72f0: 69 73 74 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a  istLock);.    }.
7300: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54  .    /*.     * T
7310: 49 50 20 23 32 31 38 2e 20 52 65 6d 6f 76 65 64  IP #218. Removed
7320: 20 74 68 65 20 63 6f 64 65 20 72 65 6d 6f 76 69   the code removi
7330: 6e 67 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ng the structure
7340: 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c   from the global
7350: 0a 20 20 20 20 20 2a 20 73 6f 63 6b 65 74 20 6c  .     * socket l
7360: 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ist. This is now
7370: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 74 68 72   done by the thr
7380: 65 61 64 20 61 63 74 69 6f 6e 20 63 61 6c 6c 62  ead action callb
7390: 61 63 6b 73 2c 20 61 6e 64 20 6f 6e 6c 79 0a 20  acks, and only. 
73a0: 20 20 20 20 2a 20 74 68 65 72 65 2e 20 54 68 69      * there. Thi
73b0: 73 20 68 61 70 70 65 6e 73 20 62 65 66 6f 72 65  s happens before
73c0: 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 63 61   this code is ca
73d0: 6c 6c 65 64 2e 20 57 65 20 63 61 6e 20 66 72 65  lled. We can fre
73e0: 65 20 77 69 74 68 6f 75 74 0a 20 20 20 20 20 2a  e without.     *
73f0: 20 66 65 61 72 20 6f 66 20 64 61 6d 61 67 69 6e   fear of damagin
7400: 67 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 20 20  g the list..    
7410: 20 2a 2f 0a 0a 20 20 20 20 63 6b 66 72 65 65 28   */..    ckfree(
7420: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72  statePtr);.    r
7430: 65 74 75 72 6e 20 65 72 72 6f 72 43 6f 64 65 3b  eturn errorCode;
7440: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
7450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7490: 0a 20 2a 0a 20 2a 20 54 63 70 43 6c 6f 73 65 32  . *. * TcpClose2
74a0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
74b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
74c0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e  alled by the gen
74d0: 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f  eric IO level to
74e0: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 63 68 61   perform the cha
74f0: 6e 6e 65 6c 0a 20 2a 09 74 79 70 65 20 73 70 65  nnel. *.type spe
7500: 63 69 66 69 63 20 70 61 72 74 20 6f 66 20 61 20  cific part of a 
7510: 68 61 6c 66 2d 63 6c 6f 73 65 3a 20 6e 61 6d 65  half-close: name
7520: 6c 79 2c 20 61 20 73 68 75 74 64 6f 77 6e 28 29  ly, a shutdown()
7530: 20 6f 6e 20 61 20 73 6f 63 6b 65 74 2e 0a 20 2a   on a socket.. *
7540: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
7550: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  0 if successful,
7560: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72   the value of er
7570: 72 6e 6f 20 69 66 20 66 61 69 6c 65 64 2e 0a 20  rno if failed.. 
7580: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
7590: 73 3a 0a 20 2a 09 53 68 75 74 73 20 64 6f 77 6e  s:. *.Shuts down
75a0: 20 6f 6e 65 20 73 69 64 65 20 6f 66 20 74 68 65   one side of the
75b0: 20 73 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a 2d 2d   socket.. *. *--
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7600: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
7610: 20 69 6e 74 0a 54 63 70 43 6c 6f 73 65 32 50 72   int.TcpClose2Pr
7620: 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e  oc(.    void *in
7630: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54  stanceData,./* T
7640: 68 65 20 73 6f 63 6b 65 74 20 74 6f 20 63 6c 6f  he socket to clo
7650: 73 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  se. */.    Tcl_I
7660: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
7670: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70  /* For error rep
7680: 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  orting. */.    i
7690: 6e 74 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 46  nt flags).../* F
76a0: 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61  lags that indica
76b0: 74 65 20 77 68 69 63 68 20 73 69 64 65 20 74 6f  te which side to
76c0: 20 63 6c 6f 73 65 2e 20 2a 2f 0a 7b 0a 20 20 20   close. */.{.   
76d0: 20 54 63 70 53 74 61 74 65 20 2a 73 74 61 74 65   TcpState *state
76e0: 50 74 72 20 3d 20 28 54 63 70 53 74 61 74 65 20  Ptr = (TcpState 
76f0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
7700: 20 20 20 20 69 6e 74 20 72 65 61 64 45 72 72 6f      int readErro
7710: 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 77  r = 0;.    int w
7720: 72 69 74 65 45 72 72 6f 72 20 3d 20 30 3b 0a 0a  riteError = 0;..
7730: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 68      /*.     * Sh
7740: 75 74 64 6f 77 6e 20 74 68 65 20 4f 53 20 73 6f  utdown the OS so
7750: 63 6b 65 74 20 68 61 6e 64 6c 65 2e 0a 20 20 20  cket handle..   
7760: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 28 66    */..    if ((f
7770: 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53  lags & (TCL_CLOS
7780: 45 5f 52 45 41 44 7c 54 43 4c 5f 43 4c 4f 53 45  E_READ|TCL_CLOSE
7790: 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 20 7b  _WRITE)) == 0) {
77a0: 0a 09 72 65 74 75 72 6e 20 54 63 70 43 6c 6f 73  ..return TcpClos
77b0: 65 50 72 6f 63 28 69 6e 73 74 61 6e 63 65 44 61  eProc(instanceDa
77c0: 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta, interp);.   
77d0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
77e0: 2a 20 53 69 6e 67 6c 65 20 66 64 20 6f 70 65 72  * Single fd oper
77f0: 61 74 69 6f 6e 3a 20 54 63 6c 5f 4f 70 65 6e 54  ation: Tcl_OpenT
7800: 63 70 53 65 72 76 65 72 28 29 20 64 6f 65 73 20  cpServer() does 
7810: 6e 6f 74 20 73 65 74 20 54 43 4c 5f 52 45 41 44  not set TCL_READ
7820: 41 42 4c 45 20 6f 72 0a 20 20 20 20 20 2a 20 54  ABLE or.     * T
7830: 43 4c 5f 57 52 49 54 41 42 4c 45 20 73 6f 20 74  CL_WRITABLE so t
7840: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
7850: 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61   be called for a
7860: 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74 2e 0a   server socket..
7870: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
7880: 28 28 66 6c 61 67 73 20 26 20 54 43 4c 5f 43 4c  ((flags & TCL_CL
7890: 4f 53 45 5f 52 45 41 44 29 20 26 26 20 28 73 68  OSE_READ) && (sh
78a0: 75 74 64 6f 77 6e 28 73 74 61 74 65 50 74 72 2d  utdown(statePtr-
78b0: 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 2c 20 53 44  >sockets->fd, SD
78c0: 5f 52 45 43 45 49 56 45 29 20 3d 3d 20 53 4f 43  _RECEIVE) == SOC
78d0: 4b 45 54 5f 45 52 52 4f 52 29 29 20 7b 0a 09 54  KET_ERROR)) {..T
78e0: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f  clWinConvertErro
78f0: 72 28 28 44 57 4f 52 44 29 20 57 53 41 47 65 74  r((DWORD) WSAGet
7900: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 72  LastError());..r
7910: 65 61 64 45 72 72 6f 72 20 3d 20 54 63 6c 5f 47  eadError = Tcl_G
7920: 65 74 45 72 72 6e 6f 28 29 3b 0a 20 20 20 20 7d  etErrno();.    }
7930: 0a 20 20 20 20 69 66 20 28 28 66 6c 61 67 73 20  .    if ((flags 
7940: 26 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54  & TCL_CLOSE_WRIT
7950: 45 29 20 26 26 20 28 73 68 75 74 64 6f 77 6e 28  E) && (shutdown(
7960: 73 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74  statePtr->socket
7970: 73 2d 3e 66 64 2c 20 53 44 5f 53 45 4e 44 29 20  s->fd, SD_SEND) 
7980: 3d 3d 20 53 4f 43 4b 45 54 5f 45 52 52 4f 52 29  == SOCKET_ERROR)
7990: 29 20 7b 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65  ) {..TclWinConve
79a0: 72 74 45 72 72 6f 72 28 28 44 57 4f 52 44 29 20  rtError((DWORD) 
79b0: 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f 72 28  WSAGetLastError(
79c0: 29 29 3b 0a 09 77 72 69 74 65 45 72 72 6f 72 20  ));..writeError 
79d0: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  = Tcl_GetErrno()
79e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
79f0: 72 6e 20 28 72 65 61 64 45 72 72 6f 72 20 21 3d  rn (readError !=
7a00: 20 30 29 20 3f 20 72 65 61 64 45 72 72 6f 72 20   0) ? readError 
7a10: 3a 20 77 72 69 74 65 45 72 72 6f 72 3b 0a 7d 0a  : writeError;.}.
7a20: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7a70: 0a 20 2a 20 54 63 70 53 65 74 4f 70 74 69 6f 6e  . * TcpSetOption
7a80: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65  Proc --. *. *.Se
7a90: 74 73 20 54 63 70 20 63 68 61 6e 6e 65 6c 20 73  ts Tcp channel s
7aa0: 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 73 2e  pecific options.
7ab0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
7ac0: 20 2a 09 4e 6f 6e 65 2c 20 75 6e 6c 65 73 73 20   *.None, unless 
7ad0: 61 6e 20 65 72 72 6f 72 20 68 61 70 70 65 6e 73  an error happens
7ae0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
7af0: 65 63 74 73 3a 0a 20 2a 09 43 68 61 6e 67 65 73  ects:. *.Changes
7b00: 20 61 74 74 72 69 62 75 74 65 73 20 6f 66 20 74   attributes of t
7b10: 68 65 20 73 6f 63 6b 65 74 20 61 74 20 74 68 65  he socket at the
7b20: 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 0a 20   system level.. 
7b30: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
7b80: 73 74 61 74 69 63 20 69 6e 74 0a 54 63 70 53 65  static int.TcpSe
7b90: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 0a 20 20 20  tOptionProc(.   
7ba0: 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 44   void *instanceD
7bb0: 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73  ata,./* Socket s
7bc0: 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  tate. */.    Tcl
7bd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7be0: 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72  ../* For error r
7bf0: 65 70 6f 72 74 69 6e 67 20 2d 20 63 61 6e 20 62  eporting - can b
7c00: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63  e NULL. */.    c
7c10: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f  onst char *optio
7c20: 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f  nName,./* Name o
7c30: 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20  f the option to 
7c40: 73 65 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  set. */.    cons
7c50: 74 20 63 68 61 72 20 2a 76 61 6c 75 65 29 09 09  t char *value)..
7c60: 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72  /* New value for
7c70: 20 6f 70 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 23 69   option. */.{.#i
7c80: 66 64 65 66 20 54 43 4c 5f 46 45 41 54 55 52 45  fdef TCL_FEATURE
7c90: 5f 4b 45 45 50 41 4c 49 56 45 5f 4e 41 47 4c 45  _KEEPALIVE_NAGLE
7ca0: 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73  .    TcpState *s
7cb0: 74 61 74 65 50 74 72 20 3d 20 69 6e 73 74 61 6e  tatePtr = instan
7cc0: 63 65 44 61 74 61 3b 0a 20 20 20 20 53 4f 43 4b  ceData;.    SOCK
7cd0: 45 54 20 73 6f 63 6b 3b 0a 23 65 6e 64 69 66 20  ET sock;.#endif 
7ce0: 2f 2a 54 43 4c 5f 46 45 41 54 55 52 45 5f 4b 45  /*TCL_FEATURE_KE
7cf0: 45 50 41 4c 49 56 45 5f 4e 41 47 4c 45 2a 2f 0a  EPALIVE_NAGLE*/.
7d00: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43  .    /*.     * C
7d10: 68 65 63 6b 20 74 68 61 74 20 57 69 6e 53 6f 63  heck that WinSoc
7d20: 6b 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  k is initialized
7d30: 3b 20 64 6f 20 6e 6f 74 20 63 61 6c 6c 20 69 74  ; do not call it
7d40: 20 69 66 20 6e 6f 74 2c 20 74 6f 20 70 72 65 76   if not, to prev
7d50: 65 6e 74 0a 20 20 20 20 20 2a 20 73 79 73 74 65  ent.     * syste
7d60: 6d 20 63 72 61 73 68 65 73 2e 20 54 68 69 73 20  m crashes. This 
7d70: 63 61 6e 20 68 61 70 70 65 6e 20 61 74 20 65 78  can happen at ex
7d80: 69 74 20 74 69 6d 65 20 69 66 20 74 68 65 20 65  it time if the e
7d90: 78 69 74 20 68 61 6e 64 6c 65 72 20 66 6f 72 0a  xit handler for.
7da0: 20 20 20 20 20 2a 20 57 69 6e 53 6f 63 6b 20 72       * WinSock r
7db0: 61 6e 20 62 65 66 6f 72 65 20 6f 74 68 65 72 20  an before other 
7dc0: 65 78 69 74 20 68 61 6e 64 6c 65 72 73 20 74 68  exit handlers th
7dd0: 61 74 20 77 61 6e 74 20 74 6f 20 75 73 65 20 73  at want to use s
7de0: 6f 63 6b 65 74 73 2e 0a 20 20 20 20 20 2a 2f 0a  ockets..     */.
7df0: 0a 20 20 20 20 69 66 20 28 21 53 6f 63 6b 65 74  .    if (!Socket
7e00: 73 45 6e 61 62 6c 65 64 28 29 29 20 7b 0a 09 69  sEnabled()) {..i
7e10: 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 20 20  f (interp) {..  
7e20: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
7e30: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
7e40: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 20  ewStringObj(... 
7e50: 20 20 20 22 77 69 6e 73 6f 63 6b 20 69 73 20 6e     "winsock is n
7e60: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 2c  ot initialized",
7e70: 20 2d 31 29 29 3b 0a 09 7d 0a 09 72 65 74 75 72   -1));..}..retur
7e80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7e90: 20 7d 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 46   }..#ifdef TCL_F
7ea0: 45 41 54 55 52 45 5f 4b 45 45 50 41 4c 49 56 45  EATURE_KEEPALIVE
7eb0: 5f 4e 41 47 4c 45 0a 23 65 72 72 6f 72 20 22 54  _NAGLE.#error "T
7ec0: 43 4c 5f 46 45 41 54 55 52 45 5f 4b 45 45 50 41  CL_FEATURE_KEEPA
7ed0: 4c 49 56 45 5f 4e 41 47 4c 45 20 6e 6f 74 20 72  LIVE_NAGLE not r
7ee0: 65 76 69 65 77 65 64 20 66 6f 72 20 77 68 65 74  eviewed for whet
7ef0: 68 65 72 20 74 6f 20 74 72 65 61 74 20 73 74 61  her to treat sta
7f00: 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 20 61  tePtr->sockets a
7f10: 73 20 73 69 6e 67 6c 65 20 66 64 20 6f 72 20 6c  s single fd or l
7f20: 69 73 74 22 0a 20 20 20 20 73 6f 63 6b 20 3d 20  ist".    sock = 
7f30: 73 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74  statePtr->socket
7f40: 73 2d 3e 66 64 3b 0a 0a 20 20 20 20 69 66 20 28  s->fd;..    if (
7f50: 21 73 74 72 63 61 73 65 63 6d 70 28 6f 70 74 69  !strcasecmp(opti
7f60: 6f 6e 4e 61 6d 65 2c 20 22 2d 6b 65 65 70 61 6c  onName, "-keepal
7f70: 69 76 65 22 29 29 20 7b 0a 09 42 4f 4f 4c 20 76  ive")) {..BOOL v
7f80: 61 6c 20 3d 20 46 41 4c 53 45 3b 0a 09 69 6e 74  al = FALSE;..int
7f90: 20 62 6f 6f 6c 56 61 72 2c 20 72 74 6e 3b 0a 0a   boolVar, rtn;..
7fa0: 09 69 66 20 28 54 63 6c 5f 47 65 74 42 6f 6f 6c  .if (Tcl_GetBool
7fb0: 65 61 6e 28 69 6e 74 65 72 70 2c 20 76 61 6c 75  ean(interp, valu
7fc0: 65 2c 20 26 62 6f 6f 6c 56 61 72 29 20 21 3d 20  e, &boolVar) != 
7fd0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72  TCL_OK) {..    r
7fe0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7ff0: 0a 09 7d 0a 09 69 66 20 28 62 6f 6f 6c 56 61 72  ..}..if (boolVar
8000: 29 20 7b 0a 09 20 20 20 20 76 61 6c 20 3d 20 54  ) {..    val = T
8010: 52 55 45 3b 0a 09 7d 0a 09 72 74 6e 20 3d 20 73  RUE;..}..rtn = s
8020: 65 74 73 6f 63 6b 6f 70 74 28 73 6f 63 6b 2c 20  etsockopt(sock, 
8030: 53 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f 5f 4b  SOL_SOCKET, SO_K
8040: 45 45 50 41 4c 49 56 45 2c 0a 09 09 28 63 6f 6e  EEPALIVE,...(con
8050: 73 74 20 63 68 61 72 20 2a 29 20 26 76 61 6c 2c  st char *) &val,
8060: 20 73 69 7a 65 6f 66 28 42 4f 4f 4c 29 29 3b 0a   sizeof(BOOL));.
8070: 09 69 66 20 28 72 74 6e 20 21 3d 20 30 29 20 7b  .if (rtn != 0) {
8080: 0a 09 20 20 20 20 54 63 6c 57 69 6e 43 6f 6e 76  ..    TclWinConv
8090: 65 72 74 45 72 72 6f 72 28 57 53 41 47 65 74 4c  ertError(WSAGetL
80a0: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 20 20  astError());..  
80b0: 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a    if (interp) {.
80c0: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
80d0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
80e0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 09 22 63 6f  bjPrintf(...."co
80f0: 75 6c 64 6e 27 74 20 73 65 74 20 73 6f 63 6b 65  uldn't set socke
8100: 74 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 0a 09  t option: %s",..
8110: 09 09 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72  ..Tcl_PosixError
8120: 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 20 20 20  (interp)));..   
8130: 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
8140: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 72 65  CL_ERROR;..}..re
8150: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
8160: 20 7d 20 65 6c 73 65 20 69 66 20 28 21 73 74 72   } else if (!str
8170: 63 61 73 65 63 6d 70 28 6f 70 74 69 6f 6e 4e 61  casecmp(optionNa
8180: 6d 65 2c 20 22 2d 6e 61 67 6c 65 22 29 29 20 7b  me, "-nagle")) {
8190: 0a 09 42 4f 4f 4c 20 76 61 6c 20 3d 20 46 41 4c  ..BOOL val = FAL
81a0: 53 45 3b 0a 09 69 6e 74 20 62 6f 6f 6c 56 61 72  SE;..int boolVar
81b0: 2c 20 72 74 6e 3b 0a 0a 09 69 66 20 28 54 63 6c  , rtn;...if (Tcl
81c0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 28 69 6e 74 65  _GetBoolean(inte
81d0: 72 70 2c 20 76 61 6c 75 65 2c 20 26 62 6f 6f 6c  rp, value, &bool
81e0: 56 61 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  Var) != TCL_OK) 
81f0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
8200: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20  L_ERROR;..}..if 
8210: 28 21 62 6f 6f 6c 56 61 72 29 20 7b 0a 09 20 20  (!boolVar) {..  
8220: 20 20 76 61 6c 20 3d 20 54 52 55 45 3b 0a 09 7d    val = TRUE;..}
8230: 0a 09 72 74 6e 20 3d 20 73 65 74 73 6f 63 6b 6f  ..rtn = setsocko
8240: 70 74 28 73 6f 63 6b 2c 20 49 50 50 52 4f 54 4f  pt(sock, IPPROTO
8250: 5f 54 43 50 2c 20 54 43 50 5f 4e 4f 44 45 4c 41  _TCP, TCP_NODELA
8260: 59 2c 0a 09 09 28 63 6f 6e 73 74 20 63 68 61 72  Y,...(const char
8270: 20 2a 29 20 26 76 61 6c 2c 20 73 69 7a 65 6f 66   *) &val, sizeof
8280: 28 42 4f 4f 4c 29 29 3b 0a 09 69 66 20 28 72 74  (BOOL));..if (rt
8290: 6e 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  n != 0) {..    T
82a0: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f  clWinConvertErro
82b0: 72 28 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f  r(WSAGetLastErro
82c0: 72 28 29 29 3b 0a 09 20 20 20 20 69 66 20 28 69  r());..    if (i
82d0: 6e 74 65 72 70 29 20 7b 0a 09 09 54 63 6c 5f 53  nterp) {...Tcl_S
82e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
82f0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  rp, Tcl_ObjPrint
8300: 66 28 0a 09 09 09 22 63 6f 75 6c 64 6e 27 74 20  f(...."couldn't 
8310: 73 65 74 20 73 6f 63 6b 65 74 20 6f 70 74 69 6f  set socket optio
8320: 6e 3a 20 25 73 22 2c 0a 09 09 09 54 63 6c 5f 50  n: %s",....Tcl_P
8330: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70  osixError(interp
8340: 29 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  )));..    }..   
8350: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8360: 52 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43  R;..}..return TC
8370: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  L_OK;.    }..   
8380: 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43   return Tcl_BadC
8390: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
83a0: 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c  erp, optionName,
83b0: 20 22 6b 65 65 70 61 6c 69 76 65 20 6e 61 67 6c   "keepalive nagl
83c0: 65 22 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  e");.#else.    r
83d0: 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61  eturn Tcl_BadCha
83e0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
83f0: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22  p, optionName, "
8400: 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 54 43 4c  ");.#endif /*TCL
8410: 5f 46 45 41 54 55 52 45 5f 4b 45 45 50 41 4c 49  _FEATURE_KEEPALI
8420: 56 45 5f 4e 41 47 4c 45 2a 2f 0a 7d 0a 0c 0a 2f  VE_NAGLE*/.}.../
8430: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8480: 20 54 63 70 47 65 74 4f 70 74 69 6f 6e 50 72 6f   TcpGetOptionPro
8490: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 75  c --. *. *.Compu
84a0: 74 65 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61  tes an option va
84b0: 6c 75 65 20 66 6f 72 20 61 20 54 43 50 20 73 6f  lue for a TCP so
84c0: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
84d0: 65 6c 2c 20 6f 72 20 61 20 6c 69 73 74 20 6f 66  el, or a list of
84e0: 0a 20 2a 09 61 6c 6c 20 6f 70 74 69 6f 6e 73 20  . *.all options 
84f0: 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73  and their values
8500: 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a 20 54 68  .. *. *.Note: Th
8510: 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 65 64  is code is based
8520: 20 6f 6e 20 63 6f 64 65 20 63 6f 6e 74 72 69 62   on code contrib
8530: 75 74 65 64 20 62 79 20 4a 6f 68 6e 20 48 61 78  uted by John Hax
8540: 62 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  by.. *. * Result
8550: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
8560: 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 54 68 65   Tcl result. The
8570: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 70   value of the sp
8580: 65 63 69 66 69 65 64 20 6f 70 74 69 6f 6e 20 6f  ecified option o
8590: 72 20 61 20 6c 69 73 74 20 6f 66 0a 20 2a 09 61  r a list of. *.a
85a0: 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74  ll options and t
85b0: 68 65 69 72 20 76 61 6c 75 65 73 20 69 73 20 72  heir values is r
85c0: 65 74 75 72 6e 65 64 20 69 6e 20 74 68 65 20 73  eturned in the s
85d0: 75 70 70 6c 69 65 64 20 44 53 74 72 69 6e 67 2e  upplied DString.
85e0: 20 53 65 74 73 0a 20 2a 09 45 72 72 6f 72 20 6d   Sets. *.Error m
85f0: 65 73 73 61 67 65 20 69 66 20 6e 65 65 64 65 64  essage if needed
8600: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
8610: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
8620: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
8670: 73 74 61 74 69 63 20 69 6e 74 0a 54 63 70 47 65  static int.TcpGe
8680: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 0a 20 20 20  tOptionProc(.   
8690: 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 44   void *instanceD
86a0: 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73  ata,./* Socket s
86b0: 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  tate. */.    Tcl
86c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
86d0: 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72  ../* For error r
86e0: 65 70 6f 72 74 69 6e 67 20 2d 20 63 61 6e 20 62  eporting - can b
86f0: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63  e NULL. */.    c
8700: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f  onst char *optio
8710: 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f  nName,./* Name o
8720: 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20  f the option to 
8730: 72 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c  retrieve the val
8740: 75 65 0a 09 09 09 09 20 2a 20 66 6f 72 2c 20 6f  ue..... * for, o
8750: 72 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c  r NULL to get al
8760: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68  l options and th
8770: 65 69 72 0a 09 09 09 09 20 2a 20 76 61 6c 75 65  eir..... * value
8780: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  s. */.    Tcl_DS
8790: 74 72 69 6e 67 20 2a 64 73 50 74 72 29 09 09 2f  tring *dsPtr)../
87a0: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65  * Where to store
87b0: 20 74 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61   the computed va
87c0: 6c 75 65 3b 0a 09 09 09 09 20 2a 20 69 6e 69 74  lue;..... * init
87d0: 69 61 6c 69 7a 65 64 20 62 79 20 63 61 6c 6c 65  ialized by calle
87e0: 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 70 53  r. */.{.    TcpS
87f0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
8800: 20 28 54 63 70 53 74 61 74 65 20 2a 29 69 6e 73   (TcpState *)ins
8810: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 63  tanceData;.    c
8820: 68 61 72 20 68 6f 73 74 5b 4e 49 5f 4d 41 58 48  har host[NI_MAXH
8830: 4f 53 54 5d 2c 20 70 6f 72 74 5b 4e 49 5f 4d 41  OST], port[NI_MA
8840: 58 53 45 52 56 5d 3b 0a 20 20 20 20 53 4f 43 4b  XSERV];.    SOCK
8850: 45 54 20 73 6f 63 6b 3b 0a 20 20 20 20 73 69 7a  ET sock;.    siz
8860: 65 5f 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20  e_t len = 0;.   
8870: 20 69 6e 74 20 72 65 76 65 72 73 65 44 4e 53 20   int reverseDNS 
8880: 3d 20 30 3b 0a 23 64 65 66 69 6e 65 20 53 55 50  = 0;.#define SUP
8890: 50 52 45 53 53 5f 52 44 4e 53 5f 56 41 52 20 22  PRESS_RDNS_VAR "
88a0: 3a 3a 74 63 6c 3a 3a 75 6e 73 75 70 70 6f 72 74  ::tcl::unsupport
88b0: 65 64 3a 3a 6e 6f 52 65 76 65 72 73 65 44 4e 53  ed::noReverseDNS
88c0: 22 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  "..    /*.     *
88d0: 20 43 68 65 63 6b 20 74 68 61 74 20 57 69 6e 53   Check that WinS
88e0: 6f 63 6b 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ock is initializ
88f0: 65 64 3b 20 64 6f 20 6e 6f 74 20 63 61 6c 6c 20  ed; do not call 
8900: 69 74 20 69 66 20 6e 6f 74 2c 20 74 6f 20 70 72  it if not, to pr
8910: 65 76 65 6e 74 0a 20 20 20 20 20 2a 20 73 79 73  event.     * sys
8920: 74 65 6d 20 63 72 61 73 68 65 73 2e 20 54 68 69  tem crashes. Thi
8930: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 61 74 20  s can happen at 
8940: 65 78 69 74 20 74 69 6d 65 20 69 66 20 74 68 65  exit time if the
8950: 20 65 78 69 74 20 68 61 6e 64 6c 65 72 20 66 6f   exit handler fo
8960: 72 0a 20 20 20 20 20 2a 20 57 69 6e 53 6f 63 6b  r.     * WinSock
8970: 20 72 61 6e 20 62 65 66 6f 72 65 20 6f 74 68 65   ran before othe
8980: 72 20 65 78 69 74 20 68 61 6e 64 6c 65 72 73 20  r exit handlers 
8990: 74 68 61 74 20 77 61 6e 74 20 74 6f 20 75 73 65  that want to use
89a0: 20 73 6f 63 6b 65 74 73 2e 0a 20 20 20 20 20 2a   sockets..     *
89b0: 2f 0a 0a 20 20 20 20 69 66 20 28 21 53 6f 63 6b  /..    if (!Sock
89c0: 65 74 73 45 6e 61 62 6c 65 64 28 29 29 20 7b 0a  etsEnabled()) {.
89d0: 09 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09  .if (interp) {..
89e0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
89f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
8a00: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09  _NewStringObj(..
8a10: 09 20 20 20 20 22 77 69 6e 73 6f 63 6b 20 69 73  .    "winsock is
8a20: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
8a30: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 72 65 74  ", -1));..}..ret
8a40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8a50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
8a60: 20 20 2a 20 47 6f 20 6f 6e 65 20 73 74 65 70 20    * Go one step 
8a70: 69 6e 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74  in async connect
8a80: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 49  .     *.     * I
8a90: 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 74  f any error is t
8aa0: 68 72 6f 77 6e 20 73 61 76 65 20 69 74 20 61 73  hrown save it as
8ab0: 20 62 61 63 6b 72 6f 75 6e 64 20 65 72 72 6f 72   backround error
8ac0: 20 74 6f 20 72 65 70 6f 72 74 20 65 76 65 6e 74   to report event
8ad0: 75 61 6c 6c 79 0a 20 20 20 20 20 2a 20 62 65 6c  ually.     * bel
8ae0: 6f 77 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow..     */.    
8af0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73  WaitForConnect(s
8b00: 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a  tatePtr, NULL);.
8b10: 0a 20 20 20 20 73 6f 63 6b 20 3d 20 73 74 61 74  .    sock = stat
8b20: 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66  ePtr->sockets->f
8b30: 64 3b 0a 20 20 20 20 69 66 20 28 6f 70 74 69 6f  d;.    if (optio
8b40: 6e 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  nName != NULL) {
8b50: 0a 09 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f  ..len = strlen(o
8b60: 70 74 69 6f 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  ptionName);.    
8b70: 7d 0a 0a 20 20 20 20 69 66 20 28 28 6c 65 6e 20  }..    if ((len 
8b80: 3e 20 31 29 20 26 26 20 28 6f 70 74 69 6f 6e 4e  > 1) && (optionN
8b90: 61 6d 65 5b 31 5d 20 3d 3d 20 27 65 27 29 20 26  ame[1] == 'e') &
8ba0: 26 0a 09 20 20 20 20 28 73 74 72 6e 63 6d 70 28  &..    (strncmp(
8bb0: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 2d 65 72  optionName, "-er
8bc0: 72 6f 72 22 2c 20 6c 65 6e 29 20 3d 3d 20 30 29  ror", len) == 0)
8bd0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 6f 20 6e  ) {../*.. * Do n
8be0: 6f 74 20 72 65 74 75 72 6e 20 61 6e 79 20 65 72  ot return any er
8bf0: 72 6f 72 73 20 69 66 20 61 73 79 6e 63 20 63 6f  rors if async co
8c00: 6e 6e 65 63 74 20 69 73 20 72 75 6e 6e 69 6e 67  nnect is running
8c10: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21 47 4f  ... */...if (!GO
8c20: 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d  T_BITS(statePtr-
8c30: 3e 66 6c 61 67 73 2c 20 54 43 50 5f 41 53 59 4e  >flags, TCP_ASYN
8c40: 43 5f 50 45 4e 44 49 4e 47 29 29 20 7b 0a 09 20  C_PENDING)) {.. 
8c50: 20 20 20 69 66 20 28 47 4f 54 5f 42 49 54 53 28     if (GOT_BITS(
8c60: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c  statePtr->flags,
8c70: 20 54 43 50 5f 41 53 59 4e 43 5f 46 41 49 4c 45   TCP_ASYNC_FAILE
8c80: 44 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20  D)) {.../*... * 
8c90: 49 6e 20 63 61 73 65 20 6f 66 20 61 20 66 61 69  In case of a fai
8ca0: 6c 65 64 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63  led async connec
8cb0: 74 2c 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65  t, eventually re
8cc0: 70 6f 72 74 20 74 68 65 0a 09 09 20 2a 20 63 6f  port the... * co
8cd0: 6e 6e 65 63 74 20 65 72 72 6f 72 20 6f 6e 6c 79  nnect error only
8ce0: 20 6f 6e 63 65 2e 20 20 44 6f 20 6e 6f 74 20 72   once.  Do not r
8cf0: 65 70 6f 72 74 20 74 68 65 20 73 79 73 74 65 6d  eport the system
8d00: 20 65 72 72 6f 72 2c 0a 09 09 20 2a 20 61 73 20   error,... * as 
8d10: 74 68 69 73 20 63 6f 6d 65 73 20 61 67 61 69 6e  this comes again
8d20: 20 61 6e 64 20 61 67 61 69 6e 2e 0a 09 09 20 2a   and again.... *
8d30: 2f 0a 0a 09 09 69 66 20 28 73 74 61 74 65 50 74  /....if (statePt
8d40: 72 2d 3e 63 6f 6e 6e 65 63 74 45 72 72 6f 72 20  r->connectError 
8d50: 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63  != 0) {...    Tc
8d60: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
8d70: 64 73 50 74 72 2c 0a 09 09 09 20 20 20 20 54 63  dsPtr,....    Tc
8d80: 6c 5f 45 72 72 6e 6f 4d 73 67 28 73 74 61 74 65  l_ErrnoMsg(state
8d90: 50 74 72 2d 3e 63 6f 6e 6e 65 63 74 45 72 72 6f  Ptr->connectErro
8da0: 72 29 2c 20 2d 31 29 3b 0a 09 09 20 20 20 20 73  r), -1);...    s
8db0: 74 61 74 65 50 74 72 2d 3e 63 6f 6e 6e 65 63 74  tatePtr->connect
8dc0: 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 7d 0a 09  Error = 0;...}..
8dd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 2f      } else {.../
8de0: 2a 0a 09 09 20 2a 20 52 65 70 6f 72 74 20 61 6e  *... * Report an
8df0: 20 65 76 65 6e 74 75 61 6c 20 6c 61 73 74 20 65   eventual last e
8e00: 72 72 6f 72 20 6f 66 20 74 68 65 20 73 6f 63 6b  rror of the sock
8e10: 65 74 20 73 79 73 74 65 6d 2e 0a 09 09 20 2a 2f  et system.... */
8e20: 0a 0a 09 09 69 6e 74 20 6f 70 74 6c 65 6e 3b 0a  ....int optlen;.
8e30: 09 09 69 6e 74 20 72 65 74 3b 0a 09 09 44 57 4f  ..int ret;...DWO
8e40: 52 44 20 65 72 72 3b 0a 0a 09 09 2f 2a 0a 09 09  RD err;..../*...
8e50: 20 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20   * Populate the 
8e60: 65 72 72 20 76 61 72 69 61 62 6c 65 20 77 69 74  err variable wit
8e70: 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 0a  h a POSIX error.
8e80: 09 09 20 2a 2f 0a 0a 09 09 6f 70 74 6c 65 6e 20  .. */....optlen 
8e90: 3d 20 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 09  = sizeof(int);..
8ea0: 09 72 65 74 20 3d 20 67 65 74 73 6f 63 6b 6f 70  .ret = getsockop
8eb0: 74 28 73 6f 63 6b 2c 20 53 4f 4c 5f 53 4f 43 4b  t(sock, SOL_SOCK
8ec0: 45 54 2c 20 53 4f 5f 45 52 52 4f 52 2c 0a 09 09  ET, SO_ERROR,...
8ed0: 09 28 63 68 61 72 20 2a 29 26 65 72 72 2c 20 26  .(char *)&err, &
8ee0: 6f 70 74 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 0a 09  optlen);..../*..
8ef0: 09 20 2a 20 54 68 65 20 65 72 72 6f 72 20 77 61  . * The error wa
8f00: 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 64  s not returned d
8f10: 69 72 65 63 74 6c 79 20 62 75 74 20 73 68 6f 75  irectly but shou
8f20: 6c 64 20 62 65 20 74 61 6b 65 6e 0a 09 09 20 2a  ld be taken... *
8f30: 20 66 72 6f 6d 20 57 53 41 2e 0a 09 09 20 2a 2f   from WSA.... */
8f40: 0a 0a 09 09 69 66 20 28 72 65 74 20 3d 3d 20 53  ....if (ret == S
8f50: 4f 43 4b 45 54 5f 45 52 52 4f 52 29 20 7b 0a 09  OCKET_ERROR) {..
8f60: 09 20 20 20 20 65 72 72 20 3d 20 57 53 41 47 65  .    err = WSAGe
8f70: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 09 09  tLastError();...
8f80: 7d 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 52 65 74  }..../*... * Ret
8f90: 75 72 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67  urn error messag
8fa0: 65 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28  e.... */....if (
8fb0: 65 72 72 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  err) {...    Tcl
8fc0: 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28  WinConvertError(
8fd0: 65 72 72 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f  err);...    Tcl_
8fe0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 64 73  DStringAppend(ds
8ff0: 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73  Ptr, Tcl_ErrnoMs
9000: 67 28 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  g(Tcl_GetErrno()
9010: 29 2c 20 2d 31 29 3b 0a 09 09 7d 0a 09 20 20 20  ), -1);...}..   
9020: 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43   }..}..return TC
9030: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  L_OK;.    }..   
9040: 20 69 66 20 28 28 6c 65 6e 20 3e 20 31 29 20 26   if ((len > 1) &
9050: 26 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 5b 31 5d  & (optionName[1]
9060: 20 3d 3d 20 27 63 27 29 20 26 26 0a 09 20 20 20   == 'c') &&..   
9070: 20 28 73 74 72 6e 63 6d 70 28 6f 70 74 69 6f 6e   (strncmp(option
9080: 4e 61 6d 65 2c 20 22 2d 63 6f 6e 6e 65 63 74 69  Name, "-connecti
9090: 6e 67 22 2c 20 6c 65 6e 29 20 3d 3d 20 30 29 29  ng", len) == 0))
90a0: 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 41   {..Tcl_DStringA
90b0: 70 70 65 6e 64 28 64 73 50 74 72 2c 0a 09 09 47  ppend(dsPtr,...G
90c0: 4f 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  OT_BITS(statePtr
90d0: 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f 41 53 59  ->flags, TCP_ASY
90e0: 4e 43 5f 50 45 4e 44 49 4e 47 29 0a 09 09 3f 20  NC_PENDING)...? 
90f0: 22 31 22 20 3a 20 22 30 22 2c 20 2d 31 29 3b 0a  "1" : "0", -1);.
9100: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
9110: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  CL_OK;.    }..  
9120: 20 20 69 66 20 28 69 6e 74 65 72 70 20 21 3d 20    if (interp != 
9130: 4e 55 4c 4c 0a 09 20 20 20 20 26 26 20 54 63 6c  NULL..    && Tcl
9140: 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _GetVar(interp, 
9150: 53 55 50 50 52 45 53 53 5f 52 44 4e 53 5f 56 41  SUPPRESS_RDNS_VA
9160: 52 2c 20 30 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  R, 0) != NULL) {
9170: 0a 09 72 65 76 65 72 73 65 44 4e 53 20 3d 20 4e  ..reverseDNS = N
9180: 49 5f 4e 55 4d 45 52 49 43 48 4f 53 54 3b 0a 20  I_NUMERICHOST;. 
9190: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6c     }..    if ((l
91a0: 65 6e 20 3d 3d 20 30 29 20 7c 7c 20 28 28 6c 65  en == 0) || ((le
91b0: 6e 20 3e 20 31 29 20 26 26 20 28 6f 70 74 69 6f  n > 1) && (optio
91c0: 6e 4e 61 6d 65 5b 31 5d 20 3d 3d 20 27 70 27 29  nName[1] == 'p')
91d0: 20 26 26 0a 09 20 20 20 20 28 73 74 72 6e 63 6d   &&..    (strncm
91e0: 70 28 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 2d  p(optionName, "-
91f0: 70 65 65 72 6e 61 6d 65 22 2c 20 6c 65 6e 29 20  peername", len) 
9200: 3d 3d 20 30 29 29 29 20 7b 0a 09 61 64 64 72 65  == 0))) {..addre
9210: 73 73 20 70 65 65 72 6e 61 6d 65 3b 0a 09 73 6f  ss peername;..so
9220: 63 6b 6c 65 6e 5f 74 20 73 69 7a 65 20 3d 20 73  cklen_t size = s
9230: 69 7a 65 6f 66 28 70 65 65 72 6e 61 6d 65 29 3b  izeof(peername);
9240: 0a 0a 09 69 66 20 28 47 4f 54 5f 42 49 54 53 28  ...if (GOT_BITS(
9250: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c  statePtr->flags,
9260: 20 54 43 50 5f 41 53 59 4e 43 5f 50 45 4e 44 49   TCP_ASYNC_PENDI
9270: 4e 47 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  NG)) {..    /*..
9280: 20 20 20 20 20 2a 20 49 6e 20 61 73 79 6e 63 20       * In async 
9290: 63 6f 6e 6e 65 63 74 20 6f 75 74 70 75 74 20 61  connect output a
92a0: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 09  n empty string..
92b0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66       */...    if
92c0: 20 28 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09   (len == 0) {...
92d0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
92e0: 64 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20  dElement(dsPtr, 
92f0: 22 2d 70 65 65 72 6e 61 6d 65 22 29 3b 0a 09 09  "-peername");...
9300: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
9310: 64 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20  dElement(dsPtr, 
9320: 22 22 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  "");..    } else
9330: 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f   {...return TCL_
9340: 4f 4b 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c  OK;..    }..} el
9350: 73 65 20 69 66 20 28 67 65 74 70 65 65 72 6e 61  se if (getpeerna
9360: 6d 65 28 73 6f 63 6b 2c 20 28 4c 50 53 4f 43 4b  me(sock, (LPSOCK
9370: 41 44 44 52 29 20 26 28 70 65 65 72 6e 61 6d 65  ADDR) &(peername
9380: 2e 73 61 29 2c 0a 09 09 26 73 69 7a 65 29 20 3d  .sa),...&size) =
9390: 3d 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  = 0) {..    /*..
93a0: 20 20 20 20 20 2a 20 50 65 65 72 6e 61 6d 65 20       * Peername 
93b0: 66 65 74 63 68 20 73 75 63 63 65 65 64 65 64 20  fetch succeeded 
93c0: 2d 20 6f 75 74 70 75 74 20 6c 69 73 74 0a 09 20  - output list.. 
93d0: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20      */...    if 
93e0: 28 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 54  (len == 0) {...T
93f0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
9400: 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 22  Element(dsPtr, "
9410: 2d 70 65 65 72 6e 61 6d 65 22 29 3b 0a 09 09 54  -peername");...T
9420: 63 6c 5f 44 53 74 72 69 6e 67 53 74 61 72 74 53  cl_DStringStartS
9430: 75 62 6c 69 73 74 28 64 73 50 74 72 29 3b 0a 09  ublist(dsPtr);..
9440: 20 20 20 20 7d 0a 0a 09 20 20 20 20 67 65 74 6e      }...    getn
9450: 61 6d 65 69 6e 66 6f 28 26 28 70 65 65 72 6e 61  ameinfo(&(peerna
9460: 6d 65 2e 73 61 29 2c 20 73 69 7a 65 2c 20 68 6f  me.sa), size, ho
9470: 73 74 2c 20 73 69 7a 65 6f 66 28 68 6f 73 74 29  st, sizeof(host)
9480: 2c 0a 09 09 20 20 20 20 4e 55 4c 4c 2c 20 30 2c  ,...    NULL, 0,
9490: 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f 53 54 29   NI_NUMERICHOST)
94a0: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
94b0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
94c0: 64 73 50 74 72 2c 20 68 6f 73 74 29 3b 0a 09 20  dsPtr, host);.. 
94d0: 20 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f 28 26     getnameinfo(&
94e0: 28 70 65 65 72 6e 61 6d 65 2e 73 61 29 2c 20 73  (peername.sa), s
94f0: 69 7a 65 2c 20 68 6f 73 74 2c 20 73 69 7a 65 6f  ize, host, sizeo
9500: 66 28 68 6f 73 74 29 2c 0a 09 09 20 20 20 20 70  f(host),...    p
9510: 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70 6f 72 74  ort, sizeof(port
9520: 29 2c 20 72 65 76 65 72 73 65 44 4e 53 20 7c 20  ), reverseDNS | 
9530: 4e 49 5f 4e 55 4d 45 52 49 43 53 45 52 56 29 3b  NI_NUMERICSERV);
9540: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
9550: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64  gAppendElement(d
9560: 73 50 74 72 2c 20 68 6f 73 74 29 3b 0a 09 20 20  sPtr, host);..  
9570: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
9580: 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 50 74 72  endElement(dsPtr
9590: 2c 20 70 6f 72 74 29 3b 0a 09 20 20 20 20 69 66  , port);..    if
95a0: 20 28 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09   (len == 0) {...
95b0: 54 63 6c 5f 44 53 74 72 69 6e 67 45 6e 64 53 75  Tcl_DStringEndSu
95c0: 62 6c 69 73 74 28 64 73 50 74 72 29 3b 0a 09 20  blist(dsPtr);.. 
95d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 72 65     } else {...re
95e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20 20  turn TCL_OK;..  
95f0: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20    }..} else {.. 
9600: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 67 65     /*..     * ge
9610: 74 70 65 65 72 6e 61 6d 65 20 66 61 69 6c 65 64  tpeername failed
9620: 20 2d 20 62 75 74 20 69 66 20 77 65 20 77 65 72   - but if we wer
9630: 65 20 61 73 6b 65 64 20 66 6f 72 20 61 6c 6c 20  e asked for all 
9640: 74 68 65 20 6f 70 74 69 6f 6e 73 0a 09 20 20 20  the options..   
9650: 20 20 2a 20 28 6c 65 6e 3d 3d 30 29 2c 20 64 6f    * (len==0), do
9660: 6e 27 74 20 66 6c 61 67 20 61 6e 20 65 72 72 6f  n't flag an erro
9670: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  r at that point 
9680: 62 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c 64  because it could
9690: 20 62 65 0a 09 20 20 20 20 20 2a 20 61 6e 20 66   be..     * an f
96a0: 63 6f 6e 66 69 67 75 72 65 20 72 65 71 75 65 73  configure reques
96b0: 74 20 6f 6e 20 61 20 73 65 72 76 65 72 20 73 6f  t on a server so
96c0: 63 6b 65 74 20 28 73 75 63 68 20 73 6f 63 6b 65  cket (such socke
96d0: 74 73 20 68 61 76 65 20 6e 6f 0a 09 20 20 20 20  ts have no..    
96e0: 20 2a 20 70 65 65 72 29 2e 20 7b 43 6f 70 69 65   * peer). {Copie
96f0: 64 20 66 72 6f 6d 20 75 6e 69 78 2f 74 63 6c 55  d from unix/tclU
9700: 6e 69 78 43 68 61 6e 2e 63 7d 0a 09 20 20 20 20  nixChan.c}..    
9710: 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 6c 65   */...    if (le
9720: 6e 29 20 7b 0a 09 09 54 63 6c 57 69 6e 43 6f 6e  n) {...TclWinCon
9730: 76 65 72 74 45 72 72 6f 72 28 28 44 57 4f 52 44  vertError((DWORD
9740: 29 20 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f  ) WSAGetLastErro
9750: 72 28 29 29 3b 0a 09 09 69 66 20 28 69 6e 74 65  r());...if (inte
9760: 72 70 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  rp) {...    Tcl_
9770: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
9780: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e  erp, Tcl_ObjPrin
9790: 74 66 28 0a 09 09 09 20 20 20 20 22 63 61 6e 27  tf(....    "can'
97a0: 74 20 67 65 74 20 70 65 65 72 6e 61 6d 65 3a 20  t get peername: 
97b0: 25 73 22 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f  %s",....    Tcl_
97c0: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
97d0: 70 29 29 29 3b 0a 09 09 7d 0a 09 09 72 65 74 75  p)));...}...retu
97e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
97f0: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20     }..}.    }.. 
9800: 20 20 20 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30     if ((len == 0
9810: 29 20 7c 7c 20 28 28 6c 65 6e 20 3e 20 31 29 20  ) || ((len > 1) 
9820: 26 26 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 5b 31  && (optionName[1
9830: 5d 20 3d 3d 20 27 73 27 29 20 26 26 0a 09 20 20  ] == 's') &&..  
9840: 20 20 28 73 74 72 6e 63 6d 70 28 6f 70 74 69 6f    (strncmp(optio
9850: 6e 4e 61 6d 65 2c 20 22 2d 73 6f 63 6b 6e 61 6d  nName, "-socknam
9860: 65 22 2c 20 6c 65 6e 29 20 3d 3d 20 30 29 29 29  e", len) == 0)))
9870: 20 7b 0a 09 54 63 70 46 64 4c 69 73 74 20 2a 66   {..TcpFdList *f
9880: 64 73 3b 0a 09 61 64 64 72 65 73 73 20 73 6f 63  ds;..address soc
9890: 6b 6e 61 6d 65 3b 0a 09 73 6f 63 6b 6c 65 6e 5f  kname;..socklen_
98a0: 74 20 73 69 7a 65 3b 0a 09 69 6e 74 20 66 6f 75  t size;..int fou
98b0: 6e 64 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6c 65  nd = 0;...if (le
98c0: 6e 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  n == 0) {..    T
98d0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
98e0: 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 22  Element(dsPtr, "
98f0: 2d 73 6f 63 6b 6e 61 6d 65 22 29 3b 0a 09 20 20  -sockname");..  
9900: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 53 74 61    Tcl_DStringSta
9910: 72 74 53 75 62 6c 69 73 74 28 64 73 50 74 72 29  rtSublist(dsPtr)
9920: 3b 0a 09 7d 0a 09 69 66 20 28 47 4f 54 5f 42 49  ;..}..if (GOT_BI
9930: 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  TS(statePtr->fla
9940: 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 50 45  gs, TCP_ASYNC_PE
9950: 4e 44 49 4e 47 29 29 20 7b 0a 09 20 20 20 20 2f  NDING)) {..    /
9960: 2a 0a 09 20 20 20 20 20 2a 20 49 6e 20 61 73 79  *..     * In asy
9970: 6e 63 20 63 6f 6e 6e 65 63 74 20 6f 75 74 70 75  nc connect outpu
9980: 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  t an empty strin
9990: 67 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  g..     */...   
99a0: 20 66 6f 75 6e 64 20 3d 20 31 3b 0a 09 7d 20 65   found = 1;..} e
99b0: 6c 73 65 20 7b 0a 09 20 20 20 20 66 6f 72 20 28  lse {..    for (
99c0: 66 64 73 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  fds = statePtr->
99d0: 73 6f 63 6b 65 74 73 3b 20 66 64 73 20 21 3d 20  sockets; fds != 
99e0: 4e 55 4c 4c 3b 20 66 64 73 20 3d 20 66 64 73 2d  NULL; fds = fds-
99f0: 3e 6e 65 78 74 29 20 7b 0a 09 09 73 6f 63 6b 20  >next) {...sock 
9a00: 3d 20 66 64 73 2d 3e 66 64 3b 0a 09 09 73 69 7a  = fds->fd;...siz
9a10: 65 20 3d 20 73 69 7a 65 6f 66 28 73 6f 63 6b 6e  e = sizeof(sockn
9a20: 61 6d 65 29 3b 0a 09 09 69 66 20 28 67 65 74 73  ame);...if (gets
9a30: 6f 63 6b 6e 61 6d 65 28 73 6f 63 6b 2c 20 26 28  ockname(sock, &(
9a40: 73 6f 63 6b 6e 61 6d 65 2e 73 61 29 2c 20 26 73  sockname.sa), &s
9a50: 69 7a 65 29 20 3e 3d 20 30 29 20 7b 0a 09 09 20  ize) >= 0) {... 
9a60: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 72     int flags = r
9a70: 65 76 65 72 73 65 44 4e 53 3b 0a 0a 09 09 20 20  everseDNS;....  
9a80: 20 20 66 6f 75 6e 64 20 3d 20 31 3b 0a 09 09 20    found = 1;... 
9a90: 20 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f 28 26     getnameinfo(&
9aa0: 73 6f 63 6b 6e 61 6d 65 2e 73 61 2c 20 73 69 7a  sockname.sa, siz
9ab0: 65 2c 20 68 6f 73 74 2c 20 73 69 7a 65 6f 66 28  e, host, sizeof(
9ac0: 68 6f 73 74 29 2c 0a 09 09 09 20 20 20 20 4e 55  host),....    NU
9ad0: 4c 4c 2c 20 30 2c 20 4e 49 5f 4e 55 4d 45 52 49  LL, 0, NI_NUMERI
9ae0: 43 48 4f 53 54 29 3b 0a 09 09 20 20 20 20 54 63  CHOST);...    Tc
9af0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
9b00: 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 68 6f  lement(dsPtr, ho
9b10: 73 74 29 3b 0a 0a 09 09 20 20 20 20 2f 2a 0a 09  st);....    /*..
9b20: 09 20 20 20 20 20 2a 20 57 65 20 64 6f 6e 27 74  .     * We don't
9b30: 20 77 61 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65   want to resolve
9b40: 20 49 4e 41 44 44 52 5f 41 4e 59 20 61 6e 64 20   INADDR_ANY and 
9b50: 73 69 6e 36 61 64 64 72 5f 61 6e 79 3b 0a 09 09  sin6addr_any;...
9b60: 20 20 20 20 20 2a 20 74 68 65 79 20 63 61 6e 20       * they can 
9b70: 73 6f 6d 65 74 69 6d 65 73 20 63 61 75 73 65 20  sometimes cause 
9b80: 70 72 6f 62 6c 65 6d 73 20 28 61 6e 64 20 6e 65  problems (and ne
9b90: 76 65 72 20 68 61 76 65 20 61 0a 09 09 20 20 20  ver have a...   
9ba0: 20 20 2a 20 6e 61 6d 65 29 2e 0a 09 09 20 20 20    * name)....   
9bb0: 20 20 2a 2f 0a 0a 09 09 20 20 20 20 66 6c 61 67    */....    flag
9bc0: 73 20 7c 3d 20 4e 49 5f 4e 55 4d 45 52 49 43 53  s |= NI_NUMERICS
9bd0: 45 52 56 3b 0a 09 09 20 20 20 20 69 66 20 28 73  ERV;...    if (s
9be0: 6f 63 6b 6e 61 6d 65 2e 73 61 2e 73 61 5f 66 61  ockname.sa.sa_fa
9bf0: 6d 69 6c 79 20 3d 3d 20 41 46 5f 49 4e 45 54 29  mily == AF_INET)
9c00: 20 7b 0a 09 09 09 69 66 20 28 73 6f 63 6b 6e 61   {....if (sockna
9c10: 6d 65 2e 73 61 34 2e 73 69 6e 5f 61 64 64 72 2e  me.sa4.sin_addr.
9c20: 73 5f 61 64 64 72 20 3d 3d 20 49 4e 41 44 44 52  s_addr == INADDR
9c30: 5f 41 4e 59 29 20 7b 0a 09 09 09 20 20 20 20 66  _ANY) {....    f
9c40: 6c 61 67 73 20 7c 3d 20 4e 49 5f 4e 55 4d 45 52  lags |= NI_NUMER
9c50: 49 43 48 4f 53 54 3b 0a 09 09 09 7d 0a 09 09 20  ICHOST;....}... 
9c60: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 6f     } else if (so
9c70: 63 6b 6e 61 6d 65 2e 73 61 2e 73 61 5f 66 61 6d  ckname.sa.sa_fam
9c80: 69 6c 79 20 3d 3d 20 41 46 5f 49 4e 45 54 36 29  ily == AF_INET6)
9c90: 20 7b 0a 09 09 09 69 66 20 28 28 49 4e 36 5f 41   {....if ((IN6_A
9ca0: 52 45 5f 41 44 44 52 5f 45 51 55 41 4c 28 26 73  RE_ADDR_EQUAL(&s
9cb0: 6f 63 6b 6e 61 6d 65 2e 73 61 36 2e 73 69 6e 36  ockname.sa6.sin6
9cc0: 5f 61 64 64 72 2c 0a 09 09 09 09 20 20 20 20 26  _addr,.....    &
9cd0: 69 6e 36 61 64 64 72 5f 61 6e 79 29 29 20 7c 7c  in6addr_any)) ||
9ce0: 0a 09 09 09 09 28 49 4e 36 5f 49 53 5f 41 44 44  .....(IN6_IS_ADD
9cf0: 52 5f 56 34 4d 41 50 50 45 44 28 26 73 6f 63 6b  R_V4MAPPED(&sock
9d00: 6e 61 6d 65 2e 73 61 36 2e 73 69 6e 36 5f 61 64  name.sa6.sin6_ad
9d10: 64 72 29 0a 09 09 09 09 26 26 20 73 6f 63 6b 6e  dr).....&& sockn
9d20: 61 6d 65 2e 73 61 36 2e 73 69 6e 36 5f 61 64 64  ame.sa6.sin6_add
9d30: 72 2e 73 36 5f 61 64 64 72 5b 31 32 5d 20 3d 3d  r.s6_addr[12] ==
9d40: 20 30 0a 09 09 09 09 26 26 20 73 6f 63 6b 6e 61   0.....&& sockna
9d50: 6d 65 2e 73 61 36 2e 73 69 6e 36 5f 61 64 64 72  me.sa6.sin6_addr
9d60: 2e 73 36 5f 61 64 64 72 5b 31 33 5d 20 3d 3d 20  .s6_addr[13] == 
9d70: 30 0a 09 09 09 09 26 26 20 73 6f 63 6b 6e 61 6d  0.....&& socknam
9d80: 65 2e 73 61 36 2e 73 69 6e 36 5f 61 64 64 72 2e  e.sa6.sin6_addr.
9d90: 73 36 5f 61 64 64 72 5b 31 34 5d 20 3d 3d 20 30  s6_addr[14] == 0
9da0: 0a 09 09 09 09 26 26 20 73 6f 63 6b 6e 61 6d 65  .....&& sockname
9db0: 2e 73 61 36 2e 73 69 6e 36 5f 61 64 64 72 2e 73  .sa6.sin6_addr.s
9dc0: 36 5f 61 64 64 72 5b 31 35 5d 20 3d 3d 20 30 29  6_addr[15] == 0)
9dd0: 29 20 7b 0a 09 09 09 20 20 20 20 66 6c 61 67 73  ) {....    flags
9de0: 20 7c 3d 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f   |= NI_NUMERICHO
9df0: 53 54 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d  ST;....}...    }
9e00: 0a 09 09 20 20 20 20 67 65 74 6e 61 6d 65 69 6e  ...    getnamein
9e10: 66 6f 28 26 73 6f 63 6b 6e 61 6d 65 2e 73 61 2c  fo(&sockname.sa,
9e20: 20 73 69 7a 65 2c 20 68 6f 73 74 2c 20 73 69 7a   size, host, siz
9e30: 65 6f 66 28 68 6f 73 74 29 2c 0a 09 09 09 20 20  eof(host),....  
9e40: 20 20 70 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70    port, sizeof(p
9e50: 6f 72 74 29 2c 20 66 6c 61 67 73 29 3b 0a 09 09  ort), flags);...
9e60: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41      Tcl_DStringA
9e70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 50  ppendElement(dsP
9e80: 74 72 2c 20 68 6f 73 74 29 3b 0a 09 09 20 20 20  tr, host);...   
9e90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
9ea0: 6e 64 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c  ndElement(dsPtr,
9eb0: 20 70 6f 72 74 29 3b 0a 09 09 7d 0a 09 20 20 20   port);...}..   
9ec0: 20 7d 0a 09 7d 0a 09 69 66 20 28 66 6f 75 6e 64   }..}..if (found
9ed0: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  ) {..    if (len
9ee0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  ) {...return TCL
9ef0: 5f 4f 4b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  _OK;..    }..   
9f00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 45 6e 64 53   Tcl_DStringEndS
9f10: 75 62 6c 69 73 74 28 64 73 50 74 72 29 3b 0a 09  ublist(dsPtr);..
9f20: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 69 66  } else {..    if
9f30: 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 09 54 63   (interp) {...Tc
9f40: 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72  lWinConvertError
9f50: 28 28 44 57 4f 52 44 29 20 57 53 41 47 65 74 4c  ((DWORD) WSAGetL
9f60: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 09 54  astError());...T
9f70: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
9f80: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50  interp, Tcl_ObjP
9f90: 72 69 6e 74 66 28 0a 09 09 09 22 63 61 6e 27 74  rintf(...."can't
9fa0: 20 67 65 74 20 73 6f 63 6b 6e 61 6d 65 3a 20 25   get sockname: %
9fb0: 73 22 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72  s", Tcl_PosixErr
9fc0: 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 20  or(interp)));.. 
9fd0: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e     }..    return
9fe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
9ff0: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 54 43 4c     }..#ifdef TCL
a000: 5f 46 45 41 54 55 52 45 5f 4b 45 45 50 41 4c 49  _FEATURE_KEEPALI
a010: 56 45 5f 4e 41 47 4c 45 0a 20 20 20 20 69 66 20  VE_NAGLE.    if 
a020: 28 6c 65 6e 20 3d 3d 20 30 20 7c 7c 20 21 73 74  (len == 0 || !st
a030: 72 6e 63 6d 70 28 6f 70 74 69 6f 6e 4e 61 6d 65  rncmp(optionName
a040: 2c 20 22 2d 6b 65 65 70 61 6c 69 76 65 22 2c 20  , "-keepalive", 
a050: 6c 65 6e 29 29 20 7b 0a 09 69 6e 74 20 6f 70 74  len)) {..int opt
a060: 6c 65 6e 3b 0a 09 42 4f 4f 4c 20 6f 70 74 20 3d  len;..BOOL opt =
a070: 20 46 41 4c 53 45 3b 0a 0a 09 69 66 20 28 6c 65   FALSE;...if (le
a080: 6e 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  n == 0) {..    T
a090: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
a0a0: 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 22  Element(dsPtr, "
a0b0: 2d 6b 65 65 70 61 6c 69 76 65 22 29 3b 0a 09 7d  -keepalive");..}
a0c0: 0a 09 6f 70 74 6c 65 6e 20 3d 20 73 69 7a 65 6f  ..optlen = sizeo
a0d0: 66 28 42 4f 4f 4c 29 3b 0a 09 67 65 74 73 6f 63  f(BOOL);..getsoc
a0e0: 6b 6f 70 74 28 73 6f 63 6b 2c 20 53 4f 4c 5f 53  kopt(sock, SOL_S
a0f0: 4f 43 4b 45 54 2c 20 53 4f 5f 4b 45 45 50 41 4c  OCKET, SO_KEEPAL
a100: 49 56 45 2c 20 28 63 68 61 72 20 2a 29 26 6f 70  IVE, (char *)&op
a110: 74 2c 20 26 6f 70 74 6c 65 6e 29 3b 0a 09 69 66  t, &optlen);..if
a120: 20 28 6f 70 74 29 20 7b 0a 09 20 20 20 20 54 63   (opt) {..    Tc
a130: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
a140: 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 22 31  lement(dsPtr, "1
a150: 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ");..} else {.. 
a160: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
a170: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 50 74  pendElement(dsPt
a180: 72 2c 20 22 30 22 29 3b 0a 09 7d 0a 09 69 66 20  r, "0");..}..if 
a190: 28 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20  (len > 0) {..   
a1a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a1b0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
a1c0: 20 28 6c 65 6e 20 3d 3d 20 30 20 7c 7c 20 21 73   (len == 0 || !s
a1d0: 74 72 6e 63 6d 70 28 6f 70 74 69 6f 6e 4e 61 6d  trncmp(optionNam
a1e0: 65 2c 20 22 2d 6e 61 67 6c 65 22 2c 20 6c 65 6e  e, "-nagle", len
a1f0: 29 29 20 7b 0a 09 69 6e 74 20 6f 70 74 6c 65 6e  )) {..int optlen
a200: 3b 0a 09 42 4f 4f 4c 20 6f 70 74 20 3d 20 46 41  ;..BOOL opt = FA
a210: 4c 53 45 3b 0a 0a 09 69 66 20 28 6c 65 6e 20 3d  LSE;...if (len =
a220: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
a230: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
a240: 6d 65 6e 74 28 64 73 50 74 72 2c 20 22 2d 6e 61  ment(dsPtr, "-na
a250: 67 6c 65 22 29 3b 0a 09 7d 0a 09 6f 70 74 6c 65  gle");..}..optle
a260: 6e 20 3d 20 73 69 7a 65 6f 66 28 42 4f 4f 4c 29  n = sizeof(BOOL)
a270: 3b 0a 09 67 65 74 73 6f 63 6b 6f 70 74 28 73 6f  ;..getsockopt(so
a280: 63 6b 2c 20 49 50 50 52 4f 54 4f 5f 54 43 50 2c  ck, IPPROTO_TCP,
a290: 20 54 43 50 5f 4e 4f 44 45 4c 41 59 2c 20 28 63   TCP_NODELAY, (c
a2a0: 68 61 72 20 2a 29 26 6f 70 74 2c 20 26 6f 70 74  har *)&opt, &opt
a2b0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6f 70 74 29 20  len);..if (opt) 
a2c0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
a2d0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
a2e0: 64 73 50 74 72 2c 20 22 30 22 29 3b 0a 09 7d 20  dsPtr, "0");..} 
a2f0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f  else {..    Tcl_
a300: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
a310: 6d 65 6e 74 28 64 73 50 74 72 2c 20 22 31 22 29  ment(dsPtr, "1")
a320: 3b 0a 09 7d 0a 09 69 66 20 28 6c 65 6e 20 3e 20  ;..}..if (len > 
a330: 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  0) {..    return
a340: 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 20 20 20 20   TCL_OK;..}.    
a350: 7d 0a 23 65 6e 64 69 66 20 2f 2a 54 43 4c 5f 46  }.#endif /*TCL_F
a360: 45 41 54 55 52 45 5f 4b 45 45 50 41 4c 49 56 45  EATURE_KEEPALIVE
a370: 5f 4e 41 47 4c 45 2a 2f 0a 0a 20 20 20 20 69 66  _NAGLE*/..    if
a380: 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a 23 69 66   (len > 0) {.#if
a390: 64 65 66 20 54 43 4c 5f 46 45 41 54 55 52 45 5f  def TCL_FEATURE_
a3a0: 4b 45 45 50 41 4c 49 56 45 5f 4e 41 47 4c 45 0a  KEEPALIVE_NAGLE.
a3b0: 09 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43  .return Tcl_BadC
a3c0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
a3d0: 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c  erp, optionName,
a3e0: 0a 09 09 22 63 6f 6e 6e 65 63 74 69 6e 67 20 70  ..."connecting p
a3f0: 65 65 72 6e 61 6d 65 20 73 6f 63 6b 6e 61 6d 65  eername sockname
a400: 20 6b 65 65 70 61 6c 69 76 65 20 6e 61 67 6c 65   keepalive nagle
a410: 22 29 3b 0a 23 65 6c 73 65 0a 09 72 65 74 75 72  ");.#else..retur
a420: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
a430: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
a440: 70 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 20 20 20  ptionName,.     
a450: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 6e             "conn
a460: 65 63 74 69 6e 67 20 70 65 65 72 6e 61 6d 65 20  ecting peername 
a470: 73 6f 63 6b 6e 61 6d 65 22 29 3b 0a 23 65 6e 64  sockname");.#end
a480: 69 66 20 2f 2a 54 43 4c 5f 46 45 41 54 55 52 45  if /*TCL_FEATURE
a490: 5f 4b 45 45 50 41 4c 49 56 45 5f 4e 41 47 4c 45  _KEEPALIVE_NAGLE
a4a0: 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  */.    }..    re
a4b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
a4c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
a4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
a510: 20 2a 20 54 63 70 57 61 74 63 68 50 72 6f 63 20   * TcpWatchProc 
a520: 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 66 6f 72 6d 73  --. *. *.Informs
a530: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 64 72 69   the channel dri
a540: 76 65 72 20 6f 66 20 74 68 65 20 65 76 65 6e 74  ver of the event
a550: 73 20 74 68 61 74 20 74 68 65 20 67 65 6e 65 72  s that the gener
a560: 69 63 20 63 68 61 6e 6e 65 6c 20 63 6f 64 65 0a  ic channel code.
a570: 20 2a 09 77 69 73 68 65 73 20 74 6f 20 72 65 63   *.wishes to rec
a580: 65 69 76 65 20 6f 6e 20 74 68 69 73 20 73 6f 63  eive on this soc
a590: 6b 65 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ket.. *. * Resul
a5a0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
a5b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
a5c0: 0a 20 2a 09 4d 61 79 20 63 61 75 73 65 20 74 68  . *.May cause th
a5d0: 65 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 70 6f  e notifier to po
a5e0: 6c 6c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ll if any of the
a5f0: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6e 64 69   specified condi
a600: 74 69 6f 6e 73 20 61 72 65 0a 20 2a 09 61 6c 72  tions are. *.alr
a610: 65 61 64 79 20 74 72 75 65 2e 0a 20 2a 0a 20 2a  eady true.. *. *
a620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a660: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
a670: 69 63 20 76 6f 69 64 0a 54 63 70 57 61 74 63 68  ic void.TcpWatch
a680: 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a  Proc(.    void *
a690: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a  instanceData,./*
a6a0: 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74   The socket stat
a6b0: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  e. */.    int ma
a6c0: 73 6b 29 09 09 09 2f 2a 20 45 76 65 6e 74 73 20  sk).../* Events 
a6d0: 6f 66 20 69 6e 74 65 72 65 73 74 3b 20 61 6e 20  of interest; an 
a6e0: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
a6f0: 6e 20 6f 66 0a 09 09 09 09 20 2a 20 54 43 4c 5f  n of..... * TCL_
a700: 52 45 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52  READABLE, TCL_WR
a710: 49 54 41 42 4c 45 20 61 6e 64 0a 09 09 09 09 20  ITABLE and..... 
a720: 2a 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 2e  * TCL_EXCEPTION.
a730: 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 70 53 74 61   */.{.    TcpSta
a740: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
a750: 54 63 70 53 74 61 74 65 20 2a 29 69 6e 73 74 61  TcpState *)insta
a760: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a  nceData;..    /*
a770: 0a 20 20 20 20 20 2a 20 55 70 64 61 74 65 20 74  .     * Update t
a780: 68 65 20 77 61 74 63 68 20 65 76 65 6e 74 73 20  he watch events 
a790: 6d 61 73 6b 2e 20 4f 6e 6c 79 20 69 66 20 74 68  mask. Only if th
a7a0: 65 20 73 6f 63 6b 65 74 20 69 73 20 6e 6f 74 20  e socket is not 
a7b0: 61 20 73 65 72 76 65 72 0a 20 20 20 20 20 2a 20  a server.     * 
a7c0: 73 6f 63 6b 65 74 2e 20 5b 42 75 67 20 35 35 37  socket. [Bug 557
a7d0: 38 37 38 5d 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  878].     */..  
a7e0: 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d    if (!statePtr-
a7f0: 3e 61 63 63 65 70 74 50 72 6f 63 29 20 7b 0a 09  >acceptProc) {..
a800: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 45  statePtr->watchE
a810: 76 65 6e 74 73 20 3d 20 30 3b 0a 09 69 66 20 28  vents = 0;..if (
a820: 47 4f 54 5f 42 49 54 53 28 6d 61 73 6b 2c 20 54  GOT_BITS(mask, T
a830: 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b 0a  CL_READABLE)) {.
a840: 09 20 20 20 20 53 45 54 5f 42 49 54 53 28 73 74  .    SET_BITS(st
a850: 61 74 65 50 74 72 2d 3e 77 61 74 63 68 45 76 65  atePtr->watchEve
a860: 6e 74 73 2c 20 46 44 5f 52 45 41 44 20 7c 20 46  nts, FD_READ | F
a870: 44 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a 09 69 66  D_CLOSE);..}..if
a880: 20 28 47 4f 54 5f 42 49 54 53 28 6d 61 73 6b 2c   (GOT_BITS(mask,
a890: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 29 20   TCL_WRITABLE)) 
a8a0: 7b 0a 09 20 20 20 20 53 45 54 5f 42 49 54 53 28  {..    SET_BITS(
a8b0: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 45  statePtr->watchE
a8c0: 76 65 6e 74 73 2c 20 46 44 5f 57 52 49 54 45 20  vents, FD_WRITE 
a8d0: 7c 20 46 44 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a  | FD_CLOSE);..}.
a8e0: 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74 68 65 72  ../*.. * If ther
a8f0: 65 20 61 72 65 20 61 6e 79 20 63 6f 6e 64 69 74  e are any condit
a900: 69 6f 6e 73 20 61 6c 72 65 61 64 79 20 73 65 74  ions already set
a910: 2c 20 74 68 65 6e 20 74 65 6c 6c 20 74 68 65 20  , then tell the 
a920: 6e 6f 74 69 66 69 65 72 20 74 6f 0a 09 20 2a 20  notifier to.. * 
a930: 70 6f 6c 6c 20 72 61 74 68 65 72 20 74 68 61 6e  poll rather than
a940: 20 62 6c 6f 63 6b 2e 0a 09 20 2a 2f 0a 0a 09 69   block... */...i
a950: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61  f (statePtr->rea
a960: 64 79 45 76 65 6e 74 73 20 26 20 73 74 61 74 65  dyEvents & state
a970: 50 74 72 2d 3e 77 61 74 63 68 45 76 65 6e 74 73  Ptr->watchEvents
a980: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 54 69 6d  ) {..    Tcl_Tim
a990: 65 20 62 6c 6f 63 6b 54 69 6d 65 20 3d 20 7b 20  e blockTime = { 
a9a0: 30 2c 20 30 20 7d 3b 0a 0a 09 20 20 20 20 54 63  0, 0 };...    Tc
a9b0: 6c 5f 53 65 74 4d 61 78 42 6c 6f 63 6b 54 69 6d  l_SetMaxBlockTim
a9c0: 65 28 26 62 6c 6f 63 6b 54 69 6d 65 29 3b 0a 09  e(&blockTime);..
a9d0: 7d 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20  }.    }.}.../*. 
a9e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
a9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa20: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63  -------. *. * Tc
aa30: 70 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d  pGetHandleProc -
aa40: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66  -. *. *.Called f
aa50: 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  rom Tcl_GetChann
aa60: 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 72  elHandle to retr
aa70: 69 65 76 65 20 4f 53 20 68 61 6e 64 6c 65 73 20  ieve OS handles 
aa80: 66 72 6f 6d 20 69 6e 73 69 64 65 20 61 0a 20 2a  from inside a. *
aa90: 09 54 43 50 20 73 6f 63 6b 65 74 20 62 61 73 65  .TCP socket base
aaa0: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  d channel.. *. *
aab0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74   Results:. *.Ret
aac0: 75 72 6e 73 20 54 43 4c 5f 4f 4b 20 77 69 74 68  urns TCL_OK with
aad0: 20 74 68 65 20 66 64 20 69 6e 20 68 61 6e 64 6c   the fd in handl
aae0: 65 50 74 72 2c 20 6f 72 20 54 43 4c 5f 45 52 52  ePtr, or TCL_ERR
aaf0: 4f 52 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  OR if there is n
ab00: 6f 0a 20 2a 09 68 61 6e 64 6c 65 20 66 6f 72 20  o. *.handle for 
ab10: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 69  the specified di
ab20: 72 65 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 53  rection.. *. * S
ab30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
ab40: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
ab50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab90: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
aba0: 74 0a 54 63 70 47 65 74 48 61 6e 64 6c 65 50 72  t.TcpGetHandlePr
abb0: 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e  oc(.    void *in
abc0: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54  stanceData,./* T
abd0: 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 65 2e  he socket state.
abe0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 69 72 65   */.    int dire
abf0: 63 74 69 6f 6e 2c 09 09 2f 2a 20 4e 6f 74 20 75  ction,../* Not u
ac00: 73 65 64 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  sed. */.    void
ac10: 20 2a 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f 2a   **handlePtr)./*
ac20: 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20   Where to store 
ac30: 74 68 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 7b  the handle. */.{
ac40: 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73  .    TcpState *s
ac50: 74 61 74 65 50 74 72 20 3d 20 28 54 63 70 53 74  tatePtr = (TcpSt
ac60: 61 74 65 20 2a 29 69 6e 73 74 61 6e 63 65 44 61  ate *)instanceDa
ac70: 74 61 3b 0a 0a 20 20 20 20 2a 68 61 6e 64 6c 65  ta;..    *handle
ac80: 50 74 72 20 3d 20 49 4e 54 32 50 54 52 28 73 74  Ptr = INT2PTR(st
ac90: 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d  atePtr->sockets-
aca0: 3e 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >fd);.    return
acb0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0c 0a 2f   TCL_OK;.}...../
acc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
acd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ace0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
acf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
ad10: 20 54 63 70 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20   TcpConnect --. 
ad20: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
ad30: 6f 6e 20 6f 70 65 6e 73 20 61 20 6e 65 77 20 73  on opens a new s
ad40: 6f 63 6b 65 74 20 69 6e 20 63 6c 69 65 6e 74 20  ocket in client 
ad50: 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 09 54 68 69 73  mode.. *. *.This
ad60: 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64   might be called
ad70: 20 69 6e 20 33 20 63 69 72 63 75 6d 73 74 61 6e   in 3 circumstan
ad80: 63 65 73 3a 0a 20 2a 09 2d 20 20 20 42 79 20 61  ces:. *.-   By a
ad90: 20 72 65 67 75 6c 61 72 20 73 6f 63 6b 65 74 20   regular socket 
ada0: 63 6f 6d 6d 61 6e 64 0a 20 2a 09 2d 20 20 20 42  command. *.-   B
adb0: 79 20 74 68 65 20 65 76 65 6e 74 20 68 61 6e 64  y the event hand
adc0: 6c 65 72 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ler to continue 
add0: 61 6e 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  an asynchronousl
ade0: 79 20 63 6f 6e 6e 65 63 74 0a 20 2a 09 2d 20 20  y connect. *.-  
adf0: 20 42 79 20 61 20 62 6c 6f 63 6b 69 6e 67 20 73   By a blocking s
ae00: 6f 63 6b 65 74 20 66 75 6e 63 74 69 6f 6e 20 28  ocket function (
ae10: 67 65 74 73 2f 70 75 74 73 29 20 74 6f 20 74 65  gets/puts) to te
ae20: 72 6d 69 6e 61 74 65 20 74 68 65 0a 20 2a 09 20  rminate the. *. 
ae30: 20 20 20 63 6f 6e 6e 65 63 74 20 73 79 6e 63 68     connect synch
ae40: 72 6f 6e 6f 75 73 6c 79 0a 20 2a 0a 20 2a 20 52  ronously. *. * R
ae50: 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 20 20  esults:. *      
ae60: 54 43 4c 5f 4f 4b 2c 20 69 66 20 74 68 65 20 73  TCL_OK, if the s
ae70: 6f 63 6b 65 74 20 77 61 73 20 73 75 63 63 65 73  ocket was succes
ae80: 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64  sfully connected
ae90: 20 6f 72 20 61 6e 20 61 73 79 6e 63 68 72 6f 6e   or an asynchron
aea0: 6f 75 73 0a 20 2a 20 20 20 20 20 20 63 6f 6e 6e  ous. *      conn
aeb0: 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 70 72 6f  ection is in pro
aec0: 67 72 65 73 73 2e 20 49 66 20 61 6e 20 65 72 72  gress. If an err
aed0: 6f 72 20 6f 63 63 75 72 73 2c 20 54 43 4c 5f 45  or occurs, TCL_E
aee0: 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65 64  RROR is returned
aef0: 0a 20 2a 20 20 20 20 20 20 61 6e 64 20 61 6e 20  . *      and an 
af00: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
af10: 20 6c 65 66 74 20 69 6e 20 69 6e 74 65 72 70 2e   left in interp.
af20: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
af30: 63 74 73 3a 0a 20 2a 09 4f 70 65 6e 73 20 61 20  cts:. *.Opens a 
af40: 73 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a 20 52 65  socket.. *. * Re
af50: 6d 61 72 6b 73 3a 0a 20 2a 09 41 20 73 69 6e 67  marks:. *.A sing
af60: 6c 65 20 68 6f 73 74 20 6e 61 6d 65 20 6d 61 79  le host name may
af70: 20 72 65 73 6f 6c 76 65 20 74 6f 20 6d 6f 72 65   resolve to more
af80: 20 74 68 61 6e 20 6f 6e 65 20 49 50 20 61 64 64   than one IP add
af90: 72 65 73 73 2c 20 65 2e 67 2e 20 66 6f 72 0a 20  ress, e.g. for. 
afa0: 2a 09 61 6e 20 49 50 76 34 2f 49 50 76 36 20 64  *.an IPv4/IPv6 d
afb0: 75 61 6c 20 73 74 61 63 6b 20 68 6f 73 74 2e 20  ual stack host. 
afc0: 46 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61 73 79  For handling asy
afd0: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 63 6f 6e 6e  nchronously conn
afe0: 65 63 74 69 6e 67 0a 20 2a 09 73 6f 63 6b 65 74  ecting. *.socket
aff0: 73 20 69 6e 20 74 68 65 20 62 61 63 6b 67 72 6f  s in the backgro
b000: 75 6e 64 20 66 6f 72 20 73 75 63 68 20 68 6f 73  und for such hos
b010: 74 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ts, this functio
b020: 6e 20 63 61 6e 20 61 63 74 20 61 73 20 61 0a 20  n can act as a. 
b030: 2a 09 63 6f 72 6f 75 74 69 6e 65 2e 20 4f 6e 20  *.coroutine. On 
b040: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 2c 20  the first call, 
b050: 69 74 20 73 65 74 73 20 75 70 20 74 68 65 20 63  it sets up the c
b060: 6f 6e 74 72 6f 6c 20 76 61 72 69 61 62 6c 65 73  ontrol variables
b070: 20 66 6f 72 20 74 68 65 0a 20 2a 09 74 77 6f 20   for the. *.two 
b080: 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 6f 76 65  nested loops ove
b090: 72 20 74 68 65 20 6c 6f 63 61 6c 20 61 6e 64 20  r the local and 
b0a0: 72 65 6d 6f 74 65 20 61 64 64 72 65 73 73 65 73  remote addresses
b0b0: 2e 20 4f 6e 63 65 20 74 68 65 20 66 69 72 73 74  . Once the first
b0c0: 0a 20 2a 09 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  . *.connection a
b0d0: 74 74 65 6d 70 74 20 69 73 20 69 6e 20 70 72 6f  ttempt is in pro
b0e0: 67 72 65 73 73 2c 20 69 74 20 73 65 74 73 20 75  gress, it sets u
b0f0: 70 20 69 74 73 65 6c 66 20 61 73 20 61 20 77 72  p itself as a wr
b100: 69 74 61 62 6c 65 0a 20 2a 09 65 76 65 6e 74 20  itable. *.event 
b110: 68 61 6e 64 6c 65 72 20 66 6f 72 20 74 68 61 74  handler for that
b120: 20 73 6f 63 6b 65 74 2c 20 61 6e 64 20 72 65 74   socket, and ret
b130: 75 72 6e 73 2e 20 57 68 65 6e 20 74 68 65 20 63  urns. When the c
b140: 61 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  allback occurs,.
b150: 20 2a 09 63 6f 6e 74 72 6f 6c 20 69 73 20 74 72   *.control is tr
b160: 61 6e 73 66 65 72 72 65 64 20 74 6f 20 74 68 65  ansferred to the
b170: 20 22 72 65 65 6e 74 65 72 22 20 6c 61 62 65 6c   "reenter" label
b180: 2c 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  , right after th
b190: 65 20 69 6e 69 74 69 61 6c 0a 20 2a 09 72 65 74  e initial. *.ret
b1a0: 75 72 6e 20 61 6e 64 20 74 68 65 20 6c 6f 6f 70  urn and the loop
b1b0: 73 20 72 65 73 75 6d 65 20 61 73 20 69 66 20 74  s resume as if t
b1c0: 68 65 79 20 68 61 64 20 6e 65 76 65 72 20 62 65  hey had never be
b1d0: 65 6e 20 69 6e 74 65 72 72 75 70 74 65 64 2e 0a  en interrupted..
b1e0: 20 2a 09 46 6f 72 20 73 79 6e 63 68 72 6f 6e 6f   *.For synchrono
b1f0: 75 73 6c 79 20 63 6f 6e 6e 65 63 74 69 6e 67 20  usly connecting 
b200: 73 6f 63 6b 65 74 73 2c 20 74 68 65 20 6c 6f 6f  sockets, the loo
b210: 70 73 20 77 6f 72 6b 20 74 68 65 20 75 73 75 61  ps work the usua
b220: 6c 20 77 61 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  l way.. *. *----
b230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b270: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
b280: 6e 74 0a 54 63 70 43 6f 6e 6e 65 63 74 28 0a 20  nt.TcpConnect(. 
b290: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
b2a0: 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65  nterp,../* For e
b2b0: 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 3b 20  rror reporting; 
b2c0: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  can be NULL. */.
b2d0: 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74      TcpState *st
b2e0: 61 74 65 50 74 72 29 0a 7b 0a 20 20 20 20 44 57  atePtr).{.    DW
b2f0: 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 20 20 69  ORD error;.    i
b300: 6e 74 20 61 73 79 6e 63 5f 63 6f 6e 6e 65 63 74  nt async_connect
b310: 20 3d 20 47 4f 54 5f 42 49 54 53 28 73 74 61 74   = GOT_BITS(stat
b320: 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50  ePtr->flags, TCP
b330: 5f 41 53 59 4e 43 5f 43 4f 4e 4e 45 43 54 29 3b  _ASYNC_CONNECT);
b340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 2f 2a 20 57 65 20 61 72 65 20 73 74 61 72 74   /* We are start
b370: 65 64 20 77 69 74 68 20 61 73 79 6e 63 20 63 6f  ed with async co
b380: 6e 6e 65 63 74 20 61 6e 64 20 74 68 65 0a 20 20  nnect and the.  
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
b3b0: 20 63 6f 6e 6e 65 63 74 20 6e 6f 74 69 66 69 63   connect notific
b3c0: 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 79 65  ation was not ye
b3d0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3f0: 20 20 20 2a 20 72 65 63 65 69 76 65 64 2e 20 2a     * received. *
b400: 2f 0a 20 20 20 20 69 6e 74 20 61 73 79 6e 63 5f  /.    int async_
b410: 63 61 6c 6c 62 61 63 6b 20 3d 20 47 4f 54 5f 42  callback = GOT_B
b420: 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  ITS(statePtr->fl
b430: 61 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 50  ags, TCP_ASYNC_P
b440: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 20 20 20  ENDING);.       
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b460: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77           /* We w
b470: 65 72 65 20 63 61 6c 6c 65 64 20 62 79 20 74 68  ere called by th
b480: 65 20 65 76 65 6e 74 20 70 72 6f 63 65 64 75 72  e event procedur
b490: 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  e and.          
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 20 20 20 20 20 20 2a 20 63 6f 6e 74 69 6e 75         * continu
b4c0: 65 20 6f 75 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  e our loop. */. 
b4d0: 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69     ThreadSpecifi
b4e0: 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20  cData *tsdPtr = 
b4f0: 28 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44  (ThreadSpecificD
b500: 61 74 61 20 2a 29 54 63 6c 54 68 72 65 61 64 44  ata *)TclThreadD
b510: 61 74 61 4b 65 79 47 65 74 28 26 64 61 74 61 4b  ataKeyGet(&dataK
b520: 65 79 29 3b 0a 0a 20 20 20 20 69 66 20 28 61 73  ey);..    if (as
b530: 79 6e 63 5f 63 61 6c 6c 62 61 63 6b 29 20 7b 0a  ync_callback) {.
b540: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 72 65 65          goto ree
b550: 6e 74 65 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  nter;.    }..   
b560: 20 66 6f 72 20 28 73 74 61 74 65 50 74 72 2d 3e   for (statePtr->
b570: 61 64 64 72 20 3d 20 73 74 61 74 65 50 74 72 2d  addr = statePtr-
b580: 3e 61 64 64 72 6c 69 73 74 3b 20 73 74 61 74 65  >addrlist; state
b590: 50 74 72 2d 3e 61 64 64 72 20 21 3d 20 4e 55 4c  Ptr->addr != NUL
b5a0: 4c 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72  L;..    statePtr
b5b0: 2d 3e 61 64 64 72 20 3d 20 73 74 61 74 65 50 74  ->addr = statePt
b5c0: 72 2d 3e 61 64 64 72 2d 3e 61 69 5f 6e 65 78 74  r->addr->ai_next
b5d0: 29 20 7b 0a 09 66 6f 72 20 28 73 74 61 74 65 50  ) {..for (stateP
b5e0: 74 72 2d 3e 6d 79 61 64 64 72 20 3d 20 73 74 61  tr->myaddr = sta
b5f0: 74 65 50 74 72 2d 3e 6d 79 61 64 64 72 6c 69 73  tePtr->myaddrlis
b600: 74 3b 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 6d  t;...statePtr->m
b610: 79 61 64 64 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09  yaddr != NULL;..
b620: 09 73 74 61 74 65 50 74 72 2d 3e 6d 79 61 64 64  .statePtr->myadd
b630: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 6d 79  r = statePtr->my
b640: 61 64 64 72 2d 3e 61 69 5f 6e 65 78 74 29 20 7b  addr->ai_next) {
b650: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
b660: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 74 72 79 20   No need to try 
b670: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
b680: 6c 6f 63 61 6c 20 61 6e 64 20 72 65 6d 6f 74 65  local and remote
b690: 20 61 64 64 72 65 73 73 65 73 0a 09 20 20 20 20   addresses..    
b6a0: 20 2a 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20   * of different 
b6b0: 66 61 6d 69 6c 69 65 73 2e 0a 09 20 20 20 20 20  families...     
b6c0: 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 73 74 61  */...    if (sta
b6d0: 74 65 50 74 72 2d 3e 6d 79 61 64 64 72 2d 3e 61  tePtr->myaddr->a
b6e0: 69 5f 66 61 6d 69 6c 79 20 21 3d 20 73 74 61 74  i_family != stat
b6f0: 65 50 74 72 2d 3e 61 64 64 72 2d 3e 61 69 5f 66  ePtr->addr->ai_f
b700: 61 6d 69 6c 79 29 20 7b 0a 09 09 63 6f 6e 74 69  amily) {...conti
b710: 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 0a 20 20 20  nue;..    }..   
b720: 20 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20           /*.    
b730: 20 20 20 20 20 20 20 20 20 2a 20 43 6c 6f 73 65           * Close
b740: 20 74 68 65 20 73 6f 63 6b 65 74 20 69 66 20 69   the socket if i
b750: 74 20 69 73 20 73 74 69 6c 6c 20 6f 70 65 6e 20  t is still open 
b760: 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 75 6e  from the last un
b770: 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 20  successful.     
b780: 20 20 20 20 20 20 20 20 2a 20 69 74 65 72 61 74          * iterat
b790: 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
b7a0: 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 73    */...    if (s
b7b0: 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73  tatePtr->sockets
b7c0: 2d 3e 66 64 20 21 3d 20 49 4e 56 41 4c 49 44 5f  ->fd != INVALID_
b7d0: 53 4f 43 4b 45 54 29 20 7b 0a 09 09 63 6c 6f 73  SOCKET) {...clos
b7e0: 65 73 6f 63 6b 65 74 28 73 74 61 74 65 50 74 72  esocket(statePtr
b7f0: 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 29 3b 0a  ->sockets->fd);.
b800: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a  .    }...    /*.
b810: 09 20 20 20 20 20 2a 20 47 65 74 20 73 74 61 74  .     * Get stat
b820: 65 50 74 72 20 6c 6f 63 6b 2e 0a 09 20 20 20 20  ePtr lock...    
b830: 20 2a 2f 0a 0a 09 20 20 20 20 57 61 69 74 46 6f   */...    WaitFo
b840: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73  rSingleObject(ts
b850: 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74  dPtr->socketList
b860: 4c 6f 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b  Lock, INFINITE);
b870: 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  ...    /*..     
b880: 2a 20 52 65 73 65 74 20 6c 61 73 74 20 65 72 72  * Reset last err
b890: 6f 72 20 66 72 6f 6d 20 6c 61 73 74 20 74 72 79  or from last try
b8a0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
b8b0: 73 74 61 74 65 50 74 72 2d 3e 6e 6f 74 69 66 69  statePtr->notifi
b8c0: 65 72 43 6f 6e 6e 65 63 74 45 72 72 6f 72 20 3d  erConnectError =
b8d0: 20 30 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74   0;..    Tcl_Set
b8e0: 45 72 72 6e 6f 28 30 29 3b 0a 0a 09 20 20 20 20  Errno(0);...    
b8f0: 73 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74  statePtr->socket
b900: 73 2d 3e 66 64 20 3d 20 73 6f 63 6b 65 74 28 73  s->fd = socket(s
b910: 74 61 74 65 50 74 72 2d 3e 6d 79 61 64 64 72 2d  tatePtr->myaddr-
b920: 3e 61 69 5f 66 61 6d 69 6c 79 2c 0a 09 09 20 20  >ai_family,...  
b930: 20 20 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30    SOCK_STREAM, 0
b940: 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  );...    /*..   
b950: 20 20 2a 20 46 72 65 65 20 6c 69 73 74 20 6c 6f    * Free list lo
b960: 63 6b 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  ck...     */... 
b970: 20 20 20 53 65 74 45 76 65 6e 74 28 74 73 64 50     SetEvent(tsdP
b980: 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f  tr->socketListLo
b990: 63 6b 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20  ck);...    /*.. 
b9a0: 20 20 20 20 2a 20 43 6f 6e 74 69 6e 75 65 20 6f      * Continue o
b9b0: 6e 20 73 6f 63 6b 65 74 20 63 72 65 61 74 69 6f  n socket creatio
b9c0: 6e 20 65 72 72 6f 72 2e 0a 09 20 20 20 20 20 2a  n error...     *
b9d0: 2f 0a 0a 09 20 20 20 20 69 66 20 28 73 74 61 74  /...    if (stat
b9e0: 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66  ePtr->sockets->f
b9f0: 64 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 53 4f 43  d == INVALID_SOC
ba00: 4b 45 54 29 20 7b 0a 09 09 54 63 6c 57 69 6e 43  KET) {...TclWinC
ba10: 6f 6e 76 65 72 74 45 72 72 6f 72 28 28 44 57 4f  onvertError((DWO
ba20: 52 44 29 20 57 53 41 47 65 74 4c 61 73 74 45 72  RD) WSAGetLastEr
ba30: 72 6f 72 28 29 29 3b 0a 09 09 63 6f 6e 74 69 6e  ror());...contin
ba40: 75 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  ue;..    }...   
ba50: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 69 6e 2d   /*..     * Win-
ba60: 4e 54 20 68 61 73 20 61 20 6d 69 73 66 65 61 74  NT has a misfeat
ba70: 75 72 65 20 74 68 61 74 20 73 6f 63 6b 65 74 73  ure that sockets
ba80: 20 61 72 65 20 69 6e 68 65 72 69 74 65 64 20 69   are inherited i
ba90: 6e 20 63 68 69 6c 64 0a 09 20 20 20 20 20 2a 20  n child..     * 
baa0: 70 72 6f 63 65 73 73 65 73 20 62 79 20 64 65 66  processes by def
bab0: 61 75 6c 74 2e 20 54 75 72 6e 20 6f 66 66 20 74  ault. Turn off t
bac0: 68 65 20 69 6e 68 65 72 69 74 20 62 69 74 2e 0a  he inherit bit..
bad0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 53  .     */...    S
bae0: 65 74 48 61 6e 64 6c 65 49 6e 66 6f 72 6d 61 74  etHandleInformat
baf0: 69 6f 6e 28 28 48 41 4e 44 4c 45 29 20 73 74 61  ion((HANDLE) sta
bb00: 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e  tePtr->sockets->
bb10: 66 64 2c 0a 09 09 20 20 20 20 48 41 4e 44 4c 45  fd,...    HANDLE
bb20: 5f 46 4c 41 47 5f 49 4e 48 45 52 49 54 2c 20 30  _FLAG_INHERIT, 0
bb30: 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  );...    /*..   
bb40: 20 20 2a 20 53 65 74 20 6b 65 72 6e 65 6c 20 73    * Set kernel s
bb50: 70 61 63 65 20 62 75 66 66 65 72 69 6e 67 0a 09  pace buffering..
bb60: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63       */...    Tc
bb70: 6c 53 6f 63 6b 4d 69 6e 69 6d 75 6d 42 75 66 66  lSockMinimumBuff
bb80: 65 72 73 28 28 76 6f 69 64 20 2a 29 20 73 74 61  ers((void *) sta
bb90: 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e  tePtr->sockets->
bba0: 66 64 2c 0a 09 09 20 20 20 20 54 43 50 5f 42 55  fd,...    TCP_BU
bbb0: 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a 09 20 20  FFER_SIZE);...  
bbc0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 72 79    /*..     * Try
bbd0: 20 74 6f 20 62 69 6e 64 20 74 6f 20 61 20 6c 6f   to bind to a lo
bbe0: 63 61 6c 20 70 6f 72 74 2e 0a 09 20 20 20 20 20  cal port...     
bbf0: 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 62 69 6e  */...    if (bin
bc00: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b  d(statePtr->sock
bc10: 65 74 73 2d 3e 66 64 2c 20 73 74 61 74 65 50 74  ets->fd, statePt
bc20: 72 2d 3e 6d 79 61 64 64 72 2d 3e 61 69 5f 61 64  r->myaddr->ai_ad
bc30: 64 72 2c 0a 09 09 20 20 20 20 73 74 61 74 65 50  dr,...    stateP
bc40: 74 72 2d 3e 6d 79 61 64 64 72 2d 3e 61 69 5f 61  tr->myaddr->ai_a
bc50: 64 64 72 6c 65 6e 29 20 3d 3d 20 53 4f 43 4b 45  ddrlen) == SOCKE
bc60: 54 5f 45 52 52 4f 52 29 20 7b 0a 09 09 54 63 6c  T_ERROR) {...Tcl
bc70: 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28  WinConvertError(
bc80: 28 44 57 4f 52 44 29 20 57 53 41 47 65 74 4c 61  (DWORD) WSAGetLa
bc90: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 09 63 6f  stError());...co
bca0: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 0a  ntinue;..    }..
bcb0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
bcc0: 46 6f 72 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73  For asynchronous
bcd0: 20 63 6f 6e 6e 65 63 74 20 73 65 74 20 74 68 65   connect set the
bce0: 20 73 6f 63 6b 65 74 20 69 6e 20 6e 6f 6e 62 6c   socket in nonbl
bcf0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 0a 09 20 20 20  ocking mode..   
bd00: 20 20 2a 20 61 6e 64 20 61 63 74 69 76 61 74 65    * and activate
bd10: 20 63 6f 6e 6e 65 63 74 20 6e 6f 74 69 66 69 63   connect notific
bd20: 61 74 69 6f 6e 0a 09 20 20 20 20 20 2a 2f 0a 0a  ation..     */..
bd30: 09 20 20 20 20 69 66 20 28 61 73 79 6e 63 5f 63  .    if (async_c
bd40: 6f 6e 6e 65 63 74 29 20 7b 0a 09 09 54 63 70 53  onnect) {...TcpS
bd50: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 32 3b  tate *statePtr2;
bd60: 0a 09 09 69 6e 74 20 69 6e 5f 73 6f 63 6b 65 74  ...int in_socket
bd70: 5f 6c 69 73 74 20 3d 20 30 3b 0a 0a 09 09 2f 2a  _list = 0;..../*
bd80: 0a 09 09 20 2a 20 47 65 74 20 73 74 61 74 65 50  ... * Get stateP
bd90: 74 72 20 6c 6f 63 6b 2e 0a 09 09 20 2a 2f 0a 0a  tr lock.... */..
bda0: 09 09 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  ..WaitForSingleO
bdb0: 62 6a 65 63 74 28 74 73 64 50 74 72 2d 3e 73 6f  bject(tsdPtr->so
bdc0: 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e  cketListLock, IN
bdd0: 46 49 4e 49 54 45 29 3b 0a 0a 09 09 2f 2a 0a 09  FINITE);..../*..
bde0: 09 20 2a 20 42 75 67 66 69 67 20 66 6f 72 20 33  . * Bugfig for 3
bdf0: 33 36 34 34 31 65 64 35 39 20 74 6f 20 6e 6f 74  36441ed59 to not
be00: 20 69 67 6e 6f 72 65 20 6e 6f 74 69 66 69 63 61   ignore notifica
be10: 74 69 6f 6e 73 20 75 6e 74 69 6c 20 74 68 65 0a  tions until the.
be20: 09 09 20 2a 20 69 6e 66 6f 50 74 72 20 69 73 20  .. * infoPtr is 
be30: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 09 09 20  in the list.... 
be40: 2a 20 43 68 65 63 6b 20 69 66 20 6d 79 20 73 74  * Check if my st
be50: 61 74 65 50 74 72 20 69 73 20 61 6c 72 65 61 64  atePtr is alread
be60: 79 20 69 6e 20 74 68 65 20 74 73 64 50 74 72 2d  y in the tsdPtr-
be70: 3e 73 6f 63 6b 65 74 4c 69 73 74 0a 09 09 20 2a  >socketList... *
be80: 20 49 74 20 69 73 20 73 65 74 20 61 66 74 65 72   It is set after
be90: 20 74 68 69 73 20 63 61 6c 6c 20 62 79 20 54 63   this call by Tc
bea0: 70 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f  pThreadActionPro
beb0: 63 20 61 6e 64 20 69 73 20 73 65 74 0a 09 09 20  c and is set... 
bec0: 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 72 6f  * on a second ro
bed0: 75 6e 64 2e 0a 09 09 20 2a 0a 09 09 20 2a 20 49  und.... *... * I
bee0: 66 20 6e 6f 74 2c 20 77 65 20 62 75 66 66 65 72  f not, we buffer
bef0: 20 6d 79 20 73 74 61 74 65 50 74 72 20 69 6e 20   my statePtr in 
bf00: 74 68 65 20 74 73 64 20 6d 65 6d 6f 72 79 20 73  the tsd memory s
bf10: 6f 20 69 74 20 69 73 0a 09 09 20 2a 20 6e 6f 74  o it is... * not
bf20: 20 6c 6f 73 74 20 62 79 20 74 68 65 20 65 76 65   lost by the eve
bf30: 6e 74 20 70 72 6f 63 65 64 75 72 65 0a 09 09 20  nt procedure... 
bf40: 2a 2f 0a 0a 09 09 66 6f 72 20 28 73 74 61 74 65  */....for (state
bf50: 50 74 72 32 20 3d 20 74 73 64 50 74 72 2d 3e 73  Ptr2 = tsdPtr->s
bf60: 6f 63 6b 65 74 4c 69 73 74 3b 20 73 74 61 74 65  ocketList; state
bf70: 50 74 72 32 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09  Ptr2 != NULL;...
bf80: 09 73 74 61 74 65 50 74 72 32 20 3d 20 73 74 61  .statePtr2 = sta
bf90: 74 65 50 74 72 32 2d 3e 6e 65 78 74 50 74 72 29  tePtr2->nextPtr)
bfa0: 20 7b 0a 09 09 20 20 20 20 69 66 20 28 73 74 61   {...    if (sta
bfb0: 74 65 50 74 72 32 20 3d 3d 20 73 74 61 74 65 50  tePtr2 == stateP
bfc0: 74 72 29 20 7b 0a 09 09 09 69 6e 5f 73 6f 63 6b  tr) {....in_sock
bfd0: 65 74 5f 6c 69 73 74 20 3d 20 31 3b 0a 09 09 09  et_list = 1;....
bfe0: 62 72 65 61 6b 3b 0a 09 09 20 20 20 20 7d 0a 09  break;...    }..
bff0: 09 7d 0a 09 09 69 66 20 28 21 69 6e 5f 73 6f 63  .}...if (!in_soc
c000: 6b 65 74 5f 6c 69 73 74 29 20 7b 0a 09 09 20 20  ket_list) {...  
c010: 20 20 74 73 64 50 74 72 2d 3e 70 65 6e 64 69 6e    tsdPtr->pendin
c020: 67 54 63 70 53 74 61 74 65 20 3d 20 73 74 61 74  gTcpState = stat
c030: 65 50 74 72 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 0a  ePtr;...}..../*.
c040: 09 09 20 2a 20 53 65 74 20 63 6f 6e 6e 65 63 74  .. * Set connect
c050: 20 6d 61 73 6b 20 74 6f 20 63 6f 6e 6e 65 63 74   mask to connect
c060: 20 65 76 65 6e 74 73 0a 09 09 20 2a 0a 09 09 20   events... *... 
c070: 2a 20 54 68 69 73 20 69 73 20 61 63 74 69 76 61  * This is activa
c080: 74 65 64 20 62 79 20 61 20 53 4f 43 4b 45 54 5f  ted by a SOCKET_
c090: 53 45 4c 45 43 54 20 6d 65 73 73 61 67 65 20 74  SELECT message t
c0a0: 6f 20 74 68 65 0a 09 09 20 2a 20 6e 6f 74 69 66  o the... * notif
c0b0: 69 65 72 20 74 68 72 65 61 64 2e 0a 09 09 20 2a  ier thread.... *
c0c0: 2f 0a 0a 09 09 53 45 54 5f 42 49 54 53 28 73 74  /....SET_BITS(st
c0d0: 61 74 65 50 74 72 2d 3e 73 65 6c 65 63 74 45 76  atePtr->selectEv
c0e0: 65 6e 74 73 2c 20 46 44 5f 43 4f 4e 4e 45 43 54  ents, FD_CONNECT
c0f0: 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 46 72  );..../*... * Fr
c100: 65 65 20 6c 69 73 74 20 6c 6f 63 6b 2e 0a 09 09  ee list lock....
c110: 20 2a 2f 0a 0a 09 09 53 65 74 45 76 65 6e 74 28   */....SetEvent(
c120: 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
c130: 73 74 4c 6f 63 6b 29 3b 0a 0a 09 09 2f 2a 0a 09  stLock);..../*..
c140: 09 20 2a 20 41 63 74 69 76 61 74 65 20 61 63 63  . * Activate acc
c150: 65 70 74 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e  ept notification
c160: 2e 0a 09 09 20 2a 2f 0a 0a 09 09 53 65 6e 64 53  .... */....SendS
c170: 65 6c 65 63 74 4d 65 73 73 61 67 65 28 74 73 64  electMessage(tsd
c180: 50 74 72 2c 20 53 45 4c 45 43 54 2c 20 73 74 61  Ptr, SELECT, sta
c190: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 0a  tePtr);..    }..
c1a0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
c1b0: 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 6e 65  Attempt to conne
c1c0: 63 74 20 74 6f 20 74 68 65 20 72 65 6d 6f 74 65  ct to the remote
c1d0: 20 73 6f 63 6b 65 74 2e 0a 09 20 20 20 20 20 2a   socket...     *
c1e0: 2f 0a 0a 09 20 20 20 20 63 6f 6e 6e 65 63 74 28  /...    connect(
c1f0: 73 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74  statePtr->socket
c200: 73 2d 3e 66 64 2c 20 73 74 61 74 65 50 74 72 2d  s->fd, statePtr-
c210: 3e 61 64 64 72 2d 3e 61 69 5f 61 64 64 72 2c 0a  >addr->ai_addr,.
c220: 09 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
c230: 61 64 64 72 2d 3e 61 69 5f 61 64 64 72 6c 65 6e  addr->ai_addrlen
c240: 29 3b 0a 0a 09 20 20 20 20 65 72 72 6f 72 20 3d  );...    error =
c250: 20 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f 72   WSAGetLastError
c260: 28 29 3b 0a 09 20 20 20 20 54 63 6c 57 69 6e 43  ();..    TclWinC
c270: 6f 6e 76 65 72 74 45 72 72 6f 72 28 65 72 72 6f  onvertError(erro
c280: 72 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 61 73  r);...    if (as
c290: 79 6e 63 5f 63 6f 6e 6e 65 63 74 20 26 26 20 65  ync_connect && e
c2a0: 72 72 6f 72 20 3d 3d 20 57 53 41 45 57 4f 55 4c  rror == WSAEWOUL
c2b0: 44 42 4c 4f 43 4b 29 20 7b 0a 09 09 2f 2a 0a 09  DBLOCK) {.../*..
c2c0: 09 20 2a 20 41 73 79 6e 63 68 72 6f 6e 65 6f 75  . * Asynchroneou
c2d0: 73 20 63 6f 6e 6e 65 63 74 0a 09 09 20 2a 0a 09  s connect... *..
c2e0: 09 20 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61  . * Remember tha
c2f0: 74 20 77 65 20 6a 75 6d 70 20 62 61 63 6b 20 62  t we jump back b
c300: 65 68 69 6e 64 20 74 68 69 73 20 6e 65 78 74 20  ehind this next 
c310: 72 6f 75 6e 64 0a 09 09 20 2a 2f 0a 0a 09 09 53  round... */....S
c320: 45 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  ET_BITS(statePtr
c330: 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f 41 53 59  ->flags, TCP_ASY
c340: 4e 43 5f 50 45 4e 44 49 4e 47 29 3b 0a 09 09 72  NC_PENDING);...r
c350: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 09  eturn TCL_OK;...
c360: 20 20 20 20 72 65 65 6e 74 65 72 3a 0a 09 09 2f      reenter:.../
c370: 2a 0a 09 09 20 2a 20 52 65 2d 65 6e 74 72 79 20  *... * Re-entry 
c380: 70 6f 69 6e 74 20 66 6f 72 20 61 73 79 6e 63 20  point for async 
c390: 63 6f 6e 6e 65 63 74 20 61 66 74 65 72 20 63 6f  connect after co
c3a0: 6e 6e 65 63 74 20 65 76 65 6e 74 20 6f 72 0a 09  nnect event or..
c3b0: 09 20 2a 20 62 6c 6f 63 6b 69 6e 67 20 6f 70 65  . * blocking ope
c3c0: 72 61 74 69 6f 6e 0a 09 09 20 2a 0a 09 09 20 2a  ration... *... *
c3d0: 20 43 6c 65 61 72 20 74 68 65 20 72 65 65 6e 74   Clear the reent
c3e0: 65 72 20 66 6c 61 67 0a 09 09 20 2a 2f 0a 0a 09  er flag... */...
c3f0: 09 43 4c 45 41 52 5f 42 49 54 53 28 73 74 61 74  .CLEAR_BITS(stat
c400: 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50  ePtr->flags, TCP
c410: 5f 41 53 59 4e 43 5f 50 45 4e 44 49 4e 47 29 3b  _ASYNC_PENDING);
c420: 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 47 65 74 20  ..../*... * Get 
c430: 73 74 61 74 65 50 74 72 20 6c 6f 63 6b 2e 0a 09  statePtr lock...
c440: 09 20 2a 2f 0a 0a 09 09 57 61 69 74 46 6f 72 53  . */....WaitForS
c450: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50  ingleObject(tsdP
c460: 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f  tr->socketListLo
c470: 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 0a  ck, INFINITE);..
c480: 09 09 2f 2a 0a 09 09 20 2a 20 47 65 74 20 73 69  ../*... * Get si
c490: 67 6e 61 6c 65 64 20 63 6f 6e 6e 65 63 74 20 65  gnaled connect e
c4a0: 72 72 6f 72 2e 0a 09 09 20 2a 2f 0a 0a 09 09 54  rror.... */....T
c4b0: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f  clWinConvertErro
c4c0: 72 28 28 44 57 4f 52 44 29 20 73 74 61 74 65 50  r((DWORD) stateP
c4d0: 74 72 2d 3e 6e 6f 74 69 66 69 65 72 43 6f 6e 6e  tr->notifierConn
c4e0: 65 63 74 45 72 72 6f 72 29 3b 0a 0a 09 09 2f 2a  ectError);..../*
c4f0: 0a 09 09 20 2a 20 43 6c 65 61 72 20 65 76 65 6e  ... * Clear even
c500: 74 75 61 6c 20 63 6f 6e 6e 65 63 74 20 66 6c 61  tual connect fla
c510: 67 2e 0a 09 09 20 2a 2f 0a 0a 09 09 43 4c 45 41  g.... */....CLEA
c520: 52 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d  R_BITS(statePtr-
c530: 3e 73 65 6c 65 63 74 45 76 65 6e 74 73 2c 20 46  >selectEvents, F
c540: 44 5f 43 4f 4e 4e 45 43 54 29 3b 0a 0a 09 09 2f  D_CONNECT);..../
c550: 2a 0a 09 09 20 2a 20 46 72 65 65 20 6c 69 73 74  *... * Free list
c560: 20 6c 6f 63 6b 2e 0a 09 09 20 2a 2f 0a 0a 09 09   lock.... */....
c570: 53 65 74 45 76 65 6e 74 28 74 73 64 50 74 72 2d  SetEvent(tsdPtr-
c580: 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29  >socketListLock)
c590: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f  ;..    }...    /
c5a0: 2a 0a 09 20 20 20 20 20 2a 20 43 6c 65 61 72 20  *..     * Clear 
c5b0: 74 68 65 20 74 73 64 20 73 6f 63 6b 65 74 20 6c  the tsd socket l
c5c0: 69 73 74 20 70 6f 69 6e 74 65 72 20 69 66 20 77  ist pointer if w
c5d0: 65 20 64 69 64 20 6e 6f 74 20 77 61 69 74 20 66  e did not wait f
c5e0: 6f 72 0a 09 20 20 20 20 20 2a 20 74 68 65 20 46  or..     * the F
c5f0: 44 5f 43 4f 4e 4e 45 43 54 20 61 73 79 6e 63 68  D_CONNECT asynch
c600: 72 6f 6e 6f 75 73 6c 79 0a 09 20 20 20 20 20 2a  ronously..     *
c610: 2f 0a 0a 09 20 20 20 20 74 73 64 50 74 72 2d 3e  /...    tsdPtr->
c620: 70 65 6e 64 69 6e 67 54 63 70 53 74 61 74 65 20  pendingTcpState 
c630: 3d 20 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 69 66  = NULL;...    if
c640: 20 28 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29   (Tcl_GetErrno()
c650: 20 3d 3d 20 30 29 20 7b 0a 09 09 67 6f 74 6f 20   == 0) {...goto 
c660: 6f 75 74 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  out;..    }..}. 
c670: 20 20 20 7d 0a 0a 20 20 6f 75 74 3a 0a 20 20 20     }..  out:.   
c680: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 6f 63 6b 65   /*.     * Socke
c690: 74 20 63 6f 6e 6e 65 63 74 65 64 20 6f 72 20 63  t connected or c
c6a0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 61 69 6c 65 64  onnection failed
c6b0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a  .     */..    /*
c6c0: 0a 20 20 20 20 20 2a 20 41 73 79 6e 63 20 63 6f  .     * Async co
c6d0: 6e 6e 65 63 74 20 74 65 72 6d 69 6e 61 74 65 64  nnect terminated
c6e0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 43 4c  .     */..    CL
c6f0: 45 41 52 5f 42 49 54 53 28 73 74 61 74 65 50 74  EAR_BITS(statePt
c700: 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f 41 53  r->flags, TCP_AS
c710: 59 4e 43 5f 43 4f 4e 4e 45 43 54 29 3b 0a 0a 20  YNC_CONNECT);.. 
c720: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 45 72     if (Tcl_GetEr
c730: 72 6e 6f 28 29 20 3d 3d 20 30 29 20 7b 0a 09 2f  rno() == 0) {../
c740: 2a 0a 09 20 2a 20 53 75 63 63 65 73 66 75 6c 6c  *.. * Succesfull
c750: 79 20 63 6f 6e 6e 65 63 74 65 64 0a 09 20 2a 0a  y connected.. *.
c760: 09 20 2a 20 53 65 74 20 75 70 20 74 68 65 20 73  . * Set up the s
c770: 65 6c 65 63 74 20 6d 61 73 6b 20 66 6f 72 20 72  elect mask for r
c780: 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e 74 73  ead/write events
c790: 2e 0a 09 20 2a 2f 0a 0a 09 73 74 61 74 65 50 74  ... */...statePt
c7a0: 72 2d 3e 73 65 6c 65 63 74 45 76 65 6e 74 73 20  r->selectEvents 
c7b0: 3d 20 46 44 5f 52 45 41 44 20 7c 20 46 44 5f 57  = FD_READ | FD_W
c7c0: 52 49 54 45 20 7c 20 46 44 5f 43 4c 4f 53 45 3b  RITE | FD_CLOSE;
c7d0: 0a 0a 09 2f 2a 0a 09 20 2a 20 52 65 67 69 73 74  .../*.. * Regist
c7e0: 65 72 20 66 6f 72 20 69 6e 74 65 72 65 73 74 20  er for interest 
c7f0: 69 6e 20 65 76 65 6e 74 73 20 69 6e 20 74 68 65  in events in the
c800: 20 73 65 6c 65 63 74 20 6d 61 73 6b 2e 20 4e 6f   select mask. No
c810: 74 65 20 74 68 61 74 20 74 68 69 73 0a 09 20 2a  te that this.. *
c820: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70   automatically p
c830: 6c 61 63 65 73 20 74 68 65 20 73 6f 63 6b 65 74  laces the socket
c840: 20 69 6e 74 6f 20 6e 6f 6e 2d 62 6c 6f 63 6b 69   into non-blocki
c850: 6e 67 20 6d 6f 64 65 2e 0a 09 20 2a 2f 0a 0a 09  ng mode... */...
c860: 53 65 6e 64 53 65 6c 65 63 74 4d 65 73 73 61 67  SendSelectMessag
c870: 65 28 74 73 64 50 74 72 2c 20 53 45 4c 45 43 54  e(tsdPtr, SELECT
c880: 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  , statePtr);.   
c890: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20   } else {../*.. 
c8a0: 2a 20 43 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64  * Connect failed
c8b0: 0a 09 20 2a 0a 09 20 2a 20 46 6f 72 20 61 73 79  .. *.. * For asy
c8c0: 6e 63 20 63 6f 6e 6e 65 63 74 20 73 63 68 65 64  nc connect sched
c8d0: 75 6c 65 20 61 20 77 72 69 74 61 62 6c 65 20 65  ule a writable e
c8e0: 76 65 6e 74 20 74 6f 20 72 65 70 6f 72 74 20 74  vent to report t
c8f0: 68 65 20 66 61 69 6c 2e 0a 09 20 2a 2f 0a 0a 09  he fail... */...
c900: 69 66 20 28 61 73 79 6e 63 5f 63 61 6c 6c 62 61  if (async_callba
c910: 63 6b 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20  ck) {..    /*.. 
c920: 20 20 20 20 2a 20 53 65 74 20 75 70 20 74 68 65      * Set up the
c930: 20 73 65 6c 65 63 74 20 6d 61 73 6b 20 66 6f 72   select mask for
c940: 20 72 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e   read/write even
c950: 74 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  ts...     */... 
c960: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c     statePtr->sel
c970: 65 63 74 45 76 65 6e 74 73 20 3d 20 46 44 5f 57  ectEvents = FD_W
c980: 52 49 54 45 7c 46 44 5f 52 45 41 44 3b 0a 0a 09  RITE|FD_READ;...
c990: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 47      /*..     * G
c9a0: 65 74 20 73 74 61 74 65 50 74 72 20 6c 6f 63 6b  et statePtr lock
c9b0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
c9c0: 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62   WaitForSingleOb
c9d0: 6a 65 63 74 28 74 73 64 50 74 72 2d 3e 73 6f 63  ject(tsdPtr->soc
c9e0: 6b 65 74 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e 46  ketListLock, INF
c9f0: 49 4e 49 54 45 29 3b 0a 0a 09 20 20 20 20 2f 2a  INITE);...    /*
ca00: 0a 09 20 20 20 20 20 2a 20 53 69 67 6e 61 6c 20  ..     * Signal 
ca10: 72 65 61 64 79 20 72 65 61 64 61 62 6c 65 20 61  ready readable a
ca20: 6e 64 20 77 72 69 74 61 62 6c 65 20 65 76 65 6e  nd writable even
ca30: 74 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  ts...     */... 
ca40: 20 20 20 53 45 54 5f 42 49 54 53 28 73 74 61 74     SET_BITS(stat
ca50: 65 50 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74  ePtr->readyEvent
ca60: 73 2c 20 46 44 5f 57 52 49 54 45 20 7c 20 46 44  s, FD_WRITE | FD
ca70: 5f 52 45 41 44 29 3b 0a 0a 09 20 20 20 20 2f 2a  _READ);...    /*
ca80: 0a 09 20 20 20 20 20 2a 20 46 6c 61 67 20 65 72  ..     * Flag er
ca90: 72 6f 72 20 74 6f 20 65 76 65 6e 74 20 72 6f 75  ror to event rou
caa0: 74 69 6e 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  tine...     */..
cab0: 09 20 20 20 20 53 45 54 5f 42 49 54 53 28 73 74  .    SET_BITS(st
cac0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54  atePtr->flags, T
cad0: 43 50 5f 41 53 59 4e 43 5f 46 41 49 4c 45 44 29  CP_ASYNC_FAILED)
cae0: 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  ;...    /*..    
caf0: 20 2a 20 53 61 76 65 20 63 6f 6e 6e 65 63 74 20   * Save connect 
cb00: 65 72 72 6f 72 20 74 6f 20 62 65 20 72 65 70 6f  error to be repo
cb10: 72 74 65 64 20 62 79 20 27 66 63 6f 6e 66 69 67  rted by 'fconfig
cb20: 75 72 65 20 2d 65 72 72 6f 72 27 2e 0a 09 20 20  ure -error'...  
cb30: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 73 74 61 74     */...    stat
cb40: 65 50 74 72 2d 3e 63 6f 6e 6e 65 63 74 45 72 72  ePtr->connectErr
cb50: 6f 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e  or = Tcl_GetErrn
cb60: 6f 28 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20  o();...    /*.. 
cb70: 20 20 20 20 2a 20 46 72 65 65 20 6c 69 73 74 20      * Free list 
cb80: 6c 6f 63 6b 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  lock...     */..
cb90: 09 20 20 20 20 53 65 74 45 76 65 6e 74 28 74 73  .    SetEvent(ts
cba0: 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74  dPtr->socketList
cbb0: 4c 6f 63 6b 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  Lock);..}.../*..
cbc0: 20 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65   * Error message
cbd0: 20 6f 6e 20 73 79 6e 63 68 72 6f 6e 65 6f 75 73   on synchroneous
cbe0: 20 63 6f 6e 6e 65 63 74 0a 09 20 2a 2f 0a 0a 09   connect.. */...
cbf0: 69 66 20 28 69 6e 74 65 72 70 20 21 3d 20 4e 55  if (interp != NU
cc00: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53  LL) {..    Tcl_S
cc10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
cc20: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  rp, Tcl_ObjPrint
cc30: 66 28 0a 09 09 20 20 20 20 22 63 6f 75 6c 64 6e  f(...    "couldn
cc40: 27 74 20 6f 70 65 6e 20 73 6f 63 6b 65 74 3a 20  't open socket: 
cc50: 25 73 22 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72  %s", Tcl_PosixEr
cc60: 72 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09  ror(interp)));..
cc70: 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  }..return TCL_ER
cc80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
cc90: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
cca0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
ccf0: 0a 20 2a 20 54 63 6c 5f 4f 70 65 6e 54 63 70 43  . * Tcl_OpenTcpC
cd00: 6c 69 65 6e 74 20 2d 2d 0a 20 2a 0a 20 2a 09 4f  lient --. *. *.O
cd10: 70 65 6e 73 20 61 20 54 43 50 20 63 6c 69 65 6e  pens a TCP clien
cd20: 74 20 73 6f 63 6b 65 74 20 61 6e 64 20 63 72 65  t socket and cre
cd30: 61 74 65 73 20 61 20 63 68 61 6e 6e 65 6c 20 61  ates a channel a
cd40: 72 6f 75 6e 64 20 69 74 2e 0a 20 2a 0a 20 2a 20  round it.. *. * 
cd50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20  Results:. *.The 
cd60: 63 68 61 6e 6e 65 6c 20 6f 72 20 4e 55 4c 4c 20  channel or NULL 
cd70: 69 66 20 66 61 69 6c 65 64 2e 20 41 6e 20 65 72  if failed. An er
cd80: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 72  ror message is r
cd90: 65 74 75 72 6e 65 64 20 69 6e 20 74 68 65 0a 20  eturned in the. 
cda0: 2a 09 69 6e 74 65 72 70 72 65 74 65 72 20 6f 6e  *.interpreter on
cdb0: 20 66 61 69 6c 75 72 65 2e 0a 20 2a 0a 20 2a 20   failure.. *. * 
cdc0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
cdd0: 09 4f 70 65 6e 73 20 61 20 63 6c 69 65 6e 74 20  .Opens a client 
cde0: 73 6f 63 6b 65 74 20 61 6e 64 20 63 72 65 61 74  socket and creat
cdf0: 65 73 20 61 20 6e 65 77 20 63 68 61 6e 6e 65 6c  es a new channel
ce00: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
ce50: 2f 0a 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c 0a 54  /..Tcl_Channel.T
ce60: 63 6c 5f 4f 70 65 6e 54 63 70 43 6c 69 65 6e 74  cl_OpenTcpClient
ce70: 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  (.    Tcl_Interp
ce80: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f   *interp,../* Fo
ce90: 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  r error reportin
cea0: 67 3b 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  g; can be NULL. 
ceb0: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 6f 72 74 2c  */.    int port,
cec0: 09 09 09 2f 2a 20 50 6f 72 74 20 6e 75 6d 62 65  .../* Port numbe
ced0: 72 20 74 6f 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  r to open. */.  
cee0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f    const char *ho
cef0: 73 74 2c 09 09 2f 2a 20 48 6f 73 74 20 6f 6e 20  st,../* Host on 
cf00: 77 68 69 63 68 20 74 6f 20 6f 70 65 6e 20 70 6f  which to open po
cf10: 72 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  rt. */.    const
cf20: 20 63 68 61 72 20 2a 6d 79 61 64 64 72 2c 09 09   char *myaddr,..
cf30: 2f 2a 20 43 6c 69 65 6e 74 2d 73 69 64 65 20 61  /* Client-side a
cf40: 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 69 6e  ddress */.    in
cf50: 74 20 6d 79 70 6f 72 74 2c 09 09 09 2f 2a 20 43  t myport,.../* C
cf60: 6c 69 65 6e 74 2d 73 69 64 65 20 70 6f 72 74 20  lient-side port 
cf70: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 73 79 6e 63  */.    int async
cf80: 29 09 09 09 2f 2a 20 49 66 20 6e 6f 6e 7a 65 72  ).../* If nonzer
cf90: 6f 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64 6f  o, attempt to do
cfa0: 20 61 6e 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   an asynchronous
cfb0: 0a 09 09 09 09 20 2a 20 63 6f 6e 6e 65 63 74 2e  ..... * connect.
cfc0: 20 4f 74 68 65 72 77 69 73 65 20 77 65 20 64 6f   Otherwise we do
cfd0: 20 61 20 62 6c 6f 63 6b 69 6e 67 0a 09 09 09 09   a blocking.....
cfe0: 20 2a 20 63 6f 6e 6e 65 63 74 2e 20 2a 2f 0a 7b   * connect. */.{
cff0: 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73  .    TcpState *s
d000: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 63 6f 6e  tatePtr;.    con
d010: 73 74 20 63 68 61 72 20 2a 65 72 72 6f 72 4d 73  st char *errorMs
d020: 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74  g = NULL;.    st
d030: 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 61  ruct addrinfo *a
d040: 64 64 72 6c 69 73 74 20 3d 20 4e 55 4c 4c 2c 20  ddrlist = NULL, 
d050: 2a 6d 79 61 64 64 72 6c 69 73 74 20 3d 20 4e 55  *myaddrlist = NU
d060: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 63 68 61  LL;.    char cha
d070: 6e 6e 65 6c 4e 61 6d 65 5b 53 4f 43 4b 5f 43 48  nnelName[SOCK_CH
d080: 41 4e 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 20 20 20  AN_LENGTH];..   
d090: 20 69 66 20 28 54 63 6c 70 48 61 73 53 6f 63 6b   if (TclpHasSock
d0a0: 65 74 73 28 69 6e 74 65 72 70 29 20 21 3d 20 54  ets(interp) != T
d0b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
d0c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
d0d0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63    /*.     * Chec
d0e0: 6b 20 74 68 61 74 20 57 69 6e 53 6f 63 6b 20 69  k that WinSock i
d0f0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 3b 20 64  s initialized; d
d100: 6f 20 6e 6f 74 20 63 61 6c 6c 20 69 74 20 69 66  o not call it if
d110: 20 6e 6f 74 2c 20 74 6f 20 70 72 65 76 65 6e 74   not, to prevent
d120: 0a 20 20 20 20 20 2a 20 73 79 73 74 65 6d 20 63  .     * system c
d130: 72 61 73 68 65 73 2e 20 54 68 69 73 20 63 61 6e  rashes. This can
d140: 20 68 61 70 70 65 6e 20 61 74 20 65 78 69 74 20   happen at exit 
d150: 74 69 6d 65 20 69 66 20 74 68 65 20 65 78 69 74  time if the exit
d160: 20 68 61 6e 64 6c 65 72 20 66 6f 72 0a 20 20 20   handler for.   
d170: 20 20 2a 20 57 69 6e 53 6f 63 6b 20 72 61 6e 20    * WinSock ran 
d180: 62 65 66 6f 72 65 20 6f 74 68 65 72 20 65 78 69  before other exi
d190: 74 20 68 61 6e 64 6c 65 72 73 20 74 68 61 74 20  t handlers that 
d1a0: 77 61 6e 74 20 74 6f 20 75 73 65 20 73 6f 63 6b  want to use sock
d1b0: 65 74 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ets..     */..  
d1c0: 20 20 69 66 20 28 21 53 6f 63 6b 65 74 73 45 6e    if (!SocketsEn
d1d0: 61 62 6c 65 64 28 29 29 20 7b 0a 09 72 65 74 75  abled()) {..retu
d1e0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
d1f0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 6f      /*.     * Do
d200: 20 74 68 65 20 6e 61 6d 65 20 6c 6f 6f 6b 75 70   the name lookup
d210: 73 20 66 6f 72 20 74 68 65 20 6c 6f 63 61 6c 20  s for the local 
d220: 61 6e 64 20 72 65 6d 6f 74 65 20 61 64 64 72 65  and remote addre
d230: 73 73 65 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  sses..     */.. 
d240: 20 20 20 69 66 20 28 21 54 63 6c 43 72 65 61 74     if (!TclCreat
d250: 65 53 6f 63 6b 65 74 41 64 64 72 65 73 73 28 69  eSocketAddress(i
d260: 6e 74 65 72 70 2c 20 26 61 64 64 72 6c 69 73 74  nterp, &addrlist
d270: 2c 20 68 6f 73 74 2c 20 70 6f 72 74 2c 20 30 2c  , host, port, 0,
d280: 20 26 65 72 72 6f 72 4d 73 67 29 0a 20 20 20 20   &errorMsg).    
d290: 20 20 20 20 20 20 20 20 7c 7c 20 21 54 63 6c 43          || !TclC
d2a0: 72 65 61 74 65 53 6f 63 6b 65 74 41 64 64 72 65  reateSocketAddre
d2b0: 73 73 28 69 6e 74 65 72 70 2c 20 26 6d 79 61 64  ss(interp, &myad
d2c0: 64 72 6c 69 73 74 2c 20 6d 79 61 64 64 72 2c 20  drlist, myaddr, 
d2d0: 6d 79 70 6f 72 74 2c 20 31 2c 0a 20 20 20 20 20  myport, 1,.     
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
d2f0: 65 72 72 6f 72 4d 73 67 29 29 20 7b 0a 20 20 20  errorMsg)) {.   
d300: 20 20 20 20 20 69 66 20 28 61 64 64 72 6c 69 73       if (addrlis
d310: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20  t != NULL) {.   
d320: 20 20 20 20 20 20 20 20 20 66 72 65 65 61 64 64           freeadd
d330: 72 69 6e 66 6f 28 61 64 64 72 6c 69 73 74 29 3b  rinfo(addrlist);
d340: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d350: 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 21 3d     if (interp !=
d360: 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20   NULL) {.       
d370: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
d380: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
d390: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 20 20 20  l_ObjPrintf(.   
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 22 63 6f 75 6c 64 6e 27 74 20 6f 70 65 6e 20   "couldn't open 
d3c0: 73 6f 63 6b 65 74 3a 20 25 73 22 2c 20 65 72 72  socket: %s", err
d3d0: 6f 72 4d 73 67 29 29 3b 0a 20 20 20 20 20 20 20  orMsg));.       
d3e0: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
d3f0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
d400: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 4e 65     statePtr = Ne
d410: 77 53 6f 63 6b 65 74 49 6e 66 6f 28 49 4e 56 41  wSocketInfo(INVA
d420: 4c 49 44 5f 53 4f 43 4b 45 54 29 3b 0a 20 20 20  LID_SOCKET);.   
d430: 20 73 74 61 74 65 50 74 72 2d 3e 61 64 64 72 6c   statePtr->addrl
d440: 69 73 74 20 3d 20 61 64 64 72 6c 69 73 74 3b 0a  ist = addrlist;.
d450: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 6d 79      statePtr->my
d460: 61 64 64 72 6c 69 73 74 20 3d 20 6d 79 61 64 64  addrlist = myadd
d470: 72 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 61  rlist;.    if (a
d480: 73 79 6e 63 29 20 7b 0a 09 53 45 54 5f 42 49 54  sync) {..SET_BIT
d490: 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  S(statePtr->flag
d4a0: 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 43 4f 4e  s, TCP_ASYNC_CON
d4b0: 4e 45 43 54 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  NECT);.    }..  
d4c0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 72 65 61    /*.     * Crea
d4d0: 74 65 20 61 20 6e 65 77 20 63 6c 69 65 6e 74 20  te a new client 
d4e0: 73 6f 63 6b 65 74 20 61 6e 64 20 77 72 61 70 20  socket and wrap 
d4f0: 69 74 20 69 6e 20 61 20 63 68 61 6e 6e 65 6c 2e  it in a channel.
d500: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20  .     */.    if 
d510: 28 54 63 70 43 6f 6e 6e 65 63 74 28 69 6e 74 65  (TcpConnect(inte
d520: 72 70 2c 20 73 74 61 74 65 50 74 72 29 20 21 3d  rp, statePtr) !=
d530: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 70 43   TCL_OK) {..TcpC
d540: 6c 6f 73 65 50 72 6f 63 28 73 74 61 74 65 50 74  loseProc(statePt
d550: 72 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  r, NULL);..retur
d560: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
d570: 20 20 20 73 70 72 69 6e 74 66 28 63 68 61 6e 6e     sprintf(chann
d580: 65 6c 4e 61 6d 65 2c 20 53 4f 43 4b 5f 54 45 4d  elName, SOCK_TEM
d590: 50 4c 41 54 45 2c 20 73 74 61 74 65 50 74 72 29  PLATE, statePtr)
d5a0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
d5b0: 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43  >channel = Tcl_C
d5c0: 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 74 63  reateChannel(&tc
d5d0: 70 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 63 68  pChannelType, ch
d5e0: 61 6e 6e 65 6c 4e 61 6d 65 2c 0a 09 20 20 20 20  annelName,..    
d5f0: 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52  statePtr, (TCL_R
d600: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
d610: 49 54 41 42 4c 45 29 29 3b 0a 20 20 20 20 69 66  ITABLE));.    if
d620: 20 28 54 43 4c 5f 45 52 52 4f 52 20 3d 3d 20 54   (TCL_ERROR == T
d630: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
d640: 69 6f 6e 28 4e 55 4c 4c 2c 20 73 74 61 74 65 50  ion(NULL, stateP
d650: 74 72 2d 3e 63 68 61 6e 6e 65 6c 2c 0a 09 20 20  tr->channel,..  
d660: 20 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22    "-translation"
d670: 2c 20 22 61 75 74 6f 20 63 72 6c 66 22 29 29 20  , "auto crlf")) 
d680: 7b 0a 09 54 63 6c 5f 43 6c 6f 73 65 28 4e 55 4c  {..Tcl_Close(NUL
d690: 4c 2c 20 73 74 61 74 65 50 74 72 2d 3e 63 68 61  L, statePtr->cha
d6a0: 6e 6e 65 6c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  nnel);..return N
d6b0: 55 4c 4c 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ULL;.    } else 
d6c0: 69 66 20 28 54 43 4c 5f 45 52 52 4f 52 20 3d 3d  if (TCL_ERROR ==
d6d0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
d6e0: 70 74 69 6f 6e 28 4e 55 4c 4c 2c 20 73 74 61 74  ption(NULL, stat
d6f0: 65 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 2c 0a 09  ePtr->channel,..
d700: 20 20 20 20 22 2d 65 6f 66 63 68 61 72 22 2c 20      "-eofchar", 
d710: 22 22 29 29 20 7b 0a 09 54 63 6c 5f 43 6c 6f 73  "")) {..Tcl_Clos
d720: 65 28 4e 55 4c 4c 2c 20 73 74 61 74 65 50 74 72  e(NULL, statePtr
d730: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 09 72 65 74  ->channel);..ret
d740: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d750: 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65      return state
d760: 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 3b 0a 7d 0a  Ptr->channel;.}.
d770: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
d780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
d7c0: 0a 20 2a 20 54 63 6c 5f 4d 61 6b 65 54 63 70 43  . * Tcl_MakeTcpC
d7d0: 6c 69 65 6e 74 43 68 61 6e 6e 65 6c 20 2d 2d 0a  lientChannel --.
d7e0: 20 2a 0a 20 2a 09 43 72 65 61 74 65 73 20 61 20   *. *.Creates a 
d7f0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 66 72 6f 6d  Tcl_Channel from
d800: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6c 69   an existing cli
d810: 65 6e 74 20 54 43 50 20 73 6f 63 6b 65 74 2e 0a  ent TCP socket..
d820: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
d830: 2a 09 54 68 65 20 54 63 6c 5f 43 68 61 6e 6e 65  *.The Tcl_Channe
d840: 6c 20 77 72 61 70 70 65 64 20 61 72 6f 75 6e 64  l wrapped around
d850: 20 74 68 65 20 70 72 65 65 78 69 73 74 69 6e 67   the preexisting
d860: 20 54 43 50 20 73 6f 63 6b 65 74 2e 0a 20 2a 0a   TCP socket.. *.
d870: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
d880: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
d890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8d0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 43  -----. */..Tcl_C
d8e0: 68 61 6e 6e 65 6c 0a 54 63 6c 5f 4d 61 6b 65 54  hannel.Tcl_MakeT
d8f0: 63 70 43 6c 69 65 6e 74 43 68 61 6e 6e 65 6c 28  cpClientChannel(
d900: 0a 20 20 20 20 76 6f 69 64 20 2a 73 6f 63 6b 29  .    void *sock)
d910: 09 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20  ../* The socket 
d920: 74 6f 20 77 72 61 70 20 75 70 20 69 6e 74 6f 20  to wrap up into 
d930: 61 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 7b 0a  a channel. */.{.
d940: 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74      TcpState *st
d950: 61 74 65 50 74 72 3b 0a 20 20 20 20 63 68 61 72  atePtr;.    char
d960: 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 5b 53 4f 43   channelName[SOC
d970: 4b 5f 43 48 41 4e 5f 4c 45 4e 47 54 48 5d 3b 0a  K_CHAN_LENGTH];.
d980: 20 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66      ThreadSpecif
d990: 69 63 44 61 74 61 20 2a 74 73 64 50 74 72 3b 0a  icData *tsdPtr;.
d9a0: 0a 20 20 20 20 69 66 20 28 54 63 6c 70 48 61 73  .    if (TclpHas
d9b0: 53 6f 63 6b 65 74 73 28 4e 55 4c 4c 29 20 21 3d  Sockets(NULL) !=
d9c0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
d9d0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
d9e0: 20 20 20 20 74 73 64 50 74 72 20 3d 20 28 54 68      tsdPtr = (Th
d9f0: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
da00: 20 2a 29 54 63 6c 54 68 72 65 61 64 44 61 74 61   *)TclThreadData
da10: 4b 65 79 47 65 74 28 26 64 61 74 61 4b 65 79 29  KeyGet(&dataKey)
da20: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
da30: 20 53 65 74 20 6b 65 72 6e 65 6c 20 73 70 61 63   Set kernel spac
da40: 65 20 62 75 66 66 65 72 69 6e 67 20 61 6e 64 20  e buffering and 
da50: 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 2e 0a 20 20  non-blocking..  
da60: 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 53 6f     */..    TclSo
da70: 63 6b 4d 69 6e 69 6d 75 6d 42 75 66 66 65 72 73  ckMinimumBuffers
da80: 28 73 6f 63 6b 2c 20 54 43 50 5f 42 55 46 46 45  (sock, TCP_BUFFE
da90: 52 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 73 74  R_SIZE);..    st
daa0: 61 74 65 50 74 72 20 3d 20 4e 65 77 53 6f 63 6b  atePtr = NewSock
dab0: 65 74 49 6e 66 6f 28 28 53 4f 43 4b 45 54 29 20  etInfo((SOCKET) 
dac0: 73 6f 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  sock);..    /*. 
dad0: 20 20 20 20 2a 20 53 74 61 72 74 20 77 61 74 63      * Start watc
dae0: 68 69 6e 67 20 66 6f 72 20 72 65 61 64 2f 77 72  hing for read/wr
daf0: 69 74 65 20 65 76 65 6e 74 73 20 6f 6e 20 74 68  ite events on th
db00: 65 20 73 6f 63 6b 65 74 2e 0a 20 20 20 20 20 2a  e socket..     *
db10: 2f 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  /..    statePtr-
db20: 3e 73 65 6c 65 63 74 45 76 65 6e 74 73 20 3d 20  >selectEvents = 
db30: 46 44 5f 52 45 41 44 20 7c 20 46 44 5f 43 4c 4f  FD_READ | FD_CLO
db40: 53 45 20 7c 20 46 44 5f 57 52 49 54 45 3b 0a 20  SE | FD_WRITE;. 
db50: 20 20 20 53 65 6e 64 53 65 6c 65 63 74 4d 65 73     SendSelectMes
db60: 73 61 67 65 28 74 73 64 50 74 72 2c 20 53 45 4c  sage(tsdPtr, SEL
db70: 45 43 54 2c 20 73 74 61 74 65 50 74 72 29 3b 0a  ECT, statePtr);.
db80: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 63 68 61  .    sprintf(cha
db90: 6e 6e 65 6c 4e 61 6d 65 2c 20 53 4f 43 4b 5f 54  nnelName, SOCK_T
dba0: 45 4d 50 4c 41 54 45 2c 20 73 74 61 74 65 50 74  EMPLATE, statePt
dbb0: 72 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  r);.    statePtr
dbc0: 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f  ->channel = Tcl_
dbd0: 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 74  CreateChannel(&t
dbe0: 63 70 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 63  cpChannelType, c
dbf0: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 0a 09 20 20 20  hannelName,..   
dc00: 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f   statePtr, (TCL_
dc10: 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57  READABLE | TCL_W
dc20: 52 49 54 41 42 4c 45 29 29 3b 0a 20 20 20 20 54  RITABLE));.    T
dc30: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
dc40: 69 6f 6e 28 4e 55 4c 4c 2c 20 73 74 61 74 65 50  ion(NULL, stateP
dc50: 74 72 2d 3e 63 68 61 6e 6e 65 6c 2c 20 22 2d 74  tr->channel, "-t
dc60: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 61 75  ranslation", "au
dc70: 74 6f 20 63 72 6c 66 22 29 3b 0a 20 20 20 20 72  to crlf");.    r
dc80: 65 74 75 72 6e 20 73 74 61 74 65 50 74 72 2d 3e  eturn statePtr->
dc90: 63 68 61 6e 6e 65 6c 3b 0a 7d 0a 0c 0a 2f 2a 0a  channel;.}.../*.
dca0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
dcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dce0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
dcf0: 63 6c 5f 4f 70 65 6e 54 63 70 53 65 72 76 65 72  cl_OpenTcpServer
dd00: 20 2d 2d 0a 20 2a 0a 20 2a 09 4f 70 65 6e 73 20   --. *. *.Opens 
dd10: 61 20 54 43 50 20 73 65 72 76 65 72 20 73 6f 63  a TCP server soc
dd20: 6b 65 74 20 61 6e 64 20 63 72 65 61 74 65 73 20  ket and creates 
dd30: 61 20 63 68 61 6e 6e 65 6c 20 61 72 6f 75 6e 64  a channel around
dd40: 20 69 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c   it.. *. * Resul
dd50: 74 73 3a 0a 20 2a 09 54 68 65 20 63 68 61 6e 6e  ts:. *.The chann
dd60: 65 6c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 66 61  el or NULL if fa
dd70: 69 6c 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  iled. If an erro
dd80: 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6e 20 65  r occurred, an e
dd90: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 09  rror message. *.
dda0: 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 69  is left in the i
ddb0: 6e 74 65 72 70 27 73 20 72 65 73 75 6c 74 20 69  nterp's result i
ddc0: 66 20 69 6e 74 65 72 70 20 69 73 20 6e 6f 74 20  f interp is not 
ddd0: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  NULL.. *. * Side
dde0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4f 70 65   effects:. *.Ope
ddf0: 6e 73 20 61 20 73 65 72 76 65 72 20 73 6f 63 6b  ns a server sock
de00: 65 74 20 61 6e 64 20 63 72 65 61 74 65 73 20 61  et and creates a
de10: 20 6e 65 77 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a   new channel.. *
de20: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
de30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54  ---------. */..T
de70: 63 6c 5f 43 68 61 6e 6e 65 6c 0a 54 63 6c 5f 4f  cl_Channel.Tcl_O
de80: 70 65 6e 54 63 70 53 65 72 76 65 72 28 0a 20 20  penTcpServer(.  
de90: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dea0: 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72  terp,../* For er
deb0: 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20 2d 20  ror reporting - 
dec0: 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  may be NULL. */.
ded0: 20 20 20 20 69 6e 74 20 70 6f 72 74 2c 09 09 09      int port,...
dee0: 2f 2a 20 50 6f 72 74 20 6e 75 6d 62 65 72 20 74  /* Port number t
def0: 6f 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 63  o open. */.    c
df00: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 79 48 6f 73  onst char *myHos
df10: 74 2c 09 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 6c  t,../* Name of l
df20: 6f 63 61 6c 20 68 6f 73 74 2e 20 2a 2f 0a 20 20  ocal host. */.  
df30: 20 20 54 63 6c 5f 54 63 70 41 63 63 65 70 74 50    Tcl_TcpAcceptP
df40: 72 6f 63 20 2a 61 63 63 65 70 74 50 72 6f 63 2c  roc *acceptProc,
df50: 0a 09 09 09 09 2f 2a 20 43 61 6c 6c 62 61 63 6b  ...../* Callback
df60: 20 66 6f 72 20 61 63 63 65 70 74 69 6e 67 20 63   for accepting c
df70: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
df80: 6e 65 77 0a 09 09 09 09 20 2a 20 63 6c 69 65 6e  new..... * clien
df90: 74 73 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ts. */.    void 
dfa0: 2a 61 63 63 65 70 74 50 72 6f 63 44 61 74 61 29  *acceptProcData)
dfb0: 09 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65  ./* Data for the
dfc0: 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 7b 0a   callback. */.{.
dfd0: 20 20 20 20 53 4f 43 4b 45 54 20 73 6f 63 6b 20      SOCKET sock 
dfe0: 3d 20 49 4e 56 41 4c 49 44 5f 53 4f 43 4b 45 54  = INVALID_SOCKET
dff0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 73  ;.    unsigned s
e000: 68 6f 72 74 20 63 68 6f 73 65 6e 70 6f 72 74 20  hort chosenport 
e010: 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
e020: 61 64 64 72 69 6e 66 6f 20 2a 61 64 64 72 6c 69  addrinfo *addrli
e030: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73  st = NULL;.    s
e040: 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a  truct addrinfo *
e050: 61 64 64 72 50 74 72 3b 09 2f 2a 20 53 6f 63 6b  addrPtr;./* Sock
e060: 65 74 20 61 64 64 72 65 73 73 20 74 6f 20 6c 69  et address to li
e070: 73 74 65 6e 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  sten on. */.    
e080: 54 63 70 53 74 61 74 65 20 2a 73 74 61 74 65 50  TcpState *stateP
e090: 74 72 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 54 68  tr = NULL;./* Th
e0a0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
e0b0: 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 68  . */.    char ch
e0c0: 61 6e 6e 65 6c 4e 61 6d 65 5b 53 4f 43 4b 5f 43  annelName[SOCK_C
e0d0: 48 41 4e 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20  HAN_LENGTH];.   
e0e0: 20 75 5f 6c 6f 6e 67 20 66 6c 61 67 20 3d 20 31   u_long flag = 1
e0f0: 3b 09 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20  ;../* Indicates 
e100: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  nonblocking mode
e110: 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  . */.    const c
e120: 68 61 72 20 2a 65 72 72 6f 72 4d 73 67 20 3d 20  har *errorMsg = 
e130: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 54  NULL;..    if (T
e140: 63 6c 70 48 61 73 53 6f 63 6b 65 74 73 28 69 6e  clpHasSockets(in
e150: 74 65 72 70 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  terp) != TCL_OK)
e160: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b   {..return NULL;
e170: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
e180: 20 20 20 20 2a 20 43 68 65 63 6b 20 74 68 61 74      * Check that
e190: 20 57 69 6e 53 6f 63 6b 20 69 73 20 69 6e 69 74   WinSock is init
e1a0: 69 61 6c 69 7a 65 64 3b 20 64 6f 20 6e 6f 74 20  ialized; do not 
e1b0: 63 61 6c 6c 20 69 74 20 69 66 20 6e 6f 74 2c 20  call it if not, 
e1c0: 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20 20  to prevent.     
e1d0: 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  * system crashes
e1e0: 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  . This can happe
e1f0: 6e 20 61 74 20 65 78 69 74 20 74 69 6d 65 20 69  n at exit time i
e200: 66 20 74 68 65 20 65 78 69 74 20 68 61 6e 64 6c  f the exit handl
e210: 65 72 20 66 6f 72 0a 20 20 20 20 20 2a 20 57 69  er for.     * Wi
e220: 6e 53 6f 63 6b 20 72 61 6e 20 62 65 66 6f 72 65  nSock ran before
e230: 20 6f 74 68 65 72 20 65 78 69 74 20 68 61 6e 64   other exit hand
e240: 6c 65 72 73 20 74 68 61 74 20 77 61 6e 74 20 74  lers that want t
e250: 6f 20 75 73 65 20 73 6f 63 6b 65 74 73 2e 0a 20  o use sockets.. 
e260: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
e270: 21 53 6f 63 6b 65 74 73 45 6e 61 62 6c 65 64 28  !SocketsEnabled(
e280: 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  )) {..return NUL
e290: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
e2a0: 0a 20 20 20 20 20 2a 20 43 6f 6e 73 74 72 75 63  .     * Construc
e2b0: 74 20 74 68 65 20 61 64 64 72 65 73 73 65 73 20  t the addresses 
e2c0: 66 6f 72 20 65 61 63 68 20 65 6e 64 20 6f 66 20  for each end of 
e2d0: 74 68 65 20 73 6f 63 6b 65 74 2e 0a 20 20 20 20  the socket..    
e2e0: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 54 63   */..    if (!Tc
e2f0: 6c 43 72 65 61 74 65 53 6f 63 6b 65 74 41 64 64  lCreateSocketAdd
e300: 72 65 73 73 28 69 6e 74 65 72 70 2c 20 26 61 64  ress(interp, &ad
e310: 64 72 6c 69 73 74 2c 20 6d 79 48 6f 73 74 2c 20  drlist, myHost, 
e320: 70 6f 72 74 2c 20 31 2c 0a 09 20 20 20 20 26 65  port, 1,..    &e
e330: 72 72 6f 72 4d 73 67 29 29 20 7b 0a 09 67 6f 74  rrorMsg)) {..got
e340: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a  o error;.    }..
e350: 20 20 20 20 66 6f 72 20 28 61 64 64 72 50 74 72      for (addrPtr
e360: 20 3d 20 61 64 64 72 6c 69 73 74 3b 20 61 64 64   = addrlist; add
e370: 72 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 20 61 64  rPtr != NULL; ad
e380: 64 72 50 74 72 20 3d 20 61 64 64 72 50 74 72 2d  drPtr = addrPtr-
e390: 3e 61 69 5f 6e 65 78 74 29 20 7b 0a 09 73 6f 63  >ai_next) {..soc
e3a0: 6b 20 3d 20 73 6f 63 6b 65 74 28 61 64 64 72 50  k = socket(addrP
e3b0: 74 72 2d 3e 61 69 5f 66 61 6d 69 6c 79 2c 20 61  tr->ai_family, a
e3c0: 64 64 72 50 74 72 2d 3e 61 69 5f 73 6f 63 6b 74  ddrPtr->ai_sockt
e3d0: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ype,.           
e3e0: 20 20 20 20 20 61 64 64 72 50 74 72 2d 3e 61 69       addrPtr->ai
e3f0: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 69 66 20  _protocol);..if 
e400: 28 73 6f 63 6b 20 3d 3d 20 49 4e 56 41 4c 49 44  (sock == INVALID
e410: 5f 53 4f 43 4b 45 54 29 20 7b 0a 09 20 20 20 20  _SOCKET) {..    
e420: 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72  TclWinConvertErr
e430: 6f 72 28 28 44 57 4f 52 44 29 20 57 53 41 47 65  or((DWORD) WSAGe
e440: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09  tLastError());..
e450: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 7d      continue;..}
e460: 0a 0a 09 2f 2a 0a 09 20 2a 20 57 69 6e 2d 4e 54  .../*.. * Win-NT
e470: 20 68 61 73 20 61 20 6d 69 73 66 65 61 74 75 72   has a misfeatur
e480: 65 20 74 68 61 74 20 73 6f 63 6b 65 74 73 20 61  e that sockets a
e490: 72 65 20 69 6e 68 65 72 69 74 65 64 20 69 6e 20  re inherited in 
e4a0: 63 68 69 6c 64 0a 09 20 2a 20 70 72 6f 63 65 73  child.. * proces
e4b0: 73 65 73 20 62 79 20 64 65 66 61 75 6c 74 2e 20  ses by default. 
e4c0: 54 75 72 6e 20 6f 66 66 20 74 68 65 20 69 6e 68  Turn off the inh
e4d0: 65 72 69 74 20 62 69 74 2e 0a 09 20 2a 2f 0a 0a  erit bit... */..
e4e0: 09 53 65 74 48 61 6e 64 6c 65 49 6e 66 6f 72 6d  .SetHandleInform
e4f0: 61 74 69 6f 6e 28 28 48 41 4e 44 4c 45 29 20 73  ation((HANDLE) s
e500: 6f 63 6b 2c 20 48 41 4e 44 4c 45 5f 46 4c 41 47  ock, HANDLE_FLAG
e510: 5f 49 4e 48 45 52 49 54 2c 20 30 29 3b 0a 0a 09  _INHERIT, 0);...
e520: 2f 2a 0a 09 20 2a 20 53 65 74 20 6b 65 72 6e 65  /*.. * Set kerne
e530: 6c 20 73 70 61 63 65 20 62 75 66 66 65 72 69 6e  l space bufferin
e540: 67 0a 09 20 2a 2f 0a 0a 09 54 63 6c 53 6f 63 6b  g.. */...TclSock
e550: 4d 69 6e 69 6d 75 6d 42 75 66 66 65 72 73 28 28  MinimumBuffers((
e560: 76 6f 69 64 20 2a 29 73 6f 63 6b 2c 20 54 43 50  void *)sock, TCP
e570: 5f 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a  _BUFFER_SIZE);..
e580: 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72  ./*.. * Make sur
e590: 65 20 77 65 20 75 73 65 20 74 68 65 20 73 61 6d  e we use the sam
e5a0: 65 20 70 6f 72 74 20 77 68 65 6e 20 6f 70 65 6e  e port when open
e5b0: 69 6e 67 20 74 77 6f 20 73 65 72 76 65 72 20 73  ing two server s
e5c0: 6f 63 6b 65 74 73 0a 09 20 2a 20 66 6f 72 20 49  ockets.. * for I
e5d0: 50 76 34 20 61 6e 64 20 49 50 76 36 2e 0a 09 20  Pv4 and IPv6... 
e5e0: 2a 0a 09 20 2a 20 41 73 20 73 6f 63 6b 61 64 64  *.. * As sockadd
e5f0: 72 5f 69 6e 36 20 75 73 65 73 20 74 68 65 20 73  r_in6 uses the s
e600: 61 6d 65 20 6f 66 66 73 65 74 20 61 6e 64 20 73  ame offset and s
e610: 69 7a 65 20 66 6f 72 20 74 68 65 20 70 6f 72 74  ize for the port
e620: 0a 09 20 2a 20 6d 65 6d 62 65 72 20 61 73 20 73  .. * member as s
e630: 6f 63 6b 61 64 64 72 5f 69 6e 2c 20 77 65 20 63  ockaddr_in, we c
e640: 61 6e 20 68 61 6e 64 6c 65 20 62 6f 74 68 20 74  an handle both t
e650: 68 72 6f 75 67 68 20 74 68 65 20 49 50 76 34 20  hrough the IPv4 
e660: 41 50 49 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28  API... */...if (
e670: 70 6f 72 74 20 3d 3d 20 30 20 26 26 20 63 68 6f  port == 0 && cho
e680: 73 65 6e 70 6f 72 74 20 21 3d 20 30 29 20 7b 0a  senport != 0) {.
e690: 09 20 20 20 20 28 28 73 74 72 75 63 74 20 73 6f  .    ((struct so
e6a0: 63 6b 61 64 64 72 5f 69 6e 20 2a 29 20 61 64 64  ckaddr_in *) add
e6b0: 72 50 74 72 2d 3e 61 69 5f 61 64 64 72 29 2d 3e  rPtr->ai_addr)->
e6c0: 73 69 6e 5f 70 6f 72 74 20 3d 0a 09 09 68 74 6f  sin_port =...hto
e6d0: 6e 73 28 63 68 6f 73 65 6e 70 6f 72 74 29 3b 0a  ns(chosenport);.
e6e0: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 42 69 6e 64  .}.../*.. * Bind
e6f0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
e700: 64 20 70 6f 72 74 2e 20 4e 6f 74 65 20 74 68 61  d port. Note tha
e710: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 63 61  t we must not ca
e720: 6c 6c 0a 09 20 2a 20 73 65 74 73 6f 63 6b 6f 70  ll.. * setsockop
e730: 74 20 77 69 74 68 20 53 4f 5f 52 45 55 53 45 41  t with SO_REUSEA
e740: 44 44 52 20 62 65 63 61 75 73 65 20 4d 69 63 72  DDR because Micr
e750: 6f 73 6f 66 74 20 61 6c 6c 6f 77 73 20 61 64 64  osoft allows add
e760: 72 65 73 73 65 73 0a 09 20 2a 20 74 6f 20 62 65  resses.. * to be
e770: 20 72 65 75 73 65 64 20 65 76 65 6e 20 69 66 20   reused even if 
e780: 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
e790: 6e 20 75 73 65 2e 0a 09 20 2a 0a 09 20 2a 20 42  n use... *.. * B
e7a0: 69 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ind should not b
e7b0: 65 20 61 66 66 65 63 74 65 64 20 62 79 20 74 68  e affected by th
e7c0: 65 20 73 6f 63 6b 65 74 20 68 61 76 69 6e 67 20  e socket having 
e7d0: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 09 20 2a  already been.. *
e7e0: 20 73 65 74 20 69 6e 74 6f 20 6e 6f 6e 62 6c 6f   set into nonblo
e7f0: 63 6b 69 6e 67 20 6d 6f 64 65 2e 20 49 66 20 74  cking mode. If t
e800: 68 65 72 65 20 69 73 20 74 72 6f 75 62 6c 65 2c  here is trouble,
e810: 20 74 68 69 73 20 69 73 20 6f 6e 65 0a 09 20 2a   this is one.. *
e820: 20 70 6c 61 63 65 20 74 6f 20 6c 6f 6f 6b 20 66   place to look f
e830: 6f 72 20 62 75 67 73 2e 0a 09 20 2a 2f 0a 0a 09  or bugs... */...
e840: 69 66 20 28 62 69 6e 64 28 73 6f 63 6b 2c 20 61  if (bind(sock, a
e850: 64 64 72 50 74 72 2d 3e 61 69 5f 61 64 64 72 2c  ddrPtr->ai_addr,
e860: 0a 09 09 61 64 64 72 50 74 72 2d 3e 61 69 5f 61  ...addrPtr->ai_a
e870: 64 64 72 6c 65 6e 29 20 3d 3d 20 53 4f 43 4b 45  ddrlen) == SOCKE
e880: 54 5f 45 52 52 4f 52 29 20 7b 0a 09 20 20 20 20  T_ERROR) {..    
e890: 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72  TclWinConvertErr
e8a0: 6f 72 28 28 44 57 4f 52 44 29 20 57 53 41 47 65  or((DWORD) WSAGe
e8b0: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09  tLastError());..
e8c0: 20 20 20 20 63 6c 6f 73 65 73 6f 63 6b 65 74 28      closesocket(
e8d0: 73 6f 63 6b 29 3b 0a 09 20 20 20 20 63 6f 6e 74  sock);..    cont
e8e0: 69 6e 75 65 3b 0a 09 7d 0a 09 69 66 20 28 70 6f  inue;..}..if (po
e8f0: 72 74 20 3d 3d 20 30 20 26 26 20 63 68 6f 73 65  rt == 0 && chose
e900: 6e 70 6f 72 74 20 3d 3d 20 30 29 20 7b 0a 09 20  nport == 0) {.. 
e910: 20 20 20 61 64 64 72 65 73 73 20 73 6f 63 6b 6e     address sockn
e920: 61 6d 65 3b 0a 09 20 20 20 20 73 6f 63 6b 6c 65  ame;..    sockle
e930: 6e 5f 74 20 6e 61 6d 65 6c 65 6e 20 3d 20 73 69  n_t namelen = si
e940: 7a 65 6f 66 28 73 6f 63 6b 6e 61 6d 65 29 3b 0a  zeof(sockname);.
e950: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
e960: 20 53 79 6e 63 68 72 6f 6e 69 7a 65 20 70 6f 72   Synchronize por
e970: 74 20 6e 75 6d 62 65 72 73 20 77 68 65 6e 20 62  t numbers when b
e980: 69 6e 64 69 6e 67 20 74 6f 20 70 6f 72 74 20 30  inding to port 0
e990: 20 6f 66 20 6d 75 6c 74 69 70 6c 65 0a 09 20 20   of multiple..  
e9a0: 20 20 20 2a 20 61 64 64 72 65 73 73 65 73 2e 0a     * addresses..
e9b0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69  .     */...    i
e9c0: 66 20 28 67 65 74 73 6f 63 6b 6e 61 6d 65 28 73  f (getsockname(s
e9d0: 6f 63 6b 2c 20 26 73 6f 63 6b 6e 61 6d 65 2e 73  ock, &sockname.s
e9e0: 61 2c 20 26 6e 61 6d 65 6c 65 6e 29 20 3e 3d 20  a, &namelen) >= 
e9f0: 30 29 20 7b 0a 09 09 63 68 6f 73 65 6e 70 6f 72  0) {...chosenpor
ea00: 74 20 3d 20 6e 74 6f 68 73 28 73 6f 63 6b 6e 61  t = ntohs(sockna
ea10: 6d 65 2e 73 61 34 2e 73 69 6e 5f 70 6f 72 74 29  me.sa4.sin_port)
ea20: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a  ;..    }..}.../*
ea30: 0a 09 20 2a 20 53 65 74 20 74 68 65 20 6d 61 78  .. * Set the max
ea40: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
ea50: 65 6e 64 69 6e 67 20 63 6f 6e 6e 65 63 74 20 72  ending connect r
ea60: 65 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 6d  equests to the m
ea70: 61 78 0a 09 20 2a 20 76 61 6c 75 65 20 61 6c 6c  ax.. * value all
ea80: 6f 77 65 64 20 6f 6e 20 65 61 63 68 20 70 6c 61  owed on each pla
ea90: 74 66 6f 72 6d 20 28 57 69 6e 33 32 20 61 6e 64  tform (Win32 and
eaa0: 20 57 69 6e 33 32 73 20 6d 61 79 20 62 65 0a 09   Win32s may be..
eab0: 20 2a 20 64 69 66 66 65 72 65 6e 74 2c 20 61 6e   * different, an
eac0: 64 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 64  d there may be d
ead0: 69 66 66 65 72 65 6e 63 65 73 20 62 65 74 77 65  ifferences betwe
eae0: 65 6e 20 54 43 50 2f 49 50 20 73 74 61 63 6b 73  en TCP/IP stacks
eaf0: 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 6c 69  )... */...if (li
eb00: 73 74 65 6e 28 73 6f 63 6b 2c 20 53 4f 4d 41 58  sten(sock, SOMAX
eb10: 43 4f 4e 4e 29 20 3d 3d 20 53 4f 43 4b 45 54 5f  CONN) == SOCKET_
eb20: 45 52 52 4f 52 29 20 7b 0a 09 20 20 20 20 54 63  ERROR) {..    Tc
eb30: 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72  lWinConvertError
eb40: 28 28 44 57 4f 52 44 29 20 57 53 41 47 65 74 4c  ((DWORD) WSAGetL
eb50: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 20 20  astError());..  
eb60: 20 20 63 6c 6f 73 65 73 6f 63 6b 65 74 28 73 6f    closesocket(so
eb70: 63 6b 29 3b 0a 09 20 20 20 20 63 6f 6e 74 69 6e  ck);..    contin
eb80: 75 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61  ue;..}...if (sta
eb90: 74 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tePtr == NULL) {
eba0: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
ebb0: 20 41 64 64 20 74 68 69 73 20 73 6f 63 6b 65 74   Add this socket
ebc0: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
ebd0: 69 73 74 20 6f 66 20 73 6f 63 6b 65 74 73 2e 0a  ist of sockets..
ebe0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 73  .     */...    s
ebf0: 74 61 74 65 50 74 72 20 3d 20 4e 65 77 53 6f 63  tatePtr = NewSoc
ec00: 6b 65 74 49 6e 66 6f 28 73 6f 63 6b 29 3b 0a 09  ketInfo(sock);..
ec10: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 41 64  } else {..    Ad
ec20: 64 53 6f 63 6b 65 74 49 6e 66 6f 46 64 28 73 74  dSocketInfoFd(st
ec30: 61 74 65 50 74 72 2c 20 73 6f 63 6b 29 3b 0a 09  atePtr, sock);..
ec40: 7d 0a 20 20 20 20 7d 0a 0a 20 20 65 72 72 6f 72  }.    }..  error
ec50: 3a 0a 20 20 20 20 69 66 20 28 61 64 64 72 6c 69  :.    if (addrli
ec60: 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66  st != NULL) {..f
ec70: 72 65 65 61 64 64 72 69 6e 66 6f 28 61 64 64 72  reeaddrinfo(addr
ec80: 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  list);.    }..  
ec90: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20 21    if (statePtr !
eca0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 68 72 65 61  = NULL) {..Threa
ecb0: 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74  dSpecificData *t
ecc0: 73 64 50 74 72 20 3d 20 28 54 68 72 65 61 64 53  sdPtr = (ThreadS
ecd0: 70 65 63 69 66 69 63 44 61 74 61 20 2a 29 54 63  pecificData *)Tc
ece0: 6c 54 68 72 65 61 64 44 61 74 61 4b 65 79 47 65  lThreadDataKeyGe
ecf0: 74 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 09 73  t(&dataKey);...s
ed00: 74 61 74 65 50 74 72 2d 3e 61 63 63 65 70 74 50  tatePtr->acceptP
ed10: 72 6f 63 20 3d 20 61 63 63 65 70 74 50 72 6f 63  roc = acceptProc
ed20: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 61 63 63  ;..statePtr->acc
ed30: 65 70 74 50 72 6f 63 44 61 74 61 20 3d 20 61 63  eptProcData = ac
ed40: 63 65 70 74 50 72 6f 63 44 61 74 61 3b 0a 09 73  ceptProcData;..s
ed50: 70 72 69 6e 74 66 28 63 68 61 6e 6e 65 6c 4e 61  printf(channelNa
ed60: 6d 65 2c 20 53 4f 43 4b 5f 54 45 4d 50 4c 41 54  me, SOCK_TEMPLAT
ed70: 45 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 09 73  E, statePtr);..s
ed80: 74 61 74 65 50 74 72 2d 3e 63 68 61 6e 6e 65 6c  tatePtr->channel
ed90: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61   = Tcl_CreateCha
eda0: 6e 6e 65 6c 28 26 74 63 70 43 68 61 6e 6e 65 6c  nnel(&tcpChannel
edb0: 54 79 70 65 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d  Type, channelNam
edc0: 65 2c 0a 09 09 73 74 61 74 65 50 74 72 2c 20 30  e,...statePtr, 0
edd0: 29 3b 0a 09 2f 2a 0a 09 20 2a 20 53 65 74 20 75  );../*.. * Set u
ede0: 70 20 74 68 65 20 73 65 6c 65 63 74 20 6d 61 73  p the select mas
edf0: 6b 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  k for connection
ee00: 20 72 65 71 75 65 73 74 20 65 76 65 6e 74 73 2e   request events.
ee10: 0a 09 20 2a 2f 0a 0a 09 73 74 61 74 65 50 74 72  .. */...statePtr
ee20: 2d 3e 73 65 6c 65 63 74 45 76 65 6e 74 73 20 3d  ->selectEvents =
ee30: 20 46 44 5f 41 43 43 45 50 54 3b 0a 0a 09 2f 2a   FD_ACCEPT;.../*
ee40: 0a 09 20 2a 20 52 65 67 69 73 74 65 72 20 66 6f  .. * Register fo
ee50: 72 20 69 6e 74 65 72 65 73 74 20 69 6e 20 65 76  r interest in ev
ee60: 65 6e 74 73 20 69 6e 20 74 68 65 20 73 65 6c 65  ents in the sele
ee70: 63 74 20 6d 61 73 6b 2e 20 4e 6f 74 65 20 74 68  ct mask. Note th
ee80: 61 74 20 74 68 69 73 0a 09 20 2a 20 61 75 74 6f  at this.. * auto
ee90: 6d 61 74 69 63 61 6c 6c 79 20 70 6c 61 63 65 73  matically places
eea0: 20 74 68 65 20 73 6f 63 6b 65 74 20 69 6e 74 6f   the socket into
eeb0: 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f   non-blocking mo
eec0: 64 65 2e 0a 09 20 2a 2f 0a 0a 09 69 6f 63 74 6c  de... */...ioctl
eed0: 73 6f 63 6b 65 74 28 73 6f 63 6b 2c 20 28 6c 6f  socket(sock, (lo
eee0: 6e 67 29 20 46 49 4f 4e 42 49 4f 2c 20 26 66 6c  ng) FIONBIO, &fl
eef0: 61 67 29 3b 0a 09 53 65 6e 64 53 65 6c 65 63 74  ag);..SendSelect
ef00: 4d 65 73 73 61 67 65 28 74 73 64 50 74 72 2c 20  Message(tsdPtr, 
ef10: 53 45 4c 45 43 54 2c 20 73 74 61 74 65 50 74 72  SELECT, statePtr
ef20: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 53 65 74 43  );..if (Tcl_SetC
ef30: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
ef40: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 63  erp, statePtr->c
ef50: 68 61 6e 6e 65 6c 2c 20 22 2d 65 6f 66 63 68 61  hannel, "-eofcha
ef60: 72 22 2c 20 22 22 29 0a 09 20 20 20 20 3d 3d 20  r", "")..    == 
ef70: 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 20 20  TCL_ERROR) {..  
ef80: 20 20 54 63 6c 5f 43 6c 6f 73 65 28 4e 55 4c 4c    Tcl_Close(NULL
ef90: 2c 20 73 74 61 74 65 50 74 72 2d 3e 63 68 61 6e  , statePtr->chan
efa0: 6e 65 6c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  nel);..    retur
efb0: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 72 65 74 75  n NULL;..}..retu
efc0: 72 6e 20 73 74 61 74 65 50 74 72 2d 3e 63 68 61  rn statePtr->cha
efd0: 6e 6e 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  nnel;.    }..   
efe0: 20 69 66 20 28 69 6e 74 65 72 70 20 21 3d 20 4e   if (interp != N
eff0: 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 54  ULL) {.        T
f000: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
f010: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50  interp, Tcl_ObjP
f020: 72 69 6e 74 66 28 0a 09 09 22 63 6f 75 6c 64 6e  rintf(..."couldn
f030: 27 74 20 6f 70 65 6e 20 73 6f 63 6b 65 74 3a 20  't open socket: 
f040: 25 73 22 2c 0a 09 09 28 65 72 72 6f 72 4d 73 67  %s",...(errorMsg
f050: 20 3f 20 65 72 72 6f 72 4d 73 67 20 3a 20 54 63   ? errorMsg : Tc
f060: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  l_PosixError(int
f070: 65 72 70 29 29 29 29 3b 0a 20 20 20 20 7d 0a 0a  erp))));.    }..
f080: 20 20 20 20 69 66 20 28 73 6f 63 6b 20 21 3d 20      if (sock != 
f090: 49 4e 56 41 4c 49 44 5f 53 4f 43 4b 45 54 29 20  INVALID_SOCKET) 
f0a0: 7b 0a 09 63 6c 6f 73 65 73 6f 63 6b 65 74 28 73  {..closesocket(s
f0b0: 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ock);.    }.    
f0c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0c  return NULL;.}..
f0d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
f0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
f120: 20 2a 20 54 63 70 41 63 63 65 70 74 20 2d 2d 0a   * TcpAccept --.
f130: 20 2a 09 41 63 63 65 70 74 20 61 20 54 43 50 20   *.Accept a TCP 
f140: 73 6f 63 6b 65 74 20 63 6f 6e 6e 65 63 74 69 6f  socket connectio
f150: 6e 2e 09 20 54 68 69 73 20 69 73 20 63 61 6c 6c  n.. This is call
f160: 65 64 20 62 79 20 74 68 65 20 65 76 65 6e 74 20  ed by the event 
f170: 6c 6f 6f 70 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  loop.. *. * Resu
f180: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  lts:. *.None.. *
f190: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
f1a0: 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 61 20 6e  :. *.Creates a n
f1b0: 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f  ew connection so
f1c0: 63 6b 65 74 2e 20 43 61 6c 6c 73 20 74 68 65 20  cket. Calls the 
f1d0: 72 65 67 69 73 74 65 72 65 64 20 63 61 6c 6c 62  registered callb
f1e0: 61 63 6b 20 66 6f 72 20 74 68 65 0a 20 2a 09 63  ack for the. *.c
f1f0: 6f 6e 6e 65 63 74 69 6f 6e 20 61 63 63 65 70 74  onnection accept
f200: 61 6e 63 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a  ance mechanism..
f210: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
f220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
f260: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 63 70  .static void.Tcp
f270: 41 63 63 65 70 74 28 0a 20 20 20 20 54 63 70 46  Accept(.    TcpF
f280: 64 4c 69 73 74 20 2a 66 64 73 2c 09 2f 2a 20 53  dList *fds,./* S
f290: 65 72 76 65 72 20 73 6f 63 6b 65 74 20 74 68 61  erver socket tha
f2a0: 74 20 61 63 63 65 70 74 65 64 20 6e 65 77 53 6f  t accepted newSo
f2b0: 63 6b 65 74 2e 20 2a 2f 0a 20 20 20 20 53 4f 43  cket. */.    SOC
f2c0: 4b 45 54 20 6e 65 77 53 6f 63 6b 65 74 2c 20 20  KET newSocket,  
f2d0: 20 2f 2a 20 4e 65 77 6c 79 20 61 63 63 65 70 74   /* Newly accept
f2e0: 65 64 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 20 20  ed socket. */.  
f2f0: 20 20 61 64 64 72 65 73 73 20 61 64 64 72 29 20    address addr) 
f300: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
f310: 20 6f 66 20 6e 65 77 20 73 6f 63 6b 65 74 2e 20   of new socket. 
f320: 2a 2f 0a 7b 0a 20 20 20 20 54 63 70 53 74 61 74  */.{.    TcpStat
f330: 65 20 2a 6e 65 77 49 6e 66 6f 50 74 72 3b 0a 20  e *newInfoPtr;. 
f340: 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74 61     TcpState *sta
f350: 74 65 50 74 72 20 3d 20 66 64 73 2d 3e 73 74 61  tePtr = fds->sta
f360: 74 65 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 6c  tePtr;.    int l
f370: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 64 64 72  en = sizeof(addr
f380: 29 3b 0a 20 20 20 20 63 68 61 72 20 63 68 61 6e  );.    char chan
f390: 6e 65 6c 4e 61 6d 65 5b 53 4f 43 4b 5f 43 48 41  nelName[SOCK_CHA
f3a0: 4e 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 63  N_LENGTH];.    c
f3b0: 68 61 72 20 68 6f 73 74 5b 4e 49 5f 4d 41 58 48  har host[NI_MAXH
f3c0: 4f 53 54 5d 2c 20 70 6f 72 74 5b 4e 49 5f 4d 41  OST], port[NI_MA
f3d0: 58 53 45 52 56 5d 3b 0a 20 20 20 20 54 68 72 65  XSERV];.    Thre
f3e0: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a  adSpecificData *
f3f0: 74 73 64 50 74 72 20 3d 20 28 54 68 72 65 61 64  tsdPtr = (Thread
f400: 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 29 54  SpecificData *)T
f410: 63 6c 54 68 72 65 61 64 44 61 74 61 4b 65 79 47  clThreadDataKeyG
f420: 65 74 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 20  et(&dataKey);.. 
f430: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 69 6e     /*.     * Win
f440: 2d 4e 54 20 68 61 73 20 61 20 6d 69 73 66 65 61  -NT has a misfea
f450: 74 75 72 65 20 74 68 61 74 20 73 6f 63 6b 65 74  ture that socket
f460: 73 20 61 72 65 20 69 6e 68 65 72 69 74 65 64 20  s are inherited 
f470: 69 6e 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73  in child process
f480: 65 73 0a 20 20 20 20 20 2a 20 62 79 20 64 65 66  es.     * by def
f490: 61 75 6c 74 2e 20 54 75 72 6e 20 6f 66 66 20 74  ault. Turn off t
f4a0: 68 65 20 69 6e 68 65 72 69 74 20 62 69 74 2e 0a  he inherit bit..
f4b0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 53 65 74       */..    Set
f4c0: 48 61 6e 64 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  HandleInformatio
f4d0: 6e 28 28 48 41 4e 44 4c 45 29 20 6e 65 77 53 6f  n((HANDLE) newSo
f4e0: 63 6b 65 74 2c 20 48 41 4e 44 4c 45 5f 46 4c 41  cket, HANDLE_FLA
f4f0: 47 5f 49 4e 48 45 52 49 54 2c 20 30 29 3b 0a 0a  G_INHERIT, 0);..
f500: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 64      /*.     * Ad
f510: 64 20 74 68 69 73 20 73 6f 63 6b 65 74 20 74 6f  d this socket to
f520: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
f530: 20 6f 66 20 73 6f 63 6b 65 74 73 2e 0a 20 20 20   of sockets..   
f540: 20 20 2a 2f 0a 0a 20 20 20 20 6e 65 77 49 6e 66    */..    newInf
f550: 6f 50 74 72 20 3d 20 4e 65 77 53 6f 63 6b 65 74  oPtr = NewSocket
f560: 49 6e 66 6f 28 6e 65 77 53 6f 63 6b 65 74 29 3b  Info(newSocket);
f570: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
f580: 53 65 6c 65 63 74 20 6f 6e 20 72 65 61 64 2f 77  Select on read/w
f590: 72 69 74 65 20 65 76 65 6e 74 73 20 61 6e 64 20  rite events and 
f5a0: 63 72 65 61 74 65 20 74 68 65 20 63 68 61 6e 6e  create the chann
f5b0: 65 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  el..     */..   
f5c0: 20 6e 65 77 49 6e 66 6f 50 74 72 2d 3e 73 65 6c   newInfoPtr->sel
f5d0: 65 63 74 45 76 65 6e 74 73 20 3d 20 28 46 44 5f  ectEvents = (FD_
f5e0: 52 45 41 44 20 7c 20 46 44 5f 57 52 49 54 45 20  READ | FD_WRITE 
f5f0: 7c 20 46 44 5f 43 4c 4f 53 45 29 3b 0a 20 20 20  | FD_CLOSE);.   
f600: 20 53 65 6e 64 53 65 6c 65 63 74 4d 65 73 73 61   SendSelectMessa
f610: 67 65 28 74 73 64 50 74 72 2c 20 53 45 4c 45 43  ge(tsdPtr, SELEC
f620: 54 2c 20 6e 65 77 49 6e 66 6f 50 74 72 29 3b 0a  T, newInfoPtr);.
f630: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 63 68 61  .    sprintf(cha
f640: 6e 6e 65 6c 4e 61 6d 65 2c 20 53 4f 43 4b 5f 54  nnelName, SOCK_T
f650: 45 4d 50 4c 41 54 45 2c 20 6e 65 77 49 6e 66 6f  EMPLATE, newInfo
f660: 50 74 72 29 3b 0a 20 20 20 20 6e 65 77 49 6e 66  Ptr);.    newInf
f670: 6f 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20  oPtr->channel = 
f680: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65  Tcl_CreateChanne
f690: 6c 28 26 74 63 70 43 68 61 6e 6e 65 6c 54 79 70  l(&tcpChannelTyp
f6a0: 65 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 0a  e, channelName,.
f6b0: 09 20 20 20 20 6e 65 77 49 6e 66 6f 50 74 72 2c  .    newInfoPtr,
f6c0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c   (TCL_READABLE |
f6d0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 29 3b   TCL_WRITABLE));
f6e0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 53 65 74  .    if (Tcl_Set
f6f0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 4e 55  ChannelOption(NU
f700: 4c 4c 2c 20 6e 65 77 49 6e 66 6f 50 74 72 2d 3e  LL, newInfoPtr->
f710: 63 68 61 6e 6e 65 6c 2c 20 22 2d 74 72 61 6e 73  channel, "-trans
f720: 6c 61 74 69 6f 6e 22 2c 0a 09 20 20 20 20 22 61  lation",..    "a
f730: 75 74 6f 20 63 72 6c 66 22 29 20 3d 3d 20 54 43  uto crlf") == TC
f740: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 54 63 6c 5f  L_ERROR) {..Tcl_
f750: 43 6c 6f 73 65 28 4e 55 4c 4c 2c 20 6e 65 77 49  Close(NULL, newI
f760: 6e 66 6f 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 29  nfoPtr->channel)
f770: 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  ;..return;.    }
f780: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 53 65 74  .    if (Tcl_Set
f790: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 4e 55  ChannelOption(NU
f7a0: 4c 4c 2c 20 6e 65 77 49 6e 66 6f 50 74 72 2d 3e  LL, newInfoPtr->
f7b0: 63 68 61 6e 6e 65 6c 2c 20 22 2d 65 6f 66 63 68  channel, "-eofch
f7c0: 61 72 22 2c 20 22 22 29 0a 09 20 20 20 20 3d 3d  ar", "")..    ==
f7d0: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 54   TCL_ERROR) {..T
f7e0: 63 6c 5f 43 6c 6f 73 65 28 4e 55 4c 4c 2c 20 6e  cl_Close(NULL, n
f7f0: 65 77 49 6e 66 6f 50 74 72 2d 3e 63 68 61 6e 6e  ewInfoPtr->chann
f800: 65 6c 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  el);..return;.  
f810: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
f820: 20 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 61 63   * Invoke the ac
f830: 63 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 66 75  cept callback fu
f840: 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a  nction..     */.
f850: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
f860: 72 2d 3e 61 63 63 65 70 74 50 72 6f 63 20 21 3d  r->acceptProc !=
f870: 20 4e 55 4c 4c 29 20 7b 0a 09 67 65 74 6e 61 6d   NULL) {..getnam
f880: 65 69 6e 66 6f 28 26 28 61 64 64 72 2e 73 61 29  einfo(&(addr.sa)
f890: 2c 20 6c 65 6e 2c 20 68 6f 73 74 2c 20 73 69 7a  , len, host, siz
f8a0: 65 6f 66 28 68 6f 73 74 29 2c 20 70 6f 72 74 2c  eof(host), port,
f8b0: 20 73 69 7a 65 6f 66 28 70 6f 72 74 29 2c 0a 20   sizeof(port),. 
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8d0: 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f 53     NI_NUMERICHOS
f8e0: 54 7c 4e 49 5f 4e 55 4d 45 52 49 43 53 45 52 56  T|NI_NUMERICSERV
f8f0: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 61 63  );..statePtr->ac
f900: 63 65 70 74 50 72 6f 63 28 73 74 61 74 65 50 74  ceptProc(statePt
f910: 72 2d 3e 61 63 63 65 70 74 50 72 6f 63 44 61 74  r->acceptProcDat
f920: 61 2c 20 6e 65 77 49 6e 66 6f 50 74 72 2d 3e 63  a, newInfoPtr->c
f930: 68 61 6e 6e 65 6c 2c 0a 09 09 09 20 20 20 20 68  hannel,....    h
f940: 6f 73 74 2c 20 61 74 6f 69 28 70 6f 72 74 29 29  ost, atoi(port))
f950: 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20  ;.    }.}.../*. 
f960: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
f970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e  -------. *. * In
f9b0: 69 74 53 6f 63 6b 65 74 73 20 2d 2d 0a 20 2a 0a  itSockets --. *.
f9c0: 20 2a 09 52 65 67 69 73 74 65 72 73 20 74 68 65   *.Registers the
f9d0: 20 65 76 65 6e 74 20 77 69 6e 64 6f 77 20 66 6f   event window fo
f9e0: 72 20 74 68 65 20 73 6f 63 6b 65 74 20 6e 6f 74  r the socket not
f9f0: 69 66 69 65 72 20 63 6f 64 65 2e 0a 20 2a 0a 20  ifier code.. *. 
fa00: 2a 09 41 73 73 75 6d 65 73 20 73 6f 63 6b 65 74  *.Assumes socket
fa10: 4d 75 74 65 78 20 69 73 20 68 65 6c 64 2e 0a 20  Mutex is held.. 
fa20: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
fa30: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  .None.. *. * Sid
fa40: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65  e effects:. *.Re
fa50: 67 69 73 74 65 72 20 61 20 6e 65 77 20 77 69 6e  gister a new win
fa60: 64 6f 77 20 63 6c 61 73 73 20 61 6e 64 20 63 72  dow class and cr
fa70: 65 61 74 65 73 20 61 0a 20 2a 09 77 69 6e 64 6f  eates a. *.windo
fa80: 77 20 66 6f 72 20 75 73 65 20 69 6e 20 61 73 79  w for use in asy
fa90: 6e 63 68 72 6f 6e 6f 75 73 20 73 6f 63 6b 65 74  nchronous socket
faa0: 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e 2e 0a 20   notification.. 
fab0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
fac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
faf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
fb00: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 69 74  static void.Init
fb10: 53 6f 63 6b 65 74 73 28 76 6f 69 64 29 0a 7b 0a  Sockets(void).{.
fb20: 20 20 20 20 44 57 4f 52 44 20 69 64 3b 0a 20 20      DWORD id;.  
fb30: 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69 63    ThreadSpecific
fb40: 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20 28  Data *tsdPtr = (
fb50: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
fb60: 74 61 20 2a 29 54 63 6c 54 68 72 65 61 64 44 61  ta *)TclThreadDa
fb70: 74 61 4b 65 79 47 65 74 28 26 64 61 74 61 4b 65  taKeyGet(&dataKe
fb80: 79 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 69 6e  y);..    if (!in
fb90: 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 69 6e  itialized) {..in
fba0: 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 09  itialized = 1;..
fbb0: 54 63 6c 43 72 65 61 74 65 4c 61 74 65 45 78 69  TclCreateLateExi
fbc0: 74 48 61 6e 64 6c 65 72 28 53 6f 63 6b 65 74 45  tHandler(SocketE
fbd0: 78 69 74 48 61 6e 64 6c 65 72 2c 20 4e 55 4c 4c  xitHandler, NULL
fbe0: 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 43 72 65 61  );.../*.. * Crea
fbf0: 74 65 20 74 68 65 20 61 73 79 6e 63 20 6e 6f 74  te the async not
fc00: 69 66 69 63 61 74 69 6f 6e 20 77 69 6e 64 6f 77  ification window
fc10: 20 77 69 74 68 20 61 20 6e 65 77 20 63 6c 61 73   with a new clas
fc20: 73 2e 20 57 65 20 6d 75 73 74 0a 09 20 2a 20 63  s. We must.. * c
fc30: 72 65 61 74 65 20 61 20 6e 65 77 20 63 6c 61 73  reate a new clas
fc40: 73 20 74 6f 20 61 76 6f 69 64 20 61 20 57 69 6e  s to avoid a Win
fc50: 64 6f 77 73 20 39 35 20 62 75 67 20 74 68 61 74  dows 95 bug that
fc60: 20 63 61 75 73 65 73 20 75 73 20 74 6f 20 67 65   causes us to ge
fc70: 74 0a 09 20 2a 20 74 68 65 20 77 72 6f 6e 67 20  t.. * the wrong 
fc80: 6d 65 73 73 61 67 65 20 6e 75 6d 62 65 72 20 66  message number f
fc90: 6f 72 20 73 6f 63 6b 65 74 20 65 76 65 6e 74 73  or socket events
fca0: 20 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20   if the message 
fcb0: 77 69 6e 64 6f 77 20 69 73 0a 09 20 2a 20 61 20  window is.. * a 
fcc0: 73 75 62 63 6c 61 73 73 20 6f 66 20 61 20 73 74  subclass of a st
fcd0: 61 74 69 63 20 63 6f 6e 74 72 6f 6c 2e 0a 09 20  atic control... 
fce0: 2a 2f 0a 0a 09 77 69 6e 64 6f 77 43 6c 61 73 73  */...windowClass
fcf0: 2e 73 74 79 6c 65 20 3d 20 30 3b 0a 09 77 69 6e  .style = 0;..win
fd00: 64 6f 77 43 6c 61 73 73 2e 63 62 43 6c 73 45 78  dowClass.cbClsEx
fd10: 74 72 61 20 3d 20 30 3b 0a 09 77 69 6e 64 6f 77  tra = 0;..window
fd20: 43 6c 61 73 73 2e 63 62 57 6e 64 45 78 74 72 61  Class.cbWndExtra
fd30: 20 3d 20 30 3b 0a 09 77 69 6e 64 6f 77 43 6c 61   = 0;..windowCla
fd40: 73 73 2e 68 49 6e 73 74 61 6e 63 65 20 3d 20 28  ss.hInstance = (
fd50: 48 49 4e 53 54 41 4e 43 45 29 54 63 6c 57 69 6e  HINSTANCE)TclWin
fd60: 47 65 74 54 63 6c 49 6e 73 74 61 6e 63 65 28 29  GetTclInstance()
fd70: 3b 0a 09 77 69 6e 64 6f 77 43 6c 61 73 73 2e 68  ;..windowClass.h
fd80: 62 72 42 61 63 6b 67 72 6f 75 6e 64 20 3d 20 4e  brBackground = N
fd90: 55 4c 4c 3b 0a 09 77 69 6e 64 6f 77 43 6c 61 73  ULL;..windowClas
fda0: 73 2e 6c 70 73 7a 4d 65 6e 75 4e 61 6d 65 20 3d  s.lpszMenuName =
fdb0: 20 4e 55 4c 4c 3b 0a 09 77 69 6e 64 6f 77 43 6c   NULL;..windowCl
fdc0: 61 73 73 2e 6c 70 73 7a 43 6c 61 73 73 4e 61 6d  ass.lpszClassNam
fdd0: 65 20 3d 20 63 6c 61 73 73 4e 61 6d 65 3b 0a 09  e = className;..
fde0: 77 69 6e 64 6f 77 43 6c 61 73 73 2e 6c 70 66 6e  windowClass.lpfn
fdf0: 57 6e 64 50 72 6f 63 20 3d 20 53 6f 63 6b 65 74  WndProc = Socket
fe00: 50 72 6f 63 3b 0a 09 77 69 6e 64 6f 77 43 6c 61  Proc;..windowCla
fe10: 73 73 2e 68 49 63 6f 6e 20 3d 20 4e 55 4c 4c 3b  ss.hIcon = NULL;
fe20: 0a 09 77 69 6e 64 6f 77 43 6c 61 73 73 2e 68 43  ..windowClass.hC
fe30: 75 72 73 6f 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  ursor = NULL;...
fe40: 69 66 20 28 21 52 65 67 69 73 74 65 72 43 6c 61  if (!RegisterCla
fe50: 73 73 57 28 26 77 69 6e 64 6f 77 43 6c 61 73 73  ssW(&windowClass
fe60: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 57 69 6e  )) {..    TclWin
fe70: 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74  ConvertError(Get
fe80: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 20  LastError());.. 
fe90: 20 20 20 67 6f 74 6f 20 69 6e 69 74 46 61 69 6c     goto initFail
fea0: 75 72 65 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ure;..}.    }.. 
feb0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65     /*.     * Che
fec0: 63 6b 20 66 6f 72 20 70 65 72 2d 74 68 72 65 61  ck for per-threa
fed0: 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  d initialization
fee0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
fef0: 66 20 28 74 73 64 50 74 72 20 21 3d 20 4e 55 4c  f (tsdPtr != NUL
ff00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
ff10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
ff20: 20 2a 20 4f 4b 2c 20 74 68 69 73 20 74 68 72 65   * OK, this thre
ff30: 61 64 20 68 61 73 20 6e 65 76 65 72 20 64 6f 6e  ad has never don
ff40: 65 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  e anything with 
ff50: 73 6f 63 6b 65 74 73 20 62 65 66 6f 72 65 2e 20  sockets before. 
ff60: 20 43 6f 6e 73 74 72 75 63 74 0a 20 20 20 20 20   Construct.     
ff70: 2a 20 61 20 77 6f 72 6b 65 72 20 74 68 72 65 61  * a worker threa
ff80: 64 20 74 6f 20 68 61 6e 64 6c 65 20 61 73 79 6e  d to handle asyn
ff90: 63 68 72 6f 6e 6f 75 73 20 65 76 65 6e 74 73 20  chronous events 
ffa0: 72 65 6c 61 74 65 64 20 74 6f 20 73 6f 63 6b 65  related to socke
ffb0: 74 73 0a 20 20 20 20 20 2a 20 61 73 73 69 67 6e  ts.     * assign
ffc0: 65 64 20 74 6f 20 5f 74 68 69 73 5f 20 74 68 72  ed to _this_ thr
ffd0: 65 61 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ead..     */..  
ffe0: 20 20 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54    tsdPtr = TCL_T
fff0: 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79  SD_INIT(&dataKey
10000 29 3b 0a 20 20 20 20 74 73 64 50 74 72 2d 3e 70  );.    tsdPtr->p
10010 65 6e 64 69 6e 67 54 63 70 53 74 61 74 65 20 3d  endingTcpState =
10020 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 73 64 50 74   NULL;.    tsdPt
10030 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 20 3d 20  r->socketList = 
10040 4e 55 4c 4c 3b 0a 20 20 20 20 74 73 64 50 74 72  NULL;.    tsdPtr
10050 2d 3e 68 77 6e 64 20 20 20 20 20 20 20 3d 20 4e  ->hwnd       = N
10060 55 4c 4c 3b 0a 20 20 20 20 74 73 64 50 74 72 2d  ULL;.    tsdPtr-
10070 3e 74 68 72 65 61 64 49 64 20 20 20 3d 20 54 63  >threadId   = Tc
10080 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72 65  l_GetCurrentThre
10090 61 64 28 29 3b 0a 20 20 20 20 74 73 64 50 74 72  ad();.    tsdPtr
100a0 2d 3e 72 65 61 64 79 45 76 65 6e 74 20 3d 20 43  ->readyEvent = C
100b0 72 65 61 74 65 45 76 65 6e 74 57 28 4e 55 4c 4c  reateEventW(NULL
100c0 2c 20 46 41 4c 53 45 2c 20 46 41 4c 53 45 2c 20  , FALSE, FALSE, 
100d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 74  NULL);.    if (t
100e0 73 64 50 74 72 2d 3e 72 65 61 64 79 45 76 65 6e  sdPtr->readyEven
100f0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 67 6f  t == NULL) {..go
10100 74 6f 20 69 6e 69 74 46 61 69 6c 75 72 65 3b 0a  to initFailure;.
10110 20 20 20 20 7d 0a 20 20 20 20 74 73 64 50 74 72      }.    tsdPtr
10120 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b  ->socketListLock
10130 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 57 28   = CreateEventW(
10140 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 54 52 55  NULL, FALSE, TRU
10150 45 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  E, NULL);.    if
10160 20 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74   (tsdPtr->socket
10170 4c 69 73 74 4c 6f 63 6b 20 3d 3d 20 4e 55 4c 4c  ListLock == NULL
10180 29 20 7b 0a 09 67 6f 74 6f 20 69 6e 69 74 46 61  ) {..goto initFa
10190 69 6c 75 72 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ilure;.    }.   
101a0 20 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 54   tsdPtr->socketT
101b0 68 72 65 61 64 20 3d 20 43 72 65 61 74 65 54 68  hread = CreateTh
101c0 72 65 61 64 28 4e 55 4c 4c 2c 20 32 35 36 2c 20  read(NULL, 256, 
101d0 53 6f 63 6b 65 74 54 68 72 65 61 64 2c 20 74 73  SocketThread, ts
101e0 64 50 74 72 2c 20 30 2c 0a 09 20 20 20 20 26 69  dPtr, 0,..    &i
101f0 64 29 3b 0a 20 20 20 20 69 66 20 28 74 73 64 50  d);.    if (tsdP
10200 74 72 2d 3e 73 6f 63 6b 65 74 54 68 72 65 61 64  tr->socketThread
10210 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 67 6f 74   == NULL) {..got
10220 6f 20 69 6e 69 74 46 61 69 6c 75 72 65 3b 0a 20  o initFailure;. 
10230 20 20 20 7d 0a 0a 20 20 20 20 53 65 74 54 68 72     }..    SetThr
10240 65 61 64 50 72 69 6f 72 69 74 79 28 74 73 64 50  eadPriority(tsdP
10250 74 72 2d 3e 73 6f 63 6b 65 74 54 68 72 65 61 64  tr->socketThread
10260 2c 20 54 48 52 45 41 44 5f 50 52 49 4f 52 49 54  , THREAD_PRIORIT
10270 59 5f 48 49 47 48 45 53 54 29 3b 0a 0a 20 20 20  Y_HIGHEST);..   
10280 20 2f 2a 0a 20 20 20 20 20 2a 20 57 61 69 74 20   /*.     * Wait 
10290 66 6f 72 20 74 68 65 20 74 68 72 65 61 64 20 74  for the thread t
102a0 6f 20 73 69 67 6e 61 6c 20 77 68 65 6e 20 74 68  o signal when th
102b0 65 20 77 69 6e 64 6f 77 20 68 61 73 20 62 65 65  e window has bee
102c0 6e 20 63 72 65 61 74 65 64 20 61 6e 64 20 69 66  n created and if
102d0 0a 20 20 20 20 20 2a 20 69 74 20 69 73 20 72 65  .     * it is re
102e0 61 64 79 20 74 6f 20 67 6f 2e 0a 20 20 20 20 20  ady to go..     
102f0 2a 2f 0a 0a 20 20 20 20 57 61 69 74 46 6f 72 53  */..    WaitForS
10300 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50  ingleObject(tsdP
10310 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 2c 20  tr->readyEvent, 
10320 49 4e 46 49 4e 49 54 45 29 3b 0a 0a 20 20 20 20  INFINITE);..    
10330 69 66 20 28 74 73 64 50 74 72 2d 3e 68 77 6e 64  if (tsdPtr->hwnd
10340 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 67 6f 74   == NULL) {..got
10350 6f 20 69 6e 69 74 46 61 69 6c 75 72 65 3b 09 2f  o initFailure;./
10360 2a 20 54 72 6f 75 62 6c 65 20 63 72 65 61 74 69  * Trouble creati
10370 6e 67 20 74 68 65 20 77 69 6e 64 6f 77 2e 20 2a  ng the window. *
10380 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  /.    }..    Tcl
10390 5f 43 72 65 61 74 65 45 76 65 6e 74 53 6f 75 72  _CreateEventSour
103a0 63 65 28 53 6f 63 6b 65 74 53 65 74 75 70 50 72  ce(SocketSetupPr
103b0 6f 63 2c 20 53 6f 63 6b 65 74 43 68 65 63 6b 50  oc, SocketCheckP
103c0 72 6f 63 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  roc, NULL);.    
103d0 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 69 74 46  return;..  initF
103e0 61 69 6c 75 72 65 3a 0a 20 20 20 20 54 63 6c 70  ailure:.    Tclp
103f0 46 69 6e 61 6c 69 7a 65 53 6f 63 6b 65 74 73 28  FinalizeSockets(
10400 29 3b 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a  );.    initializ
10410 65 64 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ed = -1;.    ret
10420 75 72 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  urn;.}.../*. *--
10430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10470 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 6f 63 6b 65  ----. *. * Socke
10480 74 73 45 6e 61 62 6c 65 64 20 2d 2d 0a 20 2a 0a  tsEnabled --. *.
10490 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20 74 68   *.Check that th
104a0 65 20 57 69 6e 53 6f 63 6b 20 77 61 73 20 73 75  e WinSock was su
104b0 63 63 65 73 73 66 75 6c 6c 79 20 69 6e 69 74 69  ccessfully initi
104c0 61 6c 69 7a 65 64 2e 0a 20 2a 0a 20 2a 20 57 61  alized.. *. * Wa
104d0 72 6e 69 6e 67 3a 0a 20 2a 09 54 68 69 73 20 63  rning:. *.This c
104e0 68 65 63 6b 20 77 61 73 20 75 73 65 66 75 6c 20  heck was useful 
104f0 69 6e 20 74 69 6d 65 73 20 6f 66 20 57 69 6e 64  in times of Wind
10500 6f 77 73 39 38 20 77 68 65 72 65 20 57 69 6e 53  ows98 where WinS
10510 6f 63 6b 20 6d 61 79 0a 20 2a 09 6e 6f 74 20 62  ock may. *.not b
10520 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69  e available. Thi
10530 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
10540 65 20 61 6e 79 20 6d 6f 72 65 2e 0a 20 2a 09 54  e any more.. *.T
10550 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
10560 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68   be removed with
10570 20 54 43 4c 20 39 2e 30 0a 20 2a 0a 20 2a 20 52   TCL 9.0. *. * R
10580 65 73 75 6c 74 73 3a 0a 20 2a 09 31 20 69 66 20  esults:. *.1 if 
10590 69 74 20 69 73 2e 0a 20 2a 0a 20 2a 20 53 69 64  it is.. *. * Sid
105a0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
105b0 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
105c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10600 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a   */..static int.
10610 53 6f 63 6b 65 74 73 45 6e 61 62 6c 65 64 28 76  SocketsEnabled(v
10620 6f 69 64 29 0a 7b 0a 20 20 20 20 69 6e 74 20 65  oid).{.    int e
10630 6e 61 62 6c 65 64 3b 0a 0a 20 20 20 20 54 63 6c  nabled;..    Tcl
10640 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 73 6f 63 6b  _MutexLock(&sock
10650 65 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 65 6e  etMutex);.    en
10660 61 62 6c 65 64 20 3d 20 28 69 6e 69 74 69 61 6c  abled = (initial
10670 69 7a 65 64 20 3d 3d 20 31 29 3b 0a 20 20 20 20  ized == 1);.    
10680 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28  Tcl_MutexUnlock(
10690 26 73 6f 63 6b 65 74 4d 75 74 65 78 29 3b 0a 20  &socketMutex);. 
106a0 20 20 20 72 65 74 75 72 6e 20 65 6e 61 62 6c 65     return enable
106b0 64 3b 0a 7d 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  d;.}..../*. *---
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10700 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 6f 63 6b 65 74  ---. *. * Socket
10710 45 78 69 74 48 61 6e 64 6c 65 72 20 2d 2d 0a 20  ExitHandler --. 
10720 2a 0a 20 2a 09 43 61 6c 6c 62 61 63 6b 20 69 6e  *. *.Callback in
10730 76 6f 6b 65 64 20 64 75 72 69 6e 67 20 65 78 69  voked during exi
10740 74 20 63 6c 65 61 6e 20 75 70 20 74 6f 20 64 65  t clean up to de
10750 6c 65 74 65 20 74 68 65 20 73 6f 63 6b 65 74 0a  lete the socket.
10760 20 2a 09 63 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e   *.communication
10770 20 77 69 6e 64 6f 77 2e 0a 20 2a 0a 20 2a 20 52   window.. *. * R
10780 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
10790 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
107a0 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
107b0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
107c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
10800 74 61 74 69 63 20 76 6f 69 64 0a 53 6f 63 6b 65  tatic void.Socke
10810 74 45 78 69 74 48 61 6e 64 6c 65 72 28 0a 20 20  tExitHandler(.  
10820 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
10830 74 61 29 09 09 2f 2a 20 4e 6f 74 20 75 73 65 64  ta)../* Not used
10840 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4d  . */.{.    Tcl_M
10850 75 74 65 78 4c 6f 63 6b 28 26 73 6f 63 6b 65 74  utexLock(&socket
10860 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 0a  Mutex);..    /*.
10870 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65       * Make sure
10880 20 74 68 65 20 73 6f 63 6b 65 74 20 65 76 65 6e   the socket even
10890 74 20 68 61 6e 64 6c 69 6e 67 20 77 69 6e 64 6f  t handling windo
108a0 77 20 69 73 20 63 6c 65 61 6e 65 64 2d 75 70 20  w is cleaned-up 
108b0 66 6f 72 2c 20 61 74 0a 20 20 20 20 20 2a 20 6d  for, at.     * m
108c0 6f 73 74 2c 20 74 68 69 73 20 74 68 72 65 61 64  ost, this thread
108d0 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54  ..     */..    T
108e0 63 6c 70 46 69 6e 61 6c 69 7a 65 53 6f 63 6b 65  clpFinalizeSocke
108f0 74 73 28 29 3b 0a 20 20 20 20 55 6e 72 65 67 69  ts();.    Unregi
10900 73 74 65 72 43 6c 61 73 73 57 28 63 6c 61 73 73  sterClassW(class
10910 4e 61 6d 65 2c 20 28 48 49 4e 53 54 41 4e 43 45  Name, (HINSTANCE
10920 29 54 63 6c 57 69 6e 47 65 74 54 63 6c 49 6e 73  )TclWinGetTclIns
10930 74 61 6e 63 65 28 29 29 3b 0a 20 20 20 20 69 6e  tance());.    in
10940 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20  itialized = 0;. 
10950 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f     Tcl_MutexUnlo
10960 63 6b 28 26 73 6f 63 6b 65 74 4d 75 74 65 78 29  ck(&socketMutex)
10970 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109c0 2d 0a 20 2a 0a 20 2a 20 53 6f 63 6b 65 74 53 65  -. *. * SocketSe
109d0 74 75 70 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  tupProc --. *. *
109e0 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69  .This function i
109f0 73 20 69 6e 76 6f 6b 65 64 20 62 65 66 6f 72 65  s invoked before
10a00 20 54 63 6c 5f 44 6f 4f 6e 65 45 76 65 6e 74 20   Tcl_DoOneEvent 
10a10 62 6c 6f 63 6b 73 20 77 61 69 74 69 6e 67 20 66  blocks waiting f
10a20 6f 72 20 61 6e 0a 20 2a 09 65 76 65 6e 74 2e 0a  or an. *.event..
10a30 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
10a40 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  *.None.. *. * Si
10a50 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41  de effects:. *.A
10a60 64 6a 75 73 74 73 20 74 68 65 20 62 6c 6f 63 6b  djusts the block
10a70 20 74 69 6d 65 20 69 66 20 6e 65 65 64 65 64 2e   time if needed.
10a80 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
10a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
10ad0 0a 0a 76 6f 69 64 0a 53 6f 63 6b 65 74 53 65 74  ..void.SocketSet
10ae0 75 70 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64  upProc(.    void
10af0 20 2a 64 61 74 61 2c 09 09 2f 2a 20 4e 6f 74 20   *data,../* Not 
10b00 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  used. */.    int
10b10 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 45 76 65   flags).../* Eve
10b20 6e 74 20 66 6c 61 67 73 20 61 73 20 70 61 73 73  nt flags as pass
10b30 65 64 20 74 6f 20 54 63 6c 5f 44 6f 4f 6e 65 45  ed to Tcl_DoOneE
10b40 76 65 6e 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54  vent. */.{.    T
10b50 63 70 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  cpState *statePt
10b60 72 3b 0a 20 20 20 20 54 63 6c 5f 54 69 6d 65 20  r;.    Tcl_Time 
10b70 62 6c 6f 63 6b 54 69 6d 65 20 3d 20 7b 20 30 2c  blockTime = { 0,
10b80 20 30 20 7d 3b 0a 20 20 20 20 54 68 72 65 61 64   0 };.    Thread
10b90 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74 73  SpecificData *ts
10ba0 64 50 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49  dPtr = TCL_TSD_I
10bb0 4e 49 54 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a  NIT(&dataKey);..
10bc0 20 20 20 20 69 66 20 28 21 47 4f 54 5f 42 49 54      if (!GOT_BIT
10bd0 53 28 66 6c 61 67 73 2c 20 54 43 4c 5f 46 49 4c  S(flags, TCL_FIL
10be0 45 5f 45 56 45 4e 54 53 29 29 20 7b 0a 09 72 65  E_EVENTS)) {..re
10bf0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
10c00 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b   /*.     * Check
10c10 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
10c20 20 69 73 20 61 20 72 65 61 64 79 20 73 6f 63 6b   is a ready sock
10c30 65 74 2e 09 20 49 66 20 73 6f 2c 20 70 6f 6c 6c  et.. If so, poll
10c40 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 57 61  ..     */.    Wa
10c50 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
10c60 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74  t(tsdPtr->socket
10c70 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e 49  ListLock, INFINI
10c80 54 45 29 3b 0a 20 20 20 20 66 6f 72 20 28 73 74  TE);.    for (st
10c90 61 74 65 50 74 72 20 3d 20 74 73 64 50 74 72 2d  atePtr = tsdPtr-
10ca0 3e 73 6f 63 6b 65 74 4c 69 73 74 3b 20 73 74 61  >socketList; sta
10cb0 74 65 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09  tePtr != NULL;..
10cc0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 73      statePtr = s
10cd0 74 61 74 65 50 74 72 2d 3e 6e 65 78 74 50 74 72  tatePtr->nextPtr
10ce0 29 20 7b 0a 09 69 66 20 28 47 4f 54 5f 42 49 54  ) {..if (GOT_BIT
10cf0 53 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64  S(statePtr->read
10d00 79 45 76 65 6e 74 73 2c 0a 09 09 73 74 61 74 65  yEvents,...state
10d10 50 74 72 2d 3e 77 61 74 63 68 45 76 65 6e 74 73  Ptr->watchEvents
10d20 20 7c 20 46 44 5f 43 4f 4e 4e 45 43 54 20 7c 20   | FD_CONNECT | 
10d30 46 44 5f 41 43 43 45 50 54 29 29 20 7b 0a 09 20  FD_ACCEPT)) {.. 
10d40 20 20 20 54 63 6c 5f 53 65 74 4d 61 78 42 6c 6f     Tcl_SetMaxBlo
10d50 63 6b 54 69 6d 65 28 26 62 6c 6f 63 6b 54 69 6d  ckTime(&blockTim
10d60 65 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  e);..    break;.
10d70 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 65 74  .}.    }.    Set
10d80 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e 73 6f  Event(tsdPtr->so
10d90 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a 7d  cketListLock);.}
10da0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
10df0 2a 0a 20 2a 20 53 6f 63 6b 65 74 43 68 65 63 6b  *. * SocketCheck
10e00 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
10e10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
10e20 61 6c 6c 65 64 20 62 79 20 54 63 6c 5f 44 6f 4f  alled by Tcl_DoO
10e30 6e 65 45 76 65 6e 74 20 74 6f 20 63 68 65 63 6b  neEvent to check
10e40 20 74 68 65 20 73 6f 63 6b 65 74 20 65 76 65 6e   the socket even
10e50 74 0a 20 2a 09 73 6f 75 72 63 65 20 66 6f 72 20  t. *.source for 
10e60 65 76 65 6e 74 73 2e 0a 20 2a 0a 20 2a 20 52 65  events.. *. * Re
10e70 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
10e80 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
10e90 74 73 3a 0a 20 2a 09 4d 61 79 20 71 75 65 75 65  ts:. *.May queue
10ea0 20 61 6e 20 65 76 65 6e 74 2e 0a 20 2a 0a 20 2a   an event.. *. *
10eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ef0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
10f00 69 63 20 76 6f 69 64 0a 53 6f 63 6b 65 74 43 68  ic void.SocketCh
10f10 65 63 6b 50 72 6f 63 28 0a 20 20 20 20 76 6f 69  eckProc(.    voi
10f20 64 20 2a 64 61 74 61 2c 09 09 2f 2a 20 4e 6f 74  d *data,../* Not
10f30 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e   used. */.    in
10f40 74 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 45 76  t flags).../* Ev
10f50 65 6e 74 20 66 6c 61 67 73 20 61 73 20 70 61 73  ent flags as pas
10f60 73 65 64 20 74 6f 20 54 63 6c 5f 44 6f 4f 6e 65  sed to Tcl_DoOne
10f70 45 76 65 6e 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20  Event. */.{.    
10f80 54 63 70 53 74 61 74 65 20 2a 73 74 61 74 65 50  TcpState *stateP
10f90 74 72 3b 0a 20 20 20 20 53 6f 63 6b 65 74 45 76  tr;.    SocketEv
10fa0 65 6e 74 20 2a 65 76 50 74 72 3b 0a 20 20 20 20  ent *evPtr;.    
10fb0 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
10fc0 74 61 20 2a 74 73 64 50 74 72 20 3d 20 54 43 4c  ta *tsdPtr = TCL
10fd0 5f 54 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b  _TSD_INIT(&dataK
10fe0 65 79 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 47  ey);..    if (!G
10ff0 4f 54 5f 42 49 54 53 28 66 6c 61 67 73 2c 20 54  OT_BITS(flags, T
11000 43 4c 5f 46 49 4c 45 5f 45 56 45 4e 54 53 29 29  CL_FILE_EVENTS))
11010 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20   {..return;.    
11020 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
11030 20 51 75 65 75 65 20 65 76 65 6e 74 73 20 66 6f   Queue events fo
11040 72 20 61 6e 79 20 72 65 61 64 79 20 73 6f 63 6b  r any ready sock
11050 65 74 73 20 74 68 61 74 20 64 6f 6e 27 74 20 61  ets that don't a
11060 6c 72 65 61 64 79 20 68 61 76 65 20 65 76 65 6e  lready have even
11070 74 73 0a 20 20 20 20 20 2a 20 71 75 65 75 65 64  ts.     * queued
11080 20 28 63 61 75 73 65 64 20 62 79 20 70 65 72 73   (caused by pers
11090 69 73 74 65 6e 74 20 73 74 61 74 65 73 20 74 68  istent states th
110a0 61 74 20 77 6f 6e 27 74 20 67 65 6e 65 72 61 74  at won't generat
110b0 65 20 57 69 6e 53 6f 63 6b 0a 20 20 20 20 20 2a  e WinSock.     *
110c0 20 65 76 65 6e 74 73 29 2e 0a 20 20 20 20 20 2a   events)..     *
110d0 2f 0a 0a 20 20 20 20 57 61 69 74 46 6f 72 53 69  /..    WaitForSi
110e0 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50 74  ngleObject(tsdPt
110f0 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63  r->socketListLoc
11100 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20  k, INFINITE);.  
11110 20 20 66 6f 72 20 28 73 74 61 74 65 50 74 72 20    for (statePtr 
11120 3d 20 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74  = tsdPtr->socket
11130 4c 69 73 74 3b 20 73 74 61 74 65 50 74 72 20 21  List; statePtr !
11140 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 73 74 61  = NULL;..    sta
11150 74 65 50 74 72 20 3d 20 73 74 61 74 65 50 74 72  tePtr = statePtr
11160 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 69 66  ->nextPtr) {..if
11170 20 28 47 4f 54 5f 42 49 54 53 28 73 74 61 74 65   (GOT_BITS(state
11180 50 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 73  Ptr->readyEvents
11190 2c 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 77 61  ,...statePtr->wa
111a0 74 63 68 45 76 65 6e 74 73 20 7c 20 46 44 5f 43  tchEvents | FD_C
111b0 4f 4e 4e 45 43 54 20 7c 20 46 44 5f 41 43 43 45  ONNECT | FD_ACCE
111c0 50 54 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT).            
111d0 20 20 20 20 26 26 20 21 47 4f 54 5f 42 49 54 53      && !GOT_BITS
111e0 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
111f0 2c 20 53 4f 43 4b 45 54 5f 50 45 4e 44 49 4e 47  , SOCKET_PENDING
11200 29 29 20 7b 0a 09 20 20 20 20 53 45 54 5f 42 49  )) {..    SET_BI
11210 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  TS(statePtr->fla
11220 67 73 2c 20 53 4f 43 4b 45 54 5f 50 45 4e 44 49  gs, SOCKET_PENDI
11230 4e 47 29 3b 0a 09 20 20 20 20 65 76 50 74 72 20  NG);..    evPtr 
11240 3d 20 28 53 6f 63 6b 65 74 45 76 65 6e 74 20 2a  = (SocketEvent *
11250 29 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  )ckalloc(sizeof(
11260 53 6f 63 6b 65 74 45 76 65 6e 74 29 29 3b 0a 09  SocketEvent));..
11270 20 20 20 20 65 76 50 74 72 2d 3e 68 65 61 64 65      evPtr->heade
11280 72 2e 70 72 6f 63 20 3d 20 53 6f 63 6b 65 74 45  r.proc = SocketE
11290 76 65 6e 74 50 72 6f 63 3b 0a 09 20 20 20 20 65  ventProc;..    e
112a0 76 50 74 72 2d 3e 73 6f 63 6b 65 74 20 3d 20 73  vPtr->socket = s
112b0 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73  tatePtr->sockets
112c0 2d 3e 66 64 3b 0a 09 20 20 20 20 54 63 6c 5f 51  ->fd;..    Tcl_Q
112d0 75 65 75 65 45 76 65 6e 74 28 28 54 63 6c 5f 45  ueueEvent((Tcl_E
112e0 76 65 6e 74 20 2a 29 20 65 76 50 74 72 2c 20 54  vent *) evPtr, T
112f0 43 4c 5f 51 55 45 55 45 5f 54 41 49 4c 29 3b 0a  CL_QUEUE_TAIL);.
11300 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 65 74  .}.    }.    Set
11310 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e 73 6f  Event(tsdPtr->so
11320 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a 7d  cketListLock);.}
11330 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
11340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
11380 2a 0a 20 2a 20 53 6f 63 6b 65 74 45 76 65 6e 74  *. * SocketEvent
11390 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
113a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
113b0 61 6c 6c 65 64 20 62 79 20 54 63 6c 5f 53 65 72  alled by Tcl_Ser
113c0 76 69 63 65 45 76 65 6e 74 20 77 68 65 6e 20 61  viceEvent when a
113d0 20 73 6f 63 6b 65 74 20 65 76 65 6e 74 0a 20 2a   socket event. *
113e0 09 72 65 61 63 68 65 73 20 74 68 65 20 66 72 6f  .reaches the fro
113f0 6e 74 20 6f 66 20 74 68 65 20 65 76 65 6e 74 20  nt of the event 
11400 71 75 65 75 65 2e 20 54 68 69 73 20 66 75 6e 63  queue. This func
11410 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
11420 62 6c 65 20 66 6f 72 0a 20 2a 09 6e 6f 74 69 66  ble for. *.notif
11430 79 69 6e 67 20 74 68 65 20 67 65 6e 65 72 69 63  ying the generic
11440 20 63 68 61 6e 6e 65 6c 20 63 6f 64 65 2e 0a 20   channel code.. 
11450 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
11460 09 52 65 74 75 72 6e 73 20 31 20 69 66 20 74 68  .Returns 1 if th
11470 65 20 65 76 65 6e 74 20 77 61 73 20 68 61 6e 64  e event was hand
11480 6c 65 64 2c 20 6d 65 61 6e 69 6e 67 20 69 74 20  led, meaning it 
11490 73 68 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65  should be remove
114a0 64 20 66 72 6f 6d 0a 20 2a 09 74 68 65 20 71 75  d from. *.the qu
114b0 65 75 65 2e 20 52 65 74 75 72 6e 73 20 30 20 69  eue. Returns 0 i
114c0 66 20 74 68 65 20 65 76 65 6e 74 20 77 61 73 20  f the event was 
114d0 6e 6f 74 20 68 61 6e 64 6c 65 64 2c 20 6d 65 61  not handled, mea
114e0 6e 69 6e 67 20 69 74 20 73 68 6f 75 6c 64 0a 20  ning it should. 
114f0 2a 09 73 74 61 79 20 6f 6e 20 74 68 65 20 71 75  *.stay on the qu
11500 65 75 65 2e 20 54 68 65 20 6f 6e 6c 79 20 74 69  eue. The only ti
11510 6d 65 20 74 68 65 20 65 76 65 6e 74 20 69 73 6e  me the event isn
11520 27 74 20 68 61 6e 64 6c 65 64 20 69 73 20 69 66  't handled is if
11530 20 74 68 65 0a 20 2a 09 54 43 4c 5f 46 49 4c 45   the. *.TCL_FILE
11540 5f 45 56 45 4e 54 53 20 66 6c 61 67 20 62 69 74  _EVENTS flag bit
11550 20 69 73 6e 27 74 20 73 65 74 2e 0a 20 2a 0a 20   isn't set.. *. 
11560 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
11570 20 2a 09 57 68 61 74 65 76 65 72 20 74 68 65 20   *.Whatever the 
11580 63 68 61 6e 6e 65 6c 20 63 61 6c 6c 62 61 63 6b  channel callback
11590 20 66 75 6e 63 74 69 6f 6e 73 20 64 6f 2e 0a 20   functions do.. 
115a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
115b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
115f0 73 74 61 74 69 63 20 69 6e 74 0a 53 6f 63 6b 65  static int.Socke
11600 74 45 76 65 6e 74 50 72 6f 63 28 0a 20 20 20 20  tEventProc(.    
11610 54 63 6c 5f 45 76 65 6e 74 20 2a 65 76 50 74 72  Tcl_Event *evPtr
11620 2c 09 09 2f 2a 20 45 76 65 6e 74 20 74 6f 20 73  ,../* Event to s
11630 65 72 76 69 63 65 2e 20 2a 2f 0a 20 20 20 20 69  ervice. */.    i
11640 6e 74 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 46  nt flags).../* F
11650 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61  lags that indica
11660 74 65 20 77 68 61 74 20 65 76 65 6e 74 73 20 74  te what events t
11670 6f 20 68 61 6e 64 6c 65 2c 0a 09 09 09 09 20 2a  o handle,..... *
11680 20 73 75 63 68 20 61 73 20 54 43 4c 5f 46 49 4c   such as TCL_FIL
11690 45 5f 45 56 45 4e 54 53 2e 20 2a 2f 0a 7b 0a 20  E_EVENTS. */.{. 
116a0 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74 61     TcpState *sta
116b0 74 65 50 74 72 3b 0a 20 20 20 20 53 6f 63 6b 65  tePtr;.    Socke
116c0 74 45 76 65 6e 74 20 2a 65 76 65 6e 74 50 74 72  tEvent *eventPtr
116d0 20 3d 20 28 53 6f 63 6b 65 74 45 76 65 6e 74 20   = (SocketEvent 
116e0 2a 29 20 65 76 50 74 72 3b 0a 20 20 20 20 69 6e  *) evPtr;.    in
116f0 74 20 6d 61 73 6b 20 3d 20 30 2c 20 65 76 65 6e  t mask = 0, even
11700 74 73 3b 0a 20 20 20 20 54 68 72 65 61 64 53 70  ts;.    ThreadSp
11710 65 63 69 66 69 63 44 61 74 61 20 2a 74 73 64 50  ecificData *tsdP
11720 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 4e 49  tr = TCL_TSD_INI
11730 54 28 26 64 61 74 61 4b 65 79 29 3b 0a 20 20 20  T(&dataKey);.   
11740 20 54 63 70 46 64 4c 69 73 74 20 2a 66 64 73 3b   TcpFdList *fds;
11750 0a 20 20 20 20 53 4f 43 4b 45 54 20 6e 65 77 53  .    SOCKET newS
11760 6f 63 6b 65 74 3b 0a 20 20 20 20 61 64 64 72 65  ocket;.    addre
11770 73 73 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74  ss addr;.    int
11780 20 6c 65 6e 3b 0a 0a 20 20 20 20 69 66 20 28 21   len;..    if (!
11790 47 4f 54 5f 42 49 54 53 28 66 6c 61 67 73 2c 20  GOT_BITS(flags, 
117a0 54 43 4c 5f 46 49 4c 45 5f 45 56 45 4e 54 53 29  TCL_FILE_EVENTS)
117b0 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  ) {..return 0;. 
117c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
117d0 20 20 2a 20 46 69 6e 64 20 74 68 65 20 73 70 65    * Find the spe
117e0 63 69 66 69 65 64 20 73 6f 63 6b 65 74 20 6f 6e  cified socket on
117f0 20 74 68 65 20 73 6f 63 6b 65 74 20 6c 69 73 74   the socket list
11800 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 57  ..     */..    W
11810 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
11820 63 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65  ct(tsdPtr->socke
11830 74 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e  tListLock, INFIN
11840 49 54 45 29 3b 0a 20 20 20 20 66 6f 72 20 28 73  ITE);.    for (s
11850 74 61 74 65 50 74 72 20 3d 20 74 73 64 50 74 72  tatePtr = tsdPtr
11860 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 3b 20 73 74  ->socketList; st
11870 61 74 65 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a  atePtr != NULL;.
11880 09 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
11890 73 74 61 74 65 50 74 72 2d 3e 6e 65 78 74 50 74  statePtr->nextPt
118a0 72 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50  r) {..if (stateP
118b0 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 20  tr->sockets->fd 
118c0 3d 3d 20 65 76 65 6e 74 50 74 72 2d 3e 73 6f 63  == eventPtr->soc
118d0 6b 65 74 29 20 7b 0a 09 20 20 20 20 62 72 65 61  ket) {..    brea
118e0 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  k;..}.    }..   
118f0 20 2f 2a 0a 20 20 20 20 20 2a 20 44 69 73 63 61   /*.     * Disca
11900 72 64 20 65 76 65 6e 74 73 20 74 68 61 74 20 68  rd events that h
11910 61 76 65 20 67 6f 6e 65 20 73 74 61 6c 65 2e 0a  ave gone stale..
11920 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
11930 28 21 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20  (!statePtr) {.  
11940 20 20 20 20 20 20 53 65 74 45 76 65 6e 74 28 74        SetEvent(t
11950 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73  sdPtr->socketLis
11960 74 4c 6f 63 6b 29 3b 0a 09 72 65 74 75 72 6e 20  tLock);..return 
11970 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
11980 0a 20 20 20 20 20 2a 20 43 6c 65 61 72 20 66 6c  .     * Clear fl
11990 61 67 20 74 68 61 74 20 28 74 68 69 73 29 20 65  ag that (this) e
119a0 76 65 6e 74 20 69 73 20 70 65 6e 64 69 6e 67 0a  vent is pending.
119b0 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 43 4c 45       */..    CLE
119c0 41 52 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  AR_BITS(statePtr
119d0 2d 3e 66 6c 61 67 73 2c 20 53 4f 43 4b 45 54 5f  ->flags, SOCKET_
119e0 50 45 4e 44 49 4e 47 29 3b 0a 0a 20 20 20 20 2f  PENDING);..    /
119f0 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 74 69 6e 75  *.     * Continu
11a00 65 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20  e async connect 
11a10 69 66 20 70 65 6e 64 69 6e 67 20 61 6e 64 20 72  if pending and r
11a20 65 61 64 79 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  eady.     */..  
11a30 20 20 69 66 20 28 47 4f 54 5f 42 49 54 53 28 73    if (GOT_BITS(s
11a40 74 61 74 65 50 74 72 2d 3e 72 65 61 64 79 45 76  tatePtr->readyEv
11a50 65 6e 74 73 2c 20 46 44 5f 43 4f 4e 4e 45 43 54  ents, FD_CONNECT
11a60 29 29 20 7b 0a 09 69 66 20 28 47 4f 54 5f 42 49  )) {..if (GOT_BI
11a70 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  TS(statePtr->fla
11a80 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 50 45  gs, TCP_ASYNC_PE
11a90 4e 44 49 4e 47 29 29 20 7b 0a 09 20 20 20 20 2f  NDING)) {..    /
11aa0 2a 0a 09 20 20 20 20 20 2a 20 44 6f 20 6f 6e 65  *..     * Do one
11ab0 20 73 74 65 70 20 61 6e 64 20 73 61 76 65 20 65   step and save e
11ac0 76 65 6e 74 75 61 6c 20 63 6f 6e 6e 65 63 74 20  ventual connect 
11ad0 65 72 72 6f 72 0a 09 20 20 20 20 20 2a 2f 0a 0a  error..     */..
11ae0 09 20 20 20 20 53 65 74 45 76 65 6e 74 28 74 73  .    SetEvent(ts
11af0 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74  dPtr->socketList
11b00 4c 6f 63 6b 29 3b 0a 09 20 20 20 20 57 61 69 74  Lock);..    Wait
11b10 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
11b20 50 74 72 2c 4e 55 4c 4c 29 3b 0a 09 7d 20 65 6c  Ptr,NULL);..} el
11b30 73 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  se {..    /*..  
11b40 20 20 20 2a 20 4e 6f 20 61 73 79 6e 63 20 63 6f     * No async co
11b50 6e 6e 65 63 74 20 72 65 65 6e 74 65 72 20 70 65  nnect reenter pe
11b60 6e 64 69 6e 67 2e 20 4a 75 73 74 20 63 6c 65 61  nding. Just clea
11b70 72 20 65 76 65 6e 74 2e 0a 09 20 20 20 20 20 2a  r event...     *
11b80 2f 0a 0a 09 20 20 20 20 43 4c 45 41 52 5f 42 49  /...    CLEAR_BI
11b90 54 53 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61  TS(statePtr->rea
11ba0 64 79 45 76 65 6e 74 73 2c 20 46 44 5f 43 4f 4e  dyEvents, FD_CON
11bb0 4e 45 43 54 29 3b 0a 09 20 20 20 20 53 65 74 45  NECT);..    SetE
11bc0 76 65 6e 74 28 74 73 64 50 74 72 2d 3e 73 6f 63  vent(tsdPtr->soc
11bd0 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a 09 7d  ketListLock);..}
11be0 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ..return 1;.    
11bf0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
11c00 20 48 61 6e 64 6c 65 20 63 6f 6e 6e 65 63 74 69   Handle connecti
11c10 6f 6e 20 72 65 71 75 65 73 74 73 20 64 69 72 65  on requests dire
11c20 63 74 6c 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  ctly..     */.. 
11c30 20 20 20 69 66 20 28 47 4f 54 5f 42 49 54 53 28     if (GOT_BITS(
11c40 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64 79 45  statePtr->readyE
11c50 76 65 6e 74 73 2c 20 46 44 5f 41 43 43 45 50 54  vents, FD_ACCEPT
11c60 29 29 20 7b 0a 09 66 6f 72 20 28 66 64 73 20 3d  )) {..for (fds =
11c70 20 73 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65   statePtr->socke
11c80 74 73 3b 20 66 64 73 20 21 3d 20 4e 55 4c 4c 3b  ts; fds != NULL;
11c90 20 66 64 73 20 3d 20 66 64 73 2d 3e 6e 65 78 74   fds = fds->next
11ca0 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  ) {..    /*..   
11cb0 20 20 2a 20 41 63 63 65 70 74 20 74 68 65 20 69    * Accept the i
11cc0 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69  ncoming connecti
11cd0 6f 6e 20 72 65 71 75 65 73 74 2e 0a 09 20 20 20  on request...   
11ce0 20 20 2a 2f 0a 0a 09 20 20 20 20 6c 65 6e 20 3d    */...    len =
11cf0 20 73 69 7a 65 6f 66 28 61 64 64 72 65 73 73 29   sizeof(address)
11d00 3b 0a 09 20 20 20 20 6e 65 77 53 6f 63 6b 65 74  ;..    newSocket
11d10 20 3d 20 61 63 63 65 70 74 28 66 64 73 2d 3e 66   = accept(fds->f
11d20 64 2c 20 26 28 61 64 64 72 2e 73 61 29 2c 20 26  d, &(addr.sa), &
11d30 6c 65 6e 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09  len);...    /*..
11d40 20 20 20 20 20 2a 20 4f 6e 20 54 63 6c 20 73 65       * On Tcl se
11d50 72 76 65 72 20 73 6f 63 6b 65 74 73 20 77 69 74  rver sockets wit
11d60 68 20 6d 75 6c 74 69 70 6c 65 20 4f 53 20 66 64  h multiple OS fd
11d70 73 20 77 65 20 6c 6f 6f 70 20 6f 76 65 72 20 74  s we loop over t
11d80 68 65 20 66 64 73 0a 09 20 20 20 20 20 2a 20 74  he fds..     * t
11d90 72 79 69 6e 67 20 61 6e 20 61 63 63 65 70 74 28  rying an accept(
11da0 29 20 6f 6e 20 65 61 63 68 2c 20 73 6f 20 77 65  ) on each, so we
11db0 20 65 78 70 65 63 74 20 49 4e 56 41 4c 49 44 5f   expect INVALID_
11dc0 53 4f 43 4b 45 54 2e 20 20 54 68 65 72 65 0a 09  SOCKET.  There..
11dd0 20 20 20 20 20 2a 20 61 72 65 20 61 6c 73 6f 20       * are also 
11de0 6f 74 68 65 72 20 6e 65 74 77 6f 72 6b 20 73 74  other network st
11df0 61 63 6b 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  ack conditions t
11e00 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74 20 69  hat can result i
11e10 6e 0a 09 20 20 20 20 20 2a 20 46 44 5f 41 43 43  n..     * FD_ACC
11e20 45 50 54 20 62 75 74 20 61 20 73 75 62 73 65 71  EPT but a subseq
11e30 75 65 6e 74 20 66 61 69 6c 75 72 65 20 6f 6e 20  uent failure on 
11e40 61 63 63 65 70 74 28 29 20 62 79 20 74 68 65 20  accept() by the 
11e50 74 69 6d 65 20 77 65 0a 09 20 20 20 20 20 2a 20  time we..     * 
11e60 67 65 74 20 61 72 6f 75 6e 64 20 74 6f 20 69 74  get around to it
11e70 2e 0a 09 20 20 20 20 20 2a 0a 09 20 20 20 20 20  ...     *..     
11e80 2a 20 41 63 63 65 73 73 20 74 6f 20 73 6f 63 6b  * Access to sock
11e90 65 74 73 20 28 61 63 63 65 70 74 45 76 65 6e 74  ets (acceptEvent
11ea0 43 6f 75 6e 74 2c 20 72 65 61 64 79 45 76 65 6e  Count, readyEven
11eb0 74 73 29 20 69 6e 20 73 6f 63 6b 65 74 4c 69 73  ts) in socketLis
11ec0 74 0a 09 20 20 20 20 20 2a 20 69 73 20 73 74 69  t..     * is sti
11ed0 6c 6c 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  ll protected by 
11ee0 74 68 65 20 6c 6f 63 6b 20 28 70 72 65 76 65 6e  the lock (preven
11ef0 74 73 20 72 65 69 6e 74 72 6f 64 75 63 74 69 6f  ts reintroductio
11f00 6e 20 6f 66 0a 09 20 20 20 20 20 2a 20 53 46 20  n of..     * SF 
11f10 54 63 6c 20 42 75 67 20 33 30 35 36 37 37 35 2e  Tcl Bug 3056775.
11f20 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
11f30 69 66 20 28 6e 65 77 53 6f 63 6b 65 74 20 3d 3d  if (newSocket ==
11f40 20 49 4e 56 41 4c 49 44 5f 53 4f 43 4b 45 54 29   INVALID_SOCKET)
11f50 20 7b 0a 09 09 2f 2a 20 69 6e 74 20 65 72 72 20   {.../* int err 
11f60 3d 20 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f  = WSAGetLastErro
11f70 72 28 29 3b 20 2a 2f 0a 09 09 63 6f 6e 74 69 6e  r(); */...contin
11f80 75 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  ue;..    }...   
11f90 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49 74 20 69   /*..     * It i
11fa0 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
11fb0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 46 44  more than one FD
11fc0 5f 41 43 43 45 50 54 20 68 61 73 20 62 65 65 6e  _ACCEPT has been
11fd0 20 73 65 6e 74 2c 20 73 6f 0a 09 20 20 20 20 20   sent, so..     
11fe0 2a 20 61 6e 20 65 78 74 72 61 20 63 6f 75 6e 74  * an extra count
11ff0 20 6d 75 73 74 20 62 65 20 6b 65 70 74 2e 20 44   must be kept. D
12000 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
12010 6e 74 2c 20 61 6e 64 20 72 65 73 65 74 20 74 68  nt, and reset th
12020 65 0a 09 20 20 20 20 20 2a 20 72 65 61 64 79 45  e..     * readyE
12030 76 65 6e 74 20 62 69 74 20 69 66 20 74 68 65 20  vent bit if the 
12040 63 6f 75 6e 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  count is no long
12050 65 72 20 3e 20 30 2e 0a 09 20 20 20 20 20 2a 2f  er > 0...     */
12060 0a 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  ...    statePtr-
12070 3e 61 63 63 65 70 74 45 76 65 6e 74 43 6f 75 6e  >acceptEventCoun
12080 74 2d 2d 3b 0a 0a 09 20 20 20 20 69 66 20 28 73  t--;...    if (s
12090 74 61 74 65 50 74 72 2d 3e 61 63 63 65 70 74 45  tatePtr->acceptE
120a0 76 65 6e 74 43 6f 75 6e 74 20 3c 3d 20 30 29 20  ventCount <= 0) 
120b0 7b 0a 09 09 43 4c 45 41 52 5f 42 49 54 53 28 73  {...CLEAR_BITS(s
120c0 74 61 74 65 50 74 72 2d 3e 72 65 61 64 79 45 76  tatePtr->readyEv
120d0 65 6e 74 73 2c 20 46 44 5f 41 43 43 45 50 54 29  ents, FD_ACCEPT)
120e0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 53  ;..    }...    S
120f0 65 74 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e  etEvent(tsdPtr->
12100 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b  socketListLock);
12110 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  ...    /*..     
12120 2a 20 43 61 75 74 69 6f 6e 3a 20 54 63 70 41 63  * Caution: TcpAc
12130 63 65 70 74 28 29 20 68 61 73 20 74 68 65 20 73  cept() has the s
12140 69 64 65 2d 65 66 66 65 63 74 20 6f 66 20 65 76  ide-effect of ev
12150 61 6c 75 61 74 69 6e 67 20 74 68 65 0a 09 20 20  aluating the..  
12160 20 20 20 2a 20 73 65 72 76 65 72 20 61 63 63 65     * server acce
12170 70 74 20 73 63 72 69 70 74 20 28 76 69 61 20 41  pt script (via A
12180 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 72 6f  cceptCallbackPro
12190 63 28 29 20 69 6e 20 74 63 6c 49 4f 43 6d 64 2e  c() in tclIOCmd.
121a0 63 29 2c 0a 09 20 20 20 20 20 2a 20 77 68 69 63  c),..     * whic
121b0 68 20 63 61 6e 20 63 6c 6f 73 65 20 74 68 65 20  h can close the 
121c0 73 65 72 76 65 72 20 73 6f 63 6b 65 74 20 61 6e  server socket an
121d0 64 20 69 6e 76 61 6c 69 64 61 74 65 20 73 74 61  d invalidate sta
121e0 74 65 50 74 72 20 61 6e 64 0a 09 20 20 20 20 20  tePtr and..     
121f0 2a 20 66 64 73 2e 20 49 66 20 54 63 70 41 63 63  * fds. If TcpAcc
12200 65 70 74 28 29 20 61 63 63 65 70 74 73 20 61 20  ept() accepts a 
12210 73 6f 63 6b 65 74 20 77 65 20 6d 75 73 74 20 72  socket we must r
12220 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
12230 79 0a 09 20 20 20 20 20 2a 20 61 6e 64 20 6c 65  y..     * and le
12240 74 20 53 6f 63 6b 65 74 43 68 65 63 6b 50 72 6f  t SocketCheckPro
12250 63 20 71 75 65 75 65 20 61 64 64 69 74 69 6f 6e  c queue addition
12260 61 6c 20 46 44 5f 41 43 43 45 50 54 20 65 76 65  al FD_ACCEPT eve
12270 6e 74 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  nts...     */...
12280 20 20 20 20 54 63 70 41 63 63 65 70 74 28 66 64      TcpAccept(fd
12290 73 2c 20 6e 65 77 53 6f 63 6b 65 74 2c 20 61 64  s, newSocket, ad
122a0 64 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  dr);..    return
122b0 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20   1;..}.../*.. * 
122c0 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 64 20  Loop terminated 
122d0 77 69 74 68 20 6e 6f 20 73 6f 63 6b 65 74 73 20  with no sockets 
122e0 61 63 63 65 70 74 65 64 3b 20 63 6c 65 61 72 20  accepted; clear 
122f0 74 68 65 20 72 65 61 64 79 20 6d 61 73 6b 20 73  the ready mask s
12300 6f 0a 09 20 2a 20 77 65 20 63 61 6e 20 64 65 74  o.. * we can det
12310 65 63 74 20 74 68 65 20 6e 65 78 74 20 63 6f 6e  ect the next con
12320 6e 65 63 74 69 6f 6e 20 72 65 71 75 65 73 74 2e  nection request.
12330 20 4e 6f 74 65 20 74 68 61 74 20 63 6f 6e 6e 65   Note that conne
12340 63 74 69 6f 6e 0a 09 20 2a 20 72 65 71 75 65 73  ction.. * reques
12350 74 73 20 61 72 65 20 6c 65 76 65 6c 20 74 72 69  ts are level tri
12360 67 67 65 72 65 64 2c 20 73 6f 20 69 66 20 74 68  ggered, so if th
12370 65 72 65 20 69 73 20 61 20 72 65 71 75 65 73 74  ere is a request
12380 20 61 6c 72 65 61 64 79 0a 09 20 2a 20 70 65 6e   already.. * pen
12390 64 69 6e 67 2c 20 61 20 6e 65 77 20 65 76 65 6e  ding, a new even
123a0 74 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  t will be genera
123b0 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 73 74 61 74  ted... */...stat
123c0 65 50 74 72 2d 3e 61 63 63 65 70 74 45 76 65 6e  ePtr->acceptEven
123d0 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 43 4c 45  tCount = 0;..CLE
123e0 41 52 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  AR_BITS(statePtr
123f0 2d 3e 72 65 61 64 79 45 76 65 6e 74 73 2c 20 46  ->readyEvents, F
12400 44 5f 41 43 43 45 50 54 29 3b 0a 0a 09 53 65 74  D_ACCEPT);...Set
12410 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e 73 6f  Event(tsdPtr->so
12420 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a 09  cketListLock);..
12430 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
12440 0a 20 20 20 20 53 65 74 45 76 65 6e 74 28 74 73  .    SetEvent(ts
12450 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74  dPtr->socketList
12460 4c 6f 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  Lock);..    /*. 
12470 20 20 20 20 2a 20 4d 61 73 6b 20 6f 66 66 20 75      * Mask off u
12480 6e 77 61 6e 74 65 64 20 65 76 65 6e 74 73 20 61  nwanted events a
12490 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20 72  nd compute the r
124a0 65 61 64 2f 77 72 69 74 65 20 6d 61 73 6b 20 73  ead/write mask s
124b0 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 2a 20  o we can.     * 
124c0 6e 6f 74 69 66 79 20 74 68 65 20 63 68 61 6e 6e  notify the chann
124d0 65 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  el..     */..   
124e0 20 65 76 65 6e 74 73 20 3d 20 73 74 61 74 65 50   events = stateP
124f0 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 73 20  tr->readyEvents 
12500 26 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63  & statePtr->watc
12510 68 45 76 65 6e 74 73 3b 0a 0a 20 20 20 20 69 66  hEvents;..    if
12520 20 28 47 4f 54 5f 42 49 54 53 28 65 76 65 6e 74   (GOT_BITS(event
12530 73 2c 20 46 44 5f 43 4c 4f 53 45 29 29 20 7b 0a  s, FD_CLOSE)) {.
12540 09 2f 2a 0a 09 20 2a 20 49 66 20 74 68 65 20 73  ./*.. * If the s
12550 6f 63 6b 65 74 20 77 61 73 20 63 6c 6f 73 65 64  ocket was closed
12560 20 61 6e 64 20 74 68 65 20 63 68 61 6e 6e 65 6c   and the channel
12570 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 65 72 65   is still intere
12580 73 74 65 64 20 69 6e 0a 09 20 2a 20 72 65 61 64  sted in.. * read
12590 20 65 76 65 6e 74 73 2c 20 74 68 65 6e 20 77 65   events, then we
125a0 20 6e 65 65 64 20 74 6f 20 65 6e 73 75 72 65 20   need to ensure 
125b0 74 68 61 74 20 77 65 20 6b 65 65 70 20 70 6f 6c  that we keep pol
125c0 6c 69 6e 67 20 66 6f 72 20 74 68 69 73 0a 09 20  ling for this.. 
125d0 2a 20 65 76 65 6e 74 20 75 6e 74 69 6c 20 73 6f  * event until so
125e0 6d 65 6f 6e 65 20 64 6f 65 73 20 73 6f 6d 65 74  meone does somet
125f0 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 63 68  hing with the ch
12600 61 6e 6e 65 6c 2e 20 4e 6f 74 65 20 74 68 61 74  annel. Note that
12610 20 77 65 0a 09 20 2a 20 64 6f 20 74 68 69 73 20   we.. * do this 
12620 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 54  before calling T
12630 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c  cl_NotifyChannel
12640 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76   so we don't hav
12650 65 20 74 6f 20 77 61 74 63 68 0a 09 20 2a 20 6f  e to watch.. * o
12660 75 74 20 66 6f 72 20 74 68 65 20 63 68 61 6e 6e  ut for the chann
12670 65 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  el being deleted
12680 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
12690 75 73 2e 20 54 68 69 73 20 6d 61 79 20 63 61 75  us. This may cau
126a0 73 65 0a 09 20 2a 20 61 20 72 65 64 75 6e 64 61  se.. * a redunda
126b0 6e 74 20 74 72 69 70 20 74 68 72 6f 75 67 68 20  nt trip through 
126c0 74 68 65 20 65 76 65 6e 74 20 6c 6f 6f 70 2c 20  the event loop, 
126d0 62 75 74 20 69 74 27 73 20 73 69 6d 70 6c 65 72  but it's simpler
126e0 20 74 68 61 6e 0a 09 20 2a 20 74 72 79 69 6e 67   than.. * trying
126f0 20 74 6f 20 64 6f 20 75 6e 77 69 6e 64 20 70 72   to do unwind pr
12700 6f 74 65 63 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a  otection... */..
12710 09 54 63 6c 5f 54 69 6d 65 20 62 6c 6f 63 6b 54  .Tcl_Time blockT
12720 69 6d 65 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a  ime = { 0, 0 };.
12730 0a 09 54 63 6c 5f 53 65 74 4d 61 78 42 6c 6f 63  ..Tcl_SetMaxBloc
12740 6b 54 69 6d 65 28 26 62 6c 6f 63 6b 54 69 6d 65  kTime(&blockTime
12750 29 3b 0a 09 53 45 54 5f 42 49 54 53 28 6d 61 73  );..SET_BITS(mas
12760 6b 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20  k, TCL_READABLE 
12770 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b  | TCL_WRITABLE);
12780 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
12790 47 4f 54 5f 42 49 54 53 28 65 76 65 6e 74 73 2c  GOT_BITS(events,
127a0 20 46 44 5f 52 45 41 44 29 29 20 7b 0a 09 2f 2a   FD_READ)) {../*
127b0 0a 09 20 2a 20 54 68 72 6f 77 20 74 68 65 20 72  .. * Throw the r
127c0 65 61 64 61 62 6c 65 20 65 76 65 6e 74 20 69 66  eadable event if
127d0 20 61 6e 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63   an async connec
127e0 74 20 66 61 69 6c 65 64 2e 0a 09 20 2a 2f 0a 0a  t failed... */..
127f0 09 69 66 20 28 47 4f 54 5f 42 49 54 53 28 73 74  .if (GOT_BITS(st
12800 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54  atePtr->flags, T
12810 43 50 5f 41 53 59 4e 43 5f 46 41 49 4c 45 44 29  CP_ASYNC_FAILED)
12820 29 20 7b 0a 09 20 20 20 20 53 45 54 5f 42 49 54  ) {..    SET_BIT
12830 53 28 6d 61 73 6b 2c 20 54 43 4c 5f 52 45 41 44  S(mask, TCL_READ
12840 41 42 4c 45 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  ABLE);..} else {
12850 0a 09 20 20 20 20 66 64 5f 73 65 74 20 72 65 61  ..    fd_set rea
12860 64 46 64 73 3b 0a 09 20 20 20 20 73 74 72 75 63  dFds;..    struc
12870 74 20 74 69 6d 65 76 61 6c 20 74 69 6d 65 6f 75  t timeval timeou
12880 74 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  t;...    /*..   
12890 20 20 2a 20 57 65 20 6d 75 73 74 20 63 68 65 63    * We must chec
128a0 6b 20 74 6f 20 73 65 65 20 69 66 20 64 61 74 61  k to see if data
128b0 20 69 73 20 72 65 61 6c 6c 79 20 61 76 61 69 6c   is really avail
128c0 61 62 6c 65 2c 20 73 69 6e 63 65 20 73 6f 6d 65  able, since some
128d0 6f 6e 65 0a 09 20 20 20 20 20 2a 20 63 6f 75 6c  one..     * coul
128e0 64 20 68 61 76 65 20 63 6f 6e 73 75 6d 65 64 20  d have consumed 
128f0 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
12900 6d 65 61 6e 74 69 6d 65 2e 20 54 75 72 6e 20 6f  meantime. Turn o
12910 66 66 20 61 73 79 6e 63 0a 09 20 20 20 20 20 2a  ff async..     *
12920 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 73 6f   notification so
12930 20 73 65 6c 65 63 74 20 77 69 6c 6c 20 77 6f 72   select will wor
12940 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 49 66 20  k correctly. If 
12950 74 68 65 20 73 6f 63 6b 65 74 20 69 73 0a 09 20  the socket is.. 
12960 20 20 20 20 2a 20 73 74 69 6c 6c 20 72 65 61 64      * still read
12970 61 62 6c 65 2c 20 6e 6f 74 69 66 79 20 74 68 65  able, notify the
12980 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 2c   channel driver,
12990 20 6f 74 68 65 72 77 69 73 65 20 72 65 73 65 74   otherwise reset
129a0 20 74 68 65 0a 09 20 20 20 20 20 2a 20 61 73 79   the..     * asy
129b0 6e 63 20 73 65 6c 65 63 74 20 68 61 6e 64 6c 65  nc select handle
129c0 72 20 61 6e 64 20 6b 65 65 70 20 77 61 69 74 69  r and keep waiti
129d0 6e 67 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  ng...     */... 
129e0 20 20 20 53 65 6e 64 53 65 6c 65 63 74 4d 65 73     SendSelectMes
129f0 73 61 67 65 28 74 73 64 50 74 72 2c 20 55 4e 53  sage(tsdPtr, UNS
12a00 45 4c 45 43 54 2c 20 73 74 61 74 65 50 74 72 29  ELECT, statePtr)
12a10 3b 0a 0a 09 20 20 20 20 46 44 5f 5a 45 52 4f 28  ;...    FD_ZERO(
12a20 26 72 65 61 64 46 64 73 29 3b 0a 09 20 20 20 20  &readFds);..    
12a30 46 44 5f 53 45 54 28 73 74 61 74 65 50 74 72 2d  FD_SET(statePtr-
12a40 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 2c 20 26 72  >sockets->fd, &r
12a50 65 61 64 46 64 73 29 3b 0a 09 20 20 20 20 74 69  eadFds);..    ti
12a60 6d 65 6f 75 74 2e 74 76 5f 75 73 65 63 20 3d 20  meout.tv_usec = 
12a70 30 3b 0a 09 20 20 20 20 74 69 6d 65 6f 75 74 2e  0;..    timeout.
12a80 74 76 5f 73 65 63 20 3d 20 30 3b 0a 0a 09 20 20  tv_sec = 0;...  
12a90 20 20 69 66 20 28 73 65 6c 65 63 74 28 30 2c 20    if (select(0, 
12aa0 26 72 65 61 64 46 64 73 2c 20 4e 55 4c 4c 2c 20  &readFds, NULL, 
12ab0 4e 55 4c 4c 2c 20 26 74 69 6d 65 6f 75 74 29 20  NULL, &timeout) 
12ac0 21 3d 20 30 29 20 7b 0a 09 09 53 45 54 5f 42 49  != 0) {...SET_BI
12ad0 54 53 28 6d 61 73 6b 2c 20 54 43 4c 5f 52 45 41  TS(mask, TCL_REA
12ae0 44 41 42 4c 45 29 3b 0a 09 20 20 20 20 7d 20 65  DABLE);..    } e
12af0 6c 73 65 20 7b 0a 09 09 43 4c 45 41 52 5f 42 49  lse {...CLEAR_BI
12b00 54 53 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61  TS(statePtr->rea
12b10 64 79 45 76 65 6e 74 73 2c 20 46 44 5f 52 45 41  dyEvents, FD_REA
12b20 44 29 3b 0a 09 09 53 65 6e 64 53 65 6c 65 63 74  D);...SendSelect
12b30 4d 65 73 73 61 67 65 28 74 73 64 50 74 72 2c 20  Message(tsdPtr, 
12b40 53 45 4c 45 43 54 2c 20 73 74 61 74 65 50 74 72  SELECT, statePtr
12b50 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  );..    }..}.   
12b60 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
12b70 2a 20 77 72 69 74 61 62 6c 65 20 65 76 65 6e 74  * writable event
12b80 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
12b90 20 28 47 4f 54 5f 42 49 54 53 28 65 76 65 6e 74   (GOT_BITS(event
12ba0 73 2c 20 46 44 5f 57 52 49 54 45 29 29 20 7b 0a  s, FD_WRITE)) {.
12bb0 09 53 45 54 5f 42 49 54 53 28 6d 61 73 6b 2c 20  .SET_BITS(mask, 
12bc0 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 20  TCL_WRITABLE);. 
12bd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
12be0 20 20 2a 20 43 61 6c 6c 20 72 65 67 69 73 74 65    * Call registe
12bf0 72 65 64 20 65 76 65 6e 74 20 70 72 6f 63 65 64  red event proced
12c00 75 72 65 73 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ures.     */..  
12c10 20 20 69 66 20 28 6d 61 73 6b 29 20 7b 0a 09 54    if (mask) {..T
12c20 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c  cl_NotifyChannel
12c30 28 73 74 61 74 65 50 74 72 2d 3e 63 68 61 6e 6e  (statePtr->chann
12c40 65 6c 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 7d  el, mask);.    }
12c50 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  .    return 1;.}
12c60 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
12c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
12cb0 2a 0a 20 2a 20 41 64 64 53 6f 63 6b 65 74 49 6e  *. * AddSocketIn
12cc0 66 6f 46 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  foFd --. *. *.Th
12cd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73  is function adds
12ce0 20 61 20 53 4f 43 4b 45 54 20 66 69 6c 65 20 64   a SOCKET file d
12cf0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
12d00 20 27 73 6f 63 6b 65 74 73 27 20 6c 69 6e 6b 65   'sockets' linke
12d10 64 0a 20 2a 09 6c 69 73 74 20 6f 66 20 61 20 54  d. *.list of a T
12d20 63 70 53 74 61 74 65 20 73 74 72 75 63 74 75 72  cpState structur
12d30 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  e.. *. * Results
12d40 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
12d50 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
12d60 2a 09 4e 6f 6e 65 2c 20 65 78 63 65 70 74 20 66  *.None, except f
12d70 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  or allocation of
12d80 20 6d 65 6d 6f 72 79 2e 0a 20 2a 0a 20 2a 2d 2d   memory.. *. *--
12d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12dd0 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
12de0 20 76 6f 69 64 0a 41 64 64 53 6f 63 6b 65 74 49   void.AddSocketI
12df0 6e 66 6f 46 64 28 0a 20 20 20 20 54 63 70 53 74  nfoFd(.    TcpSt
12e00 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 0a 20  ate *statePtr,. 
12e10 20 20 20 53 4f 43 4b 45 54 20 73 6f 63 6b 65 74     SOCKET socket
12e20 29 0a 7b 0a 20 20 20 20 54 63 70 46 64 4c 69 73  ).{.    TcpFdLis
12e30 74 20 2a 66 64 73 20 3d 20 73 74 61 74 65 50 74  t *fds = statePt
12e40 72 2d 3e 73 6f 63 6b 65 74 73 3b 0a 0a 20 20 20  r->sockets;..   
12e50 20 69 66 20 28 66 64 73 20 3d 3d 20 4e 55 4c 4c   if (fds == NULL
12e60 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 41 64 64 20  ) {../*.. * Add 
12e70 74 68 65 20 66 69 72 73 74 20 46 44 2e 0a 09 20  the first FD... 
12e80 2a 2f 0a 0a 09 73 74 61 74 65 50 74 72 2d 3e 73  */...statePtr->s
12e90 6f 63 6b 65 74 73 20 3d 20 28 54 63 70 46 64 4c  ockets = (TcpFdL
12ea0 69 73 74 20 2a 29 63 6b 61 6c 6c 6f 63 28 73 69  ist *)ckalloc(si
12eb0 7a 65 6f 66 28 54 63 70 46 64 4c 69 73 74 29 29  zeof(TcpFdList))
12ec0 3b 0a 09 66 64 73 20 3d 20 73 74 61 74 65 50 74  ;..fds = statePt
12ed0 72 2d 3e 73 6f 63 6b 65 74 73 3b 0a 20 20 20 20  r->sockets;.    
12ee0 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a  } else {../*.. *
12ef0 20 46 69 6e 64 20 65 6e 64 20 6f 66 20 6c 69 73   Find end of lis
12f00 74 20 61 6e 64 20 61 70 70 65 6e 64 20 46 44 2e  t and append FD.
12f10 0a 09 20 2a 2f 0a 0a 09 77 68 69 6c 65 20 28 66  .. */...while (f
12f20 64 73 2d 3e 6e 65 78 74 20 21 3d 20 4e 55 4c 4c  ds->next != NULL
12f30 29 20 7b 0a 09 20 20 20 20 66 64 73 20 3d 20 66  ) {..    fds = f
12f40 64 73 2d 3e 6e 65 78 74 3b 0a 09 7d 0a 0a 09 66  ds->next;..}...f
12f50 64 73 2d 3e 6e 65 78 74 20 3d 20 28 54 63 70 46  ds->next = (TcpF
12f60 64 4c 69 73 74 20 2a 29 63 6b 61 6c 6c 6f 63 28  dList *)ckalloc(
12f70 73 69 7a 65 6f 66 28 54 63 70 46 64 4c 69 73 74  sizeof(TcpFdList
12f80 29 29 3b 0a 09 66 64 73 20 3d 20 66 64 73 2d 3e  ));..fds = fds->
12f90 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
12fa0 20 2f 2a 0a 20 20 20 20 20 2a 20 50 6f 70 75 6c   /*.     * Popul
12fb0 61 74 65 20 6e 65 77 20 46 44 2e 0a 20 20 20 20  ate new FD..    
12fc0 20 2a 2f 0a 0a 20 20 20 20 66 64 73 2d 3e 66 64   */..    fds->fd
12fd0 20 3d 20 73 6f 63 6b 65 74 3b 0a 20 20 20 20 66   = socket;.    f
12fe0 64 73 2d 3e 73 74 61 74 65 50 74 72 20 3d 20 73  ds->statePtr = s
12ff0 74 61 74 65 50 74 72 3b 0a 20 20 20 20 66 64 73  tatePtr;.    fds
13000 2d 3e 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 7d  ->next = NULL;.}
13010 0a 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
13060 2a 0a 20 2a 20 4e 65 77 53 6f 63 6b 65 74 49 6e  *. * NewSocketIn
13070 66 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  fo --. *. *.This
13080 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
13090 74 65 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  tes and initiali
130a0 7a 65 73 20 61 20 6e 65 77 20 54 63 70 53 74 61  zes a new TcpSta
130b0 74 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 2a  te structure.. *
130c0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
130d0 52 65 74 75 72 6e 73 20 61 20 6e 65 77 6c 79 20  Returns a newly 
130e0 61 6c 6c 6f 63 61 74 65 64 20 54 63 70 53 74 61  allocated TcpSta
130f0 74 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  te.. *. * Side e
13100 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2c  ffects:. *.None,
13110 20 65 78 63 65 70 74 20 66 6f 72 20 61 6c 6c 6f   except for allo
13120 63 61 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79  cation of memory
13130 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13180 2f 0a 0a 73 74 61 74 69 63 20 54 63 70 53 74 61  /..static TcpSta
13190 74 65 20 2a 0a 4e 65 77 53 6f 63 6b 65 74 49 6e  te *.NewSocketIn
131a0 66 6f 28 53 4f 43 4b 45 54 20 73 6f 63 6b 65 74  fo(SOCKET socket
131b0 29 0a 7b 0a 20 20 20 20 54 63 70 53 74 61 74 65  ).{.    TcpState
131c0 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 54 63   *statePtr = (Tc
131d0 70 53 74 61 74 65 20 2a 29 63 6b 61 6c 6c 6f 63  pState *)ckalloc
131e0 28 73 69 7a 65 6f 66 28 54 63 70 53 74 61 74 65  (sizeof(TcpState
131f0 29 29 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  ));..    memset(
13200 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a  statePtr, 0, siz
13210 65 6f 66 28 54 63 70 53 74 61 74 65 29 29 3b 0a  eof(TcpState));.
13220 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54  .    /*.     * T
13230 49 50 20 23 32 31 38 2e 20 52 65 6d 6f 76 65 64  IP #218. Removed
13240 20 74 68 65 20 63 6f 64 65 20 69 6e 73 65 72 74   the code insert
13250 69 6e 67 20 74 68 65 20 6e 65 77 20 73 74 72 75  ing the new stru
13260 63 74 75 72 65 20 69 6e 74 6f 20 74 68 65 20 67  cture into the g
13270 6c 6f 62 61 6c 0a 20 20 20 20 20 2a 20 6c 69 73  lobal.     * lis
13280 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 68  t. This is now h
13290 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 20 74 68  andled in the th
132a0 72 65 61 64 20 61 63 74 69 6f 6e 20 63 61 6c 6c  read action call
132b0 62 61 63 6b 73 2c 20 61 6e 64 20 6f 6e 6c 79 0a  backs, and only.
132c0 20 20 20 20 20 2a 20 74 68 65 72 65 2e 0a 20 20       * there..  
132d0 20 20 20 2a 2f 0a 0a 20 20 20 20 41 64 64 53 6f     */..    AddSo
132e0 63 6b 65 74 49 6e 66 6f 46 64 28 73 74 61 74 65  cketInfoFd(state
132f0 50 74 72 2c 20 73 6f 63 6b 65 74 29 3b 0a 0a 20  Ptr, socket);.. 
13300 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 50     return stateP
13310 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  tr;.}.../*. *---
13320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13360 2d 2d 2d 0a 20 2a 0a 20 2a 20 57 61 69 74 46 6f  ---. *. * WaitFo
13370 72 53 6f 63 6b 65 74 45 76 65 6e 74 20 2d 2d 0a  rSocketEvent --.
13380 20 2a 0a 20 2a 09 57 61 69 74 73 20 75 6e 74 69   *. *.Waits unti
13390 6c 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  l one of the spe
133a0 63 69 66 69 65 64 20 65 76 65 6e 74 73 20 6f 63  cified events oc
133b0 63 75 72 73 20 6f 6e 20 61 20 73 6f 63 6b 65 74  curs on a socket
133c0 2e 0a 20 2a 09 46 6f 72 20 65 76 65 6e 74 20 46  .. *.For event F
133d0 44 5f 43 4f 4e 4e 45 43 54 20 75 73 65 20 57 61  D_CONNECT use Wa
133e0 69 74 46 6f 72 43 6f 6e 6e 65 63 74 2e 0a 20 2a  itForConnect.. *
133f0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
13400 52 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63  Returns 1 on suc
13410 63 65 73 73 20 6f 72 20 30 20 6f 6e 20 66 61 69  cess or 0 on fai
13420 6c 75 72 65 2c 20 77 69 74 68 20 61 6e 20 65 72  lure, with an er
13430 72 6f 72 20 63 6f 64 65 20 69 6e 0a 20 2a 09 65  ror code in. *.e
13440 72 72 6f 72 43 6f 64 65 50 74 72 2e 0a 20 2a 0a  rrorCodePtr.. *.
13450 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
13460 0a 20 2a 09 50 72 6f 63 65 73 73 65 73 20 73 6f  . *.Processes so
13470 63 6b 65 74 20 65 76 65 6e 74 73 20 6f 66 66 20  cket events off 
13480 74 68 65 20 73 79 73 74 65 6d 20 71 75 65 75 65  the system queue
13490 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
134a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
134e0 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 57 61  /..static int.Wa
134f0 69 74 46 6f 72 53 6f 63 6b 65 74 45 76 65 6e 74  itForSocketEvent
13500 28 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a  (.    TcpState *
13510 73 74 61 74 65 50 74 72 2c 09 2f 2a 20 49 6e 66  statePtr,./* Inf
13520 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
13530 68 69 73 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 20  his socket. */. 
13540 20 20 20 69 6e 74 20 65 76 65 6e 74 73 2c 09 09     int events,..
13550 09 2f 2a 20 45 76 65 6e 74 73 20 74 6f 20 6c 6f  ./* Events to lo
13560 6f 6b 20 66 6f 72 2e 20 4d 61 79 20 62 65 20 6f  ok for. May be o
13570 6e 65 20 6f 66 0a 09 09 09 09 20 2a 20 46 44 5f  ne of..... * FD_
13580 52 45 41 44 20 6f 72 20 46 44 5f 57 52 49 54 45  READ or FD_WRITE
13590 2e 0a 09 09 09 09 20 2a 2f 0a 20 20 20 20 69 6e  ...... */.    in
135a0 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  t *errorCodePtr)
135b0 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74  ../* Where to st
135c0 6f 72 65 20 65 72 72 6f 72 73 3f 20 2a 2f 0a 7b  ore errors? */.{
135d0 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 20  .    int result 
135e0 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 6f 6c 64  = 1;.    int old
135f0 4d 6f 64 65 3b 0a 20 20 20 20 54 68 72 65 61 64  Mode;.    Thread
13600 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74 73  SpecificData *ts
13610 64 50 74 72 20 3d 20 28 54 68 72 65 61 64 53 70  dPtr = (ThreadSp
13620 65 63 69 66 69 63 44 61 74 61 20 2a 29 54 63 6c  ecificData *)Tcl
13630 54 68 72 65 61 64 44 61 74 61 4b 65 79 47 65 74  ThreadDataKeyGet
13640 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 20 20 20  (&dataKey);..   
13650 20 2f 2a 0a 20 20 20 20 20 2a 20 42 65 20 73 75   /*.     * Be su
13660 72 65 20 74 6f 20 64 69 73 61 62 6c 65 20 65 76  re to disable ev
13670 65 6e 74 20 73 65 72 76 69 63 69 6e 67 20 73 6f  ent servicing so
13680 20 77 65 20 61 72 65 20 74 72 75 6c 79 20 6d 6f   we are truly mo
13690 64 61 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  dal..     */..  
136a0 20 20 6f 6c 64 4d 6f 64 65 20 3d 20 54 63 6c 5f    oldMode = Tcl_
136b0 53 65 74 53 65 72 76 69 63 65 4d 6f 64 65 28 54  SetServiceMode(T
136c0 43 4c 5f 53 45 52 56 49 43 45 5f 4e 4f 4e 45 29  CL_SERVICE_NONE)
136d0 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
136e0 20 52 65 73 65 74 20 57 53 41 41 73 79 6e 63 53   Reset WSAAsyncS
136f0 65 6c 65 63 74 20 73 6f 20 77 65 20 68 61 76 65  elect so we have
13700 20 61 20 66 72 65 73 68 20 73 65 74 20 6f 66 20   a fresh set of 
13710 65 76 65 6e 74 73 20 70 65 6e 64 69 6e 67 2e 0a  events pending..
13720 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 53 65 6e       */..    Sen
13730 64 53 65 6c 65 63 74 4d 65 73 73 61 67 65 28 74  dSelectMessage(t
13740 73 64 50 74 72 2c 20 55 4e 53 45 4c 45 43 54 2c  sdPtr, UNSELECT,
13750 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
13760 53 65 6e 64 53 65 6c 65 63 74 4d 65 73 73 61 67  SendSelectMessag
13770 65 28 74 73 64 50 74 72 2c 20 53 45 4c 45 43 54  e(tsdPtr, SELECT
13780 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  , statePtr);..  
13790 20 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 69    while (1) {..i
137a0 6e 74 20 65 76 65 6e 74 5f 66 6f 75 6e 64 3b 0a  nt event_found;.
137b0 0a 09 2f 2a 0a 09 20 2a 20 47 65 74 20 73 74 61  ../*.. * Get sta
137c0 74 65 50 74 72 20 6c 6f 63 6b 2e 0a 09 20 2a 2f  tePtr lock... */
137d0 0a 0a 09 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  ...WaitForSingle
137e0 4f 62 6a 65 63 74 28 74 73 64 50 74 72 2d 3e 73  Object(tsdPtr->s
137f0 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 2c 20 49  ocketListLock, I
13800 4e 46 49 4e 49 54 45 29 3b 0a 0a 09 2f 2a 0a 09  NFINITE);.../*..
13810 20 2a 20 43 68 65 63 6b 20 69 66 20 65 76 65 6e   * Check if even
13820 74 20 6f 63 63 75 72 65 64 2e 0a 09 20 2a 2f 0a  t occured... */.
13830 0a 09 65 76 65 6e 74 5f 66 6f 75 6e 64 20 3d 20  ..event_found = 
13840 47 4f 54 5f 42 49 54 53 28 73 74 61 74 65 50 74  GOT_BITS(statePt
13850 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 73 2c 20  r->readyEvents, 
13860 65 76 65 6e 74 73 29 3b 0a 0a 09 2f 2a 0a 09 20  events);.../*.. 
13870 2a 20 46 72 65 65 20 6c 69 73 74 20 6c 6f 63 6b  * Free list lock
13880 2e 0a 09 20 2a 2f 0a 0a 09 53 65 74 45 76 65 6e  ... */...SetEven
13890 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74  t(tsdPtr->socket
138a0 4c 69 73 74 4c 6f 63 6b 29 3b 0a 0a 09 2f 2a 0a  ListLock);.../*.
138b0 09 20 2a 20 45 78 69 74 20 6c 6f 6f 70 20 69 66  . * Exit loop if
138c0 20 65 76 65 6e 74 20 6f 63 63 75 72 65 64 2e 0a   event occured..
138d0 09 20 2a 2f 0a 0a 09 69 66 20 28 65 76 65 6e 74  . */...if (event
138e0 5f 66 6f 75 6e 64 29 20 7b 0a 09 20 20 20 20 62  _found) {..    b
138f0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  reak;..}.../*.. 
13900 2a 20 45 78 69 74 20 6c 6f 6f 70 20 69 66 20 65  * Exit loop if e
13910 76 65 6e 74 20 64 69 64 20 6e 6f 74 20 6f 63 63  vent did not occ
13920 75 72 20 62 75 74 20 74 68 69 73 20 69 73 20 61  ur but this is a
13930 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 63 68   non-blocking ch
13940 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 0a 09 69 66 20  annel.. */...if 
13950 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
13960 20 26 20 54 43 50 5f 4e 4f 4e 42 4c 4f 43 4b 49   & TCP_NONBLOCKI
13970 4e 47 29 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f  NG) {..    *erro
13980 72 43 6f 64 65 50 74 72 20 3d 20 45 57 4f 55 4c  rCodePtr = EWOUL
13990 44 42 4c 4f 43 4b 3b 0a 09 20 20 20 20 72 65 73  DBLOCK;..    res
139a0 75 6c 74 20 3d 20 30 3b 0a 09 20 20 20 20 62 72  ult = 0;..    br
139b0 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  eak;..}.../*.. *
139c0 20 57 61 69 74 20 75 6e 74 69 6c 20 73 6f 6d 65   Wait until some
139d0 74 68 69 6e 67 20 68 61 70 70 65 6e 73 2e 0a 09  thing happens...
139e0 20 2a 2f 0a 0a 09 57 61 69 74 46 6f 72 53 69 6e   */...WaitForSin
139f0 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50 74 72  gleObject(tsdPtr
13a00 2d 3e 72 65 61 64 79 45 76 65 6e 74 2c 20 49 4e  ->readyEvent, IN
13a10 46 49 4e 49 54 45 29 3b 0a 20 20 20 20 7d 0a 0a  FINITE);.    }..
13a20 20 20 20 20 28 76 6f 69 64 29 20 54 63 6c 5f 53      (void) Tcl_S
13a30 65 74 53 65 72 76 69 63 65 4d 6f 64 65 28 6f 6c  etServiceMode(ol
13a40 64 4d 6f 64 65 29 3b 0a 20 20 20 20 72 65 74 75  dMode);.    retu
13a50 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f  rn result;.}.../
13a60 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
13ab0 20 53 6f 63 6b 65 74 54 68 72 65 61 64 20 2d 2d   SocketThread --
13ac0 0a 20 2a 0a 20 2a 09 48 65 6c 70 65 72 20 74 68  . *. *.Helper th
13ad0 72 65 61 64 20 75 73 65 64 20 74 6f 20 6d 61 6e  read used to man
13ae0 61 67 65 20 74 68 65 20 73 6f 63 6b 65 74 20 65  age the socket e
13af0 76 65 6e 74 20 68 61 6e 64 6c 69 6e 67 20 77 69  vent handling wi
13b00 6e 64 6f 77 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  ndow.. *. * Resu
13b10 6c 74 73 3a 0a 20 2a 09 31 20 69 66 20 75 6e 61  lts:. *.1 if una
13b20 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 73 6f  ble to create so
13b30 63 6b 65 74 20 65 76 65 6e 74 20 77 69 6e 64 6f  cket event windo
13b40 77 2c 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  w, 0 otherwise..
13b50 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
13b60 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
13b70 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
13b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bb0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
13bc0 61 74 69 63 20 44 57 4f 52 44 20 57 49 4e 41 50  atic DWORD WINAP
13bd0 49 0a 53 6f 63 6b 65 74 54 68 72 65 61 64 28 0a  I.SocketThread(.
13be0 20 20 20 20 4c 50 56 4f 49 44 20 61 72 67 29 0a      LPVOID arg).
13bf0 7b 0a 20 20 20 20 4d 53 47 20 6d 73 67 3b 0a 20  {.    MSG msg;. 
13c00 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69     ThreadSpecifi
13c10 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20  cData *tsdPtr = 
13c20 28 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44  (ThreadSpecificD
13c30 61 74 61 20 2a 29 61 72 67 3b 0a 0a 20 20 20 20  ata *)arg;..    
13c40 2f 2a 0a 20 20 20 20 20 2a 20 43 72 65 61 74 65  /*.     * Create
13c50 20 61 20 64 75 6d 6d 79 20 77 69 6e 64 6f 77 20   a dummy window 
13c60 72 65 63 65 69 76 69 6e 67 20 73 6f 63 6b 65 74  receiving socket
13c70 20 65 76 65 6e 74 73 2e 0a 20 20 20 20 20 2a 2f   events..     */
13c80 0a 0a 20 20 20 20 74 73 64 50 74 72 2d 3e 68 77  ..    tsdPtr->hw
13c90 6e 64 20 3d 20 43 72 65 61 74 65 57 69 6e 64 6f  nd = CreateWindo
13ca0 77 57 28 63 6c 61 73 73 4e 61 6d 65 2c 20 63 6c  wW(className, cl
13cb0 61 73 73 4e 61 6d 65 2c 20 57 53 5f 54 49 4c 45  assName, WS_TILE
13cc0 44 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 09  D, 0, 0, 0, 0,..
13cd0 20 20 20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20      NULL, NULL, 
13ce0 77 69 6e 64 6f 77 43 6c 61 73 73 2e 68 49 6e 73  windowClass.hIns
13cf0 74 61 6e 63 65 2c 20 61 72 67 29 3b 0a 0a 20 20  tance, arg);..  
13d00 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 69 67 6e    /*.     * Sign
13d10 61 6c 69 7a 65 20 74 68 72 65 61 64 20 63 72 65  alize thread cre
13d20 61 74 6f 72 20 74 68 61 74 20 77 65 20 61 72 65  ator that we are
13d30 20 64 6f 6e 65 20 63 72 65 61 74 69 6e 67 20 74   done creating t
13d40 68 65 20 77 69 6e 64 6f 77 2e 0a 20 20 20 20 20  he window..     
13d50 2a 2f 0a 0a 20 20 20 20 53 65 74 45 76 65 6e 74  */..    SetEvent
13d60 28 74 73 64 50 74 72 2d 3e 72 65 61 64 79 45 76  (tsdPtr->readyEv
13d70 65 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ent);..    /*.  
13d80 20 20 20 2a 20 49 66 20 75 6e 61 62 6c 65 20 74     * If unable t
13d90 6f 20 63 72 65 61 74 65 20 74 68 65 20 77 69 6e  o create the win
13da0 64 6f 77 2c 20 65 78 69 74 20 74 68 69 73 20 74  dow, exit this t
13db0 68 72 65 61 64 20 69 6d 6d 65 64 69 61 74 65 6c  hread immediatel
13dc0 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  y..     */..    
13dd0 69 66 20 28 74 73 64 50 74 72 2d 3e 68 77 6e 64  if (tsdPtr->hwnd
13de0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
13df0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
13e00 20 20 2f 2a 0a 20 20 20 20 20 2a 20 50 72 6f 63    /*.     * Proc
13e10 65 73 73 20 61 6c 6c 20 6d 65 73 73 61 67 65 73  ess all messages
13e20 20 6f 6e 20 74 68 65 20 73 6f 63 6b 65 74 20 77   on the socket w
13e30 69 6e 64 6f 77 20 75 6e 74 69 6c 20 57 4d 5f 51  indow until WM_Q
13e40 55 49 54 2e 20 54 68 69 73 20 74 68 72 65 61 64  UIT. This thread
13e50 73 0a 20 20 20 20 20 2a 20 65 78 69 74 73 20 6f  s.     * exits o
13e60 6e 6c 79 20 77 68 65 6e 20 69 6e 73 74 72 75 63  nly when instruc
13e70 74 65 64 20 74 6f 20 64 6f 20 73 6f 20 62 79 20  ted to do so by 
13e80 74 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  the call to.    
13e90 20 2a 20 50 6f 73 74 4d 65 73 73 61 67 65 57 28   * PostMessageW(
13ea0 53 4f 43 4b 45 54 5f 54 45 52 4d 49 4e 41 54 45  SOCKET_TERMINATE
13eb0 29 20 69 6e 20 54 63 6c 70 46 69 6e 61 6c 69 7a  ) in TclpFinaliz
13ec0 65 53 6f 63 6b 65 74 73 28 29 2e 0a 20 20 20 20  eSockets()..    
13ed0 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 20 28   */..    while (
13ee0 47 65 74 4d 65 73 73 61 67 65 57 28 26 6d 73 67  GetMessageW(&msg
13ef0 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3e 20  , NULL, 0, 0) > 
13f00 30 29 20 7b 0a 09 44 69 73 70 61 74 63 68 4d 65  0) {..DispatchMe
13f10 73 73 61 67 65 57 28 26 6d 73 67 29 3b 0a 20 20  ssageW(&msg);.  
13f20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
13f30 20 2a 20 54 68 69 73 20 72 65 6c 65 61 73 65 73   * This releases
13f40 20 77 61 69 74 65 72 73 20 6f 6e 20 74 68 72 65   waiters on thre
13f50 61 64 20 65 78 69 74 20 69 6e 20 54 63 6c 70 46  ad exit in TclpF
13f60 69 6e 61 6c 69 7a 65 53 6f 63 6b 65 74 73 28 29  inalizeSockets()
13f70 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 53 65  .     */..    Se
13f80 74 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e 72  tEvent(tsdPtr->r
13f90 65 61 64 79 45 76 65 6e 74 29 3b 0a 0a 20 20 20  eadyEvent);..   
13fa0 20 72 65 74 75 72 6e 20 6d 73 67 2e 77 50 61 72   return msg.wPar
13fb0 61 6d 3b 0a 7d 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  am;.}..../*. *--
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14000 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 6f 63 6b 65  ----. *. * Socke
14010 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54  tProc --. *. *.T
14020 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14030 63 61 6c 6c 65 64 20 77 68 65 6e 20 57 53 41 41  called when WSAA
14040 73 79 6e 63 53 65 6c 65 63 74 20 68 61 73 20 62  syncSelect has b
14050 65 65 6e 20 75 73 65 64 20 74 6f 20 72 65 67 69  een used to regi
14060 73 74 65 72 0a 20 2a 09 69 6e 74 65 72 65 73 74  ster. *.interest
14070 20 69 6e 20 61 20 73 6f 63 6b 65 74 20 65 76 65   in a socket eve
14080 6e 74 2c 20 61 6e 64 20 74 68 65 20 65 76 65 6e  nt, and the even
14090 74 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  t has occurred..
140a0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
140b0 2a 09 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  *.0 on success..
140c0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
140d0 74 73 3a 0a 20 2a 09 54 68 65 20 66 6c 61 67 73  ts:. *.The flags
140e0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 73   for the given s
140f0 6f 63 6b 65 74 20 61 72 65 20 75 70 64 61 74 65  ocket are update
14100 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  d to reflect the
14110 20 65 76 65 6e 74 20 74 68 61 74 0a 20 2a 09 6f   event that. *.o
14120 63 63 75 72 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d  ccured.. *. *---
14130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14170 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
14180 4c 52 45 53 55 4c 54 20 43 41 4c 4c 42 41 43 4b  LRESULT CALLBACK
14190 0a 53 6f 63 6b 65 74 50 72 6f 63 28 0a 20 20 20  .SocketProc(.   
141a0 20 48 57 4e 44 20 68 77 6e 64 2c 0a 20 20 20 20   HWND hwnd,.    
141b0 55 49 4e 54 20 6d 65 73 73 61 67 65 2c 0a 20 20  UINT message,.  
141c0 20 20 57 50 41 52 41 4d 20 77 50 61 72 61 6d 2c    WPARAM wParam,
141d0 0a 20 20 20 20 4c 50 41 52 41 4d 20 6c 50 61 72  .    LPARAM lPar
141e0 61 6d 29 0a 7b 0a 20 20 20 20 69 6e 74 20 65 76  am).{.    int ev
141f0 65 6e 74 2c 20 65 72 72 6f 72 3b 0a 20 20 20 20  ent, error;.    
14200 53 4f 43 4b 45 54 20 73 6f 63 6b 65 74 3b 0a 20  SOCKET socket;. 
14210 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74 61     TcpState *sta
14220 74 65 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 69  tePtr;.    int i
14230 6e 66 6f 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 20  nfo_found = 0;. 
14240 20 20 20 54 63 70 46 64 4c 69 73 74 20 2a 66 64     TcpFdList *fd
14250 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 68  s = NULL;.    Th
14260 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
14270 20 2a 74 73 64 50 74 72 20 3d 20 28 54 68 72 65   *tsdPtr = (Thre
14280 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a  adSpecificData *
14290 29 0a 23 69 66 64 65 66 20 5f 57 49 4e 36 34 0a  ).#ifdef _WIN64.
142a0 09 20 20 20 20 47 65 74 57 69 6e 64 6f 77 4c 6f  .    GetWindowLo
142b0 6e 67 50 74 72 57 28 68 77 6e 64 2c 20 47 57 4c  ngPtrW(hwnd, GWL
142c0 50 5f 55 53 45 52 44 41 54 41 29 3b 0a 23 65 6c  P_USERDATA);.#el
142d0 73 65 0a 09 20 20 20 20 47 65 74 57 69 6e 64 6f  se..    GetWindo
142e0 77 4c 6f 6e 67 57 28 68 77 6e 64 2c 20 47 57 4c  wLongW(hwnd, GWL
142f0 5f 55 53 45 52 44 41 54 41 29 3b 0a 23 65 6e 64  _USERDATA);.#end
14300 69 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28  if..    switch (
14310 6d 65 73 73 61 67 65 29 20 7b 0a 20 20 20 20 64  message) {.    d
14320 65 66 61 75 6c 74 3a 0a 09 72 65 74 75 72 6e 20  efault:..return 
14330 44 65 66 57 69 6e 64 6f 77 50 72 6f 63 57 28 68  DefWindowProcW(h
14340 77 6e 64 2c 20 6d 65 73 73 61 67 65 2c 20 77 50  wnd, message, wP
14350 61 72 61 6d 2c 20 6c 50 61 72 61 6d 29 3b 0a 09  aram, lParam);..
14360 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
14370 20 57 4d 5f 43 52 45 41 54 45 3a 0a 09 2f 2a 0a   WM_CREATE:../*.
14380 09 20 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e  . * Store the in
14390 69 74 69 61 6c 20 74 73 64 50 74 72 2c 20 69 74  itial tsdPtr, it
143a0 27 73 20 66 72 6f 6d 20 61 20 64 69 66 66 65 72  's from a differ
143b0 65 6e 74 20 74 68 72 65 61 64 2c 20 73 6f 20 69  ent thread, so i
143c0 74 27 73 20 6e 6f 74 0a 09 20 2a 20 64 69 72 65  t's not.. * dire
143d0 63 74 6c 79 20 61 63 63 65 73 73 69 62 6c 65 2c  ctly accessible,
143e0 20 62 75 74 20 6e 65 65 64 65 64 2e 0a 09 20 2a   but needed... *
143f0 2f 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 36 34  /..#ifdef _WIN64
14400 0a 09 53 65 74 57 69 6e 64 6f 77 4c 6f 6e 67 50  ..SetWindowLongP
14410 74 72 57 28 68 77 6e 64 2c 20 47 57 4c 50 5f 55  trW(hwnd, GWLP_U
14420 53 45 52 44 41 54 41 2c 0a 09 09 28 4c 4f 4e 47  SERDATA,...(LONG
14430 5f 50 54 52 29 20 28 28 4c 50 43 52 45 41 54 45  _PTR) ((LPCREATE
14440 53 54 52 55 43 54 29 6c 50 61 72 61 6d 29 2d 3e  STRUCT)lParam)->
14450 6c 70 43 72 65 61 74 65 50 61 72 61 6d 73 29 3b  lpCreateParams);
14460 0a 23 65 6c 73 65 0a 09 53 65 74 57 69 6e 64 6f  .#else..SetWindo
14470 77 4c 6f 6e 67 57 28 68 77 6e 64 2c 20 47 57 4c  wLongW(hwnd, GWL
14480 5f 55 53 45 52 44 41 54 41 2c 0a 09 09 28 4c 4f  _USERDATA,...(LO
14490 4e 47 29 20 28 28 4c 50 43 52 45 41 54 45 53 54  NG) ((LPCREATEST
144a0 52 55 43 54 29 6c 50 61 72 61 6d 29 2d 3e 6c 70  RUCT)lParam)->lp
144b0 43 72 65 61 74 65 50 61 72 61 6d 73 29 3b 0a 23  CreateParams);.#
144c0 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 0a 20  endif..break;.. 
144d0 20 20 20 63 61 73 65 20 57 4d 5f 44 45 53 54 52     case WM_DESTR
144e0 4f 59 3a 0a 09 50 6f 73 74 51 75 69 74 4d 65 73  OY:..PostQuitMes
144f0 73 61 67 65 28 30 29 3b 0a 09 62 72 65 61 6b 3b  sage(0);..break;
14500 0a 0a 20 20 20 20 63 61 73 65 20 53 4f 43 4b 45  ..    case SOCKE
14510 54 5f 4d 45 53 53 41 47 45 3a 0a 09 65 76 65 6e  T_MESSAGE:..even
14520 74 20 3d 20 57 53 41 47 45 54 53 45 4c 45 43 54  t = WSAGETSELECT
14530 45 56 45 4e 54 28 6c 50 61 72 61 6d 29 3b 0a 09  EVENT(lParam);..
14540 65 72 72 6f 72 20 3d 20 57 53 41 47 45 54 53 45  error = WSAGETSE
14550 4c 45 43 54 45 52 52 4f 52 28 6c 50 61 72 61 6d  LECTERROR(lParam
14560 29 3b 0a 09 73 6f 63 6b 65 74 20 3d 20 28 53 4f  );..socket = (SO
14570 43 4b 45 54 29 20 77 50 61 72 61 6d 3b 0a 0a 09  CKET) wParam;...
14580 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
14590 65 63 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b  ect(tsdPtr->sock
145a0 65 74 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e 46 49  etListLock, INFI
145b0 4e 49 54 45 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20  NITE);.../*.. * 
145c0 46 69 6e 64 20 74 68 65 20 73 70 65 63 69 66 69  Find the specifi
145d0 65 64 20 73 6f 63 6b 65 74 20 6f 6e 20 74 68 65  ed socket on the
145e0 20 73 6f 63 6b 65 74 20 6c 69 73 74 20 61 6e 64   socket list and
145f0 20 75 70 64 61 74 65 20 69 74 73 0a 09 20 2a 20   update its.. * 
14600 65 76 65 6e 74 53 74 61 74 65 20 66 6c 61 67 2e  eventState flag.
14610 0a 09 20 2a 2f 0a 0a 09 66 6f 72 20 28 73 74 61  .. */...for (sta
14620 74 65 50 74 72 20 3d 20 74 73 64 50 74 72 2d 3e  tePtr = tsdPtr->
14630 73 6f 63 6b 65 74 4c 69 73 74 3b 20 73 74 61 74  socketList; stat
14640 65 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09  ePtr != NULL;...
14650 73 74 61 74 65 50 74 72 20 3d 20 73 74 61 74 65  statePtr = state
14660 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a  Ptr->nextPtr) {.
14670 09 20 20 20 20 69 66 20 28 46 69 6e 64 46 44 49  .    if (FindFDI
14680 6e 4c 69 73 74 28 73 74 61 74 65 50 74 72 2c 20  nList(statePtr, 
14690 73 6f 63 6b 65 74 29 29 20 7b 0a 09 09 69 6e 66  socket)) {...inf
146a0 6f 5f 66 6f 75 6e 64 20 3d 20 31 3b 0a 09 09 62  o_found = 1;...b
146b0 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  reak;..    }..}.
146c0 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20 69  ../*.. * Check i
146d0 66 20 74 68 65 72 65 20 69 73 20 61 20 70 65 6e  f there is a pen
146e0 64 69 6e 67 20 69 6e 66 6f 20 73 74 72 75 63 74  ding info struct
146f0 75 72 65 20 6e 6f 74 20 6a 65 74 20 69 6e 20 74  ure not jet in t
14700 68 65 20 6c 69 73 74 2e 0a 09 20 2a 2f 0a 0a 09  he list... */...
14710 69 66 20 28 21 69 6e 66 6f 5f 66 6f 75 6e 64 0a  if (!info_found.
14720 09 09 26 26 20 74 73 64 50 74 72 2d 3e 70 65 6e  ..&& tsdPtr->pen
14730 64 69 6e 67 54 63 70 53 74 61 74 65 20 21 3d 20  dingTcpState != 
14740 4e 55 4c 4c 0a 09 09 26 26 20 46 69 6e 64 46 44  NULL...&& FindFD
14750 49 6e 4c 69 73 74 28 74 73 64 50 74 72 2d 3e 70  InList(tsdPtr->p
14760 65 6e 64 69 6e 67 54 63 70 53 74 61 74 65 2c 20  endingTcpState, 
14770 73 6f 63 6b 65 74 29 29 20 7b 0a 09 20 20 20 20  socket)) {..    
14780 73 74 61 74 65 50 74 72 20 3d 20 74 73 64 50 74  statePtr = tsdPt
14790 72 2d 3e 70 65 6e 64 69 6e 67 54 63 70 53 74 61  r->pendingTcpSta
147a0 74 65 3b 0a 09 20 20 20 20 69 6e 66 6f 5f 66 6f  te;..    info_fo
147b0 75 6e 64 20 3d 20 31 3b 0a 09 7d 0a 09 69 66 20  und = 1;..}..if 
147c0 28 69 6e 66 6f 5f 66 6f 75 6e 64 29 20 7b 0a 09  (info_found) {..
147d0 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 55      /*..     * U
147e0 70 64 61 74 65 20 74 68 65 20 73 6f 63 6b 65 74  pdate the socket
147f0 20 73 74 61 74 65 2e 0a 09 20 20 20 20 20 2a 0a   state...     *.
14800 09 20 20 20 20 20 2a 20 41 20 63 6f 75 6e 74 20  .     * A count 
14810 6f 66 20 46 44 5f 41 43 43 45 50 54 53 20 69 73  of FD_ACCEPTS is
14820 20 73 74 6f 72 65 64 2c 20 73 6f 20 69 66 20 61   stored, so if a
14830 6e 20 46 44 5f 43 4c 4f 53 45 20 65 76 65 6e 74  n FD_CLOSE event
14840 0a 09 20 20 20 20 20 2a 20 68 61 70 70 65 6e 73  ..     * happens
14850 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65  , then clear the
14860 20 46 44 5f 41 43 43 45 50 54 20 63 6f 75 6e 74   FD_ACCEPT count
14870 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 63  . Otherwise, inc
14880 72 65 6d 65 6e 74 0a 09 20 20 20 20 20 2a 20 74  rement..     * t
14890 68 65 20 63 6f 75 6e 74 20 69 66 20 74 68 65 20  he count if the 
148a0 63 75 72 72 65 6e 74 20 65 76 65 6e 74 20 69 73  current event is
148b0 20 61 6e 20 46 44 5f 41 43 43 45 50 54 2e 0a 09   an FD_ACCEPT...
148c0 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66       */...    if
148d0 20 28 47 4f 54 5f 42 49 54 53 28 65 76 65 6e 74   (GOT_BITS(event
148e0 2c 20 46 44 5f 43 4c 4f 53 45 29 29 20 7b 0a 09  , FD_CLOSE)) {..
148f0 09 73 74 61 74 65 50 74 72 2d 3e 61 63 63 65 70  .statePtr->accep
14900 74 45 76 65 6e 74 43 6f 75 6e 74 20 3d 20 30 3b  tEventCount = 0;
14910 0a 09 09 43 4c 45 41 52 5f 42 49 54 53 28 73 74  ...CLEAR_BITS(st
14920 61 74 65 50 74 72 2d 3e 72 65 61 64 79 45 76 65  atePtr->readyEve
14930 6e 74 73 2c 20 46 44 5f 57 52 49 54 45 20 7c 20  nts, FD_WRITE | 
14940 46 44 5f 41 43 43 45 50 54 29 3b 0a 09 20 20 20  FD_ACCEPT);..   
14950 20 7d 20 65 6c 73 65 20 69 66 20 28 47 4f 54 5f   } else if (GOT_
14960 42 49 54 53 28 65 76 65 6e 74 2c 20 46 44 5f 41  BITS(event, FD_A
14970 43 43 45 50 54 29 29 20 7b 0a 09 09 73 74 61 74  CCEPT)) {...stat
14980 65 50 74 72 2d 3e 61 63 63 65 70 74 45 76 65 6e  ePtr->acceptEven
14990 74 43 6f 75 6e 74 2b 2b 3b 0a 09 20 20 20 20 7d  tCount++;..    }
149a0 0a 0a 09 20 20 20 20 69 66 20 28 47 4f 54 5f 42  ...    if (GOT_B
149b0 49 54 53 28 65 76 65 6e 74 2c 20 46 44 5f 43 4f  ITS(event, FD_CO
149c0 4e 4e 45 43 54 29 29 20 7b 0a 09 09 2f 2a 0a 09  NNECT)) {.../*..
149d0 09 20 2a 20 52 65 6d 65 6d 62 65 72 20 61 6e 79  . * Remember any
149e0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
149f0 72 72 65 64 20 73 6f 20 77 65 20 63 61 6e 20 72  rred so we can r
14a00 65 70 6f 72 74 0a 09 09 20 2a 20 63 6f 6e 6e 65  eport... * conne
14a10 63 74 69 6f 6e 20 66 61 69 6c 75 72 65 73 2e 0a  ction failures..
14a20 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 65 72 72  .. */....if (err
14a30 6f 72 20 21 3d 20 45 52 52 4f 52 5f 53 55 43 43  or != ERROR_SUCC
14a40 45 53 53 29 20 7b 0a 09 09 20 20 20 20 73 74 61  ESS) {...    sta
14a50 74 65 50 74 72 2d 3e 6e 6f 74 69 66 69 65 72 43  tePtr->notifierC
14a60 6f 6e 6e 65 63 74 45 72 72 6f 72 20 3d 20 65 72  onnectError = er
14a70 72 6f 72 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  ror;...}..    }.
14a80 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
14a90 20 49 6e 66 6f 72 6d 20 6d 61 69 6e 20 74 68 72   Inform main thr
14aa0 65 61 64 20 61 62 6f 75 74 20 73 69 67 6e 61 6c  ead about signal
14ab0 65 64 20 65 76 65 6e 74 73 0a 09 20 20 20 20 20  ed events..     
14ac0 2a 2f 0a 0a 09 20 20 20 20 53 45 54 5f 42 49 54  */...    SET_BIT
14ad0 53 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64  S(statePtr->read
14ae0 79 45 76 65 6e 74 73 2c 20 65 76 65 6e 74 29 3b  yEvents, event);
14af0 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  ...    /*..     
14b00 2a 20 57 61 6b 65 20 75 70 20 74 68 65 20 4d 61  * Wake up the Ma
14b10 69 6e 20 54 68 72 65 61 64 2e 0a 09 20 20 20 20  in Thread...    
14b20 20 2a 2f 0a 0a 09 20 20 20 20 53 65 74 45 76 65   */...    SetEve
14b30 6e 74 28 74 73 64 50 74 72 2d 3e 72 65 61 64 79  nt(tsdPtr->ready
14b40 45 76 65 6e 74 29 3b 0a 09 20 20 20 20 54 63 6c  Event);..    Tcl
14b50 5f 54 68 72 65 61 64 41 6c 65 72 74 28 74 73 64  _ThreadAlert(tsd
14b60 50 74 72 2d 3e 74 68 72 65 61 64 49 64 29 3b 0a  Ptr->threadId);.
14b70 09 7d 0a 09 53 65 74 45 76 65 6e 74 28 74 73 64  .}..SetEvent(tsd
14b80 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c  Ptr->socketListL
14b90 6f 63 6b 29 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20  ock);..break;.. 
14ba0 20 20 20 63 61 73 65 20 53 4f 43 4b 45 54 5f 53     case SOCKET_S
14bb0 45 4c 45 43 54 3a 0a 09 73 74 61 74 65 50 74 72  ELECT:..statePtr
14bc0 20 3d 20 28 54 63 70 53 74 61 74 65 20 2a 29 20   = (TcpState *) 
14bd0 6c 50 61 72 61 6d 3b 0a 09 66 6f 72 20 28 66 64  lParam;..for (fd
14be0 73 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 6f  s = statePtr->so
14bf0 63 6b 65 74 73 3b 20 66 64 73 20 21 3d 20 4e 55  ckets; fds != NU
14c00 4c 4c 3b 20 66 64 73 20 3d 20 66 64 73 2d 3e 6e  LL; fds = fds->n
14c10 65 78 74 29 20 7b 0a 09 20 20 20 20 69 66 20 28  ext) {..    if (
14c20 77 50 61 72 61 6d 20 3d 3d 20 53 45 4c 45 43 54  wParam == SELECT
14c30 29 20 7b 0a 09 09 57 53 41 41 73 79 6e 63 53 65  ) {...WSAAsyncSe
14c40 6c 65 63 74 28 66 64 73 2d 3e 66 64 2c 20 68 77  lect(fds->fd, hw
14c50 6e 64 2c 0a 09 09 09 53 4f 43 4b 45 54 5f 4d 45  nd,....SOCKET_ME
14c60 53 53 41 47 45 2c 20 73 74 61 74 65 50 74 72 2d  SSAGE, statePtr-
14c70 3e 73 65 6c 65 63 74 45 76 65 6e 74 73 29 3b 0a  >selectEvents);.
14c80 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
14c90 2f 2a 0a 09 09 20 2a 20 43 6c 65 61 72 20 74 68  /*... * Clear th
14ca0 65 20 73 65 6c 65 63 74 69 6f 6e 20 6d 61 73 6b  e selection mask
14cb0 0a 09 09 20 2a 2f 0a 0a 09 09 57 53 41 41 73 79  ... */....WSAAsy
14cc0 6e 63 53 65 6c 65 63 74 28 66 64 73 2d 3e 66 64  ncSelect(fds->fd
14cd0 2c 20 68 77 6e 64 2c 20 30 2c 20 30 29 3b 0a 09  , hwnd, 0, 0);..
14ce0 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b      }..}..break;
14cf0 0a 0a 20 20 20 20 63 61 73 65 20 53 4f 43 4b 45  ..    case SOCKE
14d00 54 5f 54 45 52 4d 49 4e 41 54 45 3a 0a 09 44 65  T_TERMINATE:..De
14d10 73 74 72 6f 79 57 69 6e 64 6f 77 28 68 77 6e 64  stroyWindow(hwnd
14d20 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  );..break;.    }
14d30 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ..    return 0;.
14d40 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14d90 20 2a 0a 20 2a 20 46 69 6e 64 46 44 49 6e 4c 69   *. * FindFDInLi
14da0 73 74 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75  st --. *. *.Retu
14db0 72 6e 20 74 72 75 65 2c 20 69 66 20 74 68 65 20  rn true, if the 
14dc0 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
14dd0 69 70 74 69 6f 72 20 69 73 20 63 6f 6e 74 61 69  iptior is contai
14de0 6e 65 64 20 69 6e 20 74 68 65 0a 20 2a 09 66 69  ned in the. *.fi
14df0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 69  le descriptor li
14e00 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  st.. *. * Result
14e10 73 3a 0a 20 2a 09 74 72 75 65 20 69 66 20 66 6f  s:. *.true if fo
14e20 75 6e 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  und.. *. * Side 
14e30 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 2d 2d  effects:. *. *--
14e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e80 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
14e90 20 69 6e 74 0a 46 69 6e 64 46 44 49 6e 4c 69 73   int.FindFDInLis
14ea0 74 28 0a 20 20 20 20 54 63 70 53 74 61 74 65 20  t(.    TcpState 
14eb0 2a 73 74 61 74 65 50 74 72 2c 0a 20 20 20 20 53  *statePtr,.    S
14ec0 4f 43 4b 45 54 20 73 6f 63 6b 65 74 29 0a 7b 0a  OCKET socket).{.
14ed0 20 20 20 20 54 63 70 46 64 4c 69 73 74 20 2a 66      TcpFdList *f
14ee0 64 73 3b 0a 20 20 20 20 66 6f 72 20 28 66 64 73  ds;.    for (fds
14ef0 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 6f 63   = statePtr->soc
14f00 6b 65 74 73 3b 20 66 64 73 20 21 3d 20 4e 55 4c  kets; fds != NUL
14f10 4c 3b 20 66 64 73 20 3d 20 66 64 73 2d 3e 6e 65  L; fds = fds->ne
14f20 78 74 29 20 7b 0a 09 69 66 20 28 66 64 73 2d 3e  xt) {..if (fds->
14f30 66 64 20 3d 3d 20 73 6f 63 6b 65 74 29 20 7b 0a  fd == socket) {.
14f40 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09  .    return 1;..
14f50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
14f60 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rn 0;.}.../*. *-
14f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fb0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 57  -----. *. * TclW
14fc0 69 6e 47 65 74 53 6f 63 6b 4f 70 74 2c 20 65 74  inGetSockOpt, et
14fd0 20 61 6c 2e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68   al. --. *. *.Th
14fe0 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  ose functions ar
14ff0 65 20 68 69 73 74 6f 72 69 63 61 6c 6c 79 20 65  e historically e
15000 78 70 6f 72 74 65 64 20 62 79 20 74 68 65 20 73  xported by the s
15010 74 75 62 73 20 74 61 62 6c 65 20 61 6e 64 0a 20  tubs table and. 
15020 2a 09 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f  *.just use the o
15030 72 69 67 69 6e 61 6c 20 73 79 73 74 65 6d 20 63  riginal system c
15040 61 6c 6c 73 20 6e 6f 77 2e 0a 20 2a 0a 20 2a 20  alls now.. *. * 
15050 57 61 72 6e 69 6e 67 3a 0a 20 2a 09 54 68 6f 73  Warning:. *.Thos
15060 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  e functions are 
15070 64 65 70 72 65 63 69 61 74 65 64 20 61 6e 64 20  depreciated and 
15080 77 69 6c 6c 20 62 65 20 72 65 6d 6f 76 65 64 20  will be removed 
15090 77 69 74 68 20 54 43 4c 20 39 2e 30 2e 0a 20 2a  with TCL 9.0.. *
150a0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
150b0 41 73 20 64 65 66 69 6e 65 64 20 66 6f 72 20 65  As defined for e
150c0 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  ach function.. *
150d0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
150e0 3a 0a 20 2a 09 41 73 20 64 65 66 69 6e 65 64 20  :. *.As defined 
150f0 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74 69 6f  for each functio
15100 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  n.. *. *--------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
15150 2a 2f 0a 0a 23 75 6e 64 65 66 20 54 63 6c 57 69  */..#undef TclWi
15160 6e 47 65 74 53 6f 63 6b 4f 70 74 0a 69 6e 74 0a  nGetSockOpt.int.
15170 54 63 6c 57 69 6e 47 65 74 53 6f 63 6b 4f 70 74  TclWinGetSockOpt
15180 28 0a 20 20 20 20 53 4f 43 4b 45 54 20 73 2c 0a  (.    SOCKET s,.
15190 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 2c 0a 20      int level,. 
151a0 20 20 20 69 6e 74 20 6f 70 74 6e 61 6d 65 2c 0a     int optname,.
151b0 20 20 20 20 63 68 61 72 20 2a 6f 70 74 76 61 6c      char *optval
151c0 2c 0a 20 20 20 20 69 6e 74 20 2a 6f 70 74 6c 65  ,.    int *optle
151d0 6e 29 0a 7b 0a 0a 20 20 20 20 72 65 74 75 72 6e  n).{..    return
151e0 20 67 65 74 73 6f 63 6b 6f 70 74 28 73 2c 20 6c   getsockopt(s, l
151f0 65 76 65 6c 2c 20 6f 70 74 6e 61 6d 65 2c 20 6f  evel, optname, o
15200 70 74 76 61 6c 2c 20 6f 70 74 6c 65 6e 29 3b 0a  ptval, optlen);.
15210 7d 0a 23 75 6e 64 65 66 20 54 63 6c 57 69 6e 53  }.#undef TclWinS
15220 65 74 53 6f 63 6b 4f 70 74 0a 69 6e 74 0a 54 63  etSockOpt.int.Tc
15230 6c 57 69 6e 53 65 74 53 6f 63 6b 4f 70 74 28 0a  lWinSetSockOpt(.
15240 20 20 20 20 53 4f 43 4b 45 54 20 73 2c 0a 20 20      SOCKET s,.  
15250 20 20 69 6e 74 20 6c 65 76 65 6c 2c 0a 20 20 20    int level,.   
15260 20 69 6e 74 20 6f 70 74 6e 61 6d 65 2c 0a 20 20   int optname,.  
15270 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70    const char *op
15280 74 76 61 6c 2c 0a 20 20 20 20 69 6e 74 20 6f 70  tval,.    int op
15290 74 6c 65 6e 29 0a 7b 0a 20 20 20 20 72 65 74 75  tlen).{.    retu
152a0 72 6e 20 73 65 74 73 6f 63 6b 6f 70 74 28 73 2c  rn setsockopt(s,
152b0 20 6c 65 76 65 6c 2c 20 6f 70 74 6e 61 6d 65 2c   level, optname,
152c0 20 6f 70 74 76 61 6c 2c 20 6f 70 74 6c 65 6e 29   optval, optlen)
152d0 3b 0a 7d 0a 0a 23 75 6e 64 65 66 20 54 63 6c 70  ;.}..#undef Tclp
152e0 49 6e 65 74 4e 74 6f 61 0a 63 68 61 72 20 2a 0a  InetNtoa.char *.
152f0 54 63 6c 70 49 6e 65 74 4e 74 6f 61 28 0a 20 20  TclpInetNtoa(.  
15300 20 20 73 74 72 75 63 74 20 69 6e 5f 61 64 64 72    struct in_addr
15310 20 61 64 64 72 29 0a 7b 0a 20 20 20 20 72 65 74   addr).{.    ret
15320 75 72 6e 20 69 6e 65 74 5f 6e 74 6f 61 28 61 64  urn inet_ntoa(ad
15330 64 72 29 3b 0a 7d 0a 23 75 6e 64 65 66 20 54 63  dr);.}.#undef Tc
15340 6c 57 69 6e 47 65 74 53 65 72 76 42 79 4e 61 6d  lWinGetServByNam
15350 65 0a 73 74 72 75 63 74 20 73 65 72 76 65 6e 74  e.struct servent
15360 20 2a 0a 54 63 6c 57 69 6e 47 65 74 53 65 72 76   *.TclWinGetServ
15370 42 79 4e 61 6d 65 28 0a 20 20 20 20 63 6f 6e 73  ByName(.    cons
15380 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c 0a 20 20  t char *name,.  
15390 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72    const char *pr
153a0 6f 74 6f 29 0a 7b 0a 20 20 20 20 72 65 74 75 72  oto).{.    retur
153b0 6e 20 67 65 74 73 65 72 76 62 79 6e 61 6d 65 28  n getservbyname(
153c0 6e 61 6d 65 2c 20 70 72 6f 74 6f 29 3b 0a 7d 0a  name, proto);.}.
153d0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
15420 0a 20 2a 20 54 63 70 54 68 72 65 61 64 41 63 74  . * TcpThreadAct
15430 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  ionProc --. *. *
15440 09 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76  .Insert or remov
15450 65 20 61 6e 79 20 74 68 72 65 61 64 20 6c 6f 63  e any thread loc
15460 61 6c 20 72 65 66 73 20 74 6f 20 74 68 69 73 20  al refs to this 
15470 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52  channel.. *. * R
15480 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
15490 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
154a0 63 74 73 3a 0a 20 2a 09 43 68 61 6e 67 65 73 20  cts:. *.Changes 
154b0 74 68 72 65 61 64 20 6c 6f 63 61 6c 20 6c 69 73  thread local lis
154c0 74 20 6f 66 20 76 61 6c 69 64 20 63 68 61 6e 6e  t of valid chann
154d0 65 6c 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  els.. *. *------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15520 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  . */..static voi
15530 64 0a 54 63 70 54 68 72 65 61 64 41 63 74 69 6f  d.TcpThreadActio
15540 6e 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20  nProc(.    void 
15550 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20  *instanceData,. 
15560 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 29 0a 7b     int action).{
15570 0a 20 20 20 20 54 68 72 65 61 64 53 70 65 63 69  .    ThreadSpeci
15580 66 69 63 44 61 74 61 20 2a 74 73 64 50 74 72 3b  ficData *tsdPtr;
15590 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73  .    TcpState *s
155a0 74 61 74 65 50 74 72 20 3d 20 28 54 63 70 53 74  tatePtr = (TcpSt
155b0 61 74 65 20 2a 29 69 6e 73 74 61 6e 63 65 44 61  ate *)instanceDa
155c0 74 61 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 69  ta;.    int noti
155d0 66 79 43 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28  fyCmd;..    if (
155e0 61 63 74 69 6f 6e 20 3d 3d 20 54 43 4c 5f 43 48  action == TCL_CH
155f0 41 4e 4e 45 4c 5f 54 48 52 45 41 44 5f 49 4e 53  ANNEL_THREAD_INS
15600 45 52 54 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 45  ERT) {../*.. * E
15610 6e 73 75 72 65 20 74 68 61 74 20 73 6f 63 6b 65  nsure that socke
15620 74 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69  t subsystem is i
15630 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 74 68  nitialized in th
15640 69 73 20 74 68 72 65 61 64 2c 20 6f 72 20 65 6c  is thread, or el
15650 73 65 0a 09 20 2a 20 73 6f 63 6b 65 74 73 20 77  se.. * sockets w
15660 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 2e 0a 09 20  ill not work... 
15670 2a 2f 0a 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f  */...Tcl_MutexLo
15680 63 6b 28 26 73 6f 63 6b 65 74 4d 75 74 65 78 29  ck(&socketMutex)
15690 3b 0a 09 49 6e 69 74 53 6f 63 6b 65 74 73 28 29  ;..InitSockets()
156a0 3b 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  ;..Tcl_MutexUnlo
156b0 63 6b 28 26 73 6f 63 6b 65 74 4d 75 74 65 78 29  ck(&socketMutex)
156c0 3b 0a 0a 09 74 73 64 50 74 72 20 3d 20 54 43 4c  ;...tsdPtr = TCL
156d0 5f 54 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b  _TSD_INIT(&dataK
156e0 65 79 29 3b 0a 0a 09 57 61 69 74 46 6f 72 53 69  ey);...WaitForSi
156f0 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50 74  ngleObject(tsdPt
15700 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63  r->socketListLoc
15710 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 09 73  k, INFINITE);..s
15720 74 61 74 65 50 74 72 2d 3e 6e 65 78 74 50 74 72  tatePtr->nextPtr
15730 20 3d 20 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65   = tsdPtr->socke
15740 74 4c 69 73 74 3b 0a 09 74 73 64 50 74 72 2d 3e  tList;..tsdPtr->
15750 73 6f 63 6b 65 74 4c 69 73 74 20 3d 20 73 74 61  socketList = sta
15760 74 65 50 74 72 3b 0a 0a 09 69 66 20 28 73 74 61  tePtr;...if (sta
15770 74 65 50 74 72 20 3d 3d 20 74 73 64 50 74 72 2d  tePtr == tsdPtr-
15780 3e 70 65 6e 64 69 6e 67 54 63 70 53 74 61 74 65  >pendingTcpState
15790 29 20 7b 0a 09 20 20 20 20 74 73 64 50 74 72 2d  ) {..    tsdPtr-
157a0 3e 70 65 6e 64 69 6e 67 54 63 70 53 74 61 74 65  >pendingTcpState
157b0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 53 65   = NULL;..}...Se
157c0 74 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e 73  tEvent(tsdPtr->s
157d0 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a  ocketListLock);.
157e0 0a 09 6e 6f 74 69 66 79 43 6d 64 20 3d 20 53 45  ..notifyCmd = SE
157f0 4c 45 43 54 3b 0a 20 20 20 20 7d 20 65 6c 73 65  LECT;.    } else
15800 20 7b 0a 09 54 63 70 53 74 61 74 65 20 2a 2a 6e   {..TcpState **n
15810 65 78 74 50 74 72 50 74 72 3b 0a 09 69 6e 74 20  extPtrPtr;..int 
15820 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 09 74  removed = 0;...t
15830 73 64 50 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f  sdPtr = TCL_TSD_
15840 49 4e 49 54 28 26 64 61 74 61 4b 65 79 29 3b 0a  INIT(&dataKey);.
15850 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20 23 32 31  ../*.. * TIP #21
15860 38 2c 20 42 75 67 66 69 78 3a 20 41 6c 6c 20 61  8, Bugfix: All a
15870 63 63 65 73 73 20 74 6f 20 73 6f 63 6b 65 74 4c  ccess to socketL
15880 69 73 74 20 68 61 73 20 74 6f 20 62 65 20 70 72  ist has to be pr
15890 6f 74 65 63 74 65 64 20 62 79 0a 09 20 2a 20 74  otected by.. * t
158a0 68 65 20 6c 6f 63 6b 2e 0a 09 20 2a 2f 0a 0a 09  he lock... */...
158b0 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
158c0 65 63 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b  ect(tsdPtr->sock
158d0 65 74 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e 46 49  etListLock, INFI
158e0 4e 49 54 45 29 3b 0a 09 66 6f 72 20 28 6e 65 78  NITE);..for (nex
158f0 74 50 74 72 50 74 72 20 3d 20 26 28 74 73 64 50  tPtrPtr = &(tsdP
15900 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 29 3b  tr->socketList);
15910 20 28 2a 6e 65 78 74 50 74 72 50 74 72 29 20 21   (*nextPtrPtr) !
15920 3d 20 4e 55 4c 4c 3b 0a 09 09 6e 65 78 74 50 74  = NULL;...nextPt
15930 72 50 74 72 20 3d 20 26 28 28 2a 6e 65 78 74 50  rPtr = &((*nextP
15940 74 72 50 74 72 29 2d 3e 6e 65 78 74 50 74 72 29  trPtr)->nextPtr)
15950 29 20 7b 0a 09 20 20 20 20 69 66 20 28 28 2a 6e  ) {..    if ((*n
15960 65 78 74 50 74 72 50 74 72 29 20 3d 3d 20 73 74  extPtrPtr) == st
15970 61 74 65 50 74 72 29 20 7b 0a 09 09 28 2a 6e 65  atePtr) {...(*ne
15980 78 74 50 74 72 50 74 72 29 20 3d 20 73 74 61 74  xtPtrPtr) = stat
15990 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09  ePtr->nextPtr;..
159a0 09 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 09 09  .removed = 1;...
159b0 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 7d  break;..    }..}
159c0 0a 09 53 65 74 45 76 65 6e 74 28 74 73 64 50 74  ..SetEvent(tsdPt
159d0 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63  r->socketListLoc
159e0 6b 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 69  k);.../*.. * Thi
159f0 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 69  s could happen i
15a00 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 61  f the channel wa
15a10 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 6e 65  s created in one
15a20 20 74 68 72 65 61 64 20 61 6e 64 20 74 68 65 6e   thread and then
15a30 0a 09 20 2a 20 6d 6f 76 65 64 20 74 6f 20 61 6e  .. * moved to an
15a40 6f 74 68 65 72 20 77 69 74 68 6f 75 74 20 75 70  other without up
15a50 64 61 74 69 6e 67 20 74 68 65 20 74 68 72 65 61  dating the threa
15a60 64 20 6c 6f 63 61 6c 20 64 61 74 61 20 69 6e 20  d local data in 
15a70 65 61 63 68 0a 09 20 2a 20 74 68 72 65 61 64 2e  each.. * thread.
15a80 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21 72 65 6d  .. */...if (!rem
15a90 6f 76 65 64 29 20 7b 0a 09 20 20 20 20 54 63 6c  oved) {..    Tcl
15aa0 5f 50 61 6e 69 63 28 22 66 69 6c 65 20 69 6e 66  _Panic("file inf
15ab0 6f 20 70 74 72 20 6e 6f 74 20 6f 6e 20 74 68 72  o ptr not on thr
15ac0 65 61 64 20 63 68 61 6e 6e 65 6c 20 6c 69 73 74  ead channel list
15ad0 22 29 3b 0a 09 7d 0a 0a 09 6e 6f 74 69 66 79 43  ");..}...notifyC
15ae0 6d 64 20 3d 20 55 4e 53 45 4c 45 43 54 3b 0a 20  md = UNSELECT;. 
15af0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
15b00 20 20 2a 20 45 6e 73 75 72 65 20 74 68 61 74 2c    * Ensure that,
15b10 20 6f 72 20 73 74 6f 70 2c 20 6e 6f 74 69 66 69   or stop, notifi
15b20 63 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20  cations for the 
15b30 73 6f 63 6b 65 74 20 6f 63 63 75 72 20 69 6e 20  socket occur in 
15b40 74 68 69 73 0a 20 20 20 20 20 2a 20 74 68 72 65  this.     * thre
15b50 61 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ad..     */..   
15b60 20 53 65 6e 64 53 65 6c 65 63 74 4d 65 73 73 61   SendSelectMessa
15b70 67 65 28 74 73 64 50 74 72 2c 20 6e 6f 74 69 66  ge(tsdPtr, notif
15b80 79 43 6d 64 2c 20 73 74 61 74 65 50 74 72 29 3b  yCmd, statePtr);
15b90 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63 61 6c  .}.../*. * Local
15ba0 20 56 61 72 69 61 62 6c 65 73 3a 0a 20 2a 20 6d   Variables:. * m
15bb0 6f 64 65 3a 20 63 0a 20 2a 20 63 2d 62 61 73 69  ode: c. * c-basi
15bc0 63 2d 6f 66 66 73 65 74 3a 20 34 0a 20 2a 20 66  c-offset: 4. * f
15bd0 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 38 0a 20  ill-column: 78. 
15be0 2a 20 74 61 62 2d 77 69 64 74 68 3a 20 38 0a 20  * tab-width: 8. 
15bf0 2a 20 69 6e 64 65 6e 74 2d 74 61 62 73 2d 6d 6f  * indent-tabs-mo
15c00 64 65 3a 20 6e 69 6c 0a 20 2a 20 45 6e 64 3a 0a  de: nil. * End:.
15c10 20 2a 2f 0a                                       */.