Tcl Source Code

Hex Artifact Content
Login

Artifact f306129230ba416678c979ca96fc7996b731bcebea086237eb0ef56815f1379b:


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 c2 a9 20 31 39 39 35 2d 31 39 39  ight © 1995-199
0070: 37 20 53 75 6e 20 4d 69 63 72 6f 73 79 73 74 65  7 Sun Microsyste
0080: 6d 73 2c 20 49 6e 63 2e 0a 20 2a 0a 20 2a 20 53  ms, Inc.. *. * S
0090: 65 65 20 74 68 65 20 66 69 6c 65 20 22 6c 69 63  ee the file "lic
00a0: 65 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f 72 20  ense.terms" for 
00b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75  information on u
00c0: 73 61 67 65 20 61 6e 64 20 72 65 64 69 73 74 72  sage and redistr
00d0: 69 62 75 74 69 6f 6e 20 6f 66 0a 20 2a 20 74 68  ibution of. * th
00e0: 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72  is file, and for
00f0: 20 61 20 44 49 53 43 4c 41 49 4d 45 52 20 4f 46   a DISCLAIMER OF
0100: 20 41 4c 4c 20 57 41 52 52 41 4e 54 49 45 53 2e   ALL WARRANTIES.
0110: 0a 20 2a 0a 20 2a 20 2d 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 0a 20  --------------. 
0160: 2a 20 54 68 65 20 6f 72 64 65 72 20 61 6e 64 20  * The order and 
0170: 6e 61 6d 69 6e 67 20 6f 66 20 66 75 6e 63 74 69  naming of functi
0180: 6f 6e 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ons in this file
0190: 20 73 68 6f 75 6c 64 20 6d 69 6e 69 6d 69 7a 65   should minimize
01a0: 0a 20 2a 20 74 68 65 20 66 69 6c 65 20 64 69 66  . * the file dif
01b0: 66 20 74 6f 20 74 63 6c 55 6e 69 78 53 6f 63 6b  f to tclUnixSock
01c0: 2e 63 2e 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  .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 0a 20  --------------. 
0210: 2a 0a 20 2a 20 47 65 6e 65 72 61 6c 20 69 6e 66  *. * General inf
0220: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 68 6f 77 20  ormation on how 
0230: 74 68 69 73 20 6d 6f 64 75 6c 65 20 77 6f 72 6b  this module work
0240: 73 2e 0a 20 2a 0a 20 2a 20 2d 20 45 61 63 68 20  s.. *. * - Each 
0250: 54 63 6c 2d 74 68 72 65 61 64 20 77 69 74 68 20  Tcl-thread with 
0260: 69 74 73 20 73 6f 63 6b 65 74 73 20 6d 61 69 6e  its sockets main
0270: 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 72 6e 61  tains an interna
0280: 6c 20 77 69 6e 64 6f 77 20 74 6f 20 72 65 63 65  l window to rece
0290: 69 76 65 0a 20 2a 20 20 20 73 6f 63 6b 65 74 20  ive. *   socket 
02a0: 6d 65 73 73 61 67 65 73 20 66 72 6f 6d 20 74 68  messages from th
02b0: 65 20 4f 53 2e 0a 20 2a 0a 20 2a 20 2d 20 54 6f  e OS.. *. * - To
02c0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 6d 65 73   ensure that mes
02d0: 73 61 67 65 20 72 65 63 65 70 74 69 6f 6e 20 69  sage reception i
02e0: 73 20 61 6c 77 61 79 73 20 72 75 6e 6e 69 6e 67  s always running
02f0: 20 74 68 69 73 20 77 69 6e 64 6f 77 20 69 73 0a   this window is.
0300: 20 2a 20 20 20 61 63 74 75 61 6c 6c 79 20 6f 77   *   actually ow
0310: 6e 65 64 20 61 6e 64 20 68 61 6e 64 6c 65 64 20  ned and handled 
0320: 62 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  by an internal t
0330: 68 72 65 61 64 2e 20 54 68 69 73 20 77 65 20 63  hread. This we c
0340: 61 6c 6c 20 74 68 65 0a 20 2a 20 20 20 63 6f 2d  all the. *   co-
0350: 74 68 72 65 61 64 20 6f 66 20 54 63 6c 27 73 20  thread of Tcl's 
0360: 74 68 72 65 61 64 2e 0a 20 2a 0a 20 2a 20 2d 20  thread.. *. * - 
0370: 54 68 65 20 77 68 6f 6c 65 20 73 74 72 75 63 74  The whole struct
0380: 75 72 65 20 69 73 20 73 65 74 20 75 70 20 62 79  ure is set up by
0390: 20 49 6e 69 74 53 6f 63 6b 65 74 73 28 29 20 77   InitSockets() w
03a0: 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 20 66  hich is called f
03b0: 6f 72 20 65 61 63 68 0a 20 2a 20 20 20 54 63 6c  or each. *   Tcl
03c0: 20 74 68 72 65 61 64 2e 20 54 68 65 20 69 6d 70   thread. The imp
03d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
03e0: 68 65 20 63 6f 2d 74 68 72 65 61 64 20 69 73 20  he co-thread is 
03f0: 69 6e 20 53 6f 63 6b 65 74 54 68 72 65 61 64 28  in SocketThread(
0400: 29 2c 0a 20 2a 20 20 20 61 6e 64 20 74 68 65 20  ),. *   and the 
0410: 6d 65 73 73 61 67 65 73 20 61 72 65 20 68 61 6e  messages are han
0420: 64 6c 65 64 20 62 79 20 53 6f 63 6b 65 74 50 72  dled by SocketPr
0430: 6f 63 28 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63  oc(). The connec
0440: 74 69 6f 6e 20 62 65 74 77 65 65 6e 0a 20 2a 20  tion between. * 
0450: 20 20 62 6f 74 68 20 69 73 20 6e 6f 74 20 64 69    both is not di
0460: 72 65 63 74 6c 79 20 76 69 73 69 62 6c 65 2c 20  rectly visible, 
0470: 69 74 20 69 73 20 64 6f 6e 65 20 74 68 72 6f 75  it is done throu
0480: 67 68 20 61 20 57 69 6e 33 32 20 77 69 6e 64 6f  gh a Win32 windo
0490: 77 20 63 6c 61 73 73 2e 0a 20 2a 20 20 20 54 68  w class.. *   Th
04a0: 69 73 20 63 6c 61 73 73 20 69 73 20 69 6e 69 74  is class is init
04b0: 69 61 6c 69 7a 65 64 20 62 79 20 49 6e 69 74 53  ialized by InitS
04c0: 6f 63 6b 65 74 73 28 29 20 61 73 20 77 65 6c 6c  ockets() as well
04d0: 2c 20 61 6e 64 20 75 73 65 64 20 69 6e 20 74 68  , and used in th
04e0: 65 0a 20 2a 20 20 20 63 72 65 61 74 69 6f 6e 20  e. *   creation 
04f0: 6f 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 72  of the message r
0500: 65 63 65 69 76 65 72 20 77 69 6e 64 6f 77 73 2e  eceiver windows.
0510: 0a 20 2a 0a 20 2a 20 2d 20 41 6e 20 69 6d 70 6f  . *. * - An impo
0520: 72 74 61 6e 74 20 74 68 69 6e 67 20 74 6f 20 6e  rtant thing to n
0530: 6f 74 65 20 69 73 20 74 68 61 74 20 2a 62 6f 74  ote is that *bot
0540: 68 2a 20 74 68 72 65 61 64 20 61 6e 64 20 63 6f  h* thread and co
0550: 2d 74 68 72 65 61 64 20 68 61 76 65 0a 20 2a 20  -thread have. * 
0560: 20 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20    access to the 
0570: 6c 69 73 74 20 6f 66 20 73 6f 63 6b 65 74 73 20  list of sockets 
0580: 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 74 68  maintained in th
0590: 65 20 70 72 69 76 61 74 65 20 54 53 44 20 64 61  e private TSD da
05a0: 74 61 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 74  ta of the. *   t
05b0: 68 72 65 61 64 2e 20 54 68 65 20 63 6f 2d 74 68  hread. The co-th
05c0: 72 65 61 64 20 77 61 73 20 67 69 76 65 6e 20 61  read was given a
05d0: 63 63 65 73 73 20 74 6f 20 69 74 20 75 70 6f 6e  ccess to it upon
05e0: 20 63 72 65 61 74 69 6f 6e 20 74 68 72 6f 75 67   creation throug
05f0: 68 20 74 68 65 0a 20 2a 20 20 20 6e 65 77 20 74  h the. *   new t
0600: 68 72 65 61 64 27 73 20 63 6c 69 65 6e 74 2d 64  hread's client-d
0610: 61 74 61 2e 0a 20 2a 0a 20 2a 20 20 20 42 65 63  ata.. *. *   Bec
0620: 61 75 73 65 20 6f 66 20 74 68 69 73 20 64 75 61  ause of this dua
0630: 6c 20 61 63 63 65 73 73 20 74 68 65 20 54 53 44  l access the TSD
0640: 20 64 61 74 61 20 63 6f 6e 74 61 69 6e 73 20 61   data contains a
0650: 6e 20 4f 53 20 6d 75 74 65 78 2c 20 74 68 65 0a  n OS mutex, the.
0660: 20 2a 20 20 20 22 73 6f 63 6b 65 74 4c 69 73 74   *   "socketList
0670: 4c 6f 63 6b 22 2c 20 74 6f 20 6d 65 64 69 61 74  Lock", to mediat
0680: 65 20 65 78 63 6c 75 73 69 6f 6e 20 62 65 74 77  e exclusion betw
0690: 65 65 6e 20 74 68 72 65 61 64 20 61 6e 64 20 63  een thread and c
06a0: 6f 2d 74 68 72 65 61 64 2e 0a 20 2a 0a 20 2a 20  o-thread.. *. * 
06b0: 20 20 54 68 65 20 63 6f 2d 74 68 72 65 61 64 27    The co-thread'
06c0: 73 20 61 63 63 65 73 73 20 69 73 20 61 6c 6c 20  s access is all 
06d0: 69 6e 20 53 6f 63 6b 65 74 50 72 6f 63 28 29 2e  in SocketProc().
06e0: 20 54 68 65 20 74 68 72 65 61 64 27 73 20 61 63   The thread's ac
06f0: 63 65 73 73 20 69 73 0a 20 2a 20 20 20 74 68 72  cess is. *   thr
0700: 6f 75 67 68 20 53 6f 63 6b 65 74 45 76 65 6e 74  ough SocketEvent
0710: 50 72 6f 63 28 29 20 28 31 29 20 61 6e 64 20 74  Proc() (1) and t
0720: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6c  he functions cal
0730: 6c 65 64 20 62 79 20 69 74 2e 0a 20 2a 0a 20 2a  led by it.. *. *
0740: 20 20 20 28 41 64 20 31 29 20 54 68 69 73 20 69     (Ad 1) This i
0750: 73 20 74 68 65 20 68 61 6e 64 6c 65 72 20 66 75  s the handler fu
0760: 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 71  nction for all q
0770: 75 65 75 65 64 20 73 6f 63 6b 65 74 20 65 76 65  ueued socket eve
0780: 6e 74 73 2c 20 77 68 69 63 68 0a 20 2a 20 20 20  nts, which. *   
0790: 20 20 20 20 20 20 20 61 6c 6c 20 74 68 65 20 4f         all the O
07a0: 53 20 6d 65 73 73 61 67 65 73 20 61 72 65 20 74  S messages are t
07b0: 72 61 6e 73 6c 61 74 65 64 20 74 6f 20 74 68 72  ranslated to thr
07c0: 6f 75 67 68 20 74 68 65 20 45 76 65 6e 74 53 6f  ough the EventSo
07d0: 75 72 63 65 20 28 32 29 0a 20 2a 20 20 20 20 20  urce (2). *     
07e0: 20 20 20 20 20 64 72 69 76 65 6e 20 62 79 20 74       driven by t
07f0: 68 65 20 4f 53 20 6d 65 73 73 61 67 65 73 2e 0a  he OS messages..
0800: 20 2a 0a 20 2a 20 20 20 28 41 64 20 32 29 20 54   *. *   (Ad 2) T
0810: 68 65 20 6d 61 69 6e 20 66 75 6e 63 74 69 6f 6e  he main function
0820: 73 20 66 6f 72 20 74 68 69 73 20 61 72 65 20 53  s for this are S
0830: 6f 63 6b 65 74 53 65 74 75 70 50 72 6f 63 28 29  ocketSetupProc()
0840: 20 61 6e 64 0a 20 2a 20 20 20 20 20 20 20 20 20   and. *         
0850: 20 53 6f 63 6b 65 74 43 68 65 63 6b 50 72 6f 63   SocketCheckProc
0860: 28 29 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  ().. */..#includ
0870: 65 20 22 74 63 6c 57 69 6e 49 6e 74 2e 68 22 0a  e "tclWinInt.h".
0880: 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
0890: 0a 23 20 20 20 70 72 61 67 6d 61 20 63 6f 6d 6d  .#   pragma comm
08a0: 65 6e 74 20 28 6c 69 62 2c 20 22 77 73 32 5f 33  ent (lib, "ws2_3
08b0: 32 22 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  2").#endif../*. 
08c0: 2a 20 48 65 6c 70 65 72 20 6d 61 63 72 6f 73 20  * Helper macros 
08d0: 74 6f 20 6d 61 6b 65 20 70 61 72 74 73 20 6f 66  to make parts of
08e0: 20 74 68 69 73 20 66 69 6c 65 20 63 6c 65 61 72   this file clear
08f0: 65 72 2e 20 54 68 65 20 6d 61 63 72 6f 73 20 64  er. The macros d
0900: 6f 20 65 78 61 63 74 6c 79 0a 20 2a 20 77 68 61  o exactly. * wha
0910: 74 20 74 68 65 79 20 73 61 79 20 6f 6e 20 74 68  t they say on th
0920: 65 20 74 69 6e 2e 20 3a 2d 29 20 54 68 65 79 20  e tin. :-) They 
0930: 61 6c 73 6f 20 6f 6e 6c 79 20 65 76 65 72 20 72  also only ever r
0940: 65 66 65 72 20 74 6f 20 74 68 65 69 72 20 61 72  efer to their ar
0950: 67 75 6d 65 6e 74 73 0a 20 2a 20 6f 6e 63 65 2c  guments. * once,
0960: 20 61 6e 64 20 73 6f 20 63 61 6e 20 62 65 20 75   and so can be u
0970: 73 65 64 20 77 69 74 68 6f 75 74 20 72 65 67 61  sed without rega
0980: 72 64 20 74 6f 20 73 69 64 65 20 65 66 66 65 63  rd to side effec
0990: 74 73 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  ts.. */..#define
09a0: 20 53 45 54 5f 42 49 54 53 28 76 61 72 2c 20 62   SET_BITS(var, b
09b0: 69 74 73 29 09 28 28 76 61 72 29 20 7c 3d 20 28  its).((var) |= (
09c0: 62 69 74 73 29 29 0a 23 64 65 66 69 6e 65 20 43  bits)).#define C
09d0: 4c 45 41 52 5f 42 49 54 53 28 76 61 72 2c 20 62  LEAR_BITS(var, b
09e0: 69 74 73 29 09 28 28 76 61 72 29 20 26 3d 20 7e  its).((var) &= ~
09f0: 28 62 69 74 73 29 29 0a 23 64 65 66 69 6e 65 20  (bits)).#define 
0a00: 47 4f 54 5f 42 49 54 53 28 76 61 72 2c 20 62 69  GOT_BITS(var, bi
0a10: 74 73 29 09 28 28 28 76 61 72 29 20 26 20 28 62  ts).(((var) & (b
0a20: 69 74 73 29 29 20 21 3d 20 30 29 0a 0a 2f 2a 20  its)) != 0)../* 
0a30: 22 73 6f 63 6b 22 20 2b 20 61 20 70 6f 69 6e 74  "sock" + a point
0a40: 65 72 20 69 6e 20 68 65 78 20 2b 20 5c 30 20 2a  er in hex + \0 *
0a50: 2f 0a 23 64 65 66 69 6e 65 20 53 4f 43 4b 5f 43  /.#define SOCK_C
0a60: 48 41 4e 5f 4c 45 4e 47 54 48 09 28 31 36 20 2b  HAN_LENGTH.(16 +
0a70: 20 54 43 4c 5f 49 4e 54 45 47 45 52 5f 53 50 41   TCL_INTEGER_SPA
0a80: 43 45 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 66  CE)../*. * The f
0a90: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
0aa0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 6c  e is used to tel
0ab0: 6c 20 77 68 65 74 68 65 72 20 74 68 69 73 20 6d  l whether this m
0ac0: 6f 64 75 6c 65 20 68 61 73 20 62 65 65 6e 0a 20  odule has been. 
0ad0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  * initialized.  
0ae0: 49 66 20 31 2c 20 69 6e 69 74 69 61 6c 69 7a 61  If 1, initializa
0af0: 74 69 6f 6e 20 6f 66 20 73 6f 63 6b 65 74 73 20  tion of sockets 
0b00: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20  was successful, 
0b10: 69 66 20 2d 31 20 74 68 65 6e 0a 20 2a 20 73 6f  if -1 then. * so
0b20: 63 6b 65 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  cket initializat
0b30: 69 6f 6e 20 66 61 69 6c 65 64 20 28 57 53 41 53  ion failed (WSAS
0b40: 74 61 72 74 75 70 20 66 61 69 6c 65 64 29 2e 0a  tartup failed)..
0b50: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20   */..static int 
0b60: 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
0b70: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 57 43  .static const WC
0b80: 48 41 52 20 63 6c 61 73 73 4e 61 6d 65 5b 5d 20  HAR className[] 
0b90: 3d 20 4c 22 54 63 6c 53 6f 63 6b 65 74 22 3b 0a  = L"TclSocket";.
0ba0: 54 43 4c 5f 44 45 43 4c 41 52 45 5f 4d 55 54 45  TCL_DECLARE_MUTE
0bb0: 58 28 73 6f 63 6b 65 74 4d 75 74 65 78 29 0a 0a  X(socketMutex)..
0bc0: 2f 2a 0a 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*. * The follow
0bd0: 69 6e 67 20 64 65 66 69 6e 65 73 20 64 65 63 6c  ing defines decl
0be0: 61 72 65 20 74 68 65 20 6d 65 73 73 61 67 65 73  are the messages
0bf0: 20 75 73 65 64 20 6f 6e 20 73 6f 63 6b 65 74 20   used on socket 
0c00: 77 69 6e 64 6f 77 73 2e 0a 20 2a 2f 0a 65 6e 75  windows.. */.enu
0c10: 6d 20 54 63 6c 53 6f 63 6b 65 74 4d 65 73 73 61  m TclSocketMessa
0c20: 67 65 73 20 7b 0a 20 20 20 20 53 4f 43 4b 45 54  ges {.    SOCKET
0c30: 5f 4d 45 53 53 41 47 45 20 3d 20 57 4d 5f 55 53  _MESSAGE = WM_US
0c40: 45 52 2b 31 2c 09 2f 2a 20 53 65 6e 74 20 62 79  ER+1,./* Sent by
0c50: 20 4f 53 3a 20 73 6f 6d 65 74 68 69 6e 67 20 68   OS: something h
0c60: 61 70 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20  appened. */.    
0c70: 53 4f 43 4b 45 54 5f 53 45 4c 45 43 54 20 3d 20  SOCKET_SELECT = 
0c80: 57 4d 5f 55 53 45 52 2b 32 2c 09 2f 2a 20 41 64  WM_USER+2,./* Ad
0c90: 6a 75 73 74 20 73 65 6c 65 63 74 20 6d 61 73 6b  just select mask
0ca0: 2e 20 2a 2f 0a 20 20 20 20 53 4f 43 4b 45 54 5f  . */.    SOCKET_
0cb0: 54 45 52 4d 49 4e 41 54 45 20 3d 20 57 4d 5f 55  TERMINATE = WM_U
0cc0: 53 45 52 2b 33 2f 2a 20 53 74 6f 70 20 77 6f 72  SER+3/* Stop wor
0cd0: 6b 65 72 20 74 68 72 65 61 64 2e 20 2a 2f 0a 7d  ker thread. */.}
0ce0: 3b 0a 0a 2f 2a 0a 20 2a 20 4f 70 65 72 61 74 69  ;../*. * Operati
0cf0: 6f 6e 73 20 75 73 65 64 20 77 69 74 68 20 61 20  ons used with a 
0d00: 53 4f 43 4b 45 54 5f 53 45 4c 45 43 54 20 6d 65  SOCKET_SELECT me
0d10: 73 73 61 67 65 2e 0a 20 2a 2f 0a 65 6e 75 6d 20  ssage.. */.enum 
0d20: 53 6f 63 6b 65 74 53 65 6c 65 63 74 4f 70 65 72  SocketSelectOper
0d30: 61 74 69 6f 6e 73 20 7b 0a 20 20 20 20 53 45 4c  ations {.    SEL
0d40: 45 43 54 20 3d 20 54 52 55 45 2c 09 09 2f 2a 20  ECT = TRUE,../* 
0d50: 41 64 64 20 73 6f 63 6b 65 74 20 74 6f 20 73 65  Add socket to se
0d60: 6c 65 63 74 2e 20 2a 2f 0a 20 20 20 20 55 4e 53  lect. */.    UNS
0d70: 45 4c 45 43 54 20 3d 20 46 41 4c 53 45 09 09 2f  ELECT = FALSE../
0d80: 2a 20 52 65 6d 6f 76 65 20 73 6f 63 6b 65 74 20  * Remove socket 
0d90: 66 72 6f 6d 20 73 65 6c 65 63 74 2e 20 2a 2f 0a  from select. */.
0da0: 7d 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 69  };../*. * This i
0db0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6d 70  s needed to comp
0dc0: 6c 79 20 77 69 74 68 20 74 68 65 20 73 74 72 69  ly with the stri
0dd0: 63 74 20 61 6c 69 61 73 69 6e 67 20 72 75 6c 65  ct aliasing rule
0de0: 73 20 6f 66 20 47 43 43 2c 20 62 75 74 20 69 74  s of GCC, but it
0df0: 20 61 6c 73 6f 0a 20 2a 20 73 69 6d 70 6c 69 66   also. * simplif
0e00: 69 65 73 20 63 61 73 74 69 6e 67 20 62 65 74 77  ies casting betw
0e10: 65 65 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e  een the differen
0e20: 74 20 73 6f 63 6b 61 64 64 72 20 74 79 70 65 73  t sockaddr types
0e30: 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 75  .. */..typedef u
0e40: 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63  nion {.    struc
0e50: 74 20 73 6f 63 6b 61 64 64 72 20 73 61 3b 0a 20  t sockaddr sa;. 
0e60: 20 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64     struct sockad
0e70: 64 72 5f 69 6e 20 73 61 34 3b 0a 20 20 20 20 73  dr_in sa4;.    s
0e80: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69  truct sockaddr_i
0e90: 6e 36 20 73 61 36 3b 0a 20 20 20 20 73 74 72 75  n6 sa6;.    stru
0ea0: 63 74 20 73 6f 63 6b 61 64 64 72 5f 73 74 6f 72  ct sockaddr_stor
0eb0: 61 67 65 20 73 61 73 3b 0a 7d 20 61 64 64 72 65  age sas;.} addre
0ec0: 73 73 3b 0a 0a 23 69 66 6e 64 65 66 20 49 4e 36  ss;..#ifndef IN6
0ed0: 5f 41 52 45 5f 41 44 44 52 5f 45 51 55 41 4c 0a  _ARE_ADDR_EQUAL.
0ee0: 23 64 65 66 69 6e 65 20 49 4e 36 5f 41 52 45 5f  #define IN6_ARE_
0ef0: 41 44 44 52 5f 45 51 55 41 4c 20 49 4e 36 5f 41  ADDR_EQUAL IN6_A
0f00: 44 44 52 5f 45 51 55 41 4c 0a 23 65 6e 64 69 66  DDR_EQUAL.#endif
0f10: 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72  ../*. * This str
0f20: 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65 73  ucture describes
0f30: 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74   per-instance st
0f40: 61 74 65 20 6f 66 20 61 20 74 63 70 2d 62 61 73  ate of a tcp-bas
0f50: 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 2f 0a  ed channel.. */.
0f60: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0f70: 54 63 70 53 74 61 74 65 20 54 63 70 53 74 61 74  TcpState TcpStat
0f80: 65 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  e;..typedef stru
0f90: 63 74 20 54 63 70 46 64 4c 69 73 74 20 7b 0a 20  ct TcpFdList {. 
0fa0: 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74 61     TcpState *sta
0fb0: 74 65 50 74 72 3b 0a 20 20 20 20 53 4f 43 4b 45  tePtr;.    SOCKE
0fc0: 54 20 66 64 3b 0a 20 20 20 20 73 74 72 75 63 74  T fd;.    struct
0fd0: 20 54 63 70 46 64 4c 69 73 74 20 2a 6e 65 78 74   TcpFdList *next
0fe0: 3b 0a 7d 20 54 63 70 46 64 4c 69 73 74 3b 0a 0a  ;.} TcpFdList;..
0ff0: 73 74 72 75 63 74 20 54 63 70 53 74 61 74 65 20  struct TcpState 
1000: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
1010: 6c 20 63 68 61 6e 6e 65 6c 3b 09 2f 2a 20 43 68  l channel;./* Ch
1020: 61 6e 6e 65 6c 20 61 73 73 6f 63 69 61 74 65 64  annel associated
1030: 20 77 69 74 68 20 74 68 69 73 20 73 6f 63 6b 65   with this socke
1040: 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c  t. */.    int fl
1050: 61 67 73 3b 09 09 09 2f 2a 20 42 69 74 20 66 69  ags;.../* Bit fi
1060: 65 6c 64 20 63 6f 6d 70 72 69 73 65 64 20 6f 66  eld comprised of
1070: 20 74 68 65 20 66 6c 61 67 73 20 64 65 73 63 72   the flags descr
1080: 69 62 65 64 0a 09 09 09 09 20 2a 20 62 65 6c 6f  ibed..... * belo
1090: 77 2e 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  w. */.    struct
10a0: 20 54 63 70 46 64 4c 69 73 74 20 2a 73 6f 63 6b   TcpFdList *sock
10b0: 65 74 73 3b 09 2f 2a 20 57 69 6e 64 6f 77 73 20  ets;./* Windows 
10c0: 53 4f 43 4b 45 54 20 68 61 6e 64 6c 65 2e 20 2a  SOCKET handle. *
10d0: 2f 0a 20 20 20 20 69 6e 74 20 77 61 74 63 68 45  /.    int watchE
10e0: 76 65 6e 74 73 3b 09 09 2f 2a 20 4f 52 27 65 64  vents;../* OR'ed
10f0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1100: 46 44 5f 52 45 41 44 2c 20 46 44 5f 57 52 49 54  FD_READ, FD_WRIT
1110: 45 2c 0a 09 09 09 09 20 2a 20 46 44 5f 43 4c 4f  E,..... * FD_CLO
1120: 53 45 2c 20 46 44 5f 41 43 43 45 50 54 20 61 6e  SE, FD_ACCEPT an
1130: 64 20 46 44 5f 43 4f 4e 4e 45 43 54 20 74 68 61  d FD_CONNECT tha
1140: 74 0a 09 09 09 09 20 2a 20 69 6e 64 69 63 61 74  t..... * indicat
1150: 65 20 77 68 69 63 68 20 65 76 65 6e 74 73 20 61  e which events a
1160: 72 65 20 69 6e 74 65 72 65 73 74 69 6e 67 2e 20  re interesting. 
1170: 2a 2f 0a 20 20 20 20 76 6f 6c 61 74 69 6c 65 20  */.    volatile 
1180: 69 6e 74 20 72 65 61 64 79 45 76 65 6e 74 73 3b  int readyEvents;
1190: 09 2f 2a 20 4f 52 27 65 64 20 63 6f 6d 62 69 6e  ./* OR'ed combin
11a0: 61 74 69 6f 6e 20 6f 66 20 46 44 5f 52 45 41 44  ation of FD_READ
11b0: 2c 20 46 44 5f 57 52 49 54 45 2c 0a 09 09 09 09  , FD_WRITE,.....
11c0: 20 2a 20 46 44 5f 43 4c 4f 53 45 2c 20 46 44 5f   * FD_CLOSE, FD_
11d0: 41 43 43 45 50 54 20 61 6e 64 20 46 44 5f 43 4f  ACCEPT and FD_CO
11e0: 4e 4e 45 43 54 20 74 68 61 74 0a 09 09 09 09 20  NNECT that..... 
11f0: 2a 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  * indicate which
1200: 20 65 76 65 6e 74 73 20 68 61 76 65 20 6f 63 63   events have occ
1210: 75 72 72 65 64 2e 0a 09 09 09 09 20 2a 20 53 65  urred...... * Se
1220: 74 20 62 79 20 6e 6f 74 69 66 69 65 72 20 74 68  t by notifier th
1230: 72 65 61 64 2c 20 61 63 63 65 73 73 20 6d 75 73  read, access mus
1240: 74 20 62 65 0a 09 09 09 09 20 2a 20 70 72 6f 74  t be..... * prot
1250: 65 63 74 65 64 20 62 79 20 73 65 6d 61 70 68 6f  ected by semapho
1260: 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65  re */.    int se
1270: 6c 65 63 74 45 76 65 6e 74 73 3b 09 09 2f 2a 20  lectEvents;../* 
1280: 4f 52 27 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR'ed combinatio
1290: 6e 20 6f 66 20 46 44 5f 52 45 41 44 2c 20 46 44  n of FD_READ, FD
12a0: 5f 57 52 49 54 45 2c 0a 09 09 09 09 20 2a 20 46  _WRITE,..... * F
12b0: 44 5f 43 4c 4f 53 45 2c 20 46 44 5f 41 43 43 45  D_CLOSE, FD_ACCE
12c0: 50 54 20 61 6e 64 20 46 44 5f 43 4f 4e 4e 45 43  PT and FD_CONNEC
12d0: 54 20 74 68 61 74 0a 09 09 09 09 20 2a 20 69 6e  T that..... * in
12e0: 64 69 63 61 74 65 20 77 68 69 63 68 20 65 76 65  dicate which eve
12f0: 6e 74 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  nts are currentl
1300: 79 20 62 65 69 6e 67 0a 09 09 09 09 20 2a 20 73  y being..... * s
1310: 65 6c 65 63 74 65 64 2e 20 2a 2f 0a 20 20 20 20  elected. */.    
1320: 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 61 63 63  volatile int acc
1330: 65 70 74 45 76 65 6e 74 43 6f 75 6e 74 3b 0a 09  eptEventCount;..
1340: 09 09 09 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74  .../* Count of t
1350: 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
1360: 72 20 6f 66 20 46 44 5f 41 43 43 45 50 54 73 0a  r of FD_ACCEPTs.
1370: 09 09 09 09 20 2a 20 74 68 61 74 20 68 61 76 65  .... * that have
1380: 20 61 72 72 69 76 65 64 20 61 6e 64 20 6e 6f 74   arrived and not
1390: 20 79 65 74 20 70 72 6f 63 65 73 73 65 64 2e 0a   yet processed..
13a0: 09 09 09 09 20 2a 20 53 65 74 20 62 79 20 6e 6f  .... * Set by no
13b0: 74 69 66 69 65 72 20 74 68 72 65 61 64 2c 20 61  tifier thread, a
13c0: 63 63 65 73 73 20 6d 75 73 74 20 62 65 0a 09 09  ccess must be...
13d0: 09 09 20 2a 20 70 72 6f 74 65 63 74 65 64 20 62  .. * protected b
13e0: 79 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  y semaphore */. 
13f0: 20 20 20 54 63 6c 5f 54 63 70 41 63 63 65 70 74     Tcl_TcpAccept
1400: 50 72 6f 63 20 2a 61 63 63 65 70 74 50 72 6f 63  Proc *acceptProc
1410: 3b 0a 09 09 09 09 2f 2a 20 50 72 6f 63 20 74 6f  ;...../* Proc to
1420: 20 63 61 6c 6c 20 6f 6e 20 61 63 63 65 70 74 2e   call on accept.
1430: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 61 63   */.    void *ac
1440: 63 65 70 74 50 72 6f 63 44 61 74 61 3b 09 2f 2a  ceptProcData;./*
1450: 20 54 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   The data for th
1460: 65 20 61 63 63 65 70 74 20 70 72 6f 63 2e 20 2a  e accept proc. *
1470: 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  /..    /*.     *
1480: 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   Only needed for
1490: 20 63 6c 69 65 6e 74 20 73 6f 63 6b 65 74 73 0a   client sockets.
14a0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74 72       */..    str
14b0: 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 61 64  uct addrinfo *ad
14c0: 64 72 6c 69 73 74 3b 09 2f 2a 20 41 64 64 72 65  drlist;./* Addre
14d0: 73 73 65 73 20 74 6f 20 63 6f 6e 6e 65 63 74 20  sses to connect 
14e0: 74 6f 2e 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  to. */.    struc
14f0: 74 20 61 64 64 72 69 6e 66 6f 20 2a 61 64 64 72  t addrinfo *addr
1500: 3b 09 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 76  ;./* Iterator ov
1510: 65 72 20 61 64 64 72 6c 69 73 74 2e 20 2a 2f 0a  er addrlist. */.
1520: 20 20 20 20 73 74 72 75 63 74 20 61 64 64 72 69      struct addri
1530: 6e 66 6f 20 2a 6d 79 61 64 64 72 6c 69 73 74 3b  nfo *myaddrlist;
1540: 2f 2a 20 4c 6f 63 61 6c 20 61 64 64 72 65 73 73  /* Local address
1550: 2e 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  . */.    struct 
1560: 61 64 64 72 69 6e 66 6f 20 2a 6d 79 61 64 64 72  addrinfo *myaddr
1570: 3b 09 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 76  ;./* Iterator ov
1580: 65 72 20 6d 79 61 64 64 72 6c 69 73 74 2e 20 2a  er myaddrlist. *
1590: 2f 0a 20 20 20 20 69 6e 74 20 63 6f 6e 6e 65 63  /.    int connec
15a0: 74 45 72 72 6f 72 3b 09 09 2f 2a 20 43 61 63 68  tError;../* Cach
15b0: 65 20 73 74 61 74 75 73 20 6f 66 20 61 73 79 6e  e status of asyn
15c0: 63 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 20 20 20  c socket. */.   
15d0: 20 69 6e 74 20 63 61 63 68 65 64 42 6c 6f 63 6b   int cachedBlock
15e0: 69 6e 67 3b 09 09 2f 2a 20 43 61 63 68 65 20 62  ing;../* Cache b
15f0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 6f 66 20  locking mode of 
1600: 61 73 79 6e 63 20 73 6f 63 6b 65 74 2e 20 2a 2f  async socket. */
1610: 0a 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e  .    volatile in
1620: 74 20 6e 6f 74 69 66 69 65 72 43 6f 6e 6e 65 63  t notifierConnec
1630: 74 45 72 72 6f 72 3b 0a 09 09 09 09 2f 2a 20 41  tError;...../* A
1640: 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20 65 72 72  sync connect err
1650: 6f 72 20 73 65 74 20 62 79 20 6e 6f 74 69 66 69  or set by notifi
1660: 65 72 20 74 68 72 65 61 64 2e 0a 09 09 09 09 20  er thread...... 
1670: 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73 20  * This error is 
1680: 73 74 69 6c 6c 20 61 20 77 69 6e 64 6f 77 73 20  still a windows 
1690: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 09 09 09 09  error code......
16a0: 20 2a 20 41 63 63 65 73 73 20 6d 75 73 74 20 62   * Access must b
16b0: 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 73  e protected by s
16c0: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 20 20  emaphore */.    
16d0: 73 74 72 75 63 74 20 54 63 70 53 74 61 74 65 20  struct TcpState 
16e0: 2a 6e 65 78 74 50 74 72 3b 09 2f 2a 20 54 68 65  *nextPtr;./* The
16f0: 20 6e 65 78 74 20 73 6f 63 6b 65 74 20 6f 6e 20   next socket on 
1700: 74 68 65 20 70 65 72 2d 74 68 72 65 61 64 20 73  the per-thread s
1710: 6f 63 6b 65 74 0a 09 09 09 09 20 2a 20 6c 69 73  ocket..... * lis
1720: 74 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20  t. */.};../*. * 
1730: 54 68 65 73 65 20 62 69 74 73 20 6d 61 79 20 62  These bits may b
1740: 65 20 4f 52 27 65 64 20 74 6f 67 65 74 68 65 72  e OR'ed together
1750: 20 69 6e 74 6f 20 74 68 65 20 22 66 6c 61 67 73   into the "flags
1760: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 54 63 70  " field of a Tcp
1770: 53 74 61 74 65 0a 20 2a 20 73 74 72 75 63 74 75  State. * structu
1780: 72 65 2e 0a 20 2a 2f 0a 0a 65 6e 75 6d 20 54 63  re.. */..enum Tc
1790: 70 53 74 61 74 65 46 6c 61 67 73 20 7b 0a 20 20  pStateFlags {.  
17a0: 20 20 54 43 50 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e    TCP_NONBLOCKIN
17b0: 47 20 3d 20 31 3c 3c 30 2c 09 2f 2a 20 53 6f 63  G = 1<<0,./* Soc
17c0: 6b 65 74 20 77 69 74 68 20 6e 6f 6e 2d 62 6c 6f  ket with non-blo
17d0: 63 6b 69 6e 67 20 49 2f 4f 2e 20 2a 2f 0a 20 20  cking I/O. */.  
17e0: 20 20 54 43 50 5f 41 53 59 4e 43 5f 43 4f 4e 4e    TCP_ASYNC_CONN
17f0: 45 43 54 20 3d 20 31 3c 3c 31 2c 09 2f 2a 20 41  ECT = 1<<1,./* A
1800: 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20 69 6e 20  sync connect in 
1810: 70 72 6f 67 72 65 73 73 2e 20 2a 2f 0a 20 20 20  progress. */.   
1820: 20 53 4f 43 4b 45 54 5f 45 4f 46 20 3d 20 31 3c   SOCKET_EOF = 1<
1830: 3c 32 2c 09 09 2f 2a 20 41 20 7a 65 72 6f 20 72  <2,../* A zero r
1840: 65 61 64 20 68 61 70 70 65 6e 65 64 20 6f 6e 20  ead happened on 
1850: 74 68 65 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 20  the socket. */. 
1860: 20 20 20 53 4f 43 4b 45 54 5f 50 45 4e 44 49 4e     SOCKET_PENDIN
1870: 47 20 3d 20 31 3c 3c 33 2c 09 2f 2a 20 41 20 6d  G = 1<<3,./* A m
1880: 65 73 73 61 67 65 20 68 61 73 20 62 65 65 6e 20  essage has been 
1890: 73 65 6e 74 20 66 6f 72 20 74 68 69 73 20 73 6f  sent for this so
18a0: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 43 50 5f  cket */.    TCP_
18b0: 41 53 59 4e 43 5f 50 45 4e 44 49 4e 47 20 3d 20  ASYNC_PENDING = 
18c0: 31 3c 3c 34 2c 09 2f 2a 20 54 63 70 43 6f 6e 6e  1<<4,./* TcpConn
18d0: 65 63 74 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ect was called t
18e0: 6f 20 70 72 6f 63 65 73 73 20 61 6e 20 61 73 79  o process an asy
18f0: 6e 63 0a 09 09 09 09 20 2a 20 63 6f 6e 6e 65 63  nc..... * connec
1900: 74 2e 20 54 68 69 73 20 66 6c 61 67 20 69 6e 64  t. This flag ind
1910: 69 63 61 74 65 73 20 74 68 61 74 20 72 65 65 6e  icates that reen
1920: 74 72 79 20 69 73 0a 09 09 09 09 20 2a 20 73 74  try is..... * st
1930: 69 6c 6c 20 70 65 6e 64 69 6e 67 2e 20 2a 2f 0a  ill pending. */.
1940: 20 20 20 20 54 43 50 5f 41 53 59 4e 43 5f 46 41      TCP_ASYNC_FA
1950: 49 4c 45 44 20 3d 20 31 3c 3c 35 2c 09 2f 2a 20  ILED = 1<<5,./* 
1960: 41 6e 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74  An async connect
1970: 20 66 69 6e 61 6c 6c 79 20 66 61 69 6c 65 64 2e   finally failed.
1980: 20 2a 2f 0a 0a 20 20 20 20 54 43 50 5f 41 53 59   */..    TCP_ASY
1990: 4e 43 5f 54 45 53 54 5f 4d 4f 44 45 20 3d 20 31  NC_TEST_MODE = 1
19a0: 3c 3c 38 09 2f 2a 20 41 73 79 6e 63 20 74 65 73  <<8./* Async tes
19b0: 74 69 6e 67 20 61 63 74 69 76 61 74 65 64 2e 20  ting activated. 
19c0: 20 44 6f 20 6e 6f 74 0a 09 09 09 09 20 2a 20 61   Do not..... * a
19d0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
19e0: 74 69 6e 75 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  tinue connection
19f0: 0a 09 09 09 09 20 2a 20 70 72 6f 63 65 73 73 20  ..... * process 
1a00: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65  */.};../*. * The
1a10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1a20: 74 75 72 65 20 69 73 20 77 68 61 74 20 69 73 20  ture is what is 
1a30: 61 64 64 65 64 20 74 6f 20 74 68 65 20 54 63 6c  added to the Tcl
1a40: 20 65 76 65 6e 74 20 71 75 65 75 65 20 77 68 65   event queue whe
1a50: 6e 20 61 0a 20 2a 20 73 6f 63 6b 65 74 20 65 76  n a. * socket ev
1a60: 65 6e 74 20 6f 63 63 75 72 73 2e 0a 20 2a 2f 0a  ent occurs.. */.
1a70: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1a80: 7b 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 20  {.    Tcl_Event 
1a90: 68 65 61 64 65 72 3b 09 09 2f 2a 20 49 6e 66 6f  header;../* Info
1aa0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 69 73 20  rmation that is 
1ab0: 73 74 61 6e 64 61 72 64 20 66 6f 72 20 61 6c 6c  standard for all
1ac0: 0a 09 09 09 09 20 2a 20 65 76 65 6e 74 73 2e 20  ..... * events. 
1ad0: 2a 2f 0a 20 20 20 20 53 4f 43 4b 45 54 20 73 6f  */.    SOCKET so
1ae0: 63 6b 65 74 3b 09 09 2f 2a 20 53 6f 63 6b 65 74  cket;../* Socket
1af0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
1b00: 20 69 73 20 72 65 61 64 79 2e 20 55 73 65 64 20   is ready. Used 
1b10: 74 6f 0a 09 09 09 09 20 2a 20 66 69 6e 64 20 74  to..... * find t
1b20: 68 65 20 54 63 70 53 74 61 74 65 20 73 74 72 75  he TcpState stru
1b30: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 66 69  cture for the fi
1b40: 6c 65 0a 09 09 09 09 20 2a 20 28 63 61 6e 27 74  le..... * (can't
1b50: 20 70 6f 69 6e 74 20 64 69 72 65 63 74 6c 79 20   point directly 
1b60: 74 6f 20 74 68 65 20 54 63 70 53 74 61 74 65 0a  to the TcpState.
1b70: 09 09 09 09 20 2a 20 73 74 72 75 63 74 75 72 65  .... * structure
1b80: 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c   because it coul
1b90: 64 20 67 6f 20 61 77 61 79 20 77 68 69 6c 65 0a  d go away while.
1ba0: 09 09 09 09 20 2a 20 74 68 65 20 65 76 65 6e 74  .... * the event
1bb0: 20 69 73 20 71 75 65 75 65 64 29 2e 20 2a 2f 0a   is queued). */.
1bc0: 7d 20 53 6f 63 6b 65 74 45 76 65 6e 74 3b 0a 0a  } SocketEvent;..
1bd0: 2f 2a 0a 20 2a 20 54 68 69 73 20 64 65 66 69 6e  /*. * This defin
1be0: 65 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 62  es the minimum b
1bf0: 75 66 66 65 72 73 69 7a 65 20 6d 61 69 6e 74 61  uffersize mainta
1c00: 69 6e 65 64 20 62 79 20 74 68 65 20 6b 65 72 6e  ined by the kern
1c10: 65 6c 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  el.. */..#define
1c20: 20 54 43 50 5f 42 55 46 46 45 52 5f 53 49 5a 45   TCP_BUFFER_SIZE
1c30: 20 34 30 39 36 0a 0a 2f 2a 0a 20 2a 20 50 65 72   4096../*. * Per
1c40: 20 28 6d 61 69 6e 29 20 74 68 72 65 61 64 20 64   (main) thread d
1c50: 61 74 61 2c 20 68 6f 6c 64 69 6e 67 20 6c 69 73  ata, holding lis
1c60: 74 20 6f 66 20 74 68 69 6e 67 73 20 62 65 69 6e  t of things bein
1c70: 67 20 77 61 69 74 65 64 20 75 70 6f 6e 20 61 6e  g waited upon an
1c80: 64 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73  d the. * various
1c90: 20 68 61 6e 64 6c 65 73 20 74 6f 20 74 68 69 6e   handles to thin
1ca0: 67 73 20 64 6f 69 6e 67 20 74 68 65 20 77 61 69  gs doing the wai
1cb0: 74 69 6e 67 2f 6e 6f 74 69 66 69 63 61 74 69 6f  ting/notificatio
1cc0: 6e 2e 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  n.. */.typedef s
1cd0: 74 72 75 63 74 20 7b 0a 20 20 20 20 48 57 4e 44  truct {.    HWND
1ce0: 20 68 77 6e 64 3b 09 09 09 2f 2a 20 48 61 6e 64   hwnd;.../* Hand
1cf0: 6c 65 20 74 6f 20 77 69 6e 64 6f 77 20 66 6f 72  le to window for
1d00: 20 73 6f 63 6b 65 74 20 6d 65 73 73 61 67 65 73   socket messages
1d10: 2e 20 2a 2f 0a 20 20 20 20 48 41 4e 44 4c 45 20  . */.    HANDLE 
1d20: 73 6f 63 6b 65 74 54 68 72 65 61 64 3b 09 2f 2a  socketThread;./*
1d30: 20 54 68 72 65 61 64 20 68 61 6e 64 6c 69 6e 67   Thread handling
1d40: 20 74 68 65 20 77 69 6e 64 6f 77 20 2a 2f 0a 20   the window */. 
1d50: 20 20 20 54 63 6c 5f 54 68 72 65 61 64 49 64 20     Tcl_ThreadId 
1d60: 74 68 72 65 61 64 49 64 3b 09 2f 2a 20 50 61 72  threadId;./* Par
1d70: 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20  ent thread. */. 
1d80: 20 20 20 48 41 4e 44 4c 45 20 72 65 61 64 79 45     HANDLE readyE
1d90: 76 65 6e 74 3b 09 09 2f 2a 20 45 76 65 6e 74 20  vent;../* Event 
1da0: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1db0: 61 20 73 6f 63 6b 65 74 20 65 76 65 6e 74 20 69  a socket event i
1dc0: 73 0a 09 09 09 09 20 2a 20 72 65 61 64 79 2e 20  s..... * ready. 
1dd0: 41 6c 73 6f 20 75 73 65 64 20 74 6f 20 69 6e 64  Also used to ind
1de0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 09  icate that the..
1df0: 09 09 09 20 2a 20 73 6f 63 6b 65 74 54 68 72 65  ... * socketThre
1e00: 61 64 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74  ad has been init
1e10: 69 61 6c 69 7a 65 64 20 61 6e 64 20 68 61 73 0a  ialized and has.
1e20: 09 09 09 09 20 2a 20 73 74 61 72 74 65 64 2e 20  .... * started. 
1e30: 2a 2f 0a 20 20 20 20 48 41 4e 44 4c 45 20 73 6f  */.    HANDLE so
1e40: 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 3b 09 2f 2a  cketListLock;./*
1e50: 20 57 69 6e 33 32 20 45 76 65 6e 74 20 74 6f 20   Win32 Event to 
1e60: 6c 6f 63 6b 20 74 68 65 20 73 6f 63 6b 65 74 4c  lock the socketL
1e70: 69 73 74 20 2a 2f 0a 20 20 20 20 54 63 70 53 74  ist */.    TcpSt
1e80: 61 74 65 20 2a 70 65 6e 64 69 6e 67 54 63 70 53  ate *pendingTcpS
1e90: 74 61 74 65 3b 09 2f 2a 20 54 68 69 73 20 73 6f  tate;./* This so
1ea0: 63 6b 65 74 20 69 73 20 6f 70 65 6e 65 64 20 62  cket is opened b
1eb0: 75 74 20 6e 6f 74 20 6a 65 74 20 69 6e 20 74 68  ut not jet in th
1ec0: 65 0a 09 09 09 09 20 2a 20 6c 69 73 74 2e 20 54  e..... * list. T
1ed0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 6c 73  his value is als
1ee0: 6f 20 63 68 65 63 6b 65 64 20 62 79 0a 09 09 09  o checked by....
1ef0: 09 20 2a 20 74 68 65 20 65 76 65 6e 74 20 73 74  . * the event st
1f00: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
1f10: 54 63 70 53 74 61 74 65 20 2a 73 6f 63 6b 65 74  TcpState *socket
1f20: 4c 69 73 74 3b 09 2f 2a 20 45 76 65 72 79 20 6f  List;./* Every o
1f30: 70 65 6e 20 73 6f 63 6b 65 74 20 69 6e 20 74 68  pen socket in th
1f40: 69 73 20 74 68 72 65 61 64 20 68 61 73 20 61 6e  is thread has an
1f50: 0a 09 09 09 09 20 2a 20 65 6e 74 72 79 20 6f 6e  ..... * entry on
1f60: 20 74 68 69 73 20 6c 69 73 74 2e 20 2a 2f 0a 7d   this list. */.}
1f70: 20 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44   ThreadSpecificD
1f80: 61 74 61 3b 0a 0a 73 74 61 74 69 63 20 54 63 6c  ata;..static Tcl
1f90: 5f 54 68 72 65 61 64 44 61 74 61 4b 65 79 20 64  _ThreadDataKey d
1fa0: 61 74 61 4b 65 79 3b 0a 73 74 61 74 69 63 20 57  ataKey;.static W
1fb0: 4e 44 43 4c 41 53 53 57 20 77 69 6e 64 6f 77 43  NDCLASSW windowC
1fc0: 6c 61 73 73 3b 0a 0a 2f 2a 0a 20 2a 20 53 74 61  lass;../*. * Sta
1fd0: 74 69 63 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  tic routines for
1fe0: 20 74 68 69 73 20 66 69 6c 65 3a 0a 20 2a 2f 0a   this file:. */.
1ff0: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 54 63 70  .static int..Tcp
2000: 43 6f 6e 6e 65 63 74 28 54 63 6c 5f 49 6e 74 65  Connect(Tcl_Inte
2010: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20  rp *interp,.... 
2020: 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74 61     TcpState *sta
2030: 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  te);.static void
2040: 09 09 49 6e 69 74 53 6f 63 6b 65 74 57 69 6e 64  ..InitSocketWind
2050: 6f 77 43 6c 61 73 73 28 76 6f 69 64 29 3b 0a 73  owClass(void);.s
2060: 74 61 74 69 63 20 54 63 70 53 74 61 74 65 20 2a  tatic TcpState *
2070: 09 4e 65 77 53 6f 63 6b 65 74 49 6e 66 6f 28 53  .NewSocketInfo(S
2080: 4f 43 4b 45 54 20 73 6f 63 6b 65 74 29 3b 0a 73  OCKET socket);.s
2090: 74 61 74 69 63 20 76 6f 69 64 09 09 53 6f 63 6b  tatic void..Sock
20a0: 65 74 45 78 69 74 48 61 6e 64 6c 65 72 28 76 6f  etExitHandler(vo
20b0: 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 3b  id *clientData);
20c0: 0a 73 74 61 74 69 63 20 4c 52 45 53 55 4c 54 20  .static LRESULT 
20d0: 43 41 4c 4c 42 41 43 4b 09 53 6f 63 6b 65 74 50  CALLBACK.SocketP
20e0: 72 6f 63 28 48 57 4e 44 20 68 77 6e 64 2c 20 55  roc(HWND hwnd, U
20f0: 49 4e 54 20 6d 65 73 73 61 67 65 2c 20 57 50 41  INT message, WPA
2100: 52 41 4d 20 77 50 61 72 61 6d 2c 0a 09 09 09 20  RAM wParam,.... 
2110: 20 20 20 4c 50 41 52 41 4d 20 6c 50 61 72 61 6d     LPARAM lParam
2120: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09  );.static void..
2130: 54 63 70 41 63 63 65 70 74 28 54 63 70 46 64 4c  TcpAccept(TcpFdL
2140: 69 73 74 20 2a 66 64 73 2c 20 53 4f 43 4b 45 54  ist *fds, SOCKET
2150: 20 6e 65 77 53 6f 63 6b 65 74 2c 20 61 64 64 72   newSocket, addr
2160: 65 73 73 20 61 64 64 72 29 3b 0a 73 74 61 74 69  ess addr);.stati
2170: 63 20 69 6e 74 09 09 57 61 69 74 46 6f 72 43 6f  c int..WaitForCo
2180: 6e 6e 65 63 74 28 54 63 70 53 74 61 74 65 20 2a  nnect(TcpState *
2190: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 2a 65  statePtr, int *e
21a0: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 73 74  rrorCodePtr);.st
21b0: 61 74 69 63 20 69 6e 74 09 09 57 61 69 74 46 6f  atic int..WaitFo
21c0: 72 53 6f 63 6b 65 74 45 76 65 6e 74 28 54 63 70  rSocketEvent(Tcp
21d0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
21e0: 20 69 6e 74 20 65 76 65 6e 74 73 2c 0a 09 09 09   int events,....
21f0: 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f      int *errorCo
2200: 64 65 50 74 72 29 3b 0a 73 74 61 74 69 63 20 76  dePtr);.static v
2210: 6f 69 64 09 09 41 64 64 53 6f 63 6b 65 74 49 6e  oid..AddSocketIn
2220: 66 6f 46 64 28 54 63 70 53 74 61 74 65 20 2a 73  foFd(TcpState *s
2230: 74 61 74 65 50 74 72 2c 20 53 4f 43 4b 45 54 20  tatePtr, SOCKET 
2240: 73 6f 63 6b 65 74 29 3b 0a 73 74 61 74 69 63 20  socket);.static 
2250: 69 6e 74 09 09 46 69 6e 64 46 44 49 6e 4c 69 73  int..FindFDInLis
2260: 74 28 54 63 70 53 74 61 74 65 20 2a 73 74 61 74  t(TcpState *stat
2270: 65 50 74 72 2c 20 53 4f 43 4b 45 54 20 73 6f 63  ePtr, SOCKET soc
2280: 6b 65 74 29 3b 0a 73 74 61 74 69 63 20 44 57 4f  ket);.static DWO
2290: 52 44 20 57 49 4e 41 50 49 09 53 6f 63 6b 65 74  RD WINAPI.Socket
22a0: 54 68 72 65 61 64 28 4c 50 56 4f 49 44 20 61 72  Thread(LPVOID ar
22b0: 67 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09  g);.static void.
22c0: 09 54 63 70 54 68 72 65 61 64 41 63 74 69 6f 6e  .TcpThreadAction
22d0: 50 72 6f 63 28 76 6f 69 64 20 2a 69 6e 73 74 61  Proc(void *insta
22e0: 6e 63 65 44 61 74 61 2c 0a 09 09 09 20 20 20 20  nceData,....    
22f0: 69 6e 74 20 61 63 74 69 6f 6e 29 3b 0a 73 74 61  int action);.sta
2300: 74 69 63 20 69 6e 74 09 09 54 63 70 43 6c 6f 73  tic int..TcpClos
2310: 65 50 72 6f 63 28 76 6f 69 64 20 2a 2c 20 54 63  eProc(void *, Tc
2320: 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 0a 73 74  l_Interp *);..st
2330: 61 74 69 63 20 54 63 6c 5f 45 76 65 6e 74 43 68  atic Tcl_EventCh
2340: 65 63 6b 50 72 6f 63 09 53 6f 63 6b 65 74 43 68  eckProc.SocketCh
2350: 65 63 6b 50 72 6f 63 3b 0a 73 74 61 74 69 63 20  eckProc;.static 
2360: 54 63 6c 5f 45 76 65 6e 74 50 72 6f 63 09 09 53  Tcl_EventProc..S
2370: 6f 63 6b 65 74 45 76 65 6e 74 50 72 6f 63 3b 0a  ocketEventProc;.
2380: 73 74 61 74 69 63 20 54 63 6c 5f 45 76 65 6e 74  static Tcl_Event
2390: 53 65 74 75 70 50 72 6f 63 09 53 6f 63 6b 65 74  SetupProc.Socket
23a0: 53 65 74 75 70 50 72 6f 63 3b 0a 73 74 61 74 69  SetupProc;.stati
23b0: 63 20 54 63 6c 5f 44 72 69 76 65 72 42 6c 6f 63  c Tcl_DriverBloc
23c0: 6b 4d 6f 64 65 50 72 6f 63 09 54 63 70 42 6c 6f  kModeProc.TcpBlo
23d0: 63 6b 4d 6f 64 65 50 72 6f 63 3b 0a 73 74 61 74  ckModeProc;.stat
23e0: 69 63 20 54 63 6c 5f 44 72 69 76 65 72 43 6c 6f  ic Tcl_DriverClo
23f0: 73 65 32 50 72 6f 63 09 54 63 70 43 6c 6f 73 65  se2Proc.TcpClose
2400: 32 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 54 63  2Proc;.static Tc
2410: 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f  l_DriverSetOptio
2420: 6e 50 72 6f 63 09 54 63 70 53 65 74 4f 70 74 69  nProc.TcpSetOpti
2430: 6f 6e 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 54  onProc;.static T
2440: 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69  cl_DriverGetOpti
2450: 6f 6e 50 72 6f 63 09 54 63 70 47 65 74 4f 70 74  onProc.TcpGetOpt
2460: 69 6f 6e 50 72 6f 63 3b 0a 73 74 61 74 69 63 20  ionProc;.static 
2470: 54 63 6c 5f 44 72 69 76 65 72 49 6e 70 75 74 50  Tcl_DriverInputP
2480: 72 6f 63 09 54 63 70 49 6e 70 75 74 50 72 6f 63  roc.TcpInputProc
2490: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 44 72 69  ;.static Tcl_Dri
24a0: 76 65 72 4f 75 74 70 75 74 50 72 6f 63 09 54 63  verOutputProc.Tc
24b0: 70 4f 75 74 70 75 74 50 72 6f 63 3b 0a 73 74 61  pOutputProc;.sta
24c0: 74 69 63 20 54 63 6c 5f 44 72 69 76 65 72 57 61  tic Tcl_DriverWa
24d0: 74 63 68 50 72 6f 63 09 54 63 70 57 61 74 63 68  tchProc.TcpWatch
24e0: 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 54 63 6c  Proc;.static Tcl
24f0: 5f 44 72 69 76 65 72 47 65 74 48 61 6e 64 6c 65  _DriverGetHandle
2500: 50 72 6f 63 09 54 63 70 47 65 74 48 61 6e 64 6c  Proc.TcpGetHandl
2510: 65 50 72 6f 63 3b 0a 0a 2f 2a 0a 20 2a 20 54 68  eProc;../*. * Th
2520: 69 73 20 73 74 72 75 63 74 75 72 65 20 64 65 73  is structure des
2530: 63 72 69 62 65 73 20 74 68 65 20 63 68 61 6e 6e  cribes the chann
2540: 65 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72  el type structur
2550: 65 20 66 6f 72 20 54 43 50 20 73 6f 63 6b 65 74  e for TCP socket
2560: 0a 20 2a 20 62 61 73 65 64 20 49 4f 3a 0a 20 2a  . * based IO:. *
2570: 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
2580: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20  Tcl_ChannelType 
2590: 74 63 70 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d  tcpChannelType =
25a0: 20 7b 0a 20 20 20 20 22 74 63 70 22 2c 0a 20 20   {.    "tcp",.  
25b0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
25c0: 52 53 49 4f 4e 5f 35 2c 0a 20 20 20 20 4e 55 4c  RSION_5,.    NUL
25d0: 4c 2c 09 09 09 2f 2a 20 44 65 70 72 65 63 61 74  L,.../* Deprecat
25e0: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 70 49 6e  ed. */.    TcpIn
25f0: 70 75 74 50 72 6f 63 2c 0a 20 20 20 20 54 63 70  putProc,.    Tcp
2600: 4f 75 74 70 75 74 50 72 6f 63 2c 0a 20 20 20 20  OutputProc,.    
2610: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 44 65 70 72 65  NULL,.../* Depre
2620: 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63  cated. */.    Tc
2630: 70 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 0a  pSetOptionProc,.
2640: 20 20 20 20 54 63 70 47 65 74 4f 70 74 69 6f 6e      TcpGetOption
2650: 50 72 6f 63 2c 0a 20 20 20 20 54 63 70 57 61 74  Proc,.    TcpWat
2660: 63 68 50 72 6f 63 2c 0a 20 20 20 20 54 63 70 47  chProc,.    TcpG
2670: 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 0a 20 20  etHandleProc,.  
2680: 20 20 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 2c    TcpClose2Proc,
2690: 0a 20 20 20 20 54 63 70 42 6c 6f 63 6b 4d 6f 64  .    TcpBlockMod
26a0: 65 50 72 6f 63 2c 0a 20 20 20 20 4e 55 4c 4c 2c  eProc,.    NULL,
26b0: 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63  .../* Flush proc
26c0: 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09  . */.    NULL,..
26d0: 09 2f 2a 20 42 75 62 62 6c 65 64 20 65 76 65 6e  ./* Bubbled even
26e0: 74 20 68 61 6e 64 6c 65 72 20 70 72 6f 63 2e 20  t handler proc. 
26f0: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f  */.    NULL,.../
2700: 2a 20 53 65 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a  * Seek proc. */.
2710: 20 20 20 20 54 63 70 54 68 72 65 61 64 41 63 74      TcpThreadAct
2720: 69 6f 6e 50 72 6f 63 2c 0a 20 20 20 20 4e 55 4c  ionProc,.    NUL
2730: 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 20  L.../* Truncate 
2740: 70 72 6f 63 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  proc. */.};../*.
2750: 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67   * The following
2760: 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20   variable holds 
2770: 74 68 65 20 6e 65 74 77 6f 72 6b 20 6e 61 6d 65  the network name
2780: 20 6f 66 20 74 68 69 73 20 68 6f 73 74 2e 0a 20   of this host.. 
2790: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 49 6e  */..static TclIn
27a0: 69 74 50 72 6f 63 65 73 73 47 6c 6f 62 61 6c 56  itProcessGlobalV
27b0: 61 6c 75 65 50 72 6f 63 20 49 6e 69 74 69 61 6c  alueProc Initial
27c0: 69 7a 65 48 6f 73 74 4e 61 6d 65 3b 0a 73 74 61  izeHostName;.sta
27d0: 74 69 63 20 50 72 6f 63 65 73 73 47 6c 6f 62 61  tic ProcessGloba
27e0: 6c 56 61 6c 75 65 20 68 6f 73 74 4e 61 6d 65 20  lValue hostName 
27f0: 3d 0a 09 7b 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20  =..{0, 0, NULL, 
2800: 4e 55 4c 4c 2c 20 49 6e 69 74 69 61 6c 69 7a 65  NULL, Initialize
2810: 48 6f 73 74 4e 61 6d 65 2c 20 4e 55 4c 4c 2c 20  HostName, NULL, 
2820: 4e 55 4c 4c 7d 3b 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  NULL};.../*. *--
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 6e 64 53  ----. *. * SendS
2880: 65 6c 65 63 74 4d 65 73 73 61 67 65 20 2d 2d 0a  electMessage --.
2890: 20 2a 0a 20 2a 09 53 69 6d 70 6c 65 20 77 72 61   *. *.Simple wra
28a0: 70 70 65 72 20 72 6f 75 6e 64 20 74 68 65 20 53  pper round the S
28b0: 65 6e 64 4d 65 73 73 61 67 65 20 73 79 73 63 61  endMessage sysca
28c0: 6c 6c 20 77 69 74 68 20 61 20 53 4f 43 4b 45 54  ll with a SOCKET
28d0: 5f 53 45 4c 45 43 54 0a 20 2a 09 6d 65 73 73 61  _SELECT. *.messa
28e0: 67 65 20 74 6f 20 61 64 64 20 61 20 62 69 74 20  ge to add a bit 
28f0: 6f 66 20 74 79 70 65 20 73 61 66 65 74 79 2e 0a  of type safety..
2900: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
2950: 73 74 61 74 69 63 20 69 6e 6c 69 6e 65 20 76 6f  static inline vo
2960: 69 64 0a 53 65 6e 64 53 65 6c 65 63 74 4d 65 73  id.SendSelectMes
2970: 73 61 67 65 28 0a 20 20 20 20 54 68 72 65 61 64  sage(.    Thread
2980: 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74 73  SpecificData *ts
2990: 64 50 74 72 2c 09 2f 2a 20 52 65 66 65 72 65 6e  dPtr,./* Referen
29a0: 63 65 20 74 6f 20 74 68 69 73 20 74 68 72 65 61  ce to this threa
29b0: 64 27 73 20 77 6f 72 6b 65 72 2e 20 2a 2f 0a 20  d's worker. */. 
29c0: 20 20 20 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e     int operation
29d0: 2c 09 09 2f 2a 20 57 68 65 74 68 65 72 20 74 6f  ,../* Whether to
29e0: 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 66   add or remove f
29f0: 72 6f 6d 20 74 68 65 20 6d 61 73 6b 2e 20 2a 2f  rom the mask. */
2a00: 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 70  .    TcpState *p
2a10: 61 79 6c 6f 61 64 29 09 09 2f 2a 20 57 68 61 74  ayload)../* What
2a20: 20 73 6f 63 6b 65 74 20 74 6f 20 61 64 64 2f 72   socket to add/r
2a30: 65 6d 6f 76 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20  emove. */.{.    
2a40: 53 65 6e 64 4d 65 73 73 61 67 65 57 28 74 73 64  SendMessageW(tsd
2a50: 50 74 72 2d 3e 68 77 6e 64 2c 20 53 4f 43 4b 45  Ptr->hwnd, SOCKE
2a60: 54 5f 53 45 4c 45 43 54 2c 20 28 57 50 41 52 41  T_SELECT, (WPARA
2a70: 4d 29 20 6f 70 65 72 61 74 69 6f 6e 2c 0a 09 20  M) operation,.. 
2a80: 20 20 20 28 4c 50 41 52 41 4d 29 20 70 61 79 6c     (LPARAM) payl
2a90: 6f 61 64 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20  oad);.}.../*. * 
2aa0: 41 64 64 72 65 73 73 20 70 72 69 6e 74 20 64 65  Address print de
2ab0: 62 75 67 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  bug functions. *
2ac0: 2f 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 69  /.#if 0.static i
2ad0: 6e 6c 69 6e 65 20 76 6f 69 64 0a 70 72 69 6e 74  nline void.print
2ae0: 61 64 64 72 69 6e 66 6f 28 0a 20 20 20 20 73 74  addrinfo(.    st
2af0: 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 61  ruct addrinfo *a
2b00: 69 2c 0a 20 20 20 20 63 68 61 72 20 2a 70 72 65  i,.    char *pre
2b10: 66 69 78 29 0a 7b 0a 20 20 20 20 63 68 61 72 20  fix).{.    char 
2b20: 68 6f 73 74 5b 4e 49 5f 4d 41 58 48 4f 53 54 5d  host[NI_MAXHOST]
2b30: 2c 20 70 6f 72 74 5b 4e 49 5f 4d 41 58 53 45 52  , port[NI_MAXSER
2b40: 56 5d 3b 0a 0a 20 20 20 20 67 65 74 6e 61 6d 65  V];..    getname
2b50: 69 6e 66 6f 28 61 69 2d 3e 61 69 5f 61 64 64 72  info(ai->ai_addr
2b60: 2c 20 61 69 2d 3e 61 69 5f 61 64 64 72 6c 65 6e  , ai->ai_addrlen
2b70: 2c 0a 09 20 20 20 20 68 6f 73 74 2c 20 73 69 7a  ,..    host, siz
2b80: 65 6f 66 28 68 6f 73 74 29 2c 20 70 6f 72 74 2c  eof(host), port,
2b90: 20 73 69 7a 65 6f 66 28 70 6f 72 74 29 2c 0a 09   sizeof(port),..
2ba0: 20 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f      NI_NUMERICHO
2bb0: 53 54 20 7c 20 4e 49 5f 4e 55 4d 45 52 49 43 53  ST | NI_NUMERICS
2bc0: 45 52 56 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ERV);.}..static 
2bd0: 76 6f 69 64 0a 70 72 69 6e 74 61 64 64 72 69 6e  void.printaddrin
2be0: 66 6f 6c 69 73 74 28 0a 20 20 20 20 73 74 72 75  folist(.    stru
2bf0: 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 61 64 64  ct addrinfo *add
2c00: 72 6c 69 73 74 2c 0a 20 20 20 20 63 68 61 72 20  rlist,.    char 
2c10: 2a 70 72 65 66 69 78 29 0a 7b 0a 20 20 20 20 73  *prefix).{.    s
2c20: 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a  truct addrinfo *
2c30: 61 69 3b 0a 0a 20 20 20 20 66 6f 72 20 28 61 69  ai;..    for (ai
2c40: 20 3d 20 61 64 64 72 6c 69 73 74 3b 20 61 69 20   = addrlist; ai 
2c50: 21 3d 20 4e 55 4c 4c 3b 20 61 69 20 3d 20 61 69  != NULL; ai = ai
2c60: 2d 3e 61 69 5f 6e 65 78 74 29 20 7b 0a 09 70 72  ->ai_next) {..pr
2c70: 69 6e 74 61 64 64 72 69 6e 66 6f 28 61 69 2c 20  intaddrinfo(ai, 
2c80: 70 72 65 66 69 78 29 3b 0a 20 20 20 20 7d 0a 7d  prefix);.    }.}
2c90: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d  .#endif.../*. *-
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 49 6e 69 74  -----. *. * Init
2cf0: 69 61 6c 69 7a 65 48 6f 73 74 4e 61 6d 65 20 2d  ializeHostName -
2d00: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 72 6f 75  -. *. *.This rou
2d10: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
2d20: 6f 63 65 73 73 20 67 6c 6f 62 61 6c 20 76 61 6c  ocess global val
2d30: 75 65 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  ue of the name o
2d40: 66 20 74 68 65 20 6c 6f 63 61 6c 0a 20 2a 09 68  f the local. *.h
2d50: 6f 73 74 20 6f 6e 20 77 68 69 63 68 20 74 68 65  ost on which the
2d60: 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e   process is runn
2d70: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ing.. *. * Resul
2d80: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
2d90: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f  --------. */..vo
2de0: 69 64 0a 49 6e 69 74 69 61 6c 69 7a 65 48 6f 73  id.InitializeHos
2df0: 74 4e 61 6d 65 28 0a 20 20 20 20 63 68 61 72 20  tName(.    char 
2e00: 2a 2a 76 61 6c 75 65 50 74 72 2c 0a 20 20 20 20  **valuePtr,.    
2e10: 73 69 7a 65 5f 74 20 2a 6c 65 6e 67 74 68 50 74  size_t *lengthPt
2e20: 72 2c 0a 20 20 20 20 54 63 6c 5f 45 6e 63 6f 64  r,.    Tcl_Encod
2e30: 69 6e 67 20 2a 65 6e 63 6f 64 69 6e 67 50 74 72  ing *encodingPtr
2e40: 29 0a 7b 0a 20 20 20 20 57 43 48 41 52 20 77 62  ).{.    WCHAR wb
2e50: 75 66 5b 32 35 36 5d 3b 0a 20 20 20 20 44 57 4f  uf[256];.    DWO
2e60: 52 44 20 6c 65 6e 67 74 68 20 3d 20 73 69 7a 65  RD length = size
2e70: 6f 66 28 77 62 75 66 29 20 2f 20 73 69 7a 65 6f  of(wbuf) / sizeo
2e80: 66 28 57 43 48 41 52 29 3b 0a 20 20 20 20 54 63  f(WCHAR);.    Tc
2e90: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 0a 20  l_DString ds;.. 
2ea0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
2eb0: 69 74 28 26 64 73 29 3b 0a 20 20 20 20 69 66 20  it(&ds);.    if 
2ec0: 28 47 65 74 43 6f 6d 70 75 74 65 72 4e 61 6d 65  (GetComputerName
2ed0: 45 78 57 28 43 6f 6d 70 75 74 65 72 4e 61 6d 65  ExW(ComputerName
2ee0: 50 68 79 73 69 63 61 6c 44 6e 73 46 75 6c 6c 79  PhysicalDnsFully
2ef0: 51 75 61 6c 69 66 69 65 64 2c 20 77 62 75 66 2c  Qualified, wbuf,
2f00: 20 26 6c 65 6e 67 74 68 29 20 21 3d 20 30 29 20   &length) != 0) 
2f10: 7b 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6e 76 65 72  {../*.. * Conver
2f20: 74 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 57 43  t string from WC
2f30: 48 41 52 20 74 6f 20 75 74 66 2d 38 2c 20 74 68  HAR to utf-8, th
2f40: 65 6e 20 63 68 61 6e 67 65 20 74 6f 20 6c 6f 77  en change to low
2f50: 65 72 63 61 73 65 2c 0a 09 20 2a 20 74 68 65 6e  ercase,.. * then
2f60: 20 74 6f 20 73 79 73 74 65 6d 20 65 6e 63 6f 64   to system encod
2f70: 69 6e 67 2e 0a 09 20 2a 2f 0a 09 54 63 6c 5f 44  ing... */..Tcl_D
2f80: 53 74 72 69 6e 67 20 69 6e 44 73 3b 0a 0a 09 54  String inDs;...T
2f90: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2fa0: 69 6e 44 73 29 3b 0a 09 54 63 6c 5f 55 74 66 54  inDs);..Tcl_UtfT
2fb0: 6f 4c 6f 77 65 72 28 54 63 6c 5f 57 43 68 61 72  oLower(Tcl_WChar
2fc0: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 77 62 75  ToUtfDString(wbu
2fd0: 66 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e  f, TCL_INDEX_NON
2fe0: 45 2c 20 26 69 6e 44 73 29 29 3b 0a 09 54 63 6c  E, &inDs));..Tcl
2ff0: 5f 55 74 66 54 6f 45 78 74 65 72 6e 61 6c 44 53  _UtfToExternalDS
3000: 74 72 69 6e 67 45 78 28 4e 55 4c 4c 2c 20 4e 55  tringEx(NULL, NU
3010: 4c 4c 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  LL, Tcl_DStringV
3020: 61 6c 75 65 28 26 69 6e 44 73 29 2c 0a 09 09 54  alue(&inDs),...T
3030: 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 2c 20 54  CL_INDEX_NONE, T
3040: 43 4c 5f 45 4e 43 4f 44 49 4e 47 5f 50 52 4f 46  CL_ENCODING_PROF
3050: 49 4c 45 5f 54 43 4c 38 2c 20 26 64 73 2c 20 4e  ILE_TCL8, &ds, N
3060: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  ULL);..Tcl_DStri
3070: 6e 67 46 72 65 65 28 26 69 6e 44 73 29 3b 0a 20  ngFree(&inDs);. 
3080: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
3090: 49 6e 69 74 53 6f 63 6b 65 74 73 28 29 3b 0a 09  InitSockets();..
30a0: 2f 2a 0a 09 20 2a 20 54 68 65 20 62 75 66 66 65  /*.. * The buffe
30b0: 72 20 73 69 7a 65 20 6f 66 20 32 35 36 20 69 73  r size of 256 is
30c0: 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 62 79 20   recommended by 
30d0: 74 68 65 20 4d 53 44 4e 20 70 61 67 65 20 74 68  the MSDN page th
30e0: 61 74 0a 09 20 2a 20 64 6f 63 75 6d 65 6e 74 73  at.. * documents
30f0: 20 67 65 74 68 6f 73 74 6e 61 6d 65 28 29 20 61   gethostname() a
3100: 73 20 62 65 69 6e 67 20 61 6c 77 61 79 73 20 61  s being always a
3110: 64 65 71 75 61 74 65 2e 0a 09 20 2a 2f 0a 0a 09  dequate... */...
3120: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
3130: 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  &ds);..Tcl_DStri
3140: 6e 67 53 65 74 4c 65 6e 67 74 68 28 26 64 73 2c  ngSetLength(&ds,
3150: 20 32 35 36 29 3b 0a 09 67 65 74 68 6f 73 74 6e   256);..gethostn
3160: 61 6d 65 28 54 63 6c 5f 44 53 74 72 69 6e 67 56  ame(Tcl_DStringV
3170: 61 6c 75 65 28 26 64 73 29 2c 20 28 69 6e 74 29  alue(&ds), (int)
3180: 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74  Tcl_DStringLengt
3190: 68 28 26 64 73 29 29 3b 0a 09 54 63 6c 5f 44 53  h(&ds));..Tcl_DS
31a0: 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 26  tringSetLength(&
31b0: 64 73 2c 20 73 74 72 6c 65 6e 28 54 63 6c 5f 44  ds, strlen(Tcl_D
31c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 73 29  StringValue(&ds)
31d0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a  ));.    }..    *
31e0: 65 6e 63 6f 64 69 6e 67 50 74 72 20 3d 20 54 63  encodingPtr = Tc
31f0: 6c 5f 47 65 74 45 6e 63 6f 64 69 6e 67 28 4e 55  l_GetEncoding(NU
3200: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 2a  LL, NULL);.    *
3210: 6c 65 6e 67 74 68 50 74 72 20 3d 20 54 63 6c 5f  lengthPtr = Tcl_
3220: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64  DStringLength(&d
3230: 73 29 3b 0a 20 20 20 20 2a 76 61 6c 75 65 50 74  s);.    *valuePt
3240: 72 20 3d 20 28 63 68 61 72 20 2a 29 54 63 6c 5f  r = (char *)Tcl_
3250: 41 6c 6c 6f 63 28 2a 6c 65 6e 67 74 68 50 74 72  Alloc(*lengthPtr
3260: 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70   + 1);.    memcp
3270: 79 28 2a 76 61 6c 75 65 50 74 72 2c 20 54 63 6c  y(*valuePtr, Tcl
3280: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64  _DStringValue(&d
3290: 73 29 2c 20 2a 6c 65 6e 67 74 68 50 74 72 20 2b  s), *lengthPtr +
32a0: 20 31 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74   1);.    Tcl_DSt
32b0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 7d  ringFree(&ds);.}
32c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3310: 2a 0a 20 2a 20 54 63 6c 5f 47 65 74 48 6f 73 74  *. * Tcl_GetHost
3320: 4e 61 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65  Name --. *. *.Re
3330: 74 75 72 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  turns the name o
3340: 66 20 74 68 65 20 6c 6f 63 61 6c 20 68 6f 73 74  f the local host
3350: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
3360: 0a 20 2a 09 41 20 73 74 72 69 6e 67 20 63 6f 6e  . *.A string con
3370: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 65 74 77  taining the netw
3380: 6f 72 6b 20 6e 61 6d 65 20 66 6f 72 20 74 68 69  ork name for thi
3390: 73 20 6d 61 63 68 69 6e 65 2c 20 6f 72 20 61 6e  s machine, or an
33a0: 20 65 6d 70 74 79 0a 20 2a 09 73 74 72 69 6e 67   empty. *.string
33b0: 20 69 66 20 77 65 20 63 61 6e 27 74 20 66 69 67   if we can't fig
33c0: 75 72 65 20 6f 75 74 20 74 68 65 20 6e 61 6d 65  ure out the name
33d0: 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
33e0: 74 20 6e 6f 74 20 6d 6f 64 69 66 79 20 6f 72 0a  t not modify or.
33f0: 20 2a 09 66 72 65 65 20 74 68 69 73 20 73 74 72   *.free this str
3400: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
3410: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 63 68  effects:. *.Cach
3420: 65 73 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 72  es the name to r
3430: 65 74 75 72 6e 20 66 6f 72 20 66 75 74 75 72 65  eturn for future
3440: 20 63 61 6c 6c 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d   calls.. *. *---
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3490: 2d 2d 2d 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63  ---. */..const c
34a0: 68 61 72 20 2a 0a 54 63 6c 5f 47 65 74 48 6f 73  har *.Tcl_GetHos
34b0: 74 4e 61 6d 65 28 76 6f 69 64 29 0a 7b 0a 20 20  tName(void).{.  
34c0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74    return Tcl_Get
34d0: 53 74 72 69 6e 67 28 54 63 6c 47 65 74 50 72 6f  String(TclGetPro
34e0: 63 65 73 73 47 6c 6f 62 61 6c 56 61 6c 75 65 28  cessGlobalValue(
34f0: 26 68 6f 73 74 4e 61 6d 65 29 29 3b 0a 7d 0a 0c  &hostName));.}..
3500: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3550: 20 2a 20 54 63 6c 49 6e 69 74 53 6f 63 6b 65 74   * TclInitSocket
3560: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69  s --. *. *.Initi
3570: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 73 6f 63  alization of soc
3580: 6b 65 74 73 20 66 6f 72 20 74 68 65 20 74 68 72  kets for the thr
3590: 65 61 64 2e 20 41 6c 73 6f 20 63 72 65 61 74 65  ead. Also create
35a0: 73 20 6d 65 73 73 61 67 65 0a 20 2a 09 68 61 6e  s message. *.han
35b0: 64 6c 69 6e 67 20 77 69 6e 64 6f 77 20 63 6c 61  dling window cla
35c0: 73 73 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ss for the proce
35d0: 73 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a  ss if needed.. *
35e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
35f0: 4e 6f 74 68 69 6e 67 2e 20 50 61 6e 69 63 73 20  Nothing. Panics 
3600: 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 20 2a 0a 20  on failure.. *. 
3610: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3620: 20 2a 09 49 66 20 6e 6f 74 20 61 6c 72 65 61 64   *.If not alread
3630: 79 20 70 72 65 70 61 72 65 64 2c 20 69 6e 69 74  y prepared, init
3640: 69 61 6c 69 7a 65 73 20 74 68 65 20 54 53 44 20  ializes the TSD 
3650: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73 6f  structure and so
3660: 63 6b 65 74 0a 20 2a 09 6d 65 73 73 61 67 65 20  cket. *.message 
3670: 68 61 6e 64 6c 69 6e 67 20 74 68 72 65 61 64 20  handling thread 
3680: 61 73 73 6f 63 69 61 74 65 64 20 74 6f 20 74 68  associated to th
3690: 65 20 63 61 6c 6c 69 6e 67 20 74 68 72 65 61 64  e calling thread
36a0: 20 66 6f 72 20 74 68 65 0a 20 2a 09 73 75 62 73   for the. *.subs
36b0: 79 73 74 65 6d 20 6f 66 20 74 68 65 20 64 72 69  ystem of the dri
36c0: 76 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ver.. *. *------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 49 6e  . */..void.TclIn
3720: 69 74 53 6f 63 6b 65 74 73 28 76 6f 69 64 29 0a  itSockets(void).
3730: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 6e 20 50 65  {.    /* Then Pe
3740: 72 20 74 68 72 65 61 64 20 69 6e 69 74 69 61 6c  r thread initial
3750: 69 7a 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ization. */.    
3760: 44 57 4f 52 44 20 69 64 3b 0a 20 20 20 20 54 68  DWORD id;.    Th
3770: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
3780: 20 2a 74 73 64 50 74 72 20 3d 20 28 54 68 72 65   *tsdPtr = (Thre
3790: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a  adSpecificData *
37a0: 29 0a 09 20 20 20 20 54 63 6c 54 68 72 65 61 64  )..    TclThread
37b0: 44 61 74 61 4b 65 79 47 65 74 28 26 64 61 74 61  DataKeyGet(&data
37c0: 4b 65 79 29 3b 0a 0a 20 20 20 20 69 66 20 28 74  Key);..    if (t
37d0: 73 64 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  sdPtr != NULL) {
37e0: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
37f0: 0a 20 20 20 20 49 6e 69 74 53 6f 63 6b 65 74 57  .    InitSocketW
3800: 69 6e 64 6f 77 43 6c 61 73 73 28 29 3b 0a 0a 20  indowClass();.. 
3810: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4f 4b 2c     /*.     * OK,
3820: 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73   this thread has
3830: 20 6e 65 76 65 72 20 64 6f 6e 65 20 61 6e 79 74   never done anyt
3840: 68 69 6e 67 20 77 69 74 68 20 73 6f 63 6b 65 74  hing with socket
3850: 73 20 62 65 66 6f 72 65 2e 20 20 43 6f 6e 73 74  s before.  Const
3860: 72 75 63 74 0a 20 20 20 20 20 2a 20 61 20 77 6f  ruct.     * a wo
3870: 72 6b 65 72 20 74 68 72 65 61 64 20 74 6f 20 68  rker thread to h
3880: 61 6e 64 6c 65 20 61 73 79 6e 63 68 72 6f 6e 6f  andle asynchrono
3890: 75 73 20 65 76 65 6e 74 73 20 72 65 6c 61 74 65  us events relate
38a0: 64 20 74 6f 20 73 6f 63 6b 65 74 73 0a 20 20 20  d to sockets.   
38b0: 20 20 2a 20 61 73 73 69 67 6e 65 64 20 74 6f 20    * assigned to 
38c0: 5f 74 68 69 73 5f 20 74 68 72 65 61 64 2e 0a 20  _this_ thread.. 
38d0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 74 73 64 50      */..    tsdP
38e0: 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 4e 49  tr = TCL_TSD_INI
38f0: 54 28 26 64 61 74 61 4b 65 79 29 3b 0a 20 20 20  T(&dataKey);.   
3900: 20 74 73 64 50 74 72 2d 3e 70 65 6e 64 69 6e 67   tsdPtr->pending
3910: 54 63 70 53 74 61 74 65 20 3d 20 4e 55 4c 4c 3b  TcpState = NULL;
3920: 0a 20 20 20 20 74 73 64 50 74 72 2d 3e 73 6f 63  .    tsdPtr->soc
3930: 6b 65 74 4c 69 73 74 09 3d 20 4e 55 4c 4c 3b 0a  ketList.= NULL;.
3940: 20 20 20 20 74 73 64 50 74 72 2d 3e 68 77 6e 64      tsdPtr->hwnd
3950: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 73 64  .= NULL;.    tsd
3960: 50 74 72 2d 3e 74 68 72 65 61 64 49 64 09 3d 20  Ptr->threadId.= 
3970: 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68  Tcl_GetCurrentTh
3980: 72 65 61 64 28 29 3b 0a 20 20 20 20 74 73 64 50  read();.    tsdP
3990: 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 09 3d  tr->readyEvent.=
39a0: 20 43 72 65 61 74 65 45 76 65 6e 74 57 28 4e 55   CreateEventW(NU
39b0: 4c 4c 2c 20 46 41 4c 53 45 2c 20 46 41 4c 53 45  LL, FALSE, FALSE
39c0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
39d0: 28 74 73 64 50 74 72 2d 3e 72 65 61 64 79 45 76  (tsdPtr->readyEv
39e0: 65 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ent == NULL) {..
39f0: 67 6f 74 6f 20 69 6e 69 74 46 61 69 6c 75 72 65  goto initFailure
3a00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 73 64 50  ;.    }.    tsdP
3a10: 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f  tr->socketListLo
3a20: 63 6b 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74  ck = CreateEvent
3a30: 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 54  W(NULL, FALSE, T
3a40: 52 55 45 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  RUE, NULL);.    
3a50: 69 66 20 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b  if (tsdPtr->sock
3a60: 65 74 4c 69 73 74 4c 6f 63 6b 20 3d 3d 20 4e 55  etListLock == NU
3a70: 4c 4c 29 20 7b 0a 09 67 6f 74 6f 20 69 6e 69 74  LL) {..goto init
3a80: 46 61 69 6c 75 72 65 3b 0a 20 20 20 20 7d 0a 20  Failure;.    }. 
3a90: 20 20 20 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65     tsdPtr->socke
3aa0: 74 54 68 72 65 61 64 20 3d 20 43 72 65 61 74 65  tThread = Create
3ab0: 54 68 72 65 61 64 28 4e 55 4c 4c 2c 20 32 35 36  Thread(NULL, 256
3ac0: 2c 20 53 6f 63 6b 65 74 54 68 72 65 61 64 2c 20  , SocketThread, 
3ad0: 74 73 64 50 74 72 2c 20 30 2c 0a 09 20 20 20 20  tsdPtr, 0,..    
3ae0: 26 69 64 29 3b 0a 20 20 20 20 69 66 20 28 74 73  &id);.    if (ts
3af0: 64 50 74 72 2d 3e 73 6f 63 6b 65 74 54 68 72 65  dPtr->socketThre
3b00: 61 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 67  ad == NULL) {..g
3b10: 6f 74 6f 20 69 6e 69 74 46 61 69 6c 75 72 65 3b  oto initFailure;
3b20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 65 74 54  .    }..    SetT
3b30: 68 72 65 61 64 50 72 69 6f 72 69 74 79 28 74 73  hreadPriority(ts
3b40: 64 50 74 72 2d 3e 73 6f 63 6b 65 74 54 68 72 65  dPtr->socketThre
3b50: 61 64 2c 20 54 48 52 45 41 44 5f 50 52 49 4f 52  ad, THREAD_PRIOR
3b60: 49 54 59 5f 48 49 47 48 45 53 54 29 3b 0a 0a 20  ITY_HIGHEST);.. 
3b70: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 61 69     /*.     * Wai
3b80: 74 20 66 6f 72 20 74 68 65 20 74 68 72 65 61 64  t for the thread
3b90: 20 74 6f 20 73 69 67 6e 61 6c 20 77 68 65 6e 20   to signal when 
3ba0: 74 68 65 20 77 69 6e 64 6f 77 20 68 61 73 20 62  the window has b
3bb0: 65 65 6e 20 63 72 65 61 74 65 64 20 61 6e 64 20  een created and 
3bc0: 69 66 0a 20 20 20 20 20 2a 20 69 74 20 69 73 20  if.     * it is 
3bd0: 72 65 61 64 79 20 74 6f 20 67 6f 2e 0a 20 20 20  ready to go..   
3be0: 20 20 2a 2f 0a 0a 20 20 20 20 57 61 69 74 46 6f    */..    WaitFo
3bf0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73  rSingleObject(ts
3c00: 64 50 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74  dPtr->readyEvent
3c10: 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 0a 20 20  , INFINITE);..  
3c20: 20 20 69 66 20 28 74 73 64 50 74 72 2d 3e 68 77    if (tsdPtr->hw
3c30: 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  nd != NULL) {..T
3c40: 63 6c 5f 43 72 65 61 74 65 45 76 65 6e 74 53 6f  cl_CreateEventSo
3c50: 75 72 63 65 28 53 6f 63 6b 65 74 53 65 74 75 70  urce(SocketSetup
3c60: 50 72 6f 63 2c 20 53 6f 63 6b 65 74 43 68 65 63  Proc, SocketChec
3c70: 6b 50 72 6f 63 2c 20 4e 55 4c 4c 29 3b 0a 09 72  kProc, NULL);..r
3c80: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
3c90: 69 6e 69 74 46 61 69 6c 75 72 65 3a 0a 20 20 20  initFailure:.   
3ca0: 20 54 63 6c 5f 50 61 6e 69 63 28 22 49 6e 69 74   Tcl_Panic("Init
3cb0: 53 6f 63 6b 65 74 73 20 66 61 69 6c 65 64 22 29  Sockets failed")
3cc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  ;.    return;.}.
3cd0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3d20: 0a 20 2a 20 54 63 6c 70 46 69 6e 61 6c 69 7a 65  . * TclpFinalize
3d30: 53 6f 63 6b 65 74 73 20 2d 2d 0a 20 2a 0a 20 2a  Sockets --. *. *
3d40: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69  .This function i
3d50: 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63  s called from Tc
3d60: 6c 5f 46 69 6e 61 6c 69 7a 65 54 68 72 65 61 64  l_FinalizeThread
3d70: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
3d80: 0a 20 2a 09 70 6c 61 74 66 6f 72 6d 20 73 70 65  . *.platform spe
3d90: 63 69 66 69 63 20 73 6f 63 6b 65 74 20 73 75 62  cific socket sub
3da0: 73 79 73 74 65 6d 2e 20 41 6c 73 6f 2c 20 69 74  system. Also, it
3db0: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
3dc0: 72 6f 6d 20 77 69 74 68 69 6e 0a 20 2a 09 74 68  rom within. *.th
3dd0: 69 73 20 6d 6f 64 75 6c 65 20 74 6f 20 63 6c 65  is module to cle
3de0: 61 6e 75 70 20 74 68 65 20 73 74 61 74 65 20 69  anup the state i
3df0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 69 6e 69 74  f unable to init
3e00: 69 61 6c 69 7a 65 20 74 68 65 20 73 6f 63 6b 65  ialize the socke
3e10: 74 73 0a 20 2a 09 73 75 62 73 79 73 74 65 6d 2e  ts. *.subsystem.
3e20: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
3e30: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53   *.None.. *. * S
3e40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3e50: 44 65 6c 65 74 65 73 20 74 68 65 20 65 76 65 6e  Deletes the even
3e60: 74 20 73 6f 75 72 63 65 20 61 6e 64 20 64 65 73  t source and des
3e70: 74 72 6f 79 73 20 74 68 65 20 73 6f 63 6b 65 74  troys the socket
3e80: 20 74 68 72 65 61 64 2e 0a 20 2a 0a 20 2a 2d 2d   thread.. *. *--
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54  ----. */..void.T
3ee0: 63 6c 70 46 69 6e 61 6c 69 7a 65 53 6f 63 6b 65  clpFinalizeSocke
3ef0: 74 73 28 76 6f 69 64 29 0a 7b 0a 20 20 20 20 54  ts(void).{.    T
3f00: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
3f10: 61 20 2a 74 73 64 50 74 72 20 3d 20 28 54 68 72  a *tsdPtr = (Thr
3f20: 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20  eadSpecificData 
3f30: 2a 29 0a 09 20 20 20 20 54 63 6c 54 68 72 65 61  *)..    TclThrea
3f40: 64 44 61 74 61 4b 65 79 47 65 74 28 26 64 61 74  dDataKeyGet(&dat
3f50: 61 4b 65 79 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  aKey);..    /*. 
3f60: 20 20 20 20 2a 20 43 61 72 65 66 75 6c 21 20 54      * Careful! T
3f70: 68 69 73 20 69 73 20 61 20 66 69 6e 61 6c 69 7a  his is a finaliz
3f80: 65 72 21 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  er!.     */..   
3f90: 20 69 66 20 28 74 73 64 50 74 72 20 3d 3d 20 4e   if (tsdPtr == N
3fa0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a  ULL) {..return;.
3fb0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74      }..    if (t
3fc0: 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 54 68 72  sdPtr->socketThr
3fd0: 65 61 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ead != NULL) {..
3fe0: 69 66 20 28 74 73 64 50 74 72 2d 3e 68 77 6e 64  if (tsdPtr->hwnd
3ff0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
4000: 20 50 6f 73 74 4d 65 73 73 61 67 65 57 28 74 73   PostMessageW(ts
4010: 64 50 74 72 2d 3e 68 77 6e 64 2c 20 53 4f 43 4b  dPtr->hwnd, SOCK
4020: 45 54 5f 54 45 52 4d 49 4e 41 54 45 2c 20 30 2c  ET_TERMINATE, 0,
4030: 20 30 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20   0);...    /*.. 
4040: 20 20 20 20 2a 20 57 61 69 74 20 66 6f 72 20 74      * Wait for t
4050: 68 65 20 74 68 72 65 61 64 20 74 6f 20 65 78 69  he thread to exi
4060: 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
4070: 74 68 61 74 20 77 65 20 61 72 65 0a 09 20 20 20  that we are..   
4080: 20 20 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63    * completely c
4090: 6c 65 61 6e 65 64 20 75 70 20 62 65 66 6f 72 65  leaned up before
40a0: 20 77 65 20 6c 65 61 76 65 20 74 68 69 73 20 66   we leave this f
40b0: 75 6e 63 74 69 6f 6e 2e 0a 09 20 20 20 20 20 2a  unction...     *
40c0: 2f 0a 0a 09 20 20 20 20 57 61 69 74 46 6f 72 53  /...    WaitForS
40d0: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50  ingleObject(tsdP
40e0: 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 2c 20  tr->readyEvent, 
40f0: 49 4e 46 49 4e 49 54 45 29 3b 0a 09 20 20 20 20  INFINITE);..    
4100: 74 73 64 50 74 72 2d 3e 68 77 6e 64 20 3d 20 4e  tsdPtr->hwnd = N
4110: 55 4c 4c 3b 0a 09 7d 0a 09 43 6c 6f 73 65 48 61  ULL;..}..CloseHa
4120: 6e 64 6c 65 28 74 73 64 50 74 72 2d 3e 73 6f 63  ndle(tsdPtr->soc
4130: 6b 65 74 54 68 72 65 61 64 29 3b 0a 09 74 73 64  ketThread);..tsd
4140: 50 74 72 2d 3e 73 6f 63 6b 65 74 54 68 72 65 61  Ptr->socketThrea
4150: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
4160: 20 20 20 20 69 66 20 28 74 73 64 50 74 72 2d 3e      if (tsdPtr->
4170: 72 65 61 64 79 45 76 65 6e 74 20 21 3d 20 4e 55  readyEvent != NU
4180: 4c 4c 29 20 7b 0a 09 43 6c 6f 73 65 48 61 6e 64  LL) {..CloseHand
4190: 6c 65 28 74 73 64 50 74 72 2d 3e 72 65 61 64 79  le(tsdPtr->ready
41a0: 45 76 65 6e 74 29 3b 0a 09 74 73 64 50 74 72 2d  Event);..tsdPtr-
41b0: 3e 72 65 61 64 79 45 76 65 6e 74 20 3d 20 4e 55  >readyEvent = NU
41c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
41d0: 20 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74   (tsdPtr->socket
41e0: 4c 69 73 74 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c  ListLock != NULL
41f0: 29 20 7b 0a 09 43 6c 6f 73 65 48 61 6e 64 6c 65  ) {..CloseHandle
4200: 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c  (tsdPtr->socketL
4210: 69 73 74 4c 6f 63 6b 29 3b 0a 09 74 73 64 50 74  istLock);..tsdPt
4220: 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63  r->socketListLoc
4230: 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  k = NULL;.    }.
4240: 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 45 76      Tcl_DeleteEv
4250: 65 6e 74 53 6f 75 72 63 65 28 53 6f 63 6b 65 74  entSource(Socket
4260: 53 65 74 75 70 50 72 6f 63 2c 20 53 6f 63 6b 65  SetupProc, Socke
4270: 74 43 68 65 63 6b 50 72 6f 63 2c 20 4e 55 4c 4c  tCheckProc, NULL
4280: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42d0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 70 42 6c 6f 63  --. *. * TcpBloc
42e0: 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a  kModeProc --. *.
42f0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
4300: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74   is invoked by t
4310: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65  he generic IO le
4320: 76 65 6c 20 74 6f 20 73 65 74 20 62 6c 6f 63 6b  vel to set block
4330: 69 6e 67 20 61 6e 64 0a 20 2a 09 6e 6f 6e 62 6c  ing and. *.nonbl
4340: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 6f 6e 20 61  ocking mode on a
4350: 20 54 43 50 20 73 6f 63 6b 65 74 20 62 61 73 65   TCP socket base
4360: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  d channel.. *. *
4370: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69   Results:. *.0 i
4380: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 72  f successful, er
4390: 72 6e 6f 20 77 68 65 6e 20 66 61 69 6c 65 64 2e  rno when failed.
43a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
43b0: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65  cts:. *.Sets the
43c0: 20 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f   device into blo
43d0: 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63  cking or nonbloc
43e0: 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a  king mode.. *. *
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4430: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
4440: 69 63 20 69 6e 74 0a 54 63 70 42 6c 6f 63 6b 4d  ic int.TcpBlockM
4450: 6f 64 65 50 72 6f 63 28 0a 20 20 20 20 76 6f 69  odeProc(.    voi
4460: 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  d *instanceData,
4470: 09 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74  ../* Socket stat
4480: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f  e. */.    int mo
4490: 64 65 29 09 09 09 2f 2a 20 54 68 65 20 6d 6f 64  de).../* The mod
44a0: 65 20 74 6f 20 73 65 74 2e 20 43 61 6e 20 62 65  e to set. Can be
44b0: 20 6f 6e 65 20 6f 66 0a 09 09 09 09 20 2a 20 54   one of..... * T
44c0: 43 4c 5f 4d 4f 44 45 5f 42 4c 4f 43 4b 49 4e 47  CL_MODE_BLOCKING
44d0: 20 6f 72 0a 09 09 09 09 20 2a 20 54 43 4c 5f 4d   or..... * TCL_M
44e0: 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 2e  ODE_NONBLOCKING.
44f0: 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 70 53 74 61   */.{.    TcpSta
4500: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
4510: 54 63 70 53 74 61 74 65 20 2a 29 69 6e 73 74 61  TcpState *)insta
4520: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66  nceData;..    if
4530: 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f   (mode == TCL_MO
4540: 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20  DE_NONBLOCKING) 
4550: 7b 0a 09 53 45 54 5f 42 49 54 53 28 73 74 61 74  {..SET_BITS(stat
4560: 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50  ePtr->flags, TCP
4570: 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 3b 0a 20  _NONBLOCKING);. 
4580: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 43 4c 45     } else {..CLE
4590: 41 52 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  AR_BITS(statePtr
45a0: 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f 4e 4f 4e  ->flags, TCP_NON
45b0: 42 4c 4f 43 4b 49 4e 47 29 3b 0a 20 20 20 20 7d  BLOCKING);.    }
45c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
45d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4620: 2a 0a 20 2a 20 57 61 69 74 46 6f 72 43 6f 6e 6e  *. * WaitForConn
4630: 65 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09 43 68 65  ect --. *. *.Che
4640: 63 6b 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ck the state of 
4650: 61 6e 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74  an async connect
4660: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 61 20 63   process. If a c
4670: 6f 6e 6e 65 63 74 69 6f 6e 20 61 74 74 65 6d 70  onnection attemp
4680: 74 0a 20 2a 09 74 65 72 6d 69 6e 61 74 65 64 2c  t. *.terminated,
4690: 20 70 72 6f 63 65 73 73 20 69 74 2c 20 77 68 69   process it, whi
46a0: 63 68 20 6d 61 79 20 66 69 6e 61 6c 69 7a 65 20  ch may finalize 
46b0: 69 74 20 6f 72 20 6d 61 79 20 73 74 61 72 74 20  it or may start 
46c0: 74 68 65 20 6e 65 78 74 0a 20 2a 09 61 74 74 65  the next. *.atte
46d0: 6d 70 74 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63  mpt. If a connec
46e0: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65 73 2c  t error occures,
46f0: 20 69 74 20 69 73 20 73 61 76 65 64 20 69 6e 0a   it is saved in.
4700: 20 2a 09 73 74 61 74 65 50 74 72 2d 3e 63 6f 6e   *.statePtr->con
4710: 6e 65 63 74 45 72 72 6f 72 20 74 6f 20 62 65 20  nectError to be 
4720: 72 65 70 6f 72 74 65 64 20 62 79 20 27 66 63 6f  reported by 'fco
4730: 6e 66 69 67 75 72 65 20 2d 65 72 72 6f 72 27 2e  nfigure -error'.
4740: 0a 20 2a 0a 20 2a 09 54 68 65 72 65 20 61 72 65  . *. *.There are
4750: 20 74 77 6f 20 6d 6f 64 65 73 20 6f 66 20 6f 70   two modes of op
4760: 65 72 61 74 69 6f 6e 2c 20 64 65 66 69 6e 65 64  eration, defined
4770: 20 62 79 20 65 72 72 6f 72 43 6f 64 65 50 74 72   by errorCodePtr
4780: 3a 0a 20 2a 09 20 2a 20 20 6e 6f 6e 2d 4e 55 4c  :. *. *  non-NUL
4790: 4c 3a 20 43 61 6c 6c 65 64 20 62 79 20 65 78 70  L: Called by exp
47a0: 6c 69 63 69 74 65 20 72 65 61 64 2f 77 72 69 74  licite read/writ
47b0: 65 20 63 6f 6d 6d 61 6e 64 2e 20 42 6c 6f 63 6b  e command. Block
47c0: 20 69 66 20 73 6f 63 6b 65 74 0a 20 2a 09 20 20   if socket. *.  
47d0: 20 20 69 73 20 62 6c 6f 63 6b 69 6e 67 2e 0a 20    is blocking.. 
47e0: 2a 09 20 20 20 20 4d 61 79 20 72 65 74 75 72 6e  *.    May return
47f0: 20 74 77 6f 20 65 72 72 6f 72 20 63 6f 64 65 73   two error codes
4800: 3a 0a 20 2a 09 20 20 20 20 20 2a 09 45 57 4f 55  :. *.     *.EWOU
4810: 4c 44 42 4c 4f 43 4b 3a 20 69 66 20 63 6f 6e 6e  LDBLOCK: if conn
4820: 65 63 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20  ect is still in 
4830: 70 72 6f 67 72 65 73 73 0a 20 2a 09 20 20 20 20  progress. *.    
4840: 20 2a 09 45 4e 4f 54 43 4f 4e 4e 3a 20 69 66 20   *.ENOTCONN: if 
4850: 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 2e 20  connect failed. 
4860: 54 68 69 73 20 77 6f 75 6c 64 20 62 65 20 74 68  This would be th
4870: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  e error message.
4880: 20 2a 09 09 6f 66 20 61 20 72 65 63 76 20 6f 72   *..of a recv or
4890: 20 73 65 6e 64 74 6f 20 73 79 73 63 61 6c 6c 20   sendto syscall 
48a0: 73 6f 20 74 68 69 73 20 69 73 20 65 6d 75 6c 61  so this is emula
48b0: 74 65 64 20 68 65 72 65 2e 0a 20 2a 09 20 2a 20  ted here.. *. * 
48c0: 20 4e 75 6c 6c 3a 20 43 61 6c 6c 65 64 20 62 79   Null: Called by
48d0: 20 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 6f 70   a background op
48e0: 65 72 61 74 69 6f 6e 2e 20 44 6f 20 6e 6f 74 20  eration. Do not 
48f0: 62 6c 6f 63 6b 20 61 6e 64 20 64 6f 6e 27 74 0a  block and don't.
4900: 20 2a 09 20 20 20 20 72 65 74 75 72 6e 20 61 6e   *.    return an
4910: 79 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  y error code.. *
4920: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
4930: 30 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  0 if the connect
4940: 69 6f 6e 20 68 61 73 20 63 6f 6d 70 6c 65 74 65  ion has complete
4950: 64 2c 20 2d 31 20 69 66 20 73 74 69 6c 6c 20 69  d, -1 if still i
4960: 6e 20 70 72 6f 67 72 65 73 73 20 6f 72 20 74 68  n progress or th
4970: 65 72 65 20 69 73 0a 20 2a 09 61 6e 20 65 72 72  ere is. *.an err
4980: 6f 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  or.. *. * Side e
4990: 66 66 65 63 74 73 3a 0a 20 2a 09 50 72 6f 63 65  ffects:. *.Proce
49a0: 73 73 65 73 20 73 6f 63 6b 65 74 20 65 76 65 6e  sses socket even
49b0: 74 73 20 6f 66 66 20 74 68 65 20 73 79 73 74 65  ts off the syste
49c0: 6d 20 71 75 65 75 65 2e 20 4d 61 79 20 70 72 6f  m queue. May pro
49d0: 63 65 73 73 0a 20 2a 09 61 73 79 6e 63 68 72 6f  cess. *.asynchro
49e0: 6e 6f 75 73 20 63 6f 6e 6e 65 63 74 2e 0a 20 2a  nous connect.. *
49f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
4a40: 74 61 74 69 63 20 69 6e 74 0a 57 61 69 74 46 6f  tatic int.WaitFo
4a50: 72 43 6f 6e 6e 65 63 74 28 0a 20 20 20 20 54 63  rConnect(.    Tc
4a60: 70 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  pState *statePtr
4a70: 2c 09 09 2f 2a 20 53 74 61 74 65 20 6f 66 20 74  ,../* State of t
4a80: 68 65 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 20 20  he socket. */.  
4a90: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
4aa0: 50 74 72 29 09 09 2f 2a 20 57 68 65 72 65 20 74  Ptr)../* Where t
4ab0: 6f 20 73 74 6f 72 65 20 65 72 72 6f 72 73 3f 20  o store errors? 
4ac0: 41 20 70 61 73 73 65 64 0a 09 09 09 09 20 2a 20  A passed..... * 
4ad0: 6e 75 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 63 74  null-pointer act
4ae0: 69 76 61 74 65 73 20 62 61 63 6b 67 72 6f 75 6e  ivates backgroun
4af0: 64 20 6d 6f 64 65 2e 20 2a 2f 0a 7b 0a 20 20 20  d mode. */.{.   
4b00: 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 20   int result;.   
4b10: 20 69 6e 74 20 6f 6c 64 4d 6f 64 65 3b 0a 0a 20   int oldMode;.. 
4b20: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65     /*.     * Che
4b30: 63 6b 20 69 66 20 61 6e 20 61 73 79 6e 63 20 63  ck if an async c
4b40: 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 20 61 6c  onnect failed al
4b50: 72 65 61 64 79 20 61 6e 64 20 65 72 72 6f 72 20  ready and error 
4b60: 72 65 70 6f 72 74 69 6e 67 20 69 73 0a 20 20 20  reporting is.   
4b70: 20 20 2a 20 64 65 6d 61 6e 64 65 64 2c 20 72 65    * demanded, re
4b80: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 45  turn the error E
4b90: 4e 4f 54 43 4f 4e 4e 2e 0a 20 20 20 20 20 2a 2f  NOTCONN..     */
4ba0: 0a 0a 20 20 20 20 69 66 20 28 65 72 72 6f 72 43  ..    if (errorC
4bb0: 6f 64 65 50 74 72 20 21 3d 20 4e 55 4c 4c 20 26  odePtr != NULL &
4bc0: 26 20 47 4f 54 5f 42 49 54 53 28 73 74 61 74 65  & GOT_BITS(state
4bd0: 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f  Ptr->flags, TCP_
4be0: 41 53 59 4e 43 5f 46 41 49 4c 45 44 29 29 20 7b  ASYNC_FAILED)) {
4bf0: 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
4c00: 3d 20 45 4e 4f 54 43 4f 4e 4e 3b 0a 09 72 65 74  = ENOTCONN;..ret
4c10: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
4c20: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65     /*.     * Che
4c30: 63 6b 20 69 66 20 61 6e 20 61 73 79 6e 63 20 63  ck if an async c
4c40: 6f 6e 6e 65 63 74 20 69 73 20 72 75 6e 6e 69 6e  onnect is runnin
4c50: 67 2e 20 49 66 20 6e 6f 74 20 72 65 74 75 72 6e  g. If not return
4c60: 20 6f 6b 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20   ok.     */..   
4c70: 20 69 66 20 28 21 47 4f 54 5f 42 49 54 53 28 73   if (!GOT_BITS(s
4c80: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20  tatePtr->flags, 
4c90: 54 43 50 5f 41 53 59 4e 43 5f 43 4f 4e 4e 45 43  TCP_ASYNC_CONNEC
4ca0: 54 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b  T)) {..return 0;
4cb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
4cc0: 20 20 20 20 2a 20 49 6e 20 73 6f 63 6b 65 74 20      * In socket 
4cd0: 74 65 73 74 20 6d 6f 64 65 20 64 6f 20 6e 6f 74  test mode do not
4ce0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
4cf0: 68 65 20 63 6f 6e 6e 65 63 74 0a 20 20 20 20 20  he connect.     
4d00: 2a 20 45 78 63 65 70 74 69 6f 6e 73 20 61 72 65  * Exceptions are
4d10: 3a 0a 20 20 20 20 20 2a 20 2d 20 43 61 6c 6c 20  :.     * - Call 
4d20: 62 79 20 72 65 63 76 2f 73 65 6e 64 20 61 6e 64  by recv/send and
4d30: 20 62 6c 6f 63 6b 69 6e 67 20 73 6f 63 6b 65 74   blocking socket
4d40: 0a 20 20 20 20 20 2a 20 20 20 28 65 72 72 6f 72  .     *   (error
4d50: 43 6f 64 65 50 74 72 20 21 3d 20 4e 55 4c 4c 20  CodePtr != NULL 
4d60: 26 26 20 21 47 4f 54 5f 42 49 54 53 28 66 6c 61  && !GOT_BITS(fla
4d70: 67 73 2c 20 54 43 50 5f 4e 4f 4e 42 4c 4f 43 4b  gs, TCP_NONBLOCK
4d80: 49 4e 47 29 29 0a 20 20 20 20 20 2a 20 2d 20 43  ING)).     * - C
4d90: 61 6c 6c 20 62 79 20 74 68 65 20 65 76 65 6e 74  all by the event
4da0: 20 71 75 65 75 65 20 28 65 72 72 6f 72 43 6f 64   queue (errorCod
4db0: 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20  ePtr == NULL).  
4dc0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 47     */..    if (G
4dd0: 4f 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  OT_BITS(statePtr
4de0: 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f 41 53 59  ->flags, TCP_ASY
4df0: 4e 43 5f 54 45 53 54 5f 4d 4f 44 45 29 0a 09 20  NC_TEST_MODE).. 
4e00: 20 20 20 26 26 20 65 72 72 6f 72 43 6f 64 65 50     && errorCodeP
4e10: 74 72 20 21 3d 20 4e 55 4c 4c 0a 09 20 20 20 20  tr != NULL..    
4e20: 26 26 20 47 4f 54 5f 42 49 54 53 28 73 74 61 74  && GOT_BITS(stat
4e30: 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50  ePtr->flags, TCP
4e40: 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 29 20 7b  _NONBLOCKING)) {
4e50: 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
4e60: 3d 20 45 57 4f 55 4c 44 42 4c 4f 43 4b 3b 0a 09  = EWOULDBLOCK;..
4e70: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
4e80: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
4e90: 42 65 20 73 75 72 65 20 74 6f 20 64 69 73 61 62  Be sure to disab
4ea0: 6c 65 20 65 76 65 6e 74 20 73 65 72 76 69 63 69  le event servici
4eb0: 6e 67 20 73 6f 20 77 65 20 61 72 65 20 74 72 75  ng so we are tru
4ec0: 6c 79 20 6d 6f 64 61 6c 2e 0a 20 20 20 20 20 2a  ly modal..     *
4ed0: 2f 0a 0a 20 20 20 20 6f 6c 64 4d 6f 64 65 20 3d  /..    oldMode =
4ee0: 20 54 63 6c 5f 53 65 74 53 65 72 76 69 63 65 4d   Tcl_SetServiceM
4ef0: 6f 64 65 28 54 43 4c 5f 53 45 52 56 49 43 45 5f  ode(TCL_SERVICE_
4f00: 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  NONE);..    /*. 
4f10: 20 20 20 20 2a 20 4c 6f 6f 70 20 69 6e 20 74 68      * Loop in th
4f20: 65 20 62 6c 6f 63 6b 69 6e 67 20 63 61 73 65 20  e blocking case 
4f30: 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63  until the connec
4f40: 74 20 73 69 67 6e 61 6c 20 69 73 20 70 72 65 73  t signal is pres
4f50: 65 6e 74 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ent.     */..   
4f60: 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 2f 2a   while (1) {../*
4f70: 0a 09 20 2a 20 47 65 74 20 74 68 65 20 73 74 61  .. * Get the sta
4f80: 74 65 50 74 72 20 6c 6f 63 6b 2e 0a 09 20 2a 2f  tePtr lock... */
4f90: 0a 0a 09 54 68 72 65 61 64 53 70 65 63 69 66 69  ...ThreadSpecifi
4fa0: 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20  cData *tsdPtr = 
4fb0: 28 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44  (ThreadSpecificD
4fc0: 61 74 61 20 2a 29 0a 09 09 54 63 6c 54 68 72 65  ata *)...TclThre
4fd0: 61 64 44 61 74 61 4b 65 79 47 65 74 28 26 64 61  adDataKeyGet(&da
4fe0: 74 61 4b 65 79 29 3b 0a 09 57 61 69 74 46 6f 72  taKey);..WaitFor
4ff0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64  SingleObject(tsd
5000: 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c  Ptr->socketListL
5010: 6f 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a  ock, INFINITE);.
5020: 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20 66  ../*.. * Check f
5030: 6f 72 20 63 6f 6e 6e 65 63 74 20 65 76 65 6e 74  or connect event
5040: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 47 4f 54  ... */...if (GOT
5050: 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e  _BITS(statePtr->
5060: 72 65 61 64 79 45 76 65 6e 74 73 2c 20 46 44 5f  readyEvents, FD_
5070: 43 4f 4e 4e 45 43 54 29 29 20 7b 0a 09 20 20 20  CONNECT)) {..   
5080: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 6f 6e 73   /*..     * Cons
5090: 75 6d 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 20  ume the connect 
50a0: 65 76 65 6e 74 2e 0a 09 20 20 20 20 20 2a 2f 0a  event...     */.
50b0: 0a 09 20 20 20 20 43 4c 45 41 52 5f 42 49 54 53  ..    CLEAR_BITS
50c0: 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64 79  (statePtr->ready
50d0: 45 76 65 6e 74 73 2c 20 46 44 5f 43 4f 4e 4e 45  Events, FD_CONNE
50e0: 43 54 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20  CT);...    /*.. 
50f0: 20 20 20 20 2a 20 46 6f 72 20 62 6c 6f 63 6b 69      * For blocki
5100: 6e 67 20 73 6f 63 6b 65 74 73 20 61 6e 64 20 66  ng sockets and f
5110: 6f 72 65 67 72 6f 75 6e 64 20 70 72 6f 63 65 73  oreground proces
5120: 73 69 6e 67 2c 20 64 69 73 61 62 6c 65 20 61 73  sing, disable as
5130: 79 6e 63 0a 09 20 20 20 20 20 2a 20 63 6f 6e 6e  ync..     * conn
5140: 65 63 74 20 61 73 20 77 65 20 63 6f 6e 74 69 6e  ect as we contin
5150: 75 65 20 6e 6f 77 20 73 79 6e 63 68 72 6f 6e 6f  ue now synchrono
5160: 75 73 6c 79 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  usly...     */..
5170: 09 20 20 20 20 69 66 20 28 65 72 72 6f 72 43 6f  .    if (errorCo
5180: 64 65 50 74 72 20 21 3d 20 4e 55 4c 4c 20 26 26  dePtr != NULL &&
5190: 0a 09 09 20 20 20 20 21 47 4f 54 5f 42 49 54 53  ...    !GOT_BITS
51a0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
51b0: 2c 20 54 43 50 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e  , TCP_NONBLOCKIN
51c0: 47 29 29 20 7b 0a 09 09 43 4c 45 41 52 5f 42 49  G)) {...CLEAR_BI
51d0: 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  TS(statePtr->fla
51e0: 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 43 4f  gs, TCP_ASYNC_CO
51f0: 4e 4e 45 43 54 29 3b 0a 09 20 20 20 20 7d 0a 0a  NNECT);..    }..
5200: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
5210: 46 72 65 65 20 6c 69 73 74 20 6c 6f 63 6b 2e 0a  Free list lock..
5220: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 53  .     */...    S
5230: 65 74 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e  etEvent(tsdPtr->
5240: 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b  socketListLock);
5250: 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  ...    /*..     
5260: 2a 20 43 6f 6e 74 69 6e 75 65 20 63 6f 6e 6e 65  * Continue conne
5270: 63 74 2e 20 49 66 20 73 77 69 74 63 68 65 64 20  ct. If switched 
5280: 74 6f 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 63  to synchronous c
5290: 6f 6e 6e 65 63 74 2c 20 74 68 65 0a 09 20 20 20  onnect, the..   
52a0: 20 20 2a 20 63 6f 6e 6e 65 63 74 20 69 73 20 74    * connect is t
52b0: 65 72 6d 69 6e 61 74 65 64 2e 0a 09 20 20 20 20  erminated...    
52c0: 20 2a 2f 0a 0a 09 20 20 20 20 72 65 73 75 6c 74   */...    result
52d0: 20 3d 20 54 63 70 43 6f 6e 6e 65 63 74 28 4e 55   = TcpConnect(NU
52e0: 4c 4c 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  LL, statePtr);..
52f0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
5300: 52 65 73 74 6f 72 65 20 65 76 65 6e 74 20 73 65  Restore event se
5310: 72 76 69 63 65 20 6d 6f 64 65 2e 0a 09 20 20 20  rvice mode...   
5320: 20 20 2a 2f 0a 0a 09 20 20 20 20 28 76 6f 69 64    */...    (void
5330: 29 20 54 63 6c 5f 53 65 74 53 65 72 76 69 63 65  ) Tcl_SetService
5340: 4d 6f 64 65 28 6f 6c 64 4d 6f 64 65 29 3b 0a 0a  Mode(oldMode);..
5350: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
5360: 43 68 65 63 6b 20 66 6f 72 20 53 75 63 63 65 73  Check for Succes
5370: 73 66 75 6c 20 63 6f 6e 6e 65 63 74 20 6f 72 20  sful connect or 
5380: 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20 72 65  async connect re
5390: 73 74 61 72 74 0a 09 20 20 20 20 20 2a 2f 0a 0a  start..     */..
53a0: 09 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20  .    if (result 
53b0: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 2f  == TCL_OK) {.../
53c0: 2a 0a 09 09 20 2a 20 43 68 65 63 6b 20 66 6f 72  *... * Check for
53d0: 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20 72   async connect r
53e0: 65 73 74 61 72 74 20 28 6e 6f 74 20 70 6f 73 73  estart (not poss
53f0: 69 62 6c 65 20 66 6f 72 0a 09 09 20 2a 20 66 6f  ible for... * fo
5400: 72 65 67 72 6f 75 6e 64 20 62 6c 6f 63 6b 69 6e  reground blockin
5410: 67 20 6f 70 65 72 61 74 69 6f 6e 29 0a 09 09 20  g operation)... 
5420: 2a 2f 0a 0a 09 09 69 66 20 28 47 4f 54 5f 42 49  */....if (GOT_BI
5430: 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  TS(statePtr->fla
5440: 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 50 45  gs, TCP_ASYNC_PE
5450: 4e 44 49 4e 47 29 29 20 7b 0a 09 09 20 20 20 20  NDING)) {...    
5460: 69 66 20 28 65 72 72 6f 72 43 6f 64 65 50 74 72  if (errorCodePtr
5470: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 2a   != NULL) {....*
5480: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
5490: 57 4f 55 4c 44 42 4c 4f 43 4b 3b 0a 09 09 20 20  WOULDBLOCK;...  
54a0: 20 20 7d 0a 09 09 20 20 20 20 72 65 74 75 72 6e    }...    return
54b0: 20 2d 31 3b 0a 09 09 7d 0a 09 09 72 65 74 75 72   -1;...}...retur
54c0: 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  n 0;..    }...  
54d0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 6f 6e    /*..     * Con
54e0: 6e 65 63 74 20 66 69 6e 61 6c 6c 79 20 66 61 69  nect finally fai
54f0: 6c 65 64 2e 20 46 6f 72 20 66 6f 72 65 67 72 6f  led. For foregro
5500: 75 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  und operation re
5510: 74 75 72 6e 0a 09 20 20 20 20 20 2a 20 45 4e 4f  turn..     * ENO
5520: 54 43 4f 4e 4e 2e 0a 09 20 20 20 20 20 2a 2f 0a  TCONN...     */.
5530: 0a 09 20 20 20 20 69 66 20 28 65 72 72 6f 72 43  ..    if (errorC
5540: 6f 64 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20  odePtr != NULL) 
5550: 7b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  {...*errorCodePt
5560: 72 20 3d 20 45 4e 4f 54 43 4f 4e 4e 3b 0a 09 20  r = ENOTCONN;.. 
5570: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e     }..    return
5580: 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a   -1;..}.../*.. *
5590: 20 46 72 65 65 20 6c 69 73 74 20 6c 6f 63 6b 2e   Free list lock.
55a0: 0a 09 20 2a 2f 0a 0a 09 53 65 74 45 76 65 6e 74  .. */...SetEvent
55b0: 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c  (tsdPtr->socketL
55c0: 69 73 74 4c 6f 63 6b 29 3b 0a 0a 09 2f 2a 0a 09  istLock);.../*..
55d0: 20 2a 20 42 61 63 6b 67 72 6f 75 6e 64 20 6f 70   * Background op
55e0: 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
55f0: 77 69 74 68 20 6e 6f 20 61 63 74 69 6f 6e 20 61  with no action a
5600: 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 20 63  s there was no c
5610: 6f 6e 6e 65 63 74 0a 09 20 2a 20 65 76 65 6e 74  onnect.. * event
5620: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 65 72 72 6f  .. */...if (erro
5630: 72 43 6f 64 65 50 74 72 20 3d 3d 20 4e 55 4c 4c  rCodePtr == NULL
5640: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
5650: 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  -1;..}.../*.. * 
5660: 41 20 6e 6f 6e 20 62 6c 6f 63 6b 69 6e 67 20 73  A non blocking s
5670: 6f 63 6b 65 74 20 77 61 69 74 69 6e 67 20 66 6f  ocket waiting fo
5680: 72 20 61 6e 20 61 73 79 6e 63 68 72 6f 6e 6f 75  r an asynchronou
5690: 73 20 63 6f 6e 6e 65 63 74 0a 09 20 2a 20 72 65  s connect.. * re
56a0: 74 75 72 6e 73 20 64 69 72 65 63 74 6c 79 20 74  turns directly t
56b0: 68 65 20 65 72 72 6f 72 20 45 57 4f 55 4c 44 42  he error EWOULDB
56c0: 4c 4f 43 4b 0a 09 20 2a 2f 0a 0a 09 69 66 20 28  LOCK.. */...if (
56d0: 47 4f 54 5f 42 49 54 53 28 73 74 61 74 65 50 74  GOT_BITS(statePt
56e0: 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f 4e 4f  r->flags, TCP_NO
56f0: 4e 42 4c 4f 43 4b 49 4e 47 29 29 20 7b 0a 09 20  NBLOCKING)) {.. 
5700: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
5710: 20 3d 20 45 57 4f 55 4c 44 42 4c 4f 43 4b 3b 0a   = EWOULDBLOCK;.
5720: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
5730: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 57 61 69 74  .}.../*.. * Wait
5740: 20 75 6e 74 69 6c 20 73 6f 6d 65 74 68 69 6e 67   until something
5750: 20 68 61 70 70 65 6e 73 2e 0a 09 20 2a 2f 0a 0a   happens... */..
5760: 09 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  .WaitForSingleOb
5770: 6a 65 63 74 28 74 73 64 50 74 72 2d 3e 72 65 61  ject(tsdPtr->rea
5780: 64 79 45 76 65 6e 74 2c 20 49 4e 46 49 4e 49 54  dyEvent, INFINIT
5790: 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a  E);.    }.}.../*
57a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
57f0: 54 63 70 49 6e 70 75 74 50 72 6f 63 20 2d 2d 0a  TcpInputProc --.
5800: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
5810: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ion is invoked b
5820: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
5830: 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69   level to read i
5840: 6e 70 75 74 20 66 72 6f 6d 20 61 0a 20 2a 09 54  nput from a. *.T
5850: 43 50 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  CP socket based 
5860: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52  channel.. *. * R
5870: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e  esults:. *.The n
5880: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
5890: 65 61 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  ead is returned 
58a0: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20  or -1 on error. 
58b0: 41 6e 20 6f 75 74 70 75 74 0a 20 2a 09 61 72 67  An output. *.arg
58c0: 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74  ument contains t
58d0: 68 65 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63  he POSIX error c
58e0: 6f 64 65 20 6f 6e 20 65 72 72 6f 72 2c 20 6f 72  ode on error, or
58f0: 20 7a 65 72 6f 20 69 66 20 6e 6f 20 65 72 72 6f   zero if no erro
5900: 72 0a 20 2a 09 6f 63 63 75 72 72 65 64 2e 0a 20  r. *.occurred.. 
5910: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
5920: 73 3a 0a 20 2a 09 52 65 61 64 73 20 69 6e 70 75  s:. *.Reads inpu
5930: 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  t from the input
5940: 20 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63   device of the c
5950: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59a0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
59b0: 69 6e 74 0a 54 63 70 49 6e 70 75 74 50 72 6f 63  int.TcpInputProc
59c0: 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 74  (.    void *inst
59d0: 61 6e 63 65 44 61 74 61 2c 09 09 2f 2a 20 53 6f  anceData,../* So
59e0: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20  cket state. */. 
59f0: 20 20 20 63 68 61 72 20 2a 62 75 66 2c 09 09 09     char *buf,...
5a00: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72  /* Where to stor
5a10: 65 20 64 61 74 61 20 72 65 61 64 2e 20 2a 2f 0a  e data read. */.
5a20: 20 20 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c      int bufSize,
5a30: 09 09 2f 2a 20 48 6f 77 20 6d 75 63 68 20 73 70  ../* How much sp
5a40: 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
5a50: 20 69 6e 20 74 68 65 0a 09 09 09 09 20 2a 20 62   in the..... * b
5a60: 75 66 66 65 72 3f 20 2a 2f 0a 20 20 20 20 69 6e  uffer? */.    in
5a70: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  t *errorCodePtr)
5a80: 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74  ../* Where to st
5a90: 6f 72 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ore error code. 
5aa0: 2a 2f 0a 7b 0a 20 20 20 20 54 63 70 53 74 61 74  */.{.    TcpStat
5ab0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 54  e *statePtr = (T
5ac0: 63 70 53 74 61 74 65 20 2a 29 69 6e 73 74 61 6e  cpState *)instan
5ad0: 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  ceData;.    int 
5ae0: 62 79 74 65 73 52 65 61 64 3b 0a 20 20 20 20 44  bytesRead;.    D
5af0: 57 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 20 20  WORD error;.    
5b00: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
5b10: 74 61 20 2a 74 73 64 50 74 72 20 3d 20 28 54 68  ta *tsdPtr = (Th
5b20: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
5b30: 20 2a 29 0a 09 20 20 20 20 54 63 6c 54 68 72 65   *)..    TclThre
5b40: 61 64 44 61 74 61 4b 65 79 47 65 74 28 26 64 61  adDataKeyGet(&da
5b50: 74 61 4b 65 79 29 3b 0a 0a 20 20 20 20 2a 65 72  taKey);..    *er
5b60: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
5b70: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46  .    /*.     * F
5b80: 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
5b90: 65 20 69 66 20 45 4f 46 20 77 61 73 20 61 6c 72  e if EOF was alr
5ba0: 65 61 64 79 20 64 65 74 65 63 74 65 64 2c 20 74  eady detected, t
5bb0: 6f 20 70 72 65 76 65 6e 74 20 63 61 6c 6c 69 6e  o prevent callin
5bc0: 67 20 74 68 65 0a 20 20 20 20 20 2a 20 73 6f 63  g the.     * soc
5bd0: 6b 65 74 20 73 74 61 63 6b 20 61 66 74 65 72 20  ket stack after 
5be0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 45  the first time E
5bf0: 4f 46 20 69 73 20 64 65 74 65 63 74 65 64 2e 0a  OF is detected..
5c00: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
5c10: 28 47 4f 54 5f 42 49 54 53 28 73 74 61 74 65 50  (GOT_BITS(stateP
5c20: 74 72 2d 3e 66 6c 61 67 73 2c 20 53 4f 43 4b 45  tr->flags, SOCKE
5c30: 54 5f 45 4f 46 29 29 20 7b 0a 09 72 65 74 75 72  T_EOF)) {..retur
5c40: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
5c50: 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b 20  /*.     * Check 
5c60: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  if there is an a
5c70: 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20 72 75 6e  sync connect run
5c80: 6e 69 6e 67 2e 0a 20 20 20 20 20 2a 20 46 6f 72  ning..     * For
5c90: 20 62 6c 6f 63 6b 69 6e 67 20 73 6f 63 6b 65 74   blocking socket
5ca0: 73 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e  s terminate conn
5cb0: 65 63 74 2c 20 6f 74 68 65 72 77 69 73 65 20 64  ect, otherwise d
5cc0: 6f 20 6f 6e 65 20 73 74 65 70 2e 0a 20 20 20 20  o one step..    
5cd0: 20 2a 20 46 6f 72 20 61 20 6e 6f 6e 20 62 6c 6f   * For a non blo
5ce0: 63 6b 69 6e 67 20 73 6f 63 6b 65 74 20 72 65 74  cking socket ret
5cf0: 75 72 6e 20 45 57 4f 55 4c 44 42 4c 4f 43 4b 20  urn EWOULDBLOCK 
5d00: 69 66 20 63 6f 6e 6e 65 63 74 20 6e 6f 74 20 74  if connect not t
5d10: 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 20 2a  erminated.     *
5d20: 2f 0a 0a 20 20 20 20 69 66 20 28 57 61 69 74 46  /..    if (WaitF
5d30: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50  orConnect(stateP
5d40: 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72  tr, errorCodePtr
5d50: 29 20 21 3d 20 30 29 20 7b 0a 09 72 65 74 75 72  ) != 0) {..retur
5d60: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
5d70: 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 20 45 4f   /*.     * No EO
5d80: 46 2c 20 61 6e 64 20 69 74 20 69 73 20 63 6f 6e  F, and it is con
5d90: 6e 65 63 74 65 64 2c 20 73 6f 20 74 72 79 20 74  nected, so try t
5da0: 6f 20 72 65 61 64 20 6d 6f 72 65 20 66 72 6f 6d  o read more from
5db0: 20 74 68 65 20 73 6f 63 6b 65 74 2e 20 4e 6f 74   the socket. Not
5dc0: 65 0a 20 20 20 20 20 2a 20 74 68 61 74 20 77 65  e.     * that we
5dd0: 20 63 6c 65 61 72 20 74 68 65 20 46 44 5f 52 45   clear the FD_RE
5de0: 41 44 20 62 69 74 20 62 65 63 61 75 73 65 20 72  AD bit because r
5df0: 65 61 64 20 65 76 65 6e 74 73 20 61 72 65 20 6c  ead events are l
5e00: 65 76 65 6c 20 74 72 69 67 67 65 72 65 64 0a 20  evel triggered. 
5e10: 20 20 20 20 2a 20 73 6f 20 61 20 6e 65 77 20 65      * so a new e
5e20: 76 65 6e 74 20 77 69 6c 6c 20 62 65 20 67 65 6e  vent will be gen
5e30: 65 72 61 74 65 64 20 69 66 20 74 68 65 72 65 20  erated if there 
5e40: 69 73 20 73 74 69 6c 6c 20 64 61 74 61 20 61 76  is still data av
5e50: 61 69 6c 61 62 6c 65 20 74 6f 20 62 65 0a 20 20  ailable to be.  
5e60: 20 20 20 2a 20 72 65 61 64 2e 20 57 65 20 68 61     * read. We ha
5e70: 76 65 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 62  ve to simulate b
5e80: 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  locking behavior
5e90: 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 61   here since we a
5ea0: 72 65 20 61 6c 77 61 79 73 0a 20 20 20 20 20 2a  re always.     *
5eb0: 20 75 73 69 6e 67 20 6e 6f 6e 2d 62 6c 6f 63 6b   using non-block
5ec0: 69 6e 67 20 73 6f 63 6b 65 74 73 2e 0a 20 20 20  ing sockets..   
5ed0: 20 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 20    */..    while 
5ee0: 28 31 29 20 7b 0a 09 53 65 6e 64 53 65 6c 65 63  (1) {..SendSelec
5ef0: 74 4d 65 73 73 61 67 65 28 74 73 64 50 74 72 2c  tMessage(tsdPtr,
5f00: 20 55 4e 53 45 4c 45 43 54 2c 20 73 74 61 74 65   UNSELECT, state
5f10: 50 74 72 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53  Ptr);.../*.. * S
5f20: 69 6e 67 6c 65 20 66 64 20 6f 70 65 72 61 74 69  ingle fd operati
5f30: 6f 6e 3a 20 74 68 69 73 20 70 72 6f 63 20 69 73  on: this proc is
5f40: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72   only called for
5f50: 20 61 20 63 6f 6e 6e 65 63 74 65 64 0a 09 20 2a   a connected.. *
5f60: 20 73 6f 63 6b 65 74 2e 0a 09 20 2a 2f 0a 0a 09   socket... */...
5f70: 62 79 74 65 73 52 65 61 64 20 3d 20 72 65 63 76  bytesRead = recv
5f80: 28 73 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65  (statePtr->socke
5f90: 74 73 2d 3e 66 64 2c 20 62 75 66 2c 20 62 75 66  ts->fd, buf, buf
5fa0: 53 69 7a 65 2c 20 30 29 3b 0a 09 43 4c 45 41 52  Size, 0);..CLEAR
5fb0: 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e  _BITS(statePtr->
5fc0: 72 65 61 64 79 45 76 65 6e 74 73 2c 20 46 44 5f  readyEvents, FD_
5fd0: 52 45 41 44 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20  READ);.../*.. * 
5fe0: 43 68 65 63 6b 20 66 6f 72 20 65 6e 64 2d 6f 66  Check for end-of
5ff0: 2d 66 69 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 20  -file condition 
6000: 6f 72 20 73 75 63 63 65 73 73 66 75 6c 20 72 65  or successful re
6010: 61 64 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 62  ad... */...if (b
6020: 79 74 65 73 52 65 61 64 20 3d 3d 20 30 29 20 7b  ytesRead == 0) {
6030: 0a 09 20 20 20 20 53 45 54 5f 42 49 54 53 28 73  ..    SET_BITS(s
6040: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20  tatePtr->flags, 
6050: 53 4f 43 4b 45 54 5f 45 4f 46 29 3b 0a 09 7d 0a  SOCKET_EOF);..}.
6060: 09 69 66 20 28 62 79 74 65 73 52 65 61 64 20 21  .if (bytesRead !
6070: 3d 20 53 4f 43 4b 45 54 5f 45 52 52 4f 52 29 20  = SOCKET_ERROR) 
6080: 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  {..    break;..}
6090: 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 61 6e 20  .../*.. * If an 
60a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 66 74  error occurs aft
60b0: 65 72 20 74 68 65 20 46 44 5f 43 4c 4f 53 45 20  er the FD_CLOSE 
60c0: 68 61 73 20 61 72 72 69 76 65 64 2c 20 74 68 65  has arrived, the
60d0: 6e 20 69 67 6e 6f 72 65 20 74 68 65 0a 09 20 2a  n ignore the.. *
60e0: 20 65 72 72 6f 72 20 61 6e 64 20 72 65 70 6f 72   error and repor
60f0: 74 20 61 6e 20 45 4f 46 2e 0a 09 20 2a 2f 0a 0a  t an EOF... */..
6100: 09 69 66 20 28 47 4f 54 5f 42 49 54 53 28 73 74  .if (GOT_BITS(st
6110: 61 74 65 50 74 72 2d 3e 72 65 61 64 79 45 76 65  atePtr->readyEve
6120: 6e 74 73 2c 20 46 44 5f 43 4c 4f 53 45 29 29 20  nts, FD_CLOSE)) 
6130: 7b 0a 09 20 20 20 20 53 45 54 5f 42 49 54 53 28  {..    SET_BITS(
6140: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c  statePtr->flags,
6150: 20 53 4f 43 4b 45 54 5f 45 4f 46 29 3b 0a 09 20   SOCKET_EOF);.. 
6160: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 30     bytesRead = 0
6170: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
6180: 0a 0a 09 65 72 72 6f 72 20 3d 20 57 53 41 47 65  ...error = WSAGe
6190: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 0a 09  tLastError();...
61a0: 2f 2a 0a 09 20 2a 20 49 66 20 61 6e 20 52 53 54  /*.. * If an RST
61b0: 20 63 6f 6d 65 73 2c 20 74 68 65 6e 20 69 67 6e   comes, then ign
61c0: 6f 72 65 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ore the error an
61d0: 64 20 72 65 70 6f 72 74 20 61 6e 20 45 4f 46 20  d report an EOF 
61e0: 6a 75 73 74 20 6c 69 6b 65 0a 09 20 2a 20 6f 6e  just like.. * on
61f0: 20 55 6e 69 78 2e 0a 09 20 2a 2f 0a 0a 09 69 66   Unix... */...if
6200: 20 28 65 72 72 6f 72 20 3d 3d 20 57 53 41 45 43   (error == WSAEC
6210: 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 20 20 20  ONNRESET) {..   
6220: 20 53 45 54 5f 42 49 54 53 28 73 74 61 74 65 50   SET_BITS(stateP
6230: 74 72 2d 3e 66 6c 61 67 73 2c 20 53 4f 43 4b 45  tr->flags, SOCKE
6240: 54 5f 45 4f 46 29 3b 0a 09 20 20 20 20 62 79 74  T_EOF);..    byt
6250: 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20  esRead = 0;..   
6260: 20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a   break;..}.../*.
6270: 09 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72  . * Check for er
6280: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 72  ror condition or
6290: 20 75 6e 64 65 72 66 6c 6f 77 20 69 6e 20 6e 6f   underflow in no
62a0: 6e 2d 62 6c 6f 63 6b 69 6e 67 20 63 61 73 65 2e  n-blocking case.
62b0: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 47 4f 54 5f  .. */...if (GOT_
62c0: 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66  BITS(statePtr->f
62d0: 6c 61 67 73 2c 20 54 43 50 5f 4e 4f 4e 42 4c 4f  lags, TCP_NONBLO
62e0: 43 4b 49 4e 47 29 0a 09 09 7c 7c 20 28 65 72 72  CKING)...|| (err
62f0: 6f 72 20 21 3d 20 57 53 41 45 57 4f 55 4c 44 42  or != WSAEWOULDB
6300: 4c 4f 43 4b 29 29 20 7b 0a 09 20 20 20 20 54 63  LOCK)) {..    Tc
6310: 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f  l_WinConvertErro
6320: 72 28 65 72 72 6f 72 29 3b 0a 09 20 20 20 20 2a  r(error);..    *
6330: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54  errorCodePtr = T
6340: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09  cl_GetErrno();..
6350: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20      bytesRead = 
6360: 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -1;..    break;.
6370: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 6e 20 74  .}.../*.. * In t
6380: 68 65 20 62 6c 6f 63 6b 69 6e 67 20 63 61 73 65  he blocking case
6390: 2c 20 77 61 69 74 20 75 6e 74 69 6c 20 74 68 65  , wait until the
63a0: 20 66 69 6c 65 20 62 65 63 6f 6d 65 73 20 72 65   file becomes re
63b0: 61 64 61 62 6c 65 20 6f 72 0a 09 20 2a 20 63 6c  adable or.. * cl
63c0: 6f 73 65 64 20 61 6e 64 20 74 72 79 20 61 67 61  osed and try aga
63d0: 69 6e 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21  in... */...if (!
63e0: 57 61 69 74 46 6f 72 53 6f 63 6b 65 74 45 76 65  WaitForSocketEve
63f0: 6e 74 28 73 74 61 74 65 50 74 72 2c 20 46 44 5f  nt(statePtr, FD_
6400: 52 45 41 44 7c 46 44 5f 43 4c 4f 53 45 2c 20 65  READ|FD_CLOSE, e
6410: 72 72 6f 72 43 6f 64 65 50 74 72 29 29 20 7b 0a  rrorCodePtr)) {.
6420: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d  .    bytesRead =
6430: 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b   -1;..    break;
6440: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53  ..}.    }..    S
6450: 65 6e 64 53 65 6c 65 63 74 4d 65 73 73 61 67 65  endSelectMessage
6460: 28 74 73 64 50 74 72 2c 20 53 45 4c 45 43 54 2c  (tsdPtr, SELECT,
6470: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
6480: 20 72 65 74 75 72 6e 20 62 79 74 65 73 52 65 61   return bytesRea
6490: 64 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  d;.}.../*. *----
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64e0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 70 4f 75 74 70  --. *. * TcpOutp
64f0: 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  utProc --. *. *.
6500: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6510: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67   called by the g
6520: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20  eneric IO level 
6530: 74 6f 20 77 72 69 74 65 20 64 61 74 61 20 74 6f  to write data to
6540: 20 61 0a 20 2a 09 73 6f 63 6b 65 74 20 62 61 73   a. *.socket bas
6550: 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  ed channel.. *. 
6560: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
6570: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
6580: 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31 20  s written or -1 
6590: 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 20 2a 0a 20  on failure.. *. 
65a0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
65b0: 20 2a 09 50 72 6f 64 75 63 65 73 20 6f 75 74 70   *.Produces outp
65c0: 75 74 20 6f 6e 20 74 68 65 20 73 6f 63 6b 65 74  ut on the socket
65d0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6620: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 63  /..static int.Tc
6630: 70 4f 75 74 70 75 74 50 72 6f 63 28 0a 20 20 20  pOutputProc(.   
6640: 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 44   void *instanceD
6650: 61 74 61 2c 09 09 2f 2a 20 53 6f 63 6b 65 74 20  ata,../* Socket 
6660: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 63 6f  state. */.    co
6670: 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c 09 09  nst char *buf,..
6680: 2f 2a 20 54 68 65 20 64 61 74 61 20 62 75 66 66  /* The data buff
6690: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  er. */.    int t
66a0: 6f 57 72 69 74 65 2c 09 09 2f 2a 20 48 6f 77 20  oWrite,../* How 
66b0: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 77 72  many bytes to wr
66c0: 69 74 65 3f 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ite? */.    int 
66d0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 09 09  *errorCodePtr)..
66e0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72  /* Where to stor
66f0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f  e error code. */
6700: 0a 7b 0a 20 20 20 20 54 63 70 53 74 61 74 65 20  .{.    TcpState 
6710: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 54 63 70  *statePtr = (Tcp
6720: 53 74 61 74 65 20 2a 29 69 6e 73 74 61 6e 63 65  State *)instance
6730: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 72  Data;.    int wr
6740: 69 74 74 65 6e 3b 0a 20 20 20 20 44 57 4f 52 44  itten;.    DWORD
6750: 20 65 72 72 6f 72 3b 0a 20 20 20 20 54 68 72 65   error;.    Thre
6760: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a  adSpecificData *
6770: 74 73 64 50 74 72 20 3d 20 28 54 68 72 65 61 64  tsdPtr = (Thread
6780: 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 29 0a  SpecificData *).
6790: 09 20 20 20 20 54 63 6c 54 68 72 65 61 64 44 61  .    TclThreadDa
67a0: 74 61 4b 65 79 47 65 74 28 26 64 61 74 61 4b 65  taKeyGet(&dataKe
67b0: 79 29 3b 0a 0a 20 20 20 20 2a 65 72 72 6f 72 43  y);..    *errorC
67c0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  odePtr = 0;..   
67d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b   /*.     * Check
67e0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
67f0: 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20 72 75  async connect ru
6800: 6e 6e 69 6e 67 2e 0a 20 20 20 20 20 2a 20 46 6f  nning..     * Fo
6810: 72 20 62 6c 6f 63 6b 69 6e 67 20 73 6f 63 6b 65  r blocking socke
6820: 74 73 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e  ts terminate con
6830: 6e 65 63 74 2c 20 6f 74 68 65 72 77 69 73 65 20  nect, otherwise 
6840: 64 6f 20 6f 6e 65 20 73 74 65 70 2e 0a 20 20 20  do one step..   
6850: 20 20 2a 20 46 6f 72 20 61 20 6e 6f 6e 20 62 6c    * For a non bl
6860: 6f 63 6b 69 6e 67 20 73 6f 63 6b 65 74 20 72 65  ocking socket re
6870: 74 75 72 6e 20 45 57 4f 55 4c 44 42 4c 4f 43 4b  turn EWOULDBLOCK
6880: 20 69 66 20 63 6f 6e 6e 65 63 74 20 6e 6f 74 20   if connect not 
6890: 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 20  terminated.     
68a0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 57 61 69 74  */..    if (Wait
68b0: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
68c0: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74  Ptr, errorCodePt
68d0: 72 29 20 21 3d 20 30 29 20 7b 0a 09 72 65 74 75  r) != 0) {..retu
68e0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
68f0: 20 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 53    while (1) {..S
6900: 65 6e 64 53 65 6c 65 63 74 4d 65 73 73 61 67 65  endSelectMessage
6910: 28 74 73 64 50 74 72 2c 20 55 4e 53 45 4c 45 43  (tsdPtr, UNSELEC
6920: 54 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 09  T, statePtr);...
6930: 2f 2a 0a 09 20 2a 20 53 69 6e 67 6c 65 20 66 64  /*.. * Single fd
6940: 20 6f 70 65 72 61 74 69 6f 6e 3a 20 74 68 69 73   operation: this
6950: 20 70 72 6f 63 20 69 73 20 6f 6e 6c 79 20 63 61   proc is only ca
6960: 6c 6c 65 64 20 66 6f 72 20 61 20 63 6f 6e 6e 65  lled for a conne
6970: 63 74 65 64 0a 09 20 2a 20 73 6f 63 6b 65 74 2e  cted.. * socket.
6980: 0a 09 20 2a 2f 0a 0a 09 77 72 69 74 74 65 6e 20  .. */...written 
6990: 3d 20 73 65 6e 64 28 73 74 61 74 65 50 74 72 2d  = send(statePtr-
69a0: 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 2c 20 62 75  >sockets->fd, bu
69b0: 66 2c 20 74 6f 57 72 69 74 65 2c 20 30 29 3b 0a  f, toWrite, 0);.
69c0: 09 69 66 20 28 77 72 69 74 74 65 6e 20 21 3d 20  .if (written != 
69d0: 53 4f 43 4b 45 54 5f 45 52 52 4f 52 29 20 7b 0a  SOCKET_ERROR) {.
69e0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
69f0: 53 69 6e 63 65 20 57 69 6e 64 6f 77 73 20 77 6f  Since Windows wo
6a00: 6e 27 74 20 67 65 6e 65 72 61 74 65 20 61 20 6e  n't generate a n
6a10: 65 77 20 77 72 69 74 65 20 65 76 65 6e 74 20 75  ew write event u
6a20: 6e 74 69 6c 20 77 65 20 68 69 74 20 61 6e 0a 09  ntil we hit an..
6a30: 20 20 20 20 20 2a 20 6f 76 65 72 66 6c 6f 77 20       * overflow 
6a40: 63 6f 6e 64 69 74 69 6f 6e 2c 20 77 65 20 6e 65  condition, we ne
6a50: 65 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20  ed to force the 
6a60: 65 76 65 6e 74 20 6c 6f 6f 70 20 74 6f 20 70 6f  event loop to po
6a70: 6c 6c 0a 09 20 20 20 20 20 2a 20 75 6e 74 69 6c  ll..     * until
6a80: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 63   the condition c
6a90: 68 61 6e 67 65 73 2e 0a 09 20 20 20 20 20 2a 2f  hanges...     */
6aa0: 0a 0a 09 20 20 20 20 69 66 20 28 47 4f 54 5f 42  ...    if (GOT_B
6ab0: 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 77 61  ITS(statePtr->wa
6ac0: 74 63 68 45 76 65 6e 74 73 2c 20 46 44 5f 57 52  tchEvents, FD_WR
6ad0: 49 54 45 29 29 20 7b 0a 09 09 54 63 6c 5f 54 69  ITE)) {...Tcl_Ti
6ae0: 6d 65 20 62 6c 6f 63 6b 54 69 6d 65 20 3d 20 7b  me blockTime = {
6af0: 20 30 2c 20 30 20 7d 3b 0a 0a 09 09 54 63 6c 5f   0, 0 };....Tcl_
6b00: 53 65 74 4d 61 78 42 6c 6f 63 6b 54 69 6d 65 28  SetMaxBlockTime(
6b10: 26 62 6c 6f 63 6b 54 69 6d 65 29 3b 0a 09 20 20  &blockTime);..  
6b20: 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a    }..    break;.
6b30: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 63  .}.../*.. * Chec
6b40: 6b 20 66 6f 72 20 65 72 72 6f 72 20 63 6f 6e 64  k for error cond
6b50: 69 74 69 6f 6e 20 6f 72 20 6f 76 65 72 66 6c 6f  ition or overflo
6b60: 77 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  w. In the event 
6b70: 6f 66 20 6f 76 65 72 66 6c 6f 77 2c 20 77 65 0a  of overflow, we.
6b80: 09 20 2a 20 6e 65 65 64 20 74 6f 20 63 6c 65 61  . * need to clea
6b90: 72 20 74 68 65 20 46 44 5f 57 52 49 54 45 20 66  r the FD_WRITE f
6ba0: 6c 61 67 20 73 6f 20 77 65 20 63 61 6e 20 64 65  lag so we can de
6bb0: 74 65 63 74 20 74 68 65 20 6e 65 78 74 20 77 72  tect the next wr
6bc0: 69 74 61 62 6c 65 0a 09 20 2a 20 65 76 65 6e 74  itable.. * event
6bd0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  . Note that Wind
6be0: 6f 77 73 20 6f 6e 6c 79 20 73 65 6e 64 73 20 61  ows only sends a
6bf0: 20 6e 65 77 20 77 72 69 74 61 62 6c 65 20 65 76   new writable ev
6c00: 65 6e 74 20 61 66 74 65 72 20 61 0a 09 20 2a 20  ent after a.. * 
6c10: 73 65 6e 64 20 66 61 69 6c 73 20 77 69 74 68 20  send fails with 
6c20: 57 53 41 45 57 4f 55 4c 44 42 4c 4f 43 4b 2e 0a  WSAEWOULDBLOCK..
6c30: 09 20 2a 2f 0a 0a 09 65 72 72 6f 72 20 3d 20 57  . */...error = W
6c40: 53 41 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  SAGetLastError()
6c50: 3b 0a 09 69 66 20 28 65 72 72 6f 72 20 3d 3d 20  ;..if (error == 
6c60: 57 53 41 45 57 4f 55 4c 44 42 4c 4f 43 4b 29 20  WSAEWOULDBLOCK) 
6c70: 7b 0a 09 20 20 20 20 43 4c 45 41 52 5f 42 49 54  {..    CLEAR_BIT
6c80: 53 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64  S(statePtr->read
6c90: 79 45 76 65 6e 74 73 2c 20 46 44 5f 57 52 49 54  yEvents, FD_WRIT
6ca0: 45 29 3b 0a 09 20 20 20 20 69 66 20 28 47 4f 54  E);..    if (GOT
6cb0: 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e  _BITS(statePtr->
6cc0: 66 6c 61 67 73 2c 20 54 43 50 5f 4e 4f 4e 42 4c  flags, TCP_NONBL
6cd0: 4f 43 4b 49 4e 47 29 29 20 7b 0a 09 09 2a 65 72  OCKING)) {...*er
6ce0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 57 4f  rorCodePtr = EWO
6cf0: 55 4c 44 42 4c 4f 43 4b 3b 0a 09 09 77 72 69 74  ULDBLOCK;...writ
6d00: 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 62 72 65 61  ten = -1;...brea
6d10: 6b 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73  k;..    }..} els
6d20: 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 57 69 6e  e {..    Tcl_Win
6d30: 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 65 72 72  ConvertError(err
6d40: 6f 72 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  or);..    *error
6d50: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65  CodePtr = Tcl_Ge
6d60: 74 45 72 72 6e 6f 28 29 3b 0a 09 20 20 20 20 77  tErrno();..    w
6d70: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20  ritten = -1;..  
6d80: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a    break;..}.../*
6d90: 0a 09 20 2a 20 49 6e 20 74 68 65 20 62 6c 6f 63  .. * In the bloc
6da0: 6b 69 6e 67 20 63 61 73 65 2c 20 77 61 69 74 20  king case, wait 
6db0: 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 62  until the file b
6dc0: 65 63 6f 6d 65 73 20 77 72 69 74 61 62 6c 65 20  ecomes writable 
6dd0: 6f 72 0a 09 20 2a 20 63 6c 6f 73 65 64 20 61 6e  or.. * closed an
6de0: 64 20 74 72 79 20 61 67 61 69 6e 2e 0a 09 20 2a  d try again... *
6df0: 2f 0a 0a 09 69 66 20 28 21 57 61 69 74 46 6f 72  /...if (!WaitFor
6e00: 53 6f 63 6b 65 74 45 76 65 6e 74 28 73 74 61 74  SocketEvent(stat
6e10: 65 50 74 72 2c 20 46 44 5f 57 52 49 54 45 7c 46  ePtr, FD_WRITE|F
6e20: 44 5f 43 4c 4f 53 45 2c 20 65 72 72 6f 72 43 6f  D_CLOSE, errorCo
6e30: 64 65 50 74 72 29 29 20 7b 0a 09 20 20 20 20 77  dePtr)) {..    w
6e40: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20  ritten = -1;..  
6e50: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20    break;..}.    
6e60: 7d 0a 0a 20 20 20 20 53 65 6e 64 53 65 6c 65 63  }..    SendSelec
6e70: 74 4d 65 73 73 61 67 65 28 74 73 64 50 74 72 2c  tMessage(tsdPtr,
6e80: 20 53 45 4c 45 43 54 2c 20 73 74 61 74 65 50 74   SELECT, statePt
6e90: 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
6ea0: 77 72 69 74 74 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a  written;.}.../*.
6eb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
6f00: 63 70 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20  cpCloseProc --. 
6f10: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
6f20: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
6f30: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
6f40: 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 20  evel to perform 
6f50: 63 68 61 6e 6e 65 6c 0a 20 2a 09 74 79 70 65 20  channel. *.type 
6f60: 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70  specific cleanup
6f70: 20 6f 6e 20 61 20 73 6f 63 6b 65 74 20 62 61 73   on a socket bas
6f80: 65 64 20 63 68 61 6e 6e 65 6c 20 77 68 65 6e 20  ed channel when 
6f90: 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 73 0a 20  the channel is. 
6fa0: 2a 09 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20 2a 20  *.closed.. *. * 
6fb0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66  Results:. *.0 if
6fc0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
6fd0: 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20   value of errno 
6fe0: 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a  if failed.. *. *
6ff0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
7000: 2a 09 43 6c 6f 73 65 73 20 74 68 65 20 73 6f 63  *.Closes the soc
7010: 6b 65 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ket.. *. *------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7060: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
7070: 0a 54 63 70 43 6c 6f 73 65 50 72 6f 63 28 0a 20  .TcpCloseProc(. 
7080: 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63     void *instanc
7090: 65 44 61 74 61 2c 09 09 2f 2a 20 54 68 65 20 73  eData,../* The s
70a0: 6f 63 6b 65 74 20 74 6f 20 63 6c 6f 73 65 2e 20  ocket to close. 
70b0: 2a 2f 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  */.    TCL_UNUSE
70c0: 44 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 29  D(Tcl_Interp *))
70d0: 0a 7b 0a 20 20 20 20 54 63 70 53 74 61 74 65 20  .{.    TcpState 
70e0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 54 63 70  *statePtr = (Tcp
70f0: 53 74 61 74 65 20 2a 29 69 6e 73 74 61 6e 63 65  State *)instance
7100: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 54 49 50  Data;.    /* TIP
7110: 20 23 32 31 38 20 2a 2f 0a 20 20 20 20 69 6e 74   #218 */.    int
7120: 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a   errorCode = 0;.
7130: 20 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66      ThreadSpecif
7140: 69 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d  icData *tsdPtr =
7150: 20 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64   TCL_TSD_INIT(&d
7160: 61 74 61 4b 65 79 29 3b 0a 0a 20 20 20 20 2f 2a  ataKey);..    /*
7170: 0a 20 20 20 20 20 2a 20 43 6c 65 61 6e 20 75 70  .     * Clean up
7180: 20 74 68 65 20 4f 53 20 73 6f 63 6b 65 74 20 68   the OS socket h
7190: 61 6e 64 6c 65 2e 20 54 68 65 20 64 65 66 61 75  andle. The defau
71a0: 6c 74 20 57 69 6e 64 6f 77 73 20 73 65 74 74 69  lt Windows setti
71b0: 6e 67 20 66 6f 72 20 61 0a 20 20 20 20 20 2a 20  ng for a.     * 
71c0: 73 6f 63 6b 65 74 20 69 73 20 53 4f 5f 44 4f 4e  socket is SO_DON
71d0: 54 4c 49 4e 47 45 52 2c 20 77 68 69 63 68 20 64  TLINGER, which d
71e0: 6f 65 73 20 61 20 67 72 61 63 65 66 75 6c 20 73  oes a graceful s
71f0: 68 75 74 64 6f 77 6e 20 69 6e 20 74 68 65 0a 20  hutdown in the. 
7200: 20 20 20 20 2a 20 62 61 63 6b 67 72 6f 75 6e 64      * background
7210: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 77  ..     */..    w
7220: 68 69 6c 65 20 28 73 74 61 74 65 50 74 72 2d 3e  hile (statePtr->
7230: 73 6f 63 6b 65 74 73 20 21 3d 20 4e 55 4c 4c 29  sockets != NULL)
7240: 20 7b 0a 09 54 63 70 46 64 4c 69 73 74 20 2a 74   {..TcpFdList *t
7250: 68 69 73 66 64 20 3d 20 73 74 61 74 65 50 74 72  hisfd = statePtr
7260: 2d 3e 73 6f 63 6b 65 74 73 3b 0a 0a 09 73 74 61  ->sockets;...sta
7270: 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 20 3d  tePtr->sockets =
7280: 20 74 68 69 73 66 64 2d 3e 6e 65 78 74 3b 0a 09   thisfd->next;..
7290: 69 66 20 28 63 6c 6f 73 65 73 6f 63 6b 65 74 28  if (closesocket(
72a0: 74 68 69 73 66 64 2d 3e 66 64 29 20 3d 3d 20 53  thisfd->fd) == S
72b0: 4f 43 4b 45 54 5f 45 52 52 4f 52 29 20 7b 0a 09  OCKET_ERROR) {..
72c0: 20 20 20 20 54 63 6c 5f 57 69 6e 43 6f 6e 76 65      Tcl_WinConve
72d0: 72 74 45 72 72 6f 72 28 28 44 57 4f 52 44 29 20  rtError((DWORD) 
72e0: 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f 72 28  WSAGetLastError(
72f0: 29 29 3b 0a 09 20 20 20 20 65 72 72 6f 72 43 6f  ));..    errorCo
7300: 64 65 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e  de = Tcl_GetErrn
7310: 6f 28 29 3b 0a 09 7d 0a 09 54 63 6c 5f 46 72 65  o();..}..Tcl_Fre
7320: 65 28 74 68 69 73 66 64 29 3b 0a 20 20 20 20 7d  e(thisfd);.    }
7330: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
7340: 74 72 2d 3e 61 64 64 72 6c 69 73 74 20 21 3d 20  tr->addrlist != 
7350: 4e 55 4c 4c 29 20 7b 0a 09 66 72 65 65 61 64 64  NULL) {..freeadd
7360: 72 69 6e 66 6f 28 73 74 61 74 65 50 74 72 2d 3e  rinfo(statePtr->
7370: 61 64 64 72 6c 69 73 74 29 3b 0a 20 20 20 20 7d  addrlist);.    }
7380: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
7390: 72 2d 3e 6d 79 61 64 64 72 6c 69 73 74 20 21 3d  r->myaddrlist !=
73a0: 20 4e 55 4c 4c 29 20 7b 0a 09 66 72 65 65 61 64   NULL) {..freead
73b0: 64 72 69 6e 66 6f 28 73 74 61 74 65 50 74 72 2d  drinfo(statePtr-
73c0: 3e 6d 79 61 64 64 72 6c 69 73 74 29 3b 0a 20 20  >myaddrlist);.  
73d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
73e0: 20 2a 20 43 6c 65 61 72 20 61 6e 20 65 76 65 6e   * Clear an even
73f0: 74 75 61 6c 20 74 73 64 20 69 6e 66 6f 20 6c 69  tual tsd info li
7400: 73 74 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20  st pointer..    
7410: 20 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 20 6d   *.     * This m
7420: 61 79 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 66  ay be called, if
7430: 20 61 6e 20 61 73 79 6e 63 20 73 6f 63 6b 65 74   an async socket
7440: 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 73 20 6f   connect fails o
7450: 72 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  r is closed.    
7460: 20 2a 20 62 65 74 77 65 65 6e 20 63 6f 6e 6e 65   * between conne
7470: 63 74 20 61 6e 64 20 74 68 72 65 61 64 20 61 63  ct and thread ac
7480: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  tion callback.. 
7490: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
74a0: 74 73 64 50 74 72 2d 3e 70 65 6e 64 69 6e 67 54  tsdPtr->pendingT
74b0: 63 70 53 74 61 74 65 20 21 3d 20 4e 55 4c 4c 0a  cpState != NULL.
74c0: 09 20 20 20 20 26 26 20 74 73 64 50 74 72 2d 3e  .    && tsdPtr->
74d0: 70 65 6e 64 69 6e 67 54 63 70 53 74 61 74 65 20  pendingTcpState 
74e0: 3d 3d 20 73 74 61 74 65 50 74 72 29 20 7b 0a 09  == statePtr) {..
74f0: 2f 2a 0a 09 20 2a 20 47 65 74 20 69 6e 66 6f 50  /*.. * Get infoP
7500: 74 72 20 6c 6f 63 6b 2c 20 62 65 63 61 75 73 65  tr lock, because
7510: 20 74 68 69 73 20 63 6f 6e 63 65 72 6e 73 20 74   this concerns t
7520: 68 65 20 6e 6f 74 69 66 69 65 72 20 74 68 72 65  he notifier thre
7530: 61 64 2e 0a 09 20 2a 2f 0a 0a 09 57 61 69 74 46  ad... */...WaitF
7540: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74  orSingleObject(t
7550: 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73  sdPtr->socketLis
7560: 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29  tLock, INFINITE)
7570: 3b 0a 0a 09 74 73 64 50 74 72 2d 3e 70 65 6e 64  ;...tsdPtr->pend
7580: 69 6e 67 54 63 70 53 74 61 74 65 20 3d 20 4e 55  ingTcpState = NU
7590: 4c 4c 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 46 72 65  LL;.../*.. * Fre
75a0: 65 20 6c 69 73 74 20 6c 6f 63 6b 2e 0a 09 20 2a  e list lock... *
75b0: 2f 0a 0a 09 53 65 74 45 76 65 6e 74 28 74 73 64  /...SetEvent(tsd
75c0: 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c  Ptr->socketListL
75d0: 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ock);.    }..   
75e0: 20 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50 20 23   /*.     * TIP #
75f0: 32 31 38 2e 20 52 65 6d 6f 76 65 64 20 74 68 65  218. Removed the
7600: 20 63 6f 64 65 20 72 65 6d 6f 76 69 6e 67 20 74   code removing t
7610: 68 65 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  he structure fro
7620: 6d 20 74 68 65 20 67 6c 6f 62 61 6c 0a 20 20 20  m the global.   
7630: 20 20 2a 20 73 6f 63 6b 65 74 20 6c 69 73 74 2e    * socket list.
7640: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 64 6f 6e   This is now don
7650: 65 20 62 79 20 74 68 65 20 74 68 72 65 61 64 20  e by the thread 
7660: 61 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73  action callbacks
7670: 2c 20 61 6e 64 20 6f 6e 6c 79 0a 20 20 20 20 20  , and only.     
7680: 2a 20 74 68 65 72 65 2e 20 54 68 69 73 20 68 61  * there. This ha
7690: 70 70 65 6e 73 20 62 65 66 6f 72 65 20 74 68 69  ppens before thi
76a0: 73 20 63 6f 64 65 20 69 73 20 63 61 6c 6c 65 64  s code is called
76b0: 2e 20 57 65 20 63 61 6e 20 66 72 65 65 20 77 69  . We can free wi
76c0: 74 68 6f 75 74 0a 20 20 20 20 20 2a 20 66 65 61  thout.     * fea
76d0: 72 20 6f 66 20 64 61 6d 61 67 69 6e 67 20 74 68  r of damaging th
76e0: 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a  e list..     */.
76f0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 73 74  .    Tcl_Free(st
7700: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74  atePtr);.    ret
7710: 75 72 6e 20 65 72 72 6f 72 43 6f 64 65 3b 0a 7d  urn errorCode;.}
7720: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7770: 2a 0a 20 2a 20 54 63 70 43 6c 6f 73 65 32 50 72  *. * TcpClose2Pr
7780: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  oc --. *. *.This
7790: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
77a0: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
77b0: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70  ic IO level to p
77c0: 65 72 66 6f 72 6d 20 74 68 65 20 63 68 61 6e 6e  erform the chann
77d0: 65 6c 0a 20 2a 09 74 79 70 65 20 73 70 65 63 69  el. *.type speci
77e0: 66 69 63 20 70 61 72 74 20 6f 66 20 61 20 68 61  fic part of a ha
77f0: 6c 66 2d 63 6c 6f 73 65 3a 20 6e 61 6d 65 6c 79  lf-close: namely
7800: 2c 20 61 20 73 68 75 74 64 6f 77 6e 28 29 20 6f  , a shutdown() o
7810: 6e 20 61 20 73 6f 63 6b 65 74 2e 0a 20 2a 0a 20  n a socket.. *. 
7820: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20  * Results:. *.0 
7830: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  if successful, t
7840: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e  he value of errn
7850: 6f 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a  o if failed.. *.
7860: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
7870: 0a 20 2a 09 53 68 75 74 73 20 64 6f 77 6e 20 6f  . *.Shuts down o
7880: 6e 65 20 73 69 64 65 20 6f 66 20 74 68 65 20 73  ne side of the s
7890: 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ocket.. *. *----
78a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
78f0: 6e 74 0a 54 63 70 43 6c 6f 73 65 32 50 72 6f 63  nt.TcpClose2Proc
7900: 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 74  (.    void *inst
7910: 61 6e 63 65 44 61 74 61 2c 09 09 2f 2a 20 54 68  anceData,../* Th
7920: 65 20 73 6f 63 6b 65 74 20 74 6f 20 63 6c 6f 73  e socket to clos
7930: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  e. */.    Tcl_In
7940: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
7950: 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70 6f  * For error repo
7960: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e  rting. */.    in
7970: 74 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 46 6c  t flags).../* Fl
7980: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74  ags that indicat
7990: 65 20 77 68 69 63 68 20 73 69 64 65 20 74 6f 20  e which side to 
79a0: 63 6c 6f 73 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20  close. */.{.    
79b0: 54 63 70 53 74 61 74 65 20 2a 73 74 61 74 65 50  TcpState *stateP
79c0: 74 72 20 3d 20 28 54 63 70 53 74 61 74 65 20 2a  tr = (TcpState *
79d0: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20  )instanceData;. 
79e0: 20 20 20 69 6e 74 20 72 65 61 64 45 72 72 6f 72     int readError
79f0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 77 72   = 0;.    int wr
7a00: 69 74 65 45 72 72 6f 72 20 3d 20 30 3b 0a 0a 20  iteError = 0;.. 
7a10: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 68 75     /*.     * Shu
7a20: 74 64 6f 77 6e 20 74 68 65 20 4f 53 20 73 6f 63  tdown the OS soc
7a30: 6b 65 74 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ket handle..    
7a40: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 28 66 6c   */..    if ((fl
7a50: 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45  ags & (TCL_CLOSE
7a60: 5f 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f 53  _READ | TCL_CLOS
7a70: 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 20  E_WRITE)) == 0) 
7a80: 7b 0a 09 72 65 74 75 72 6e 20 54 63 70 43 6c 6f  {..return TcpClo
7a90: 73 65 50 72 6f 63 28 69 6e 73 74 61 6e 63 65 44  seProc(instanceD
7aa0: 61 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata, interp);.  
7ab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
7ac0: 20 2a 20 53 69 6e 67 6c 65 20 66 64 20 6f 70 65   * Single fd ope
7ad0: 72 61 74 69 6f 6e 3a 20 54 63 6c 5f 4f 70 65 6e  ration: Tcl_Open
7ae0: 54 63 70 53 65 72 76 65 72 28 29 20 64 6f 65 73  TcpServer() does
7af0: 20 6e 6f 74 20 73 65 74 20 54 43 4c 5f 52 45 41   not set TCL_REA
7b00: 44 41 42 4c 45 20 6f 72 0a 20 20 20 20 20 2a 20  DABLE or.     * 
7b10: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 73 6f 20  TCL_WRITABLE so 
7b20: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  this should neve
7b30: 72 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  r be called for 
7b40: 61 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74 2e  a server socket.
7b50: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
7b60: 20 28 28 66 6c 61 67 73 20 26 20 54 43 4c 5f 43   ((flags & TCL_C
7b70: 4c 4f 53 45 5f 52 45 41 44 29 0a 09 20 20 20 20  LOSE_READ)..    
7b80: 26 26 20 28 73 68 75 74 64 6f 77 6e 28 73 74 61  && (shutdown(sta
7b90: 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e  tePtr->sockets->
7ba0: 66 64 2c 20 53 44 5f 52 45 43 45 49 56 45 29 20  fd, SD_RECEIVE) 
7bb0: 3d 3d 20 53 4f 43 4b 45 54 5f 45 52 52 4f 52 29  == SOCKET_ERROR)
7bc0: 29 20 7b 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76  ) {..Tcl_WinConv
7bd0: 65 72 74 45 72 72 6f 72 28 28 44 57 4f 52 44 29  ertError((DWORD)
7be0: 20 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f 72   WSAGetLastError
7bf0: 28 29 29 3b 0a 09 72 65 61 64 45 72 72 6f 72 20  ());..readError 
7c00: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  = Tcl_GetErrno()
7c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
7c20: 28 66 6c 61 67 73 20 26 20 54 43 4c 5f 43 4c 4f  (flags & TCL_CLO
7c30: 53 45 5f 57 52 49 54 45 29 0a 09 20 20 20 20 26  SE_WRITE)..    &
7c40: 26 20 28 73 68 75 74 64 6f 77 6e 28 73 74 61 74  & (shutdown(stat
7c50: 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66  ePtr->sockets->f
7c60: 64 2c 20 53 44 5f 53 45 4e 44 29 20 3d 3d 20 53  d, SD_SEND) == S
7c70: 4f 43 4b 45 54 5f 45 52 52 4f 52 29 29 20 7b 0a  OCKET_ERROR)) {.
7c80: 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45  .Tcl_WinConvertE
7c90: 72 72 6f 72 28 28 44 57 4f 52 44 29 20 57 53 41  rror((DWORD) WSA
7ca0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  GetLastError());
7cb0: 0a 09 77 72 69 74 65 45 72 72 6f 72 20 3d 20 54  ..writeError = T
7cc0: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 20  cl_GetErrno();. 
7cd0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
7ce0: 28 72 65 61 64 45 72 72 6f 72 20 21 3d 20 30 29  (readError != 0)
7cf0: 20 3f 20 72 65 61 64 45 72 72 6f 72 20 3a 20 77   ? readError : w
7d00: 72 69 74 65 45 72 72 6f 72 3b 0a 7d 0a 0c 0a 2f  riteError;.}.../
7d10: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
7d60: 20 54 63 70 53 65 74 4f 70 74 69 6f 6e 50 72 6f   TcpSetOptionPro
7d70: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65 74 73 20  c --. *. *.Sets 
7d80: 54 63 70 20 63 68 61 6e 6e 65 6c 20 73 70 65 63  Tcp channel spec
7d90: 69 66 69 63 20 6f 70 74 69 6f 6e 73 2e 0a 20 2a  ific options.. *
7da0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
7db0: 4e 6f 6e 65 2c 20 75 6e 6c 65 73 73 20 61 6e 20  None, unless an 
7dc0: 65 72 72 6f 72 20 68 61 70 70 65 6e 73 2e 0a 20  error happens.. 
7dd0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
7de0: 73 3a 0a 20 2a 09 43 68 61 6e 67 65 73 20 61 74  s:. *.Changes at
7df0: 74 72 69 62 75 74 65 73 20 6f 66 20 74 68 65 20  tributes of the 
7e00: 73 6f 63 6b 65 74 20 61 74 20 74 68 65 20 73 79  socket at the sy
7e10: 73 74 65 6d 20 6c 65 76 65 6c 2e 0a 20 2a 0a 20  stem level.. *. 
7e20: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
7e70: 74 69 63 20 69 6e 74 0a 54 63 70 53 65 74 4f 70  tic int.TcpSetOp
7e80: 74 69 6f 6e 50 72 6f 63 28 0a 20 20 20 20 76 6f  tionProc(.    vo
7e90: 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61  id *instanceData
7ea0: 2c 09 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61  ,../* Socket sta
7eb0: 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  te. */.    Tcl_I
7ec0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
7ed0: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70  /* For error rep
7ee0: 6f 72 74 69 6e 67 20 2d 20 63 61 6e 20 62 65 20  orting - can be 
7ef0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e  NULL. */.    con
7f00: 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e  st char *optionN
7f10: 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20  ame,./* Name of 
7f20: 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20 73 65  the option to se
7f30: 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  t. */.    const 
7f40: 63 68 61 72 20 2a 76 61 6c 75 65 29 09 09 2f 2a  char *value)../*
7f50: 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 20 6f   New value for o
7f60: 70 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20  ption. */.{.    
7f70: 54 63 70 53 74 61 74 65 20 2a 73 74 61 74 65 50  TcpState *stateP
7f80: 74 72 20 3d 20 28 54 63 70 53 74 61 74 65 20 2a  tr = (TcpState *
7f90: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20  )instanceData;. 
7fa0: 20 20 20 53 4f 43 4b 45 54 20 73 6f 63 6b 3b 0a     SOCKET sock;.
7fb0: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 20 3d      size_t len =
7fc0: 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 6f 70 74   0;..    if (opt
7fd0: 69 6f 6e 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29  ionName != NULL)
7fe0: 20 7b 0a 09 6c 65 6e 20 3d 20 73 74 72 6c 65 6e   {..len = strlen
7ff0: 28 6f 70 74 69 6f 6e 4e 61 6d 65 29 3b 0a 20 20  (optionName);.  
8000: 20 20 7d 0a 0a 20 20 20 20 73 6f 63 6b 20 3d 20    }..    sock = 
8010: 73 74 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74  statePtr->socket
8020: 73 2d 3e 66 64 3b 0a 0a 20 20 20 20 69 66 20 28  s->fd;..    if (
8030: 28 6c 65 6e 20 3e 20 31 29 20 26 26 20 28 6f 70  (len > 1) && (op
8040: 74 69 6f 6e 4e 61 6d 65 5b 31 5d 20 3d 3d 20 27  tionName[1] == '
8050: 6b 27 29 20 26 26 0a 09 20 20 20 20 28 73 74 72  k') &&..    (str
8060: 6e 63 6d 70 28 6f 70 74 69 6f 6e 4e 61 6d 65 2c  ncmp(optionName,
8070: 20 22 2d 6b 65 65 70 61 6c 69 76 65 22 2c 20 6c   "-keepalive", l
8080: 65 6e 29 20 3d 3d 20 30 29 29 20 7b 0a 09 42 4f  en) == 0)) {..BO
8090: 4f 4c 20 62 6f 6f 6c 56 61 72 3b 0a 09 69 6e 74  OL boolVar;..int
80a0: 20 72 74 6e 3b 0a 0a 09 69 66 20 28 54 63 6c 5f   rtn;...if (Tcl_
80b0: 47 65 74 42 6f 6f 6c 65 61 6e 28 69 6e 74 65 72  GetBoolean(inter
80c0: 70 2c 20 76 61 6c 75 65 2c 20 26 62 6f 6f 6c 56  p, value, &boolV
80d0: 61 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ar) != TCL_OK) {
80e0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
80f0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 72 74 6e 20  _ERROR;..}..rtn 
8100: 3d 20 73 65 74 73 6f 63 6b 6f 70 74 28 73 6f 63  = setsockopt(soc
8110: 6b 2c 20 53 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53  k, SOL_SOCKET, S
8120: 4f 5f 4b 45 45 50 41 4c 49 56 45 2c 0a 09 09 28  O_KEEPALIVE,...(
8130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 26 62  const char *) &b
8140: 6f 6f 6c 56 61 72 2c 20 73 69 7a 65 6f 66 28 62  oolVar, sizeof(b
8150: 6f 6f 6c 56 61 72 29 29 3b 0a 09 69 66 20 28 72  oolVar));..if (r
8160: 74 6e 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20  tn != 0) {..    
8170: 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72  Tcl_WinConvertEr
8180: 72 6f 72 28 57 53 41 47 65 74 4c 61 73 74 45 72  ror(WSAGetLastEr
8190: 72 6f 72 28 29 29 3b 0a 09 20 20 20 20 69 66 20  ror());..    if 
81a0: 28 69 6e 74 65 72 70 29 20 7b 0a 09 09 54 63 6c  (interp) {...Tcl
81b0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
81c0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69  terp, Tcl_ObjPri
81d0: 6e 74 66 28 0a 09 09 09 22 63 6f 75 6c 64 6e 27  ntf(...."couldn'
81e0: 74 20 73 65 74 20 73 6f 63 6b 65 74 20 6f 70 74  t set socket opt
81f0: 69 6f 6e 3a 20 25 73 22 2c 0a 09 09 09 54 63 6c  ion: %s",....Tcl
8200: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
8210: 72 70 29 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20  rp)));..    }.. 
8220: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8230: 52 4f 52 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20  ROR;..}..return 
8240: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
8250: 20 20 69 66 20 28 28 6c 65 6e 20 3e 20 31 29 20    if ((len > 1) 
8260: 26 26 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 5b 31  && (optionName[1
8270: 5d 20 3d 3d 20 27 6e 27 29 20 26 26 0a 09 20 20  ] == 'n') &&..  
8280: 20 20 28 73 74 72 6e 63 6d 70 28 6f 70 74 69 6f    (strncmp(optio
8290: 6e 4e 61 6d 65 2c 20 22 2d 6e 6f 64 65 6c 61 79  nName, "-nodelay
82a0: 22 2c 20 6c 65 6e 29 20 3d 3d 20 30 29 29 20 7b  ", len) == 0)) {
82b0: 0a 09 42 4f 4f 4c 20 62 6f 6f 6c 56 61 72 3b 0a  ..BOOL boolVar;.
82c0: 09 69 6e 74 20 72 74 6e 3b 0a 0a 09 69 66 20 28  .int rtn;...if (
82d0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 28 69  Tcl_GetBoolean(i
82e0: 6e 74 65 72 70 2c 20 76 61 6c 75 65 2c 20 26 62  nterp, value, &b
82f0: 6f 6f 6c 56 61 72 29 20 21 3d 20 54 43 4c 5f 4f  oolVar) != TCL_O
8300: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
8310: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09   TCL_ERROR;..}..
8320: 72 74 6e 20 3d 20 73 65 74 73 6f 63 6b 6f 70 74  rtn = setsockopt
8330: 28 73 6f 63 6b 2c 20 49 50 50 52 4f 54 4f 5f 54  (sock, IPPROTO_T
8340: 43 50 2c 20 54 43 50 5f 4e 4f 44 45 4c 41 59 2c  CP, TCP_NODELAY,
8350: 0a 09 09 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ...(const char *
8360: 29 20 26 62 6f 6f 6c 56 61 72 2c 20 73 69 7a 65  ) &boolVar, size
8370: 6f 66 28 62 6f 6f 6c 56 61 72 29 29 3b 0a 09 69  of(boolVar));..i
8380: 66 20 28 72 74 6e 20 21 3d 20 30 29 20 7b 0a 09  f (rtn != 0) {..
8390: 20 20 20 20 54 63 6c 5f 57 69 6e 43 6f 6e 76 65      Tcl_WinConve
83a0: 72 74 45 72 72 6f 72 28 57 53 41 47 65 74 4c 61  rtError(WSAGetLa
83b0: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 20 20 20  stError());..   
83c0: 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09   if (interp) {..
83d0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
83e0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
83f0: 6a 50 72 69 6e 74 66 28 0a 09 09 09 22 63 6f 75  jPrintf(...."cou
8400: 6c 64 6e 27 74 20 73 65 74 20 73 6f 63 6b 65 74  ldn't set socket
8410: 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 0a 09 09   option: %s",...
8420: 09 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28  .Tcl_PosixError(
8430: 69 6e 74 65 72 70 29 29 29 3b 0a 09 20 20 20 20  interp)));..    
8440: 7d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  }..    return TC
8450: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 72 65 74  L_ERROR;..}..ret
8460: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
8470: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  }.    return Tcl
8480: 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _BadChannelOptio
8490: 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  n(interp, option
84a0: 4e 61 6d 65 2c 20 22 6b 65 65 70 61 6c 69 76 65  Name, "keepalive
84b0: 20 6e 6f 64 65 6c 61 79 22 29 3b 0a 7d 0a 0c 0a   nodelay");.}...
84c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
84d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
8510: 2a 20 54 63 70 47 65 74 4f 70 74 69 6f 6e 50 72  * TcpGetOptionPr
8520: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70  oc --. *. *.Comp
8530: 75 74 65 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76  utes an option v
8540: 61 6c 75 65 20 66 6f 72 20 61 20 54 43 50 20 73  alue for a TCP s
8550: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
8560: 6e 65 6c 2c 20 6f 72 20 61 20 6c 69 73 74 20 6f  nel, or a list o
8570: 66 0a 20 2a 09 61 6c 6c 20 6f 70 74 69 6f 6e 73  f. *.all options
8580: 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65   and their value
8590: 73 2e 0a 20 2a 0a 20 2a 09 4e 6f 74 65 3a 20 54  s.. *. *.Note: T
85a0: 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 65  his code is base
85b0: 64 20 6f 6e 20 63 6f 64 65 20 63 6f 6e 74 72 69  d on code contri
85c0: 62 75 74 65 64 20 62 79 20 4a 6f 68 6e 20 48 61  buted by John Ha
85d0: 78 62 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  xby.. *. * Resul
85e0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
85f0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 54 68  d Tcl result. Th
8600: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
8610: 70 65 63 69 66 69 65 64 20 6f 70 74 69 6f 6e 20  pecified option 
8620: 6f 72 20 61 20 6c 69 73 74 20 6f 66 0a 20 2a 09  or a list of. *.
8630: 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20  all options and 
8640: 74 68 65 69 72 20 76 61 6c 75 65 73 20 69 73 20  their values is 
8650: 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 65 20  returned in the 
8660: 73 75 70 70 6c 69 65 64 20 44 53 74 72 69 6e 67  supplied DString
8670: 2e 20 53 65 74 73 0a 20 2a 09 45 72 72 6f 72 20  . Sets. *.Error 
8680: 6d 65 73 73 61 67 65 20 69 66 20 6e 65 65 64 65  message if neede
8690: 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  d.. *. * Side ef
86a0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
86b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
8700: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 63 70 47  .static int.TcpG
8710: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 0a 20 20  etOptionProc(.  
8720: 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65    void *instance
8730: 44 61 74 61 2c 09 09 2f 2a 20 53 6f 63 6b 65 74  Data,../* Socket
8740: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54   state. */.    T
8750: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8760: 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72  p,../* For error
8770: 20 72 65 70 6f 72 74 69 6e 67 20 2d 20 63 61 6e   reporting - can
8780: 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20   be NULL. */.   
8790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74   const char *opt
87a0: 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65  ionName,./* Name
87b0: 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74   of the option t
87c0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 76  o retrieve the v
87d0: 61 6c 75 65 0a 09 09 09 09 20 2a 20 66 6f 72 2c  alue..... * for,
87e0: 20 6f 72 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20   or NULL to get 
87f0: 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20  all options and 
8800: 74 68 65 69 72 0a 09 09 09 09 20 2a 20 76 61 6c  their..... * val
8810: 75 65 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ues. */.    Tcl_
8820: 44 53 74 72 69 6e 67 20 2a 64 73 50 74 72 29 09  DString *dsPtr).
8830: 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 6f  ./* Where to sto
8840: 72 65 20 74 68 65 20 63 6f 6d 70 75 74 65 64 20  re the computed 
8850: 76 61 6c 75 65 3b 0a 09 09 09 09 20 2a 20 69 6e  value;..... * in
8860: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 63 61 6c  itialized by cal
8870: 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63  ler. */.{.    Tc
8880: 70 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  pState *statePtr
8890: 20 3d 20 28 54 63 70 53 74 61 74 65 20 2a 29 69   = (TcpState *)i
88a0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20  nstanceData;.   
88b0: 20 63 68 61 72 20 68 6f 73 74 5b 4e 49 5f 4d 41   char host[NI_MA
88c0: 58 48 4f 53 54 5d 2c 20 70 6f 72 74 5b 4e 49 5f  XHOST], port[NI_
88d0: 4d 41 58 53 45 52 56 5d 3b 0a 20 20 20 20 53 4f  MAXSERV];.    SO
88e0: 43 4b 45 54 20 73 6f 63 6b 3b 0a 20 20 20 20 73  CKET sock;.    s
88f0: 69 7a 65 5f 74 20 6c 65 6e 20 3d 20 30 3b 0a 20  ize_t len = 0;. 
8900: 20 20 20 69 6e 74 20 72 65 76 65 72 73 65 44 4e     int reverseDN
8910: 53 20 3d 20 30 3b 0a 23 64 65 66 69 6e 65 20 53  S = 0;.#define S
8920: 55 50 50 52 45 53 53 5f 52 44 4e 53 5f 56 41 52  UPPRESS_RDNS_VAR
8930: 20 22 3a 3a 74 63 6c 3a 3a 75 6e 73 75 70 70 6f   "::tcl::unsuppo
8940: 72 74 65 64 3a 3a 6e 6f 52 65 76 65 72 73 65 44  rted::noReverseD
8950: 4e 53 22 0a 23 64 65 66 69 6e 65 20 48 41 56 45  NS".#define HAVE
8960: 5f 4f 50 54 49 4f 4e 28 6f 70 74 69 6f 6e 29 20  _OPTION(option) 
8970: 5c 0a 09 28 28 6c 65 6e 20 3e 20 31 29 20 26 26  \..((len > 1) &&
8980: 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 5b 31 5d 20   (optionName[1] 
8990: 3d 3d 20 6f 70 74 69 6f 6e 5b 31 5d 29 20 26 26  == option[1]) &&
89a0: 20 5c 0a 09 20 20 20 20 28 73 74 72 6e 63 6d 70   \..    (strncmp
89b0: 28 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74  (optionName, opt
89c0: 69 6f 6e 2c 20 6c 65 6e 29 20 3d 3d 20 30 29 29  ion, len) == 0))
89d0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
89e0: 47 6f 20 6f 6e 65 20 73 74 65 70 20 69 6e 20 61  Go one step in a
89f0: 73 79 6e 63 20 63 6f 6e 6e 65 63 74 0a 20 20 20  sync connect.   
8a00: 20 20 2a 0a 20 20 20 20 20 2a 20 49 66 20 61 6e    *.     * If an
8a10: 79 20 65 72 72 6f 72 20 69 73 20 74 68 72 6f 77  y error is throw
8a20: 6e 20 73 61 76 65 20 69 74 20 61 73 20 62 61 63  n save it as bac
8a30: 6b 67 72 6f 75 6e 64 20 65 72 72 6f 72 20 74 6f  kground error to
8a40: 20 72 65 70 6f 72 74 20 65 76 65 6e 74 75 61 6c   report eventual
8a50: 6c 79 0a 20 20 20 20 20 2a 20 62 65 6c 6f 77 2e  ly.     * below.
8a60: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
8a70: 20 28 21 47 4f 54 5f 42 49 54 53 28 73 74 61 74   (!GOT_BITS(stat
8a80: 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50  ePtr->flags, TCP
8a90: 5f 41 53 59 4e 43 5f 54 45 53 54 5f 4d 4f 44 45  _ASYNC_TEST_MODE
8aa0: 29 29 20 7b 0a 09 57 61 69 74 46 6f 72 43 6f 6e  )) {..WaitForCon
8ab0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 4e  nect(statePtr, N
8ac0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ULL);.    }..   
8ad0: 20 73 6f 63 6b 20 3d 20 73 74 61 74 65 50 74 72   sock = statePtr
8ae0: 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 3b 0a 20  ->sockets->fd;. 
8af0: 20 20 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d     if (optionNam
8b00: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 65  e != NULL) {..le
8b10: 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 70 74 69 6f  n = strlen(optio
8b20: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  nName);.    }.. 
8b30: 20 20 20 69 66 20 28 48 41 56 45 5f 4f 50 54 49     if (HAVE_OPTI
8b40: 4f 4e 28 22 2d 65 72 72 6f 72 22 29 29 20 7b 0a  ON("-error")) {.
8b50: 09 2f 2a 0a 09 20 2a 20 44 6f 20 6e 6f 74 20 72  ./*.. * Do not r
8b60: 65 74 75 72 6e 20 61 6e 79 20 65 72 72 6f 72 73  eturn any errors
8b70: 20 69 66 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63   if async connec
8b80: 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 09 20  t is running... 
8b90: 2a 2f 0a 0a 09 69 66 20 28 21 47 4f 54 5f 42 49  */...if (!GOT_BI
8ba0: 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  TS(statePtr->fla
8bb0: 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 50 45  gs, TCP_ASYNC_PE
8bc0: 4e 44 49 4e 47 29 29 20 7b 0a 09 20 20 20 20 69  NDING)) {..    i
8bd0: 66 20 28 47 4f 54 5f 42 49 54 53 28 73 74 61 74  f (GOT_BITS(stat
8be0: 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50  ePtr->flags, TCP
8bf0: 5f 41 53 59 4e 43 5f 46 41 49 4c 45 44 29 29 20  _ASYNC_FAILED)) 
8c00: 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 6e 20 63  {.../*... * In c
8c10: 61 73 65 20 6f 66 20 61 20 66 61 69 6c 65 64 20  ase of a failed 
8c20: 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74 2c 20 65  async connect, e
8c30: 76 65 6e 74 75 61 6c 6c 79 20 72 65 70 6f 72 74  ventually report
8c40: 20 74 68 65 0a 09 09 20 2a 20 63 6f 6e 6e 65 63   the... * connec
8c50: 74 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 6e 63  t error only onc
8c60: 65 2e 20 20 44 6f 20 6e 6f 74 20 72 65 70 6f 72  e.  Do not repor
8c70: 74 20 74 68 65 20 73 79 73 74 65 6d 20 65 72 72  t the system err
8c80: 6f 72 2c 0a 09 09 20 2a 20 61 73 20 74 68 69 73  or,... * as this
8c90: 20 63 6f 6d 65 73 20 61 67 61 69 6e 20 61 6e 64   comes again and
8ca0: 20 61 67 61 69 6e 2e 0a 09 09 20 2a 2f 0a 0a 09   again.... */...
8cb0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63  .if (statePtr->c
8cc0: 6f 6e 6e 65 63 74 45 72 72 6f 72 20 21 3d 20 30  onnectError != 0
8cd0: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 44 53  ) {...    Tcl_DS
8ce0: 74 72 69 6e 67 41 70 70 65 6e 64 28 64 73 50 74  tringAppend(dsPt
8cf0: 72 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 45 72  r,....    Tcl_Er
8d00: 72 6e 6f 4d 73 67 28 73 74 61 74 65 50 74 72 2d  rnoMsg(statePtr-
8d10: 3e 63 6f 6e 6e 65 63 74 45 72 72 6f 72 29 2c 0a  >connectError),.
8d20: 09 09 09 20 20 20 20 54 43 4c 5f 49 4e 44 45 58  ...    TCL_INDEX
8d30: 5f 4e 4f 4e 45 29 3b 0a 09 09 20 20 20 20 73 74  _NONE);...    st
8d40: 61 74 65 50 74 72 2d 3e 63 6f 6e 6e 65 63 74 45  atePtr->connectE
8d50: 72 72 6f 72 20 3d 20 30 3b 0a 09 09 7d 0a 09 20  rror = 0;...}.. 
8d60: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a     } else {.../*
8d70: 0a 09 09 20 2a 20 52 65 70 6f 72 74 20 61 6e 20  ... * Report an 
8d80: 65 76 65 6e 74 75 61 6c 20 6c 61 73 74 20 65 72  eventual last er
8d90: 72 6f 72 20 6f 66 20 74 68 65 20 73 6f 63 6b 65  ror of the socke
8da0: 74 20 73 79 73 74 65 6d 2e 0a 09 09 20 2a 2f 0a  t system.... */.
8db0: 0a 09 09 69 6e 74 20 6f 70 74 6c 65 6e 3b 0a 09  ...int optlen;..
8dc0: 09 69 6e 74 20 72 65 74 3b 0a 09 09 44 57 4f 52  .int ret;...DWOR
8dd0: 44 20 65 72 72 3b 0a 0a 09 09 2f 2a 0a 09 09 20  D err;..../*... 
8de0: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 65  * Populate the e
8df0: 72 72 20 76 61 72 69 61 62 6c 65 20 77 69 74 68  rr variable with
8e00: 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 0a 09   a POSIX error..
8e10: 09 20 2a 2f 0a 0a 09 09 6f 70 74 6c 65 6e 20 3d  . */....optlen =
8e20: 20 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 09 09   sizeof(int);...
8e30: 72 65 74 20 3d 20 67 65 74 73 6f 63 6b 6f 70 74  ret = getsockopt
8e40: 28 73 6f 63 6b 2c 20 53 4f 4c 5f 53 4f 43 4b 45  (sock, SOL_SOCKE
8e50: 54 2c 20 53 4f 5f 45 52 52 4f 52 2c 0a 09 09 09  T, SO_ERROR,....
8e60: 28 63 68 61 72 20 2a 29 26 65 72 72 2c 20 26 6f  (char *)&err, &o
8e70: 70 74 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 0a 09 09  ptlen);..../*...
8e80: 20 2a 20 54 68 65 20 65 72 72 6f 72 20 77 61 73   * The error was
8e90: 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 64 69   not returned di
8ea0: 72 65 63 74 6c 79 20 62 75 74 20 73 68 6f 75 6c  rectly but shoul
8eb0: 64 20 62 65 20 74 61 6b 65 6e 0a 09 09 20 2a 20  d be taken... * 
8ec0: 66 72 6f 6d 20 57 53 41 2e 0a 09 09 20 2a 2f 0a  from WSA.... */.
8ed0: 0a 09 09 69 66 20 28 72 65 74 20 3d 3d 20 53 4f  ...if (ret == SO
8ee0: 43 4b 45 54 5f 45 52 52 4f 52 29 20 7b 0a 09 09  CKET_ERROR) {...
8ef0: 20 20 20 20 65 72 72 20 3d 20 57 53 41 47 65 74      err = WSAGet
8f00: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 09 09 7d  LastError();...}
8f10: 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 52 65 74 75  ..../*... * Retu
8f20: 72 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  rn error message
8f30: 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 65  .... */....if (e
8f40: 72 72 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  rr) {...    Tcl_
8f50: 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28  WinConvertError(
8f60: 65 72 72 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f  err);...    Tcl_
8f70: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 64 73  DStringAppend(ds
8f80: 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73  Ptr, Tcl_ErrnoMs
8f90: 67 28 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29  g(Tcl_GetErrno()
8fa0: 29 2c 0a 09 09 09 20 20 20 20 54 43 4c 5f 49 4e  ),....    TCL_IN
8fb0: 44 45 58 5f 4e 4f 4e 45 29 3b 0a 09 09 7d 0a 09  DEX_NONE);...}..
8fc0: 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e      }..}..return
8fd0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a   TCL_OK;.    }..
8fe0: 20 20 20 20 69 66 20 28 48 41 56 45 5f 4f 50 54      if (HAVE_OPT
8ff0: 49 4f 4e 28 22 2d 63 6f 6e 6e 65 63 74 69 6e 67  ION("-connecting
9000: 22 29 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69  ")) {..Tcl_DStri
9010: 6e 67 41 70 70 65 6e 64 28 64 73 50 74 72 2c 0a  ngAppend(dsPtr,.
9020: 09 09 47 4f 54 5f 42 49 54 53 28 73 74 61 74 65  ..GOT_BITS(state
9030: 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f  Ptr->flags, TCP_
9040: 41 53 59 4e 43 5f 50 45 4e 44 49 4e 47 29 0a 09  ASYNC_PENDING)..
9050: 09 3f 20 22 31 22 20 3a 20 22 30 22 2c 20 54 43  .? "1" : "0", TC
9060: 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 29 3b 0a 09  L_INDEX_NONE);..
9070: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
9080: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e     }..    if (in
9090: 74 65 72 70 20 21 3d 20 4e 55 4c 4c 0a 09 20 20  terp != NULL..  
90a0: 20 20 26 26 20 54 63 6c 5f 47 65 74 56 61 72 28    && Tcl_GetVar(
90b0: 69 6e 74 65 72 70 2c 20 53 55 50 50 52 45 53 53  interp, SUPPRESS
90c0: 5f 52 44 4e 53 5f 56 41 52 2c 20 30 29 20 21 3d  _RDNS_VAR, 0) !=
90d0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 76 65 72 73   NULL) {..revers
90e0: 65 44 4e 53 20 3d 20 4e 49 5f 4e 55 4d 45 52 49  eDNS = NI_NUMERI
90f0: 43 48 4f 53 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  CHOST;.    }..  
9100: 20 20 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30 29    if ((len == 0)
9110: 20 7c 7c 20 48 41 56 45 5f 4f 50 54 49 4f 4e 28   || HAVE_OPTION(
9120: 22 2d 70 65 65 72 6e 61 6d 65 22 29 29 20 7b 0a  "-peername")) {.
9130: 09 61 64 64 72 65 73 73 20 70 65 65 72 6e 61 6d  .address peernam
9140: 65 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20 73 69  e;..socklen_t si
9150: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 70 65 65 72  ze = sizeof(peer
9160: 6e 61 6d 65 29 3b 0a 0a 09 69 66 20 28 47 4f 54  name);...if (GOT
9170: 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e  _BITS(statePtr->
9180: 66 6c 61 67 73 2c 20 54 43 50 5f 41 53 59 4e 43  flags, TCP_ASYNC
9190: 5f 50 45 4e 44 49 4e 47 29 29 20 7b 0a 09 20 20  _PENDING)) {..  
91a0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49 6e 20    /*..     * In 
91b0: 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20 6f 75  async connect ou
91c0: 74 70 75 74 20 61 6e 20 65 6d 70 74 79 20 73 74  tput an empty st
91d0: 72 69 6e 67 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  ring..     */...
91e0: 20 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30      if (len == 0
91f0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
9200: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64  gAppendElement(d
9210: 73 50 74 72 2c 20 22 2d 70 65 65 72 6e 61 6d 65  sPtr, "-peername
9220: 22 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ");...Tcl_DStrin
9230: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64  gAppendElement(d
9240: 73 50 74 72 2c 20 22 22 29 3b 0a 09 20 20 20 20  sPtr, "");..    
9250: 7d 20 65 6c 73 65 20 7b 0a 09 09 72 65 74 75 72  } else {...retur
9260: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20 20 20 20 7d  n TCL_OK;..    }
9270: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 67 65 74  ..} else if (get
9280: 70 65 65 72 6e 61 6d 65 28 73 6f 63 6b 2c 20 28  peername(sock, (
9290: 4c 50 53 4f 43 4b 41 44 44 52 29 20 26 28 70 65  LPSOCKADDR) &(pe
92a0: 65 72 6e 61 6d 65 2e 73 61 29 2c 0a 09 09 26 73  ername.sa),...&s
92b0: 69 7a 65 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20  ize) == 0) {..  
92c0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 50 65 65    /*..     * Pee
92d0: 72 6e 61 6d 65 20 66 65 74 63 68 20 73 75 63 63  rname fetch succ
92e0: 65 65 64 65 64 20 2d 20 6f 75 74 70 75 74 20 6c  eeded - output l
92f0: 69 73 74 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  ist..     */... 
9300: 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29     if (len == 0)
9310: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
9320: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73  AppendElement(ds
9330: 50 74 72 2c 20 22 2d 70 65 65 72 6e 61 6d 65 22  Ptr, "-peername"
9340: 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67  );...Tcl_DString
9350: 53 74 61 72 74 53 75 62 6c 69 73 74 28 64 73 50  StartSublist(dsP
9360: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  tr);..    }...  
9370: 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f 28 26 28    getnameinfo(&(
9380: 70 65 65 72 6e 61 6d 65 2e 73 61 29 2c 20 73 69  peername.sa), si
9390: 7a 65 2c 20 68 6f 73 74 2c 20 73 69 7a 65 6f 66  ze, host, sizeof
93a0: 28 68 6f 73 74 29 2c 0a 09 09 20 20 20 20 4e 55  (host),...    NU
93b0: 4c 4c 2c 20 30 2c 20 4e 49 5f 4e 55 4d 45 52 49  LL, 0, NI_NUMERI
93c0: 43 48 4f 53 54 29 3b 0a 09 20 20 20 20 54 63 6c  CHOST);..    Tcl
93d0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
93e0: 65 6d 65 6e 74 28 64 73 50 74 72 2c 20 68 6f 73  ement(dsPtr, hos
93f0: 74 29 3b 0a 09 20 20 20 20 67 65 74 6e 61 6d 65  t);..    getname
9400: 69 6e 66 6f 28 26 28 70 65 65 72 6e 61 6d 65 2e  info(&(peername.
9410: 73 61 29 2c 20 73 69 7a 65 2c 20 68 6f 73 74 2c  sa), size, host,
9420: 20 73 69 7a 65 6f 66 28 68 6f 73 74 29 2c 0a 09   sizeof(host),..
9430: 09 20 20 20 20 70 6f 72 74 2c 20 73 69 7a 65 6f  .    port, sizeo
9440: 66 28 70 6f 72 74 29 2c 20 72 65 76 65 72 73 65  f(port), reverse
9450: 44 4e 53 20 7c 20 4e 49 5f 4e 55 4d 45 52 49 43  DNS | NI_NUMERIC
9460: 53 45 52 56 29 3b 0a 09 20 20 20 20 54 63 6c 5f  SERV);..    Tcl_
9470: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
9480: 6d 65 6e 74 28 64 73 50 74 72 2c 20 68 6f 73 74  ment(dsPtr, host
9490: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
94a0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
94b0: 28 64 73 50 74 72 2c 20 70 6f 72 74 29 3b 0a 09  (dsPtr, port);..
94c0: 20 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30      if (len == 0
94d0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
94e0: 67 45 6e 64 53 75 62 6c 69 73 74 28 64 73 50 74  gEndSublist(dsPt
94f0: 72 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  r);..    } else 
9500: 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f  {...return TCL_O
9510: 4b 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73  K;..    }..} els
9520: 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  e {..    /*..   
9530: 20 20 2a 20 67 65 74 70 65 65 72 6e 61 6d 65 20    * getpeername 
9540: 66 61 69 6c 65 64 20 2d 20 62 75 74 20 69 66 20  failed - but if 
9550: 77 65 20 77 65 72 65 20 61 73 6b 65 64 20 66 6f  we were asked fo
9560: 72 20 61 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e  r all the option
9570: 73 0a 09 20 20 20 20 20 2a 20 28 6c 65 6e 3d 3d  s..     * (len==
9580: 30 29 2c 20 64 6f 6e 27 74 20 66 6c 61 67 20 61  0), don't flag a
9590: 6e 20 65 72 72 6f 72 20 61 74 20 74 68 61 74 20  n error at that 
95a0: 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 74  point because it
95b0: 20 63 6f 75 6c 64 20 62 65 0a 09 20 20 20 20 20   could be..     
95c0: 2a 20 61 6e 20 66 63 6f 6e 66 69 67 75 72 65 20  * an fconfigure 
95d0: 72 65 71 75 65 73 74 20 6f 6e 20 61 20 73 65 72  request on a ser
95e0: 76 65 72 20 73 6f 63 6b 65 74 20 28 73 75 63 68  ver socket (such
95f0: 20 73 6f 63 6b 65 74 73 20 68 61 76 65 20 6e 6f   sockets have no
9600: 0a 09 20 20 20 20 20 2a 20 70 65 65 72 29 2e 20  ..     * peer). 
9610: 7b 43 6f 70 69 65 64 20 66 72 6f 6d 20 75 6e 69  {Copied from uni
9620: 78 2f 74 63 6c 55 6e 69 78 43 68 61 6e 2e 63 7d  x/tclUnixChan.c}
9630: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
9640: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 09 54 63 6c  if (len) {...Tcl
9650: 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72  _WinConvertError
9660: 28 28 44 57 4f 52 44 29 20 57 53 41 47 65 74 4c  ((DWORD) WSAGetL
9670: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 09 69  astError());...i
9680: 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 09 20  f (interp) {... 
9690: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
96a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
96b0: 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 09 20 20  ObjPrintf(....  
96c0: 20 20 22 63 61 6e 27 74 20 67 65 74 20 70 65 65    "can't get pee
96d0: 72 6e 61 6d 65 3a 20 25 73 22 2c 0a 09 09 09 20  rname: %s",.... 
96e0: 20 20 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f     Tcl_PosixErro
96f0: 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 09 7d  r(interp)));...}
9700: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
9710: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  ROR;..    }..}. 
9720: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6c     }..    if ((l
9730: 65 6e 20 3d 3d 20 30 29 20 7c 7c 20 48 41 56 45  en == 0) || HAVE
9740: 5f 4f 50 54 49 4f 4e 28 22 2d 73 6f 63 6b 6e 61  _OPTION("-sockna
9750: 6d 65 22 29 29 20 7b 0a 09 54 63 70 46 64 4c 69  me")) {..TcpFdLi
9760: 73 74 20 2a 66 64 73 3b 0a 09 61 64 64 72 65 73  st *fds;..addres
9770: 73 20 73 6f 63 6b 6e 61 6d 65 3b 0a 09 73 6f 63  s sockname;..soc
9780: 6b 6c 65 6e 5f 74 20 73 69 7a 65 3b 0a 09 69 6e  klen_t size;..in
9790: 74 20 66 6f 75 6e 64 20 3d 20 30 3b 0a 0a 09 69  t found = 0;...i
97a0: 66 20 28 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  f (len == 0) {..
97b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41      Tcl_DStringA
97c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 50  ppendElement(dsP
97d0: 74 72 2c 20 22 2d 73 6f 63 6b 6e 61 6d 65 22 29  tr, "-sockname")
97e0: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
97f0: 6e 67 53 74 61 72 74 53 75 62 6c 69 73 74 28 64  ngStartSublist(d
9800: 73 50 74 72 29 3b 0a 09 7d 0a 09 69 66 20 28 47  sPtr);..}..if (G
9810: 4f 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  OT_BITS(statePtr
9820: 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f 41 53 59  ->flags, TCP_ASY
9830: 4e 43 5f 50 45 4e 44 49 4e 47 29 29 20 7b 0a 09  NC_PENDING)) {..
9840: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49      /*..     * I
9850: 6e 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20  n async connect 
9860: 6f 75 74 70 75 74 20 61 6e 20 65 6d 70 74 79 20  output an empty 
9870: 73 74 72 69 6e 67 0a 09 20 20 20 20 20 2a 2f 0a  string..     */.
9880: 0a 09 20 20 20 20 66 6f 75 6e 64 20 3d 20 31 3b  ..    found = 1;
9890: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
98a0: 66 6f 72 20 28 66 64 73 20 3d 20 73 74 61 74 65  for (fds = state
98b0: 50 74 72 2d 3e 73 6f 63 6b 65 74 73 3b 20 66 64  Ptr->sockets; fd
98c0: 73 20 21 3d 20 4e 55 4c 4c 3b 20 66 64 73 20 3d  s != NULL; fds =
98d0: 20 66 64 73 2d 3e 6e 65 78 74 29 20 7b 0a 09 09   fds->next) {...
98e0: 73 6f 63 6b 20 3d 20 66 64 73 2d 3e 66 64 3b 0a  sock = fds->fd;.
98f0: 09 09 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  ..size = sizeof(
9900: 73 6f 63 6b 6e 61 6d 65 29 3b 0a 09 09 69 66 20  sockname);...if 
9910: 28 67 65 74 73 6f 63 6b 6e 61 6d 65 28 73 6f 63  (getsockname(soc
9920: 6b 2c 20 26 28 73 6f 63 6b 6e 61 6d 65 2e 73 61  k, &(sockname.sa
9930: 29 2c 20 26 73 69 7a 65 29 20 3e 3d 20 30 29 20  ), &size) >= 0) 
9940: 7b 0a 09 09 20 20 20 20 69 6e 74 20 66 6c 61 67  {...    int flag
9950: 73 20 3d 20 72 65 76 65 72 73 65 44 4e 53 3b 0a  s = reverseDNS;.
9960: 0a 09 09 20 20 20 20 66 6f 75 6e 64 20 3d 20 31  ...    found = 1
9970: 3b 0a 09 09 20 20 20 20 67 65 74 6e 61 6d 65 69  ;...    getnamei
9980: 6e 66 6f 28 26 73 6f 63 6b 6e 61 6d 65 2e 73 61  nfo(&sockname.sa
9990: 2c 20 73 69 7a 65 2c 20 68 6f 73 74 2c 20 73 69  , size, host, si
99a0: 7a 65 6f 66 28 68 6f 73 74 29 2c 0a 09 09 09 20  zeof(host),.... 
99b0: 20 20 20 4e 55 4c 4c 2c 20 30 2c 20 4e 49 5f 4e     NULL, 0, NI_N
99c0: 55 4d 45 52 49 43 48 4f 53 54 29 3b 0a 09 09 20  UMERICHOST);... 
99d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
99e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 50 74  pendElement(dsPt
99f0: 72 2c 20 68 6f 73 74 29 3b 0a 0a 09 09 20 20 20  r, host);....   
9a00: 20 2f 2a 0a 09 09 20 20 20 20 20 2a 20 57 65 20   /*...     * We 
9a10: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
9a20: 73 6f 6c 76 65 20 49 4e 41 44 44 52 5f 41 4e 59  solve INADDR_ANY
9a30: 20 61 6e 64 20 73 69 6e 36 61 64 64 72 5f 61 6e   and sin6addr_an
9a40: 79 3b 0a 09 09 20 20 20 20 20 2a 20 74 68 65 79  y;...     * they
9a50: 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 63   can sometimes c
9a60: 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 28 61  ause problems (a
9a70: 6e 64 20 6e 65 76 65 72 20 68 61 76 65 20 61 0a  nd never have a.
9a80: 09 09 20 20 20 20 20 2a 20 6e 61 6d 65 29 2e 0a  ..     * name)..
9a90: 09 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 20 20  ..     */....   
9aa0: 20 66 6c 61 67 73 20 7c 3d 20 4e 49 5f 4e 55 4d   flags |= NI_NUM
9ab0: 45 52 49 43 53 45 52 56 3b 0a 09 09 20 20 20 20  ERICSERV;...    
9ac0: 69 66 20 28 73 6f 63 6b 6e 61 6d 65 2e 73 61 2e  if (sockname.sa.
9ad0: 73 61 5f 66 61 6d 69 6c 79 20 3d 3d 20 41 46 5f  sa_family == AF_
9ae0: 49 4e 45 54 29 20 7b 0a 09 09 09 69 66 20 28 73  INET) {....if (s
9af0: 6f 63 6b 6e 61 6d 65 2e 73 61 34 2e 73 69 6e 5f  ockname.sa4.sin_
9b00: 61 64 64 72 2e 73 5f 61 64 64 72 20 3d 3d 20 49  addr.s_addr == I
9b10: 4e 41 44 44 52 5f 41 4e 59 29 20 7b 0a 09 09 09  NADDR_ANY) {....
9b20: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 4e 49 5f      flags |= NI_
9b30: 4e 55 4d 45 52 49 43 48 4f 53 54 3b 0a 09 09 09  NUMERICHOST;....
9b40: 7d 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  }...    } else i
9b50: 66 20 28 73 6f 63 6b 6e 61 6d 65 2e 73 61 2e 73  f (sockname.sa.s
9b60: 61 5f 66 61 6d 69 6c 79 20 3d 3d 20 41 46 5f 49  a_family == AF_I
9b70: 4e 45 54 36 29 20 7b 0a 09 09 09 69 66 20 28 28  NET6) {....if ((
9b80: 49 4e 36 5f 41 52 45 5f 41 44 44 52 5f 45 51 55  IN6_ARE_ADDR_EQU
9b90: 41 4c 28 26 73 6f 63 6b 6e 61 6d 65 2e 73 61 36  AL(&sockname.sa6
9ba0: 2e 73 69 6e 36 5f 61 64 64 72 2c 0a 09 09 09 09  .sin6_addr,.....
9bb0: 20 20 20 20 26 69 6e 36 61 64 64 72 5f 61 6e 79      &in6addr_any
9bc0: 29 29 20 7c 7c 0a 09 09 09 09 28 49 4e 36 5f 49  )) ||.....(IN6_I
9bd0: 53 5f 41 44 44 52 5f 56 34 4d 41 50 50 45 44 28  S_ADDR_V4MAPPED(
9be0: 26 73 6f 63 6b 6e 61 6d 65 2e 73 61 36 2e 73 69  &sockname.sa6.si
9bf0: 6e 36 5f 61 64 64 72 29 0a 09 09 09 09 26 26 20  n6_addr).....&& 
9c00: 73 6f 63 6b 6e 61 6d 65 2e 73 61 36 2e 73 69 6e  sockname.sa6.sin
9c10: 36 5f 61 64 64 72 2e 73 36 5f 61 64 64 72 5b 31  6_addr.s6_addr[1
9c20: 32 5d 20 3d 3d 20 30 0a 09 09 09 09 26 26 20 73  2] == 0.....&& s
9c30: 6f 63 6b 6e 61 6d 65 2e 73 61 36 2e 73 69 6e 36  ockname.sa6.sin6
9c40: 5f 61 64 64 72 2e 73 36 5f 61 64 64 72 5b 31 33  _addr.s6_addr[13
9c50: 5d 20 3d 3d 20 30 0a 09 09 09 09 26 26 20 73 6f  ] == 0.....&& so
9c60: 63 6b 6e 61 6d 65 2e 73 61 36 2e 73 69 6e 36 5f  ckname.sa6.sin6_
9c70: 61 64 64 72 2e 73 36 5f 61 64 64 72 5b 31 34 5d  addr.s6_addr[14]
9c80: 20 3d 3d 20 30 0a 09 09 09 09 26 26 20 73 6f 63   == 0.....&& soc
9c90: 6b 6e 61 6d 65 2e 73 61 36 2e 73 69 6e 36 5f 61  kname.sa6.sin6_a
9ca0: 64 64 72 2e 73 36 5f 61 64 64 72 5b 31 35 5d 20  ddr.s6_addr[15] 
9cb0: 3d 3d 20 30 29 29 20 7b 0a 09 09 09 20 20 20 20  == 0)) {....    
9cc0: 66 6c 61 67 73 20 7c 3d 20 4e 49 5f 4e 55 4d 45  flags |= NI_NUME
9cd0: 52 49 43 48 4f 53 54 3b 0a 09 09 09 7d 0a 09 09  RICHOST;....}...
9ce0: 20 20 20 20 7d 0a 09 09 20 20 20 20 67 65 74 6e      }...    getn
9cf0: 61 6d 65 69 6e 66 6f 28 26 73 6f 63 6b 6e 61 6d  ameinfo(&socknam
9d00: 65 2e 73 61 2c 20 73 69 7a 65 2c 20 68 6f 73 74  e.sa, size, host
9d10: 2c 20 73 69 7a 65 6f 66 28 68 6f 73 74 29 2c 0a  , sizeof(host),.
9d20: 09 09 09 20 20 20 20 70 6f 72 74 2c 20 73 69 7a  ...    port, siz
9d30: 65 6f 66 28 70 6f 72 74 29 2c 20 66 6c 61 67 73  eof(port), flags
9d40: 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 74  );...    Tcl_DSt
9d50: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
9d60: 74 28 64 73 50 74 72 2c 20 68 6f 73 74 29 3b 0a  t(dsPtr, host);.
9d70: 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
9d80: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64  gAppendElement(d
9d90: 73 50 74 72 2c 20 70 6f 72 74 29 3b 0a 09 09 7d  sPtr, port);...}
9da0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28  ..    }..}..if (
9db0: 66 6f 75 6e 64 29 20 7b 0a 09 20 20 20 20 69 66  found) {..    if
9dc0: 20 28 6c 65 6e 29 20 7b 0a 09 09 72 65 74 75 72   (len) {...retur
9dd0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20 20 20 20 7d  n TCL_OK;..    }
9de0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
9df0: 67 45 6e 64 53 75 62 6c 69 73 74 28 64 73 50 74  gEndSublist(dsPt
9e00: 72 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  r);..} else {.. 
9e10: 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b     if (interp) {
9e20: 0a 09 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72  ...Tcl_WinConver
9e30: 74 45 72 72 6f 72 28 28 44 57 4f 52 44 29 20 57  tError((DWORD) W
9e40: 53 41 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  SAGetLastError()
9e50: 29 3b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52  );...Tcl_SetObjR
9e60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
9e70: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 09  l_ObjPrintf(....
9e80: 22 63 61 6e 27 74 20 67 65 74 20 73 6f 63 6b 6e  "can't get sockn
9e90: 61 6d 65 3a 20 25 73 22 2c 20 54 63 6c 5f 50 6f  ame: %s", Tcl_Po
9ea0: 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29  sixError(interp)
9eb0: 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ));..    }..    
9ec0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9ed0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
9ee0: 69 66 20 28 28 6c 65 6e 20 3d 3d 20 30 29 20 7c  if ((len == 0) |
9ef0: 7c 20 48 41 56 45 5f 4f 50 54 49 4f 4e 28 22 2d  | HAVE_OPTION("-
9f00: 6b 65 65 70 61 6c 69 76 65 22 29 29 20 7b 0a 09  keepalive")) {..
9f10: 69 6e 74 20 6f 70 74 6c 65 6e 3b 0a 09 42 4f 4f  int optlen;..BOO
9f20: 4c 20 6f 70 74 20 3d 20 46 41 4c 53 45 3b 0a 0a  L opt = FALSE;..
9f30: 09 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29 20 7b  .if (len == 0) {
9f40: 0a 09 20 20 20 20 73 6f 63 6b 20 3d 20 73 74 61  ..    sock = sta
9f50: 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e  tePtr->sockets->
9f60: 66 64 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  fd;..    Tcl_DSt
9f70: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
9f80: 74 28 64 73 50 74 72 2c 20 22 2d 6b 65 65 70 61  t(dsPtr, "-keepa
9f90: 6c 69 76 65 22 29 3b 0a 09 7d 0a 09 6f 70 74 6c  live");..}..optl
9fa0: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 42 4f 4f 4c  en = sizeof(BOOL
9fb0: 29 3b 0a 09 67 65 74 73 6f 63 6b 6f 70 74 28 73  );..getsockopt(s
9fc0: 6f 63 6b 2c 20 53 4f 4c 5f 53 4f 43 4b 45 54 2c  ock, SOL_SOCKET,
9fd0: 20 53 4f 5f 4b 45 45 50 41 4c 49 56 45 2c 20 28   SO_KEEPALIVE, (
9fe0: 63 68 61 72 20 2a 29 26 6f 70 74 2c 20 26 6f 70  char *)&opt, &op
9ff0: 74 6c 65 6e 29 3b 0a 09 54 63 6c 5f 44 53 74 72  tlen);..Tcl_DStr
a000: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
a010: 28 64 73 50 74 72 2c 20 6f 70 74 20 3f 20 22 31  (dsPtr, opt ? "1
a020: 22 20 3a 20 22 30 22 29 3b 0a 09 69 66 20 28 6c  " : "0");..if (l
a030: 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 72  en > 0) {..    r
a040: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d  eturn TCL_OK;..}
a050: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
a060: 28 6c 65 6e 20 3d 3d 20 30 29 20 7c 7c 20 48 41  (len == 0) || HA
a070: 56 45 5f 4f 50 54 49 4f 4e 28 22 2d 6e 6f 64 65  VE_OPTION("-node
a080: 6c 61 79 22 29 29 20 7b 0a 09 69 6e 74 20 6f 70  lay")) {..int op
a090: 74 6c 65 6e 3b 0a 09 42 4f 4f 4c 20 6f 70 74 20  tlen;..BOOL opt 
a0a0: 3d 20 46 41 4c 53 45 3b 0a 0a 09 69 66 20 28 6c  = FALSE;...if (l
a0b0: 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  en == 0) {..    
a0c0: 73 6f 63 6b 20 3d 20 73 74 61 74 65 50 74 72 2d  sock = statePtr-
a0d0: 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 3b 0a 09 20  >sockets->fd;.. 
a0e0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
a0f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 64 73 50 74  pendElement(dsPt
a100: 72 2c 20 22 2d 6e 6f 64 65 6c 61 79 22 29 3b 0a  r, "-nodelay");.
a110: 09 7d 0a 09 6f 70 74 6c 65 6e 20 3d 20 73 69 7a  .}..optlen = siz
a120: 65 6f 66 28 42 4f 4f 4c 29 3b 0a 09 67 65 74 73  eof(BOOL);..gets
a130: 6f 63 6b 6f 70 74 28 73 6f 63 6b 2c 20 49 50 50  ockopt(sock, IPP
a140: 52 4f 54 4f 5f 54 43 50 2c 20 54 43 50 5f 4e 4f  ROTO_TCP, TCP_NO
a150: 44 45 4c 41 59 2c 20 28 63 68 61 72 20 2a 29 26  DELAY, (char *)&
a160: 6f 70 74 2c 20 26 6f 70 74 6c 65 6e 29 3b 0a 09  opt, &optlen);..
a170: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
a180: 64 45 6c 65 6d 65 6e 74 28 64 73 50 74 72 2c 20  dElement(dsPtr, 
a190: 6f 70 74 20 3f 20 22 31 22 20 3a 20 22 30 22 29  opt ? "1" : "0")
a1a0: 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 29 20  ;..if (len > 0) 
a1b0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
a1c0: 4c 5f 4f 4b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  L_OK;..}.    }..
a1d0: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 30 29      if (len > 0)
a1e0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42   {..return Tcl_B
a1f0: 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  adChannelOption(
a200: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61  interp, optionNa
a210: 6d 65 2c 0a 09 09 22 63 6f 6e 6e 65 63 74 69 6e  me,..."connectin
a220: 67 20 6b 65 65 70 61 6c 69 76 65 20 6e 6f 64 65  g keepalive node
a230: 6c 61 79 20 70 65 65 72 6e 61 6d 65 20 73 6f 63  lay peername soc
a240: 6b 6e 61 6d 65 22 29 3b 0a 20 20 20 20 7d 0a 0a  kname");.    }..
a250: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
a260: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
a270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2b0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 70 57 61 74 63  --. *. * TcpWatc
a2c0: 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49  hProc --. *. *.I
a2d0: 6e 66 6f 72 6d 73 20 74 68 65 20 63 68 61 6e 6e  nforms the chann
a2e0: 65 6c 20 64 72 69 76 65 72 20 6f 66 20 74 68 65  el driver of the
a2f0: 20 65 76 65 6e 74 73 20 74 68 61 74 20 74 68 65   events that the
a300: 20 67 65 6e 65 72 69 63 20 63 68 61 6e 6e 65 6c   generic channel
a310: 20 63 6f 64 65 0a 20 2a 09 77 69 73 68 65 73 20   code. *.wishes 
a320: 74 6f 20 72 65 63 65 69 76 65 20 6f 6e 20 74 68  to receive on th
a330: 69 73 20 73 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a  is socket.. *. *
a340: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
a350: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
a360: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61  fects:. *.May ca
a370: 75 73 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72  use the notifier
a380: 20 74 6f 20 70 6f 6c 6c 20 69 66 20 61 6e 79 20   to poll if any 
a390: 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
a3a0: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 0a   conditions are.
a3b0: 20 2a 09 61 6c 72 65 61 64 79 20 74 72 75 65 2e   *.already true.
a3c0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
a3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
a410: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 63  ..static void.Tc
a420: 70 57 61 74 63 68 50 72 6f 63 28 0a 20 20 20 20  pWatchProc(.    
a430: 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61  void *instanceDa
a440: 74 61 2c 09 09 2f 2a 20 54 68 65 20 73 6f 63 6b  ta,../* The sock
a450: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20  et state. */.   
a460: 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20   int mask).../* 
a470: 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 72 65  Events of intere
a480: 73 74 3b 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d  st; an OR-ed com
a490: 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 09 09 09 09  bination of.....
a4a0: 20 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c   * TCL_READABLE,
a4b0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e   TCL_WRITABLE an
a4c0: 64 0a 09 09 09 09 20 2a 20 54 43 4c 5f 45 58 43  d..... * TCL_EXC
a4d0: 45 50 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20  EPTION. */.{.   
a4e0: 20 54 63 70 53 74 61 74 65 20 2a 73 74 61 74 65   TcpState *state
a4f0: 50 74 72 20 3d 20 28 54 63 70 53 74 61 74 65 20  Ptr = (TcpState 
a500: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
a510: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 55  .    /*.     * U
a520: 70 64 61 74 65 20 74 68 65 20 77 61 74 63 68 20  pdate the watch 
a530: 65 76 65 6e 74 73 20 6d 61 73 6b 2e 20 4f 6e 6c  events mask. Onl
a540: 79 20 69 66 20 74 68 65 20 73 6f 63 6b 65 74 20  y if the socket 
a550: 69 73 20 6e 6f 74 20 61 20 73 65 72 76 65 72 0a  is not a server.
a560: 20 20 20 20 20 2a 20 73 6f 63 6b 65 74 2e 20 5b       * socket. [
a570: 42 75 67 20 35 35 37 38 37 38 5d 0a 20 20 20 20  Bug 557878].    
a580: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 73 74   */..    if (!st
a590: 61 74 65 50 74 72 2d 3e 61 63 63 65 70 74 50 72  atePtr->acceptPr
a5a0: 6f 63 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  oc) {..statePtr-
a5b0: 3e 77 61 74 63 68 45 76 65 6e 74 73 20 3d 20 30  >watchEvents = 0
a5c0: 3b 0a 09 69 66 20 28 47 4f 54 5f 42 49 54 53 28  ;..if (GOT_BITS(
a5d0: 6d 61 73 6b 2c 20 54 43 4c 5f 52 45 41 44 41 42  mask, TCL_READAB
a5e0: 4c 45 29 29 20 7b 0a 09 20 20 20 20 53 45 54 5f  LE)) {..    SET_
a5f0: 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 77  BITS(statePtr->w
a600: 61 74 63 68 45 76 65 6e 74 73 2c 20 46 44 5f 52  atchEvents, FD_R
a610: 45 41 44 20 7c 20 46 44 5f 43 4c 4f 53 45 29 3b  EAD | FD_CLOSE);
a620: 0a 09 7d 0a 09 69 66 20 28 47 4f 54 5f 42 49 54  ..}..if (GOT_BIT
a630: 53 28 6d 61 73 6b 2c 20 54 43 4c 5f 57 52 49 54  S(mask, TCL_WRIT
a640: 41 42 4c 45 29 29 20 7b 0a 09 20 20 20 20 53 45  ABLE)) {..    SE
a650: 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d  T_BITS(statePtr-
a660: 3e 77 61 74 63 68 45 76 65 6e 74 73 2c 20 46 44  >watchEvents, FD
a670: 5f 57 52 49 54 45 20 7c 20 46 44 5f 43 4c 4f 53  _WRITE | FD_CLOS
a680: 45 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  E);..}.../*.. * 
a690: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
a6a0: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6c 72 65   conditions alre
a6b0: 61 64 79 20 73 65 74 2c 20 74 68 65 6e 20 74 65  ady set, then te
a6c0: 6c 6c 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  ll the notifier 
a6d0: 74 6f 0a 09 20 2a 20 70 6f 6c 6c 20 72 61 74 68  to.. * poll rath
a6e0: 65 72 20 74 68 61 6e 20 62 6c 6f 63 6b 2e 0a 09  er than block...
a6f0: 20 2a 2f 0a 0a 09 69 66 20 28 73 74 61 74 65 50   */...if (stateP
a700: 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 73 20  tr->readyEvents 
a710: 26 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63  & statePtr->watc
a720: 68 45 76 65 6e 74 73 29 20 7b 0a 09 20 20 20 20  hEvents) {..    
a730: 54 63 6c 5f 54 69 6d 65 20 62 6c 6f 63 6b 54 69  Tcl_Time blockTi
a740: 6d 65 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a 0a  me = { 0, 0 };..
a750: 09 20 20 20 20 54 63 6c 5f 53 65 74 4d 61 78 42  .    Tcl_SetMaxB
a760: 6c 6f 63 6b 54 69 6d 65 28 26 62 6c 6f 63 6b 54  lockTime(&blockT
a770: 69 6d 65 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d  ime);..}.    }.}
a780: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
a790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
a7d0: 2a 0a 20 2a 20 54 63 70 47 65 74 48 61 6e 64 6c  *. * TcpGetHandl
a7e0: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43  eProc --. *. *.C
a7f0: 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f 47  alled from Tcl_G
a800: 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 20  etChannelHandle 
a810: 74 6f 20 72 65 74 72 69 65 76 65 20 4f 53 20 68  to retrieve OS h
a820: 61 6e 64 6c 65 73 20 66 72 6f 6d 20 69 6e 73 69  andles from insi
a830: 64 65 20 61 0a 20 2a 09 54 43 50 20 73 6f 63 6b  de a. *.TCP sock
a840: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
a850: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
a860: 0a 20 2a 09 52 65 74 75 72 6e 73 20 54 43 4c 5f  . *.Returns TCL_
a870: 4f 4b 20 77 69 74 68 20 74 68 65 20 66 64 20 69  OK with the fd i
a880: 6e 20 68 61 6e 64 6c 65 50 74 72 2c 20 6f 72 20  n handlePtr, or 
a890: 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 74 68 65  TCL_ERROR if the
a8a0: 72 65 20 69 73 20 6e 6f 0a 20 2a 09 68 61 6e 64  re is no. *.hand
a8b0: 6c 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  le for the speci
a8c0: 66 69 65 64 20 64 69 72 65 63 74 69 6f 6e 2e 0a  fied direction..
a8d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
a8e0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
a8f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
a900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
a940: 61 74 69 63 20 69 6e 74 0a 54 63 70 47 65 74 48  atic int.TcpGetH
a950: 61 6e 64 6c 65 50 72 6f 63 28 0a 20 20 20 20 76  andleProc(.    v
a960: 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74  oid *instanceDat
a970: 61 2c 09 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65  a,../* The socke
a980: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20  t state. */.    
a990: 54 43 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29 20  TCL_UNUSED(int) 
a9a0: 2f 2a 64 69 72 65 63 74 69 6f 6e 2a 2f 2c 0a 20  /*direction*/,. 
a9b0: 20 20 20 76 6f 69 64 20 2a 2a 68 61 6e 64 6c 65     void **handle
a9c0: 50 74 72 29 09 09 2f 2a 20 57 68 65 72 65 20 74  Ptr)../* Where t
a9d0: 6f 20 73 74 6f 72 65 20 74 68 65 20 68 61 6e 64  o store the hand
a9e0: 6c 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 70  le. */.{.    Tcp
a9f0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
aa00: 3d 20 28 54 63 70 53 74 61 74 65 20 2a 29 69 6e  = (TcpState *)in
aa10: 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20  stanceData;..   
aa20: 20 2a 68 61 6e 64 6c 65 50 74 72 20 3d 20 49 4e   *handlePtr = IN
aa30: 54 32 50 54 52 28 73 74 61 74 65 50 74 72 2d 3e  T2PTR(statePtr->
aa40: 73 6f 63 6b 65 74 73 2d 3e 66 64 29 3b 0a 20 20  sockets->fd);.  
aa50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
aa60: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
aa70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aab0: 0a 20 2a 0a 20 2a 20 54 63 70 43 6f 6e 6e 65 63  . *. * TcpConnec
aac0: 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  t --. *. *.This 
aad0: 66 75 6e 63 74 69 6f 6e 20 6f 70 65 6e 73 20 61  function opens a
aae0: 20 6e 65 77 20 73 6f 63 6b 65 74 20 69 6e 20 63   new socket in c
aaf0: 6c 69 65 6e 74 20 6d 6f 64 65 2e 0a 20 2a 0a 20  lient mode.. *. 
ab00: 2a 09 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  *.This might be 
ab10: 63 61 6c 6c 65 64 20 69 6e 20 33 20 63 69 72 63  called in 3 circ
ab20: 75 6d 73 74 61 6e 63 65 73 3a 0a 20 2a 09 2d 20  umstances:. *.- 
ab30: 20 20 42 79 20 61 20 72 65 67 75 6c 61 72 20 73    By a regular s
ab40: 6f 63 6b 65 74 20 63 6f 6d 6d 61 6e 64 0a 20 2a  ocket command. *
ab50: 09 2d 20 20 20 42 79 20 74 68 65 20 65 76 65 6e  .-   By the even
ab60: 74 20 68 61 6e 64 6c 65 72 20 74 6f 20 63 6f 6e  t handler to con
ab70: 74 69 6e 75 65 20 61 6e 20 61 73 79 6e 63 68 72  tinue an asynchr
ab80: 6f 6e 6f 75 73 6c 79 20 63 6f 6e 6e 65 63 74 0a  onously connect.
ab90: 20 2a 09 2d 20 20 20 42 79 20 61 20 62 6c 6f 63   *.-   By a bloc
aba0: 6b 69 6e 67 20 73 6f 63 6b 65 74 20 66 75 6e 63  king socket func
abb0: 74 69 6f 6e 20 28 67 65 74 73 2f 70 75 74 73 29  tion (gets/puts)
abc0: 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
abd0: 65 0a 20 2a 09 20 20 20 20 63 6f 6e 6e 65 63 74  e. *.    connect
abe0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 0a 20   synchronously. 
abf0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
ac00: 09 54 43 4c 5f 4f 4b 2c 20 69 66 20 74 68 65 20  .TCL_OK, if the 
ac10: 73 6f 63 6b 65 74 20 77 61 73 20 73 75 63 63 65  socket was succe
ac20: 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65  ssfully connecte
ac30: 64 20 6f 72 20 61 6e 20 61 73 79 6e 63 68 72 6f  d or an asynchro
ac40: 6e 6f 75 73 0a 20 2a 09 63 6f 6e 6e 65 63 74 69  nous. *.connecti
ac50: 6f 6e 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  on is in progres
ac60: 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
ac70: 63 63 75 72 73 2c 20 54 43 4c 5f 45 52 52 4f 52  ccurs, TCL_ERROR
ac80: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 20 2a 09   is returned. *.
ac90: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
aca0: 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20  sage is left in 
acb0: 69 6e 74 65 72 70 2e 0a 20 2a 0a 20 2a 20 53 69  interp.. *. * Si
acc0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4f  de effects:. *.O
acd0: 70 65 6e 73 20 61 20 73 6f 63 6b 65 74 2e 0a 20  pens a socket.. 
ace0: 2a 0a 20 2a 20 52 65 6d 61 72 6b 73 3a 0a 20 2a  *. * Remarks:. *
acf0: 09 41 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 6e  .A single host n
ad00: 61 6d 65 20 6d 61 79 20 72 65 73 6f 6c 76 65 20  ame may resolve 
ad10: 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
ad20: 20 49 50 20 61 64 64 72 65 73 73 2c 20 65 2e 67   IP address, e.g
ad30: 2e 20 66 6f 72 0a 20 2a 09 61 6e 20 49 50 76 34  . for. *.an IPv4
ad40: 2f 49 50 76 36 20 64 75 61 6c 20 73 74 61 63 6b  /IPv6 dual stack
ad50: 20 68 6f 73 74 2e 20 46 6f 72 20 68 61 6e 64 6c   host. For handl
ad60: 69 6e 67 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73  ing asynchronous
ad70: 6c 79 20 63 6f 6e 6e 65 63 74 69 6e 67 0a 20 2a  ly connecting. *
ad80: 09 73 6f 63 6b 65 74 73 20 69 6e 20 74 68 65 20  .sockets in the 
ad90: 62 61 63 6b 67 72 6f 75 6e 64 20 66 6f 72 20 73  background for s
ada0: 75 63 68 20 68 6f 73 74 73 2c 20 74 68 69 73 20  uch hosts, this 
adb0: 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 61 63 74  function can act
adc0: 20 61 73 20 61 0a 20 2a 09 63 6f 72 6f 75 74 69   as a. *.corouti
add0: 6e 65 2e 20 4f 6e 20 74 68 65 20 66 69 72 73 74  ne. On the first
ade0: 20 63 61 6c 6c 2c 20 69 74 20 73 65 74 73 20 75   call, it sets u
adf0: 70 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 76 61  p the control va
ae00: 72 69 61 62 6c 65 73 20 66 6f 72 20 74 68 65 0a  riables for the.
ae10: 20 2a 09 74 77 6f 20 6e 65 73 74 65 64 20 6c 6f   *.two nested lo
ae20: 6f 70 73 20 6f 76 65 72 20 74 68 65 20 6c 6f 63  ops over the loc
ae30: 61 6c 20 61 6e 64 20 72 65 6d 6f 74 65 20 61 64  al and remote ad
ae40: 64 72 65 73 73 65 73 2e 20 4f 6e 63 65 20 74 68  dresses. Once th
ae50: 65 20 66 69 72 73 74 0a 20 2a 09 63 6f 6e 6e 65  e first. *.conne
ae60: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 69 73  ction attempt is
ae70: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 69 74   in progress, it
ae80: 20 73 65 74 73 20 75 70 20 69 74 73 65 6c 66 20   sets up itself 
ae90: 61 73 20 61 20 77 72 69 74 61 62 6c 65 0a 20 2a  as a writable. *
aea0: 09 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 20 66  .event handler f
aeb0: 6f 72 20 74 68 61 74 20 73 6f 63 6b 65 74 2c 20  or that socket, 
aec0: 61 6e 64 20 72 65 74 75 72 6e 73 2e 20 57 68 65  and returns. Whe
aed0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  n the callback o
aee0: 63 63 75 72 73 2c 0a 20 2a 09 63 6f 6e 74 72 6f  ccurs,. *.contro
aef0: 6c 20 69 73 20 74 72 61 6e 73 66 65 72 72 65 64  l is transferred
af00: 20 74 6f 20 74 68 65 20 22 72 65 65 6e 74 65 72   to the "reenter
af10: 22 20 6c 61 62 65 6c 2c 20 72 69 67 68 74 20 61  " label, right a
af20: 66 74 65 72 20 74 68 65 20 69 6e 69 74 69 61 6c  fter the initial
af30: 0a 20 2a 09 72 65 74 75 72 6e 20 61 6e 64 20 74  . *.return and t
af40: 68 65 20 6c 6f 6f 70 73 20 72 65 73 75 6d 65 20  he loops resume 
af50: 61 73 20 69 66 20 74 68 65 79 20 68 61 64 20 6e  as if they had n
af60: 65 76 65 72 20 62 65 65 6e 20 69 6e 74 65 72 72  ever been interr
af70: 75 70 74 65 64 2e 0a 20 2a 09 46 6f 72 20 73 79  upted.. *.For sy
af80: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 63 6f 6e 6e  nchronously conn
af90: 65 63 74 69 6e 67 20 73 6f 63 6b 65 74 73 2c 20  ecting sockets, 
afa0: 74 68 65 20 6c 6f 6f 70 73 20 77 6f 72 6b 20 74  the loops work t
afb0: 68 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 20 2a  he usual way.. *
afc0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
afd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
afe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
b010: 74 61 74 69 63 20 69 6e 74 0a 54 63 70 43 6f 6e  tatic int.TcpCon
b020: 6e 65 63 74 28 0a 20 20 20 20 54 63 6c 5f 49 6e  nect(.    Tcl_In
b030: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
b040: 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70 6f  * For error repo
b050: 72 74 69 6e 67 3b 20 63 61 6e 20 62 65 20 4e 55  rting; can be NU
b060: 4c 4c 2e 20 2a 2f 0a 20 20 20 20 54 63 70 53 74  LL. */.    TcpSt
b070: 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 0a 7b  ate *statePtr).{
b080: 0a 20 20 20 20 44 57 4f 52 44 20 65 72 72 6f 72  .    DWORD error
b090: 3b 0a 20 20 20 20 69 6e 74 20 61 73 79 6e 63 5f  ;.    int async_
b0a0: 63 6f 6e 6e 65 63 74 20 3d 20 47 4f 54 5f 42 49  connect = GOT_BI
b0b0: 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  TS(statePtr->fla
b0c0: 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f 43 4f  gs, TCP_ASYNC_CO
b0d0: 4e 4e 45 43 54 29 3b 0a 09 09 09 09 2f 2a 20 57  NNECT);...../* W
b0e0: 65 20 61 72 65 20 73 74 61 72 74 65 64 20 77 69  e are started wi
b0f0: 74 68 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63 74  th async connect
b100: 20 61 6e 64 20 74 68 65 0a 09 09 09 09 20 2a 20   and the..... * 
b110: 63 6f 6e 6e 65 63 74 20 6e 6f 74 69 66 69 63 61  connect notifica
b120: 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 79 65 74  tion was not yet
b130: 0a 09 09 09 09 20 2a 20 72 65 63 65 69 76 65 64  ..... * received
b140: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 73 79  . */.    int asy
b150: 6e 63 5f 63 61 6c 6c 62 61 63 6b 20 3d 20 47 4f  nc_callback = GO
b160: 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d  T_BITS(statePtr-
b170: 3e 66 6c 61 67 73 2c 20 54 43 50 5f 41 53 59 4e  >flags, TCP_ASYN
b180: 43 5f 50 45 4e 44 49 4e 47 29 3b 0a 09 09 09 09  C_PENDING);.....
b190: 2f 2a 20 57 65 20 77 65 72 65 20 63 61 6c 6c 65  /* We were calle
b1a0: 64 20 62 79 20 74 68 65 20 65 76 65 6e 74 20 70  d by the event p
b1b0: 72 6f 63 65 64 75 72 65 20 61 6e 64 0a 09 09 09  rocedure and....
b1c0: 09 20 2a 20 63 6f 6e 74 69 6e 75 65 20 6f 75 72  . * continue our
b1d0: 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 54 68   loop. */.    Th
b1e0: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
b1f0: 20 2a 74 73 64 50 74 72 20 3d 20 28 54 68 72 65   *tsdPtr = (Thre
b200: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a  adSpecificData *
b210: 29 0a 09 20 20 20 20 54 63 6c 54 68 72 65 61 64  )..    TclThread
b220: 44 61 74 61 4b 65 79 47 65 74 28 26 64 61 74 61  DataKeyGet(&data
b230: 4b 65 79 29 3b 0a 0a 20 20 20 20 69 66 20 28 61  Key);..    if (a
b240: 73 79 6e 63 5f 63 61 6c 6c 62 61 63 6b 29 20 7b  sync_callback) {
b250: 0a 09 67 6f 74 6f 20 72 65 65 6e 74 65 72 3b 0a  ..goto reenter;.
b260: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28      }..    for (
b270: 73 74 61 74 65 50 74 72 2d 3e 61 64 64 72 20 3d  statePtr->addr =
b280: 20 73 74 61 74 65 50 74 72 2d 3e 61 64 64 72 6c   statePtr->addrl
b290: 69 73 74 3b 20 73 74 61 74 65 50 74 72 2d 3e 61  ist; statePtr->a
b2a0: 64 64 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 20 20  ddr != NULL;..  
b2b0: 20 20 73 74 61 74 65 50 74 72 2d 3e 61 64 64 72    statePtr->addr
b2c0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 61 64 64   = statePtr->add
b2d0: 72 2d 3e 61 69 5f 6e 65 78 74 29 20 7b 0a 09 66  r->ai_next) {..f
b2e0: 6f 72 20 28 73 74 61 74 65 50 74 72 2d 3e 6d 79  or (statePtr->my
b2f0: 61 64 64 72 20 3d 20 73 74 61 74 65 50 74 72 2d  addr = statePtr-
b300: 3e 6d 79 61 64 64 72 6c 69 73 74 3b 0a 09 09 73  >myaddrlist;...s
b310: 74 61 74 65 50 74 72 2d 3e 6d 79 61 64 64 72 20  tatePtr->myaddr 
b320: 21 3d 20 4e 55 4c 4c 3b 0a 09 09 73 74 61 74 65  != NULL;...state
b330: 50 74 72 2d 3e 6d 79 61 64 64 72 20 3d 20 73 74  Ptr->myaddr = st
b340: 61 74 65 50 74 72 2d 3e 6d 79 61 64 64 72 2d 3e  atePtr->myaddr->
b350: 61 69 5f 6e 65 78 74 29 20 7b 0a 09 20 20 20 20  ai_next) {..    
b360: 2f 2a 0a 09 20 20 20 20 20 2a 20 4e 6f 20 6e 65  /*..     * No ne
b370: 65 64 20 74 6f 20 74 72 79 20 63 6f 6d 62 69 6e  ed to try combin
b380: 61 74 69 6f 6e 73 20 6f 66 20 6c 6f 63 61 6c 20  ations of local 
b390: 61 6e 64 20 72 65 6d 6f 74 65 20 61 64 64 72 65  and remote addre
b3a0: 73 73 65 73 0a 09 20 20 20 20 20 2a 20 6f 66 20  sses..     * of 
b3b0: 64 69 66 66 65 72 65 6e 74 20 66 61 6d 69 6c 69  different famili
b3c0: 65 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  es...     */... 
b3d0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
b3e0: 3e 6d 79 61 64 64 72 2d 3e 61 69 5f 66 61 6d 69  >myaddr->ai_fami
b3f0: 6c 79 20 21 3d 20 73 74 61 74 65 50 74 72 2d 3e  ly != statePtr->
b400: 61 64 64 72 2d 3e 61 69 5f 66 61 6d 69 6c 79 29  addr->ai_family)
b410: 20 7b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09   {...continue;..
b420: 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09      }...    /*..
b430: 20 20 20 20 20 2a 20 43 6c 6f 73 65 20 74 68 65       * Close the
b440: 20 73 6f 63 6b 65 74 20 69 66 20 69 74 20 69 73   socket if it is
b450: 20 73 74 69 6c 6c 20 6f 70 65 6e 20 66 72 6f 6d   still open from
b460: 20 74 68 65 20 6c 61 73 74 20 75 6e 73 75 63 63   the last unsucc
b470: 65 73 73 66 75 6c 0a 09 20 20 20 20 20 2a 20 69  essful..     * i
b480: 74 65 72 61 74 69 6f 6e 2e 0a 09 20 20 20 20 20  teration...     
b490: 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 73 74 61  */...    if (sta
b4a0: 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e  tePtr->sockets->
b4b0: 66 64 20 21 3d 20 49 4e 56 41 4c 49 44 5f 53 4f  fd != INVALID_SO
b4c0: 43 4b 45 54 29 20 7b 0a 09 09 63 6c 6f 73 65 73  CKET) {...closes
b4d0: 6f 63 6b 65 74 28 73 74 61 74 65 50 74 72 2d 3e  ocket(statePtr->
b4e0: 73 6f 63 6b 65 74 73 2d 3e 66 64 29 3b 0a 09 20  sockets->fd);.. 
b4f0: 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20     }...    /*.. 
b500: 20 20 20 20 2a 20 47 65 74 20 73 74 61 74 65 50      * Get stateP
b510: 74 72 20 6c 6f 63 6b 2e 0a 09 20 20 20 20 20 2a  tr lock...     *
b520: 2f 0a 0a 09 20 20 20 20 57 61 69 74 46 6f 72 53  /...    WaitForS
b530: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50  ingleObject(tsdP
b540: 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f  tr->socketListLo
b550: 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 0a  ck, INFINITE);..
b560: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
b570: 52 65 73 65 74 20 6c 61 73 74 20 65 72 72 6f 72  Reset last error
b580: 20 66 72 6f 6d 20 6c 61 73 74 20 74 72 79 0a 09   from last try..
b590: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 73 74       */...    st
b5a0: 61 74 65 50 74 72 2d 3e 6e 6f 74 69 66 69 65 72  atePtr->notifier
b5b0: 43 6f 6e 6e 65 63 74 45 72 72 6f 72 20 3d 20 30  ConnectError = 0
b5c0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b5d0: 72 6e 6f 28 30 29 3b 0a 0a 09 20 20 20 20 73 74  rno(0);...    st
b5e0: 61 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d  atePtr->sockets-
b5f0: 3e 66 64 20 3d 20 73 6f 63 6b 65 74 28 73 74 61  >fd = socket(sta
b600: 74 65 50 74 72 2d 3e 6d 79 61 64 64 72 2d 3e 61  tePtr->myaddr->a
b610: 69 5f 66 61 6d 69 6c 79 2c 0a 09 09 20 20 20 20  i_family,...    
b620: 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30 29 3b  SOCK_STREAM, 0);
b630: 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  ...    /*..     
b640: 2a 20 46 72 65 65 20 6c 69 73 74 20 6c 6f 63 6b  * Free list lock
b650: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
b660: 20 53 65 74 45 76 65 6e 74 28 74 73 64 50 74 72   SetEvent(tsdPtr
b670: 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b  ->socketListLock
b680: 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  );...    /*..   
b690: 20 20 2a 20 43 6f 6e 74 69 6e 75 65 20 6f 6e 20    * Continue on 
b6a0: 73 6f 63 6b 65 74 20 63 72 65 61 74 69 6f 6e 20  socket creation 
b6b0: 65 72 72 6f 72 2e 0a 09 20 20 20 20 20 2a 2f 0a  error...     */.
b6c0: 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
b6d0: 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 20  tr->sockets->fd 
b6e0: 3d 3d 20 49 4e 56 41 4c 49 44 5f 53 4f 43 4b 45  == INVALID_SOCKE
b6f0: 54 29 20 7b 0a 09 09 54 63 6c 5f 57 69 6e 43 6f  T) {...Tcl_WinCo
b700: 6e 76 65 72 74 45 72 72 6f 72 28 28 44 57 4f 52  nvertError((DWOR
b710: 44 29 20 57 53 41 47 65 74 4c 61 73 74 45 72 72  D) WSAGetLastErr
b720: 6f 72 28 29 29 3b 0a 09 09 63 6f 6e 74 69 6e 75  or());...continu
b730: 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  e;..    }...    
b740: 2f 2a 0a 09 20 20 20 20 20 2a 20 57 69 6e 2d 4e  /*..     * Win-N
b750: 54 20 68 61 73 20 61 20 6d 69 73 66 65 61 74 75  T has a misfeatu
b760: 72 65 20 74 68 61 74 20 73 6f 63 6b 65 74 73 20  re that sockets 
b770: 61 72 65 20 69 6e 68 65 72 69 74 65 64 20 69 6e  are inherited in
b780: 20 63 68 69 6c 64 0a 09 20 20 20 20 20 2a 20 70   child..     * p
b790: 72 6f 63 65 73 73 65 73 20 62 79 20 64 65 66 61  rocesses by defa
b7a0: 75 6c 74 2e 20 54 75 72 6e 20 6f 66 66 20 74 68  ult. Turn off th
b7b0: 65 20 69 6e 68 65 72 69 74 20 62 69 74 2e 0a 09  e inherit bit...
b7c0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 53 65       */...    Se
b7d0: 74 48 61 6e 64 6c 65 49 6e 66 6f 72 6d 61 74 69  tHandleInformati
b7e0: 6f 6e 28 28 48 41 4e 44 4c 45 29 20 73 74 61 74  on((HANDLE) stat
b7f0: 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66  ePtr->sockets->f
b800: 64 2c 0a 09 09 20 20 20 20 48 41 4e 44 4c 45 5f  d,...    HANDLE_
b810: 46 4c 41 47 5f 49 4e 48 45 52 49 54 2c 20 30 29  FLAG_INHERIT, 0)
b820: 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  ;...    /*..    
b830: 20 2a 20 53 65 74 20 6b 65 72 6e 65 6c 20 73 70   * Set kernel sp
b840: 61 63 65 20 62 75 66 66 65 72 69 6e 67 0a 09 20  ace buffering.. 
b850: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c      */...    Tcl
b860: 53 6f 63 6b 4d 69 6e 69 6d 75 6d 42 75 66 66 65  SockMinimumBuffe
b870: 72 73 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65  rs((void *)state
b880: 50 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66 64  Ptr->sockets->fd
b890: 2c 0a 09 09 20 20 20 20 54 43 50 5f 42 55 46 46  ,...    TCP_BUFF
b8a0: 45 52 5f 53 49 5a 45 29 3b 0a 0a 09 20 20 20 20  ER_SIZE);...    
b8b0: 2f 2a 0a 09 20 20 20 20 20 2a 20 54 72 79 20 74  /*..     * Try t
b8c0: 6f 20 62 69 6e 64 20 74 6f 20 61 20 6c 6f 63 61  o bind to a loca
b8d0: 6c 20 70 6f 72 74 2e 0a 09 20 20 20 20 20 2a 2f  l port...     */
b8e0: 0a 0a 09 20 20 20 20 69 66 20 28 62 69 6e 64 28  ...    if (bind(
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 2c 20 73 74 61 74 65 50 74 72 2d  s->fd, statePtr-
b910: 3e 6d 79 61 64 64 72 2d 3e 61 69 5f 61 64 64 72  >myaddr->ai_addr
b920: 2c 0a 09 09 20 20 20 20 28 73 6f 63 6b 6c 65 6e  ,...    (socklen
b930: 5f 74 29 73 74 61 74 65 50 74 72 2d 3e 6d 79 61  _t)statePtr->mya
b940: 64 64 72 2d 3e 61 69 5f 61 64 64 72 6c 65 6e 29  ddr->ai_addrlen)
b950: 20 3d 3d 20 53 4f 43 4b 45 54 5f 45 52 52 4f 52   == SOCKET_ERROR
b960: 29 20 7b 0a 09 09 54 63 6c 5f 57 69 6e 43 6f 6e  ) {...Tcl_WinCon
b970: 76 65 72 74 45 72 72 6f 72 28 28 44 57 4f 52 44  vertError((DWORD
b980: 29 20 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f  ) WSAGetLastErro
b990: 72 28 29 29 3b 0a 09 09 63 6f 6e 74 69 6e 75 65  r());...continue
b9a0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f  ;..    }...    /
b9b0: 2a 0a 09 20 20 20 20 20 2a 20 46 6f 72 20 61 73  *..     * For as
b9c0: 79 6e 63 68 72 6f 6e 6f 75 73 20 63 6f 6e 6e 65  ynchronous conne
b9d0: 63 74 20 73 65 74 20 74 68 65 20 73 6f 63 6b 65  ct set the socke
b9e0: 74 20 69 6e 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67  t in nonblocking
b9f0: 20 6d 6f 64 65 0a 09 20 20 20 20 20 2a 20 61 6e   mode..     * an
ba00: 64 20 61 63 74 69 76 61 74 65 20 63 6f 6e 6e 65  d activate conne
ba10: 63 74 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e 0a  ct notification.
ba20: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69  .     */...    i
ba30: 66 20 28 61 73 79 6e 63 5f 63 6f 6e 6e 65 63 74  f (async_connect
ba40: 29 20 7b 0a 09 09 54 63 70 53 74 61 74 65 20 2a  ) {...TcpState *
ba50: 73 74 61 74 65 50 74 72 32 3b 0a 09 09 69 6e 74  statePtr2;...int
ba60: 20 69 6e 5f 73 6f 63 6b 65 74 5f 6c 69 73 74 20   in_socket_list 
ba70: 3d 20 30 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20  = 0;..../*... * 
ba80: 47 65 74 20 73 74 61 74 65 50 74 72 20 6c 6f 63  Get statePtr loc
ba90: 6b 2e 0a 09 09 20 2a 2f 0a 0a 09 09 57 61 69 74  k.... */....Wait
baa0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28  ForSingleObject(
bab0: 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
bac0: 73 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e 49 54 45  stLock, INFINITE
bad0: 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 42 75  );..../*... * Bu
bae0: 67 66 69 67 20 66 6f 72 20 33 33 36 34 34 31 65  gfig for 336441e
baf0: 64 35 39 20 74 6f 20 6e 6f 74 20 69 67 6e 6f 72  d59 to not ignor
bb00: 65 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e 73 20  e notifications 
bb10: 75 6e 74 69 6c 20 74 68 65 0a 09 09 20 2a 20 69  until the... * i
bb20: 6e 66 6f 50 74 72 20 69 73 20 69 6e 20 74 68 65  nfoPtr is in the
bb30: 20 6c 69 73 74 2e 0a 09 09 20 2a 20 43 68 65 63   list.... * Chec
bb40: 6b 20 69 66 20 6d 79 20 73 74 61 74 65 50 74 72  k if my statePtr
bb50: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
bb60: 68 65 20 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65  he tsdPtr->socke
bb70: 74 4c 69 73 74 0a 09 09 20 2a 20 49 74 20 69 73  tList... * It is
bb80: 20 73 65 74 20 61 66 74 65 72 20 74 68 69 73 20   set after this 
bb90: 63 61 6c 6c 20 62 79 20 54 63 70 54 68 72 65 61  call by TcpThrea
bba0: 64 41 63 74 69 6f 6e 50 72 6f 63 20 61 6e 64 20  dActionProc and 
bbb0: 69 73 20 73 65 74 0a 09 09 20 2a 20 6f 6e 20 61  is set... * on a
bbc0: 20 73 65 63 6f 6e 64 20 72 6f 75 6e 64 2e 0a 09   second round...
bbd0: 09 20 2a 0a 09 09 20 2a 20 49 66 20 6e 6f 74 2c  . *... * If not,
bbe0: 20 77 65 20 62 75 66 66 65 72 20 6d 79 20 73 74   we buffer my st
bbf0: 61 74 65 50 74 72 20 69 6e 20 74 68 65 20 74 73  atePtr in the ts
bc00: 64 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 69  d memory so it i
bc10: 73 0a 09 09 20 2a 20 6e 6f 74 20 6c 6f 73 74 20  s... * not lost 
bc20: 62 79 20 74 68 65 20 65 76 65 6e 74 20 70 72 6f  by the event pro
bc30: 63 65 64 75 72 65 0a 09 09 20 2a 2f 0a 0a 09 09  cedure... */....
bc40: 66 6f 72 20 28 73 74 61 74 65 50 74 72 32 20 3d  for (statePtr2 =
bc50: 20 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c   tsdPtr->socketL
bc60: 69 73 74 3b 20 73 74 61 74 65 50 74 72 32 20 21  ist; statePtr2 !
bc70: 3d 20 4e 55 4c 4c 3b 0a 09 09 09 73 74 61 74 65  = NULL;....state
bc80: 50 74 72 32 20 3d 20 73 74 61 74 65 50 74 72 32  Ptr2 = statePtr2
bc90: 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 09 20  ->nextPtr) {... 
bca0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 32     if (statePtr2
bcb0: 20 3d 3d 20 73 74 61 74 65 50 74 72 29 20 7b 0a   == statePtr) {.
bcc0: 09 09 09 69 6e 5f 73 6f 63 6b 65 74 5f 6c 69 73  ...in_socket_lis
bcd0: 74 20 3d 20 31 3b 0a 09 09 09 62 72 65 61 6b 3b  t = 1;....break;
bce0: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 69  ...    }...}...i
bcf0: 66 20 28 21 69 6e 5f 73 6f 63 6b 65 74 5f 6c 69  f (!in_socket_li
bd00: 73 74 29 20 7b 0a 09 09 20 20 20 20 74 73 64 50  st) {...    tsdP
bd10: 74 72 2d 3e 70 65 6e 64 69 6e 67 54 63 70 53 74  tr->pendingTcpSt
bd20: 61 74 65 20 3d 20 73 74 61 74 65 50 74 72 3b 0a  ate = statePtr;.
bd30: 09 09 7d 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 53  ..}..../*... * S
bd40: 65 74 20 63 6f 6e 6e 65 63 74 20 6d 61 73 6b 20  et connect mask 
bd50: 74 6f 20 63 6f 6e 6e 65 63 74 20 65 76 65 6e 74  to connect event
bd60: 73 0a 09 09 20 2a 0a 09 09 20 2a 20 54 68 69 73  s... *... * This
bd70: 20 69 73 20 61 63 74 69 76 61 74 65 64 20 62 79   is activated by
bd80: 20 61 20 53 4f 43 4b 45 54 5f 53 45 4c 45 43 54   a SOCKET_SELECT
bd90: 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 0a   message to the.
bda0: 09 09 20 2a 20 6e 6f 74 69 66 69 65 72 20 74 68  .. * notifier th
bdb0: 72 65 61 64 2e 0a 09 09 20 2a 2f 0a 0a 09 09 53  read.... */....S
bdc0: 45 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  ET_BITS(statePtr
bdd0: 2d 3e 73 65 6c 65 63 74 45 76 65 6e 74 73 2c 20  ->selectEvents, 
bde0: 46 44 5f 43 4f 4e 4e 45 43 54 29 3b 0a 0a 09 09  FD_CONNECT);....
bdf0: 2f 2a 0a 09 09 20 2a 20 46 72 65 65 20 6c 69 73  /*... * Free lis
be00: 74 20 6c 6f 63 6b 2e 0a 09 09 20 2a 2f 0a 0a 09  t lock.... */...
be10: 09 53 65 74 45 76 65 6e 74 28 74 73 64 50 74 72  .SetEvent(tsdPtr
be20: 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b  ->socketListLock
be30: 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 41 63  );..../*... * Ac
be40: 74 69 76 61 74 65 20 61 63 63 65 70 74 20 6e 6f  tivate accept no
be50: 74 69 66 69 63 61 74 69 6f 6e 2e 0a 09 09 20 2a  tification.... *
be60: 2f 0a 0a 09 09 53 65 6e 64 53 65 6c 65 63 74 4d  /....SendSelectM
be70: 65 73 73 61 67 65 28 74 73 64 50 74 72 2c 20 53  essage(tsdPtr, S
be80: 45 4c 45 43 54 2c 20 73 74 61 74 65 50 74 72 29  ELECT, statePtr)
be90: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f  ;..    }...    /
bea0: 2a 0a 09 20 20 20 20 20 2a 20 41 74 74 65 6d 70  *..     * Attemp
beb0: 74 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  t to connect to 
bec0: 74 68 65 20 72 65 6d 6f 74 65 20 73 6f 63 6b 65  the remote socke
bed0: 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  t...     */...  
bee0: 20 20 63 6f 6e 6e 65 63 74 28 73 74 61 74 65 50    connect(stateP
bef0: 74 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 2c  tr->sockets->fd,
bf00: 20 73 74 61 74 65 50 74 72 2d 3e 61 64 64 72 2d   statePtr->addr-
bf10: 3e 61 69 5f 61 64 64 72 2c 0a 09 09 20 20 20 20  >ai_addr,...    
bf20: 28 73 6f 63 6b 6c 65 6e 5f 74 29 73 74 61 74 65  (socklen_t)state
bf30: 50 74 72 2d 3e 61 64 64 72 2d 3e 61 69 5f 61 64  Ptr->addr->ai_ad
bf40: 64 72 6c 65 6e 29 3b 0a 0a 09 20 20 20 20 65 72  drlen);...    er
bf50: 72 6f 72 20 3d 20 57 53 41 47 65 74 4c 61 73 74  ror = WSAGetLast
bf60: 45 72 72 6f 72 28 29 3b 0a 09 20 20 20 20 54 63  Error();..    Tc
bf70: 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f  l_WinConvertErro
bf80: 72 28 65 72 72 6f 72 29 3b 0a 0a 09 20 20 20 20  r(error);...    
bf90: 69 66 20 28 61 73 79 6e 63 5f 63 6f 6e 6e 65 63  if (async_connec
bfa0: 74 20 26 26 20 65 72 72 6f 72 20 3d 3d 20 57 53  t && error == WS
bfb0: 41 45 57 4f 55 4c 44 42 4c 4f 43 4b 29 20 7b 0a  AEWOULDBLOCK) {.
bfc0: 09 09 2f 2a 0a 09 09 20 2a 20 41 73 79 6e 63 68  ../*... * Asynch
bfd0: 72 6f 6e 6f 75 73 20 63 6f 6e 6e 65 63 74 0a 09  ronous connect..
bfe0: 09 20 2a 0a 09 09 20 2a 20 52 65 6d 65 6d 62 65  . *... * Remembe
bff0: 72 20 74 68 61 74 20 77 65 20 6a 75 6d 70 20 62  r that we jump b
c000: 61 63 6b 20 62 65 68 69 6e 64 20 74 68 69 73 20  ack behind this 
c010: 6e 65 78 74 20 72 6f 75 6e 64 0a 09 09 20 2a 2f  next round... */
c020: 0a 0a 09 09 53 45 54 5f 42 49 54 53 28 73 74 61  ....SET_BITS(sta
c030: 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20 54 43  tePtr->flags, TC
c040: 50 5f 41 53 59 4e 43 5f 50 45 4e 44 49 4e 47 29  P_ASYNC_PENDING)
c050: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;...return TCL_O
c060: 4b 3b 0a 0a 09 20 20 20 20 72 65 65 6e 74 65 72  K;...    reenter
c070: 3a 0a 09 09 2f 2a 0a 09 09 20 2a 20 52 65 2d 65  :.../*... * Re-e
c080: 6e 74 72 79 20 70 6f 69 6e 74 20 66 6f 72 20 61  ntry point for a
c090: 73 79 6e 63 20 63 6f 6e 6e 65 63 74 20 61 66 74  sync connect aft
c0a0: 65 72 20 63 6f 6e 6e 65 63 74 20 65 76 65 6e 74  er connect event
c0b0: 20 6f 72 0a 09 09 20 2a 20 62 6c 6f 63 6b 69 6e   or... * blockin
c0c0: 67 20 6f 70 65 72 61 74 69 6f 6e 0a 09 09 20 2a  g operation... *
c0d0: 0a 09 09 20 2a 20 43 6c 65 61 72 20 74 68 65 20  ... * Clear the 
c0e0: 72 65 65 6e 74 65 72 20 66 6c 61 67 0a 09 09 20  reenter flag... 
c0f0: 2a 2f 0a 0a 09 09 43 4c 45 41 52 5f 42 49 54 53  */....CLEAR_BITS
c100: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
c110: 2c 20 54 43 50 5f 41 53 59 4e 43 5f 50 45 4e 44  , TCP_ASYNC_PEND
c120: 49 4e 47 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a  ING);..../*... *
c130: 20 47 65 74 20 73 74 61 74 65 50 74 72 20 6c 6f   Get statePtr lo
c140: 63 6b 2e 0a 09 09 20 2a 2f 0a 0a 09 09 57 61 69  ck.... */....Wai
c150: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
c160: 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c  (tsdPtr->socketL
c170: 69 73 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e 49 54  istLock, INFINIT
c180: 45 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 47  E);..../*... * G
c190: 65 74 20 73 69 67 6e 61 6c 65 64 20 63 6f 6e 6e  et signaled conn
c1a0: 65 63 74 20 65 72 72 6f 72 2e 0a 09 09 20 2a 2f  ect error.... */
c1b0: 0a 0a 09 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65  ....Tcl_WinConve
c1c0: 72 74 45 72 72 6f 72 28 28 44 57 4f 52 44 29 20  rtError((DWORD) 
c1d0: 73 74 61 74 65 50 74 72 2d 3e 6e 6f 74 69 66 69  statePtr->notifi
c1e0: 65 72 43 6f 6e 6e 65 63 74 45 72 72 6f 72 29 3b  erConnectError);
c1f0: 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 43 6c 65 61  ..../*... * Clea
c200: 72 20 65 76 65 6e 74 75 61 6c 20 63 6f 6e 6e 65  r eventual conne
c210: 63 74 20 66 6c 61 67 2e 0a 09 09 20 2a 2f 0a 0a  ct flag.... */..
c220: 09 09 43 4c 45 41 52 5f 42 49 54 53 28 73 74 61  ..CLEAR_BITS(sta
c230: 74 65 50 74 72 2d 3e 73 65 6c 65 63 74 45 76 65  tePtr->selectEve
c240: 6e 74 73 2c 20 46 44 5f 43 4f 4e 4e 45 43 54 29  nts, FD_CONNECT)
c250: 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 46 72 65  ;..../*... * Fre
c260: 65 20 6c 69 73 74 20 6c 6f 63 6b 2e 0a 09 09 20  e list lock.... 
c270: 2a 2f 0a 0a 09 09 53 65 74 45 76 65 6e 74 28 74  */....SetEvent(t
c280: 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73  sdPtr->socketLis
c290: 74 4c 6f 63 6b 29 3b 0a 09 20 20 20 20 7d 0a 0a  tLock);..    }..
c2a0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
c2b0: 43 6c 65 61 72 20 74 68 65 20 74 73 64 20 73 6f  Clear the tsd so
c2c0: 63 6b 65 74 20 6c 69 73 74 20 70 6f 69 6e 74 65  cket list pointe
c2d0: 72 20 69 66 20 77 65 20 64 69 64 20 6e 6f 74 20  r if we did not 
c2e0: 77 61 69 74 20 66 6f 72 0a 09 20 20 20 20 20 2a  wait for..     *
c2f0: 20 74 68 65 20 46 44 5f 43 4f 4e 4e 45 43 54 20   the FD_CONNECT 
c300: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 0a 09  asynchronously..
c310: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 74 73       */...    ts
c320: 64 50 74 72 2d 3e 70 65 6e 64 69 6e 67 54 63 70  dPtr->pendingTcp
c330: 53 74 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  State = NULL;...
c340: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 45      if (Tcl_GetE
c350: 72 72 6e 6f 28 29 20 3d 3d 20 30 29 20 7b 0a 09  rrno() == 0) {..
c360: 09 67 6f 74 6f 20 6f 75 74 3b 0a 09 20 20 20 20  .goto out;..    
c370: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 6f 75  }..}.    }..  ou
c380: 74 3a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  t:.    /*.     *
c390: 20 53 6f 63 6b 65 74 20 63 6f 6e 6e 65 63 74 65   Socket connecte
c3a0: 64 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  d or connection 
c3b0: 66 61 69 6c 65 64 0a 20 20 20 20 20 2a 2f 0a 0a  failed.     */..
c3c0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 73      /*.     * As
c3d0: 79 6e 63 20 63 6f 6e 6e 65 63 74 20 74 65 72 6d  ync connect term
c3e0: 69 6e 61 74 65 64 0a 20 20 20 20 20 2a 2f 0a 0a  inated.     */..
c3f0: 20 20 20 20 43 4c 45 41 52 5f 42 49 54 53 28 73      CLEAR_BITS(s
c400: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c 20  tatePtr->flags, 
c410: 54 43 50 5f 41 53 59 4e 43 5f 43 4f 4e 4e 45 43  TCP_ASYNC_CONNEC
c420: 54 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c  T);..    if (Tcl
c430: 5f 47 65 74 45 72 72 6e 6f 28 29 20 3d 3d 20 30  _GetErrno() == 0
c440: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 75 63 63  ) {../*.. * Succ
c450: 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74  essfully connect
c460: 65 64 0a 09 20 2a 0a 09 20 2a 20 53 65 74 20 75  ed.. *.. * Set u
c470: 70 20 74 68 65 20 73 65 6c 65 63 74 20 6d 61 73  p the select mas
c480: 6b 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  k for read/write
c490: 20 65 76 65 6e 74 73 2e 0a 09 20 2a 2f 0a 0a 09   events... */...
c4a0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 65 63 74  statePtr->select
c4b0: 45 76 65 6e 74 73 20 3d 20 46 44 5f 52 45 41 44  Events = FD_READ
c4c0: 20 7c 20 46 44 5f 57 52 49 54 45 20 7c 20 46 44   | FD_WRITE | FD
c4d0: 5f 43 4c 4f 53 45 3b 0a 0a 09 2f 2a 0a 09 20 2a  _CLOSE;.../*.. *
c4e0: 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 69 6e   Register for in
c4f0: 74 65 72 65 73 74 20 69 6e 20 65 76 65 6e 74 73  terest in events
c500: 20 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6d   in the select m
c510: 61 73 6b 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  ask. Note that t
c520: 68 69 73 0a 09 20 2a 20 61 75 74 6f 6d 61 74 69  his.. * automati
c530: 63 61 6c 6c 79 20 70 6c 61 63 65 73 20 74 68 65  cally places the
c540: 20 73 6f 63 6b 65 74 20 69 6e 74 6f 20 6e 6f 6e   socket into non
c550: 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  -blocking mode..
c560: 09 20 2a 2f 0a 0a 09 53 65 6e 64 53 65 6c 65 63  . */...SendSelec
c570: 74 4d 65 73 73 61 67 65 28 74 73 64 50 74 72 2c  tMessage(tsdPtr,
c580: 20 53 45 4c 45 43 54 2c 20 73 74 61 74 65 50 74   SELECT, statePt
c590: 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  r);.    } else {
c5a0: 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6e 6e 65 63 74  ../*.. * Connect
c5b0: 20 66 61 69 6c 65 64 0a 09 20 2a 0a 09 20 2a 20   failed.. *.. * 
c5c0: 46 6f 72 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63  For async connec
c5d0: 74 20 73 63 68 65 64 75 6c 65 20 61 20 77 72 69  t schedule a wri
c5e0: 74 61 62 6c 65 20 65 76 65 6e 74 20 74 6f 20 72  table event to r
c5f0: 65 70 6f 72 74 20 74 68 65 20 66 61 69 6c 2e 0a  eport the fail..
c600: 09 20 2a 2f 0a 0a 09 69 66 20 28 61 73 79 6e 63  . */...if (async
c610: 5f 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 20 20  _callback) {..  
c620: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 53 65 74    /*..     * Set
c630: 20 75 70 20 74 68 65 20 73 65 6c 65 63 74 20 6d   up the select m
c640: 61 73 6b 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ask for read/wri
c650: 74 65 20 65 76 65 6e 74 73 2e 0a 09 20 20 20 20  te events...    
c660: 20 2a 2f 0a 0a 09 20 20 20 20 73 74 61 74 65 50   */...    stateP
c670: 74 72 2d 3e 73 65 6c 65 63 74 45 76 65 6e 74 73  tr->selectEvents
c680: 20 3d 20 46 44 5f 57 52 49 54 45 7c 46 44 5f 52   = FD_WRITE|FD_R
c690: 45 41 44 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20  EAD;...    /*.. 
c6a0: 20 20 20 20 2a 20 47 65 74 20 73 74 61 74 65 50      * Get stateP
c6b0: 74 72 20 6c 6f 63 6b 2e 0a 09 20 20 20 20 20 2a  tr lock...     *
c6c0: 2f 0a 0a 09 20 20 20 20 57 61 69 74 46 6f 72 53  /...    WaitForS
c6d0: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50  ingleObject(tsdP
c6e0: 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f  tr->socketListLo
c6f0: 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 0a  ck, INFINITE);..
c700: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
c710: 53 69 67 6e 61 6c 20 72 65 61 64 79 20 72 65 61  Signal ready rea
c720: 64 61 62 6c 65 20 61 6e 64 20 77 72 69 74 61 62  dable and writab
c730: 6c 65 20 65 76 65 6e 74 73 2e 0a 09 20 20 20 20  le events...    
c740: 20 2a 2f 0a 0a 09 20 20 20 20 53 45 54 5f 42 49   */...    SET_BI
c750: 54 53 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61  TS(statePtr->rea
c760: 64 79 45 76 65 6e 74 73 2c 20 46 44 5f 57 52 49  dyEvents, FD_WRI
c770: 54 45 20 7c 20 46 44 5f 52 45 41 44 29 3b 0a 0a  TE | FD_READ);..
c780: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
c790: 46 6c 61 67 20 65 72 72 6f 72 20 74 6f 20 65 76  Flag error to ev
c7a0: 65 6e 74 20 72 6f 75 74 69 6e 65 2e 0a 09 20 20  ent routine...  
c7b0: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 53 45 54 5f     */...    SET_
c7c0: 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66  BITS(statePtr->f
c7d0: 6c 61 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f  lags, TCP_ASYNC_
c7e0: 46 41 49 4c 45 44 29 3b 0a 0a 09 20 20 20 20 2f  FAILED);...    /
c7f0: 2a 0a 09 20 20 20 20 20 2a 20 53 61 76 65 20 63  *..     * Save c
c800: 6f 6e 6e 65 63 74 20 65 72 72 6f 72 20 74 6f 20  onnect error to 
c810: 62 65 20 72 65 70 6f 72 74 65 64 20 62 79 20 27  be reported by '
c820: 66 63 6f 6e 66 69 67 75 72 65 20 2d 65 72 72 6f  fconfigure -erro
c830: 72 27 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  r'...     */... 
c840: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 6f 6e     statePtr->con
c850: 6e 65 63 74 45 72 72 6f 72 20 3d 20 54 63 6c 5f  nectError = Tcl_
c860: 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 09 20 20  GetErrno();...  
c870: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 46 72 65    /*..     * Fre
c880: 65 20 6c 69 73 74 20 6c 6f 63 6b 2e 0a 09 20 20  e list lock...  
c890: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 53 65 74 45     */...    SetE
c8a0: 76 65 6e 74 28 74 73 64 50 74 72 2d 3e 73 6f 63  vent(tsdPtr->soc
c8b0: 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a 09 7d  ketListLock);..}
c8c0: 0a 0a 09 2f 2a 0a 09 20 2a 20 45 72 72 6f 72 20  .../*.. * Error 
c8d0: 6d 65 73 73 61 67 65 20 6f 6e 20 73 79 6e 63 68  message on synch
c8e0: 72 6f 6e 6f 75 73 20 63 6f 6e 6e 65 63 74 0a 09  ronous connect..
c8f0: 20 2a 2f 0a 0a 09 69 66 20 28 69 6e 74 65 72 70   */...if (interp
c900: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
c910: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
c920: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
c930: 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22  jPrintf(...    "
c940: 63 6f 75 6c 64 6e 27 74 20 6f 70 65 6e 20 73 6f  couldn't open so
c950: 63 6b 65 74 3a 20 25 73 22 2c 20 54 63 6c 5f 50  cket: %s", Tcl_P
c960: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70  osixError(interp
c970: 29 29 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20  )));..}..return 
c980: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
c990: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c9a0: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
c9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9f0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 4f 70  ---. *. * Tcl_Op
ca00: 65 6e 54 63 70 43 6c 69 65 6e 74 20 2d 2d 0a 20  enTcpClient --. 
ca10: 2a 0a 20 2a 09 4f 70 65 6e 73 20 61 20 54 43 50  *. *.Opens a TCP
ca20: 20 63 6c 69 65 6e 74 20 73 6f 63 6b 65 74 20 61   client socket a
ca30: 6e 64 20 63 72 65 61 74 65 73 20 61 20 63 68 61  nd creates a cha
ca40: 6e 6e 65 6c 20 61 72 6f 75 6e 64 20 69 74 2e 0a  nnel around it..
ca50: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
ca60: 2a 09 54 68 65 20 63 68 61 6e 6e 65 6c 20 6f 72  *.The channel or
ca70: 20 4e 55 4c 4c 20 69 66 20 66 61 69 6c 65 64 2e   NULL if failed.
ca80: 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   An error messag
ca90: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  e is returned in
caa0: 20 74 68 65 0a 20 2a 09 69 6e 74 65 72 70 72 65   the. *.interpre
cab0: 74 65 72 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ter on failure..
cac0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
cad0: 74 73 3a 0a 20 2a 09 4f 70 65 6e 73 20 61 20 63  ts:. *.Opens a c
cae0: 6c 69 65 6e 74 20 73 6f 63 6b 65 74 20 61 6e 64  lient socket and
caf0: 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63   creates a new c
cb00: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
cb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb50: 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 43 68 61  ---. */..Tcl_Cha
cb60: 6e 6e 65 6c 0a 54 63 6c 5f 4f 70 65 6e 54 63 70  nnel.Tcl_OpenTcp
cb70: 43 6c 69 65 6e 74 28 0a 20 20 20 20 54 63 6c 5f  Client(.    Tcl_
cb80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09  Interp *interp,.
cb90: 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65  ./* For error re
cba0: 70 6f 72 74 69 6e 67 3b 20 63 61 6e 20 62 65 20  porting; can be 
cbb0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  NULL. */.    int
cbc0: 20 70 6f 72 74 2c 09 09 09 2f 2a 20 50 6f 72 74   port,.../* Port
cbd0: 20 6e 75 6d 62 65 72 20 74 6f 20 6f 70 65 6e 2e   number to open.
cbe0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
cbf0: 61 72 20 2a 68 6f 73 74 2c 09 09 2f 2a 20 48 6f  ar *host,../* Ho
cc00: 73 74 20 6f 6e 20 77 68 69 63 68 20 74 6f 20 6f  st on which to o
cc10: 70 65 6e 20 70 6f 72 74 2e 20 2a 2f 0a 20 20 20  pen port. */.   
cc20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 79 61   const char *mya
cc30: 64 64 72 2c 09 09 2f 2a 20 43 6c 69 65 6e 74 2d  ddr,../* Client-
cc40: 73 69 64 65 20 61 64 64 72 65 73 73 20 2a 2f 0a  side address */.
cc50: 20 20 20 20 69 6e 74 20 6d 79 70 6f 72 74 2c 09      int myport,.
cc60: 09 09 2f 2a 20 43 6c 69 65 6e 74 2d 73 69 64 65  ../* Client-side
cc70: 20 70 6f 72 74 20 2a 2f 0a 20 20 20 20 69 6e 74   port */.    int
cc80: 20 61 73 79 6e 63 29 09 09 09 2f 2a 20 49 66 20   async).../* If 
cc90: 6e 6f 6e 7a 65 72 6f 2c 20 61 74 74 65 6d 70 74  nonzero, attempt
cca0: 20 74 6f 20 64 6f 20 61 6e 20 61 73 79 6e 63 68   to do an asynch
ccb0: 72 6f 6e 6f 75 73 0a 09 09 09 09 20 2a 20 63 6f  ronous..... * co
ccc0: 6e 6e 65 63 74 2e 20 4f 74 68 65 72 77 69 73 65  nnect. Otherwise
ccd0: 20 77 65 20 64 6f 20 61 20 62 6c 6f 63 6b 69 6e   we do a blockin
cce0: 67 0a 09 09 09 09 20 2a 20 63 6f 6e 6e 65 63 74  g..... * connect
ccf0: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 70 53 74  . */.{.    TcpSt
cd00: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
cd10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65     const char *e
cd20: 72 72 6f 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a  rrorMsg = NULL;.
cd30: 20 20 20 20 73 74 72 75 63 74 20 61 64 64 72 69      struct addri
cd40: 6e 66 6f 20 2a 61 64 64 72 6c 69 73 74 20 3d 20  nfo *addrlist = 
cd50: 4e 55 4c 4c 2c 20 2a 6d 79 61 64 64 72 6c 69 73  NULL, *myaddrlis
cd60: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  t = NULL;.    ch
cd70: 61 72 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 5b 53  ar channelName[S
cd80: 4f 43 4b 5f 43 48 41 4e 5f 4c 45 4e 47 54 48 5d  OCK_CHAN_LENGTH]
cd90: 3b 0a 0a 20 20 20 20 54 63 6c 49 6e 69 74 53 6f  ;..    TclInitSo
cda0: 63 6b 65 74 73 28 29 3b 0a 0a 20 20 20 20 2f 2a  ckets();..    /*
cdb0: 0a 20 20 20 20 20 2a 20 44 6f 20 74 68 65 20 6e  .     * Do the n
cdc0: 61 6d 65 20 6c 6f 6f 6b 75 70 73 20 66 6f 72 20  ame lookups for 
cdd0: 74 68 65 20 6c 6f 63 61 6c 20 61 6e 64 20 72 65  the local and re
cde0: 6d 6f 74 65 20 61 64 64 72 65 73 73 65 73 2e 0a  mote addresses..
cdf0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
ce00: 28 21 54 63 6c 43 72 65 61 74 65 53 6f 63 6b 65  (!TclCreateSocke
ce10: 74 41 64 64 72 65 73 73 28 69 6e 74 65 72 70 2c  tAddress(interp,
ce20: 20 26 61 64 64 72 6c 69 73 74 2c 20 68 6f 73 74   &addrlist, host
ce30: 2c 20 70 6f 72 74 2c 20 30 2c 20 26 65 72 72 6f  , port, 0, &erro
ce40: 72 4d 73 67 29 0a 09 20 20 20 20 7c 7c 20 21 54  rMsg)..    || !T
ce50: 63 6c 43 72 65 61 74 65 53 6f 63 6b 65 74 41 64  clCreateSocketAd
ce60: 64 72 65 73 73 28 69 6e 74 65 72 70 2c 20 26 6d  dress(interp, &m
ce70: 79 61 64 64 72 6c 69 73 74 2c 20 6d 79 61 64 64  yaddrlist, myadd
ce80: 72 2c 20 6d 79 70 6f 72 74 2c 20 31 2c 0a 09 09  r, myport, 1,...
ce90: 20 20 20 20 26 65 72 72 6f 72 4d 73 67 29 29 20      &errorMsg)) 
cea0: 7b 0a 09 69 66 20 28 61 64 64 72 6c 69 73 74 20  {..if (addrlist 
ceb0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
cec0: 66 72 65 65 61 64 64 72 69 6e 66 6f 28 61 64 64  freeaddrinfo(add
ced0: 72 6c 69 73 74 29 3b 0a 09 7d 0a 09 69 66 20 28  rlist);..}..if (
cee0: 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20  interp != NULL) 
cef0: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  {..    Tcl_SetOb
cf00: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
cf10: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09  Tcl_ObjPrintf(..
cf20: 09 20 20 20 20 22 63 6f 75 6c 64 6e 27 74 20 6f  .    "couldn't o
cf30: 70 65 6e 20 73 6f 63 6b 65 74 3a 20 25 73 22 2c  pen socket: %s",
cf40: 20 65 72 72 6f 72 4d 73 67 29 29 3b 0a 09 7d 0a   errorMsg));..}.
cf50: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
cf60: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74    }..    statePt
cf70: 72 20 3d 20 4e 65 77 53 6f 63 6b 65 74 49 6e 66  r = NewSocketInf
cf80: 6f 28 49 4e 56 41 4c 49 44 5f 53 4f 43 4b 45 54  o(INVALID_SOCKET
cf90: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  );.    statePtr-
cfa0: 3e 61 64 64 72 6c 69 73 74 20 3d 20 61 64 64 72  >addrlist = addr
cfb0: 6c 69 73 74 3b 0a 20 20 20 20 73 74 61 74 65 50  list;.    stateP
cfc0: 74 72 2d 3e 6d 79 61 64 64 72 6c 69 73 74 20 3d  tr->myaddrlist =
cfd0: 20 6d 79 61 64 64 72 6c 69 73 74 3b 0a 20 20 20   myaddrlist;.   
cfe0: 20 69 66 20 28 61 73 79 6e 63 29 20 7b 0a 09 53   if (async) {..S
cff0: 45 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  ET_BITS(statePtr
d000: 2d 3e 66 6c 61 67 73 2c 20 54 43 50 5f 41 53 59  ->flags, TCP_ASY
d010: 4e 43 5f 43 4f 4e 4e 45 43 54 29 3b 0a 20 20 20  NC_CONNECT);.   
d020: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
d030: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
d040: 6c 69 65 6e 74 20 73 6f 63 6b 65 74 20 61 6e 64  lient socket and
d050: 20 77 72 61 70 20 69 74 20 69 6e 20 61 20 63 68   wrap it in a ch
d060: 61 6e 6e 65 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20  annel..     */. 
d070: 20 20 20 69 66 20 28 54 63 70 43 6f 6e 6e 65 63     if (TcpConnec
d080: 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  t(interp, stateP
d090: 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  tr) != TCL_OK) {
d0a0: 0a 09 54 63 70 43 6c 6f 73 65 50 72 6f 63 28 73  ..TcpCloseProc(s
d0b0: 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a  tatePtr, NULL);.
d0c0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d0d0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 57 69 6e 47    }..    TclWinG
d0e0: 65 6e 65 72 61 74 65 43 68 61 6e 6e 65 6c 4e 61  enerateChannelNa
d0f0: 6d 65 28 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20  me(channelName, 
d100: 22 73 6f 63 6b 22 2c 20 73 74 61 74 65 50 74 72  "sock", statePtr
d110: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  );.    statePtr-
d120: 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43  >channel = Tcl_C
d130: 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 74 63  reateChannel(&tc
d140: 70 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 63 68  pChannelType, ch
d150: 61 6e 6e 65 6c 4e 61 6d 65 2c 0a 09 20 20 20 20  annelName,..    
d160: 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52  statePtr, (TCL_R
d170: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
d180: 49 54 41 42 4c 45 29 29 3b 0a 20 20 20 20 69 66  ITABLE));.    if
d190: 20 28 54 43 4c 5f 45 52 52 4f 52 20 3d 3d 20 54   (TCL_ERROR == T
d1a0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
d1b0: 69 6f 6e 28 4e 55 4c 4c 2c 20 73 74 61 74 65 50  ion(NULL, stateP
d1c0: 74 72 2d 3e 63 68 61 6e 6e 65 6c 2c 0a 09 20 20  tr->channel,..  
d1d0: 20 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22    "-translation"
d1e0: 2c 20 22 61 75 74 6f 20 63 72 6c 66 22 29 29 20  , "auto crlf")) 
d1f0: 7b 0a 09 54 63 6c 5f 43 6c 6f 73 65 45 78 28 4e  {..Tcl_CloseEx(N
d200: 55 4c 4c 2c 20 73 74 61 74 65 50 74 72 2d 3e 63  ULL, statePtr->c
d210: 68 61 6e 6e 65 6c 2c 20 30 29 3b 0a 09 72 65 74  hannel, 0);..ret
d220: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20  urn NULL;.    } 
d230: 65 6c 73 65 20 69 66 20 28 54 43 4c 5f 45 52 52  else if (TCL_ERR
d240: 4f 52 20 3d 3d 20 54 63 6c 5f 53 65 74 43 68 61  OR == Tcl_SetCha
d250: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 4e 55 4c 4c 2c  nnelOption(NULL,
d260: 20 73 74 61 74 65 50 74 72 2d 3e 63 68 61 6e 6e   statePtr->chann
d270: 65 6c 2c 0a 09 20 20 20 20 22 2d 65 6f 66 63 68  el,..    "-eofch
d280: 61 72 22 2c 20 22 22 29 29 20 7b 0a 09 54 63 6c  ar", "")) {..Tcl
d290: 5f 43 6c 6f 73 65 45 78 28 4e 55 4c 4c 2c 20 73  _CloseEx(NULL, s
d2a0: 74 61 74 65 50 74 72 2d 3e 63 68 61 6e 6e 65 6c  tatePtr->channel
d2b0: 2c 20 30 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  , 0);..return NU
d2c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
d2d0: 74 75 72 6e 20 73 74 61 74 65 50 74 72 2d 3e 63  turn statePtr->c
d2e0: 68 61 6e 6e 65 6c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  hannel;.}.../*. 
d2f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
d300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d330: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63  -------. *. * Tc
d340: 6c 5f 4d 61 6b 65 54 63 70 43 6c 69 65 6e 74 43  l_MakeTcpClientC
d350: 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09  hannel --. *. *.
d360: 43 72 65 61 74 65 73 20 61 20 54 63 6c 5f 43 68  Creates a Tcl_Ch
d370: 61 6e 6e 65 6c 20 66 72 6f 6d 20 61 6e 20 65 78  annel from an ex
d380: 69 73 74 69 6e 67 20 63 6c 69 65 6e 74 20 54 43  isting client TC
d390: 50 20 73 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a 20  P socket.. *. * 
d3a0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20  Results:. *.The 
d3b0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 77 72 61 70  Tcl_Channel wrap
d3c0: 70 65 64 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ped around the p
d3d0: 72 65 65 78 69 73 74 69 6e 67 20 54 43 50 20 73  reexisting TCP s
d3e0: 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  ocket.. *. * Sid
d3f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
d400: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
d410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d450: 20 2a 2f 0a 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c   */..Tcl_Channel
d460: 0a 54 63 6c 5f 4d 61 6b 65 54 63 70 43 6c 69 65  .Tcl_MakeTcpClie
d470: 6e 74 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 76  ntChannel(.    v
d480: 6f 69 64 20 2a 73 6f 63 6b 29 09 09 09 2f 2a 20  oid *sock).../* 
d490: 54 68 65 20 73 6f 63 6b 65 74 20 74 6f 20 77 72  The socket to wr
d4a0: 61 70 20 75 70 20 69 6e 74 6f 20 61 20 63 68 61  ap up into a cha
d4b0: 6e 6e 65 6c 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54  nnel. */.{.    T
d4c0: 63 6c 49 6e 69 74 53 6f 63 6b 65 74 73 28 29 3b  clInitSockets();
d4d0: 0a 0a 20 20 20 20 54 68 72 65 61 64 53 70 65 63  ..    ThreadSpec
d4e0: 69 66 69 63 44 61 74 61 20 2a 74 73 64 50 74 72  ificData *tsdPtr
d4f0: 20 3d 20 28 54 68 72 65 61 64 53 70 65 63 69 66   = (ThreadSpecif
d500: 69 63 44 61 74 61 20 2a 29 0a 09 20 20 20 20 54  icData *)..    T
d510: 63 6c 54 68 72 65 61 64 44 61 74 61 4b 65 79 47  clThreadDataKeyG
d520: 65 74 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 20  et(&dataKey);.. 
d530: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 74     /*.     * Set
d540: 20 6b 65 72 6e 65 6c 20 73 70 61 63 65 20 62 75   kernel space bu
d550: 66 66 65 72 69 6e 67 20 61 6e 64 20 6e 6f 6e 2d  ffering and non-
d560: 62 6c 6f 63 6b 69 6e 67 2e 0a 20 20 20 20 20 2a  blocking..     *
d570: 2f 0a 0a 20 20 20 20 54 63 6c 53 6f 63 6b 4d 69  /..    TclSockMi
d580: 6e 69 6d 75 6d 42 75 66 66 65 72 73 28 73 6f 63  nimumBuffers(soc
d590: 6b 2c 20 54 43 50 5f 42 55 46 46 45 52 5f 53 49  k, TCP_BUFFER_SI
d5a0: 5a 45 29 3b 0a 0a 20 20 20 20 54 63 70 53 74 61  ZE);..    TcpSta
d5b0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 4e  te *statePtr = N
d5c0: 65 77 53 6f 63 6b 65 74 49 6e 66 6f 28 28 53 4f  ewSocketInfo((SO
d5d0: 43 4b 45 54 29 20 73 6f 63 6b 29 3b 0a 0a 20 20  CKET) sock);..  
d5e0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 74 61 72    /*.     * Star
d5f0: 74 20 77 61 74 63 68 69 6e 67 20 66 6f 72 20 72  t watching for r
d600: 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e 74 73  ead/write events
d610: 20 6f 6e 20 74 68 65 20 73 6f 63 6b 65 74 2e 0a   on the socket..
d620: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61       */..    sta
d630: 74 65 50 74 72 2d 3e 73 65 6c 65 63 74 45 76 65  tePtr->selectEve
d640: 6e 74 73 20 3d 20 46 44 5f 52 45 41 44 20 7c 20  nts = FD_READ | 
d650: 46 44 5f 43 4c 4f 53 45 20 7c 20 46 44 5f 57 52  FD_CLOSE | FD_WR
d660: 49 54 45 3b 0a 20 20 20 20 53 65 6e 64 53 65 6c  ITE;.    SendSel
d670: 65 63 74 4d 65 73 73 61 67 65 28 74 73 64 50 74  ectMessage(tsdPt
d680: 72 2c 20 53 45 4c 45 43 54 2c 20 73 74 61 74 65  r, SELECT, state
d690: 50 74 72 29 3b 0a 0a 20 20 20 20 63 68 61 72 20  Ptr);..    char 
d6a0: 63 68 61 6e 6e 65 6c 4e 61 6d 65 5b 53 4f 43 4b  channelName[SOCK
d6b0: 5f 43 48 41 4e 5f 4c 45 4e 47 54 48 5d 3b 0a 20  _CHAN_LENGTH];. 
d6c0: 20 20 20 54 63 6c 57 69 6e 47 65 6e 65 72 61 74     TclWinGenerat
d6d0: 65 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  eChannelName(cha
d6e0: 6e 6e 65 6c 4e 61 6d 65 2c 20 22 73 6f 63 6b 22  nnelName, "sock"
d6f0: 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  , statePtr);.   
d700: 20 73 74 61 74 65 50 74 72 2d 3e 63 68 61 6e 6e   statePtr->chann
d710: 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43  el = Tcl_CreateC
d720: 68 61 6e 6e 65 6c 28 26 74 63 70 43 68 61 6e 6e  hannel(&tcpChann
d730: 65 6c 54 79 70 65 2c 20 63 68 61 6e 6e 65 6c 4e  elType, channelN
d740: 61 6d 65 2c 0a 09 20 20 20 20 73 74 61 74 65 50  ame,..    stateP
d750: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c  tr, (TCL_READABL
d760: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  E | TCL_WRITABLE
d770: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
d780: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 4e 55 4c  hannelOption(NUL
d790: 4c 2c 20 73 74 61 74 65 50 74 72 2d 3e 63 68 61  L, statePtr->cha
d7a0: 6e 6e 65 6c 2c 20 22 2d 74 72 61 6e 73 6c 61 74  nnel, "-translat
d7b0: 69 6f 6e 22 2c 20 22 61 75 74 6f 20 63 72 6c 66  ion", "auto crlf
d7c0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  ");.    return s
d7d0: 74 61 74 65 50 74 72 2d 3e 63 68 61 6e 6e 65 6c  tatePtr->channel
d7e0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
d7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d830: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 4f 70 65 6e  -. *. * Tcl_Open
d840: 54 63 70 53 65 72 76 65 72 45 78 20 2d 2d 0a 20  TcpServerEx --. 
d850: 2a 0a 20 2a 09 4f 70 65 6e 73 20 61 20 54 43 50  *. *.Opens a TCP
d860: 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74 20 61   server socket a
d870: 6e 64 20 63 72 65 61 74 65 73 20 61 20 63 68 61  nd creates a cha
d880: 6e 6e 65 6c 20 61 72 6f 75 6e 64 20 69 74 2e 0a  nnel around it..
d890: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
d8a0: 2a 09 54 68 65 20 63 68 61 6e 6e 65 6c 20 6f 72  *.The channel or
d8b0: 20 4e 55 4c 4c 20 69 66 20 66 61 69 6c 65 64 2e   NULL if failed.
d8c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d8d0: 75 72 72 65 64 2c 20 61 6e 20 65 72 72 6f 72 20  urred, an error 
d8e0: 6d 65 73 73 61 67 65 0a 20 2a 09 69 73 20 6c 65  message. *.is le
d8f0: 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70  ft in the interp
d900: 27 73 20 72 65 73 75 6c 74 20 69 66 20 69 6e 74  's result if int
d910: 65 72 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  erp is not NULL.
d920: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
d930: 63 74 73 3a 0a 20 2a 09 4f 70 65 6e 73 20 61 20  cts:. *.Opens a 
d940: 73 65 72 76 65 72 20 73 6f 63 6b 65 74 20 61 6e  server socket an
d950: 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  d creates a new 
d960: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
d970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 43 68  ----. */..Tcl_Ch
d9c0: 61 6e 6e 65 6c 0a 54 63 6c 5f 4f 70 65 6e 54 63  annel.Tcl_OpenTc
d9d0: 70 53 65 72 76 65 72 45 78 28 0a 20 20 20 20 54  pServerEx(.    T
d9e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
d9f0: 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72  p,../* For error
da00: 20 72 65 70 6f 72 74 69 6e 67 20 2d 20 6d 61 79   reporting - may
da10: 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20   be NULL. */.   
da20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
da30: 76 69 63 65 2c 09 2f 2a 20 50 6f 72 74 20 6e 75  vice,./* Port nu
da40: 6d 62 65 72 20 74 6f 20 6f 70 65 6e 2e 20 2a 2f  mber to open. */
da50: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
da60: 2a 6d 79 48 6f 73 74 2c 09 09 2f 2a 20 4e 61 6d  *myHost,../* Nam
da70: 65 20 6f 66 20 6c 6f 63 61 6c 20 68 6f 73 74 2e  e of local host.
da80: 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
da90: 20 69 6e 74 20 66 6c 61 67 73 2c 09 09 2f 2a 20   int flags,../* 
daa0: 46 6c 61 67 73 2e 20 2a 2f 0a 20 20 20 20 69 6e  Flags. */.    in
dab0: 74 20 62 61 63 6b 6c 6f 67 2c 09 09 2f 2a 20 4c  t backlog,../* L
dac0: 65 6e 67 74 68 20 6f 66 20 4f 53 20 6c 69 73 74  ength of OS list
dad0: 65 6e 20 62 61 63 6b 6c 6f 67 20 71 75 65 75 65  en backlog queue
dae0: 2c 20 6f 72 20 2d 31 0a 09 09 09 09 20 2a 20 66  , or -1..... * f
daf0: 6f 72 20 64 65 66 61 75 6c 74 2e 20 2a 2f 0a 20  or default. */. 
db00: 20 20 20 54 63 6c 5f 54 63 70 41 63 63 65 70 74     Tcl_TcpAccept
db10: 50 72 6f 63 20 2a 61 63 63 65 70 74 50 72 6f 63  Proc *acceptProc
db20: 2c 0a 09 09 09 09 2f 2a 20 43 61 6c 6c 62 61 63  ,...../* Callbac
db30: 6b 20 66 6f 72 20 61 63 63 65 70 74 69 6e 67 20  k for accepting 
db40: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
db50: 20 6e 65 77 0a 09 09 09 09 20 2a 20 63 6c 69 65   new..... * clie
db60: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  nts. */.    void
db70: 20 2a 61 63 63 65 70 74 50 72 6f 63 44 61 74 61   *acceptProcData
db80: 29 09 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68  )./* Data for th
db90: 65 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 7b  e callback. */.{
dba0: 0a 20 20 20 20 53 4f 43 4b 45 54 20 73 6f 63 6b  .    SOCKET sock
dbb0: 20 3d 20 49 4e 56 41 4c 49 44 5f 53 4f 43 4b 45   = INVALID_SOCKE
dbc0: 54 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  T;.    unsigned 
dbd0: 73 68 6f 72 74 20 63 68 6f 73 65 6e 70 6f 72 74  short chosenport
dbe0: 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
dbf0: 20 61 64 64 72 69 6e 66 6f 20 2a 61 64 64 72 6c   addrinfo *addrl
dc00: 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ist = NULL;.    
dc10: 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20  struct addrinfo 
dc20: 2a 61 64 64 72 50 74 72 3b 09 2f 2a 20 53 6f 63  *addrPtr;./* Soc
dc30: 6b 65 74 20 61 64 64 72 65 73 73 20 74 6f 20 6c  ket address to l
dc40: 69 73 74 65 6e 20 6f 6e 2e 20 2a 2f 0a 20 20 20  isten on. */.   
dc50: 20 54 63 70 53 74 61 74 65 20 2a 73 74 61 74 65   TcpState *state
dc60: 50 74 72 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 54  Ptr = NULL;./* T
dc70: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
dc80: 65 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  e. */.    char c
dc90: 68 61 6e 6e 65 6c 4e 61 6d 65 5b 53 4f 43 4b 5f  hannelName[SOCK_
dca0: 43 48 41 4e 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20  CHAN_LENGTH];.  
dcb0: 20 20 75 5f 6c 6f 6e 67 20 66 6c 61 67 20 3d 20    u_long flag = 
dcc0: 31 3b 09 09 2f 2a 20 49 6e 64 69 63 61 74 65 73  1;../* Indicates
dcd0: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64   nonblocking mod
dce0: 65 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  e. */.    const 
dcf0: 63 68 61 72 20 2a 65 72 72 6f 72 4d 73 67 20 3d  char *errorMsg =
dd00: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6f   NULL;.    int o
dd10: 70 74 76 61 6c 75 65 2c 20 70 6f 72 74 3b 0a 0a  ptvalue, port;..
dd20: 20 20 20 20 54 63 6c 49 6e 69 74 53 6f 63 6b 65      TclInitSocke
dd30: 74 73 28 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ts();..    /*.  
dd40: 20 20 20 2a 20 43 6f 6e 73 74 72 75 63 74 20 74     * Construct t
dd50: 68 65 20 61 64 64 72 65 73 73 65 73 20 66 6f 72  he addresses for
dd60: 20 65 61 63 68 20 65 6e 64 20 6f 66 20 74 68 65   each end of the
dd70: 20 73 6f 63 6b 65 74 2e 0a 20 20 20 20 20 2a 2f   socket..     */
dd80: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 53 6f 63  ..    if (TclSoc
dd90: 6b 47 65 74 50 6f 72 74 28 69 6e 74 65 72 70 2c  kGetPort(interp,
dda0: 20 73 65 72 76 69 63 65 2c 20 22 74 63 70 22 2c   service, "tcp",
ddb0: 20 26 70 6f 72 74 29 20 21 3d 20 54 43 4c 5f 4f   &port) != TCL_O
ddc0: 4b 29 20 7b 0a 09 65 72 72 6f 72 4d 73 67 20 3d  K) {..errorMsg =
ddd0: 20 22 69 6e 76 61 6c 69 64 20 70 6f 72 74 20 6e   "invalid port n
dde0: 75 6d 62 65 72 22 3b 0a 09 67 6f 74 6f 20 65 72  umber";..goto er
ddf0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ror;.    }..    
de00: 69 66 20 28 21 54 63 6c 43 72 65 61 74 65 53 6f  if (!TclCreateSo
de10: 63 6b 65 74 41 64 64 72 65 73 73 28 69 6e 74 65  cketAddress(inte
de20: 72 70 2c 20 26 61 64 64 72 6c 69 73 74 2c 20 6d  rp, &addrlist, m
de30: 79 48 6f 73 74 2c 20 70 6f 72 74 2c 20 31 2c 0a  yHost, port, 1,.
de40: 09 20 20 20 20 26 65 72 72 6f 72 4d 73 67 29 29  .    &errorMsg))
de50: 20 7b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a   {..goto error;.
de60: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28      }..    for (
de70: 61 64 64 72 50 74 72 20 3d 20 61 64 64 72 6c 69  addrPtr = addrli
de80: 73 74 3b 20 61 64 64 72 50 74 72 20 21 3d 20 4e  st; addrPtr != N
de90: 55 4c 4c 3b 20 61 64 64 72 50 74 72 20 3d 20 61  ULL; addrPtr = a
dea0: 64 64 72 50 74 72 2d 3e 61 69 5f 6e 65 78 74 29  ddrPtr->ai_next)
deb0: 20 7b 0a 09 73 6f 63 6b 20 3d 20 73 6f 63 6b 65   {..sock = socke
dec0: 74 28 61 64 64 72 50 74 72 2d 3e 61 69 5f 66 61  t(addrPtr->ai_fa
ded0: 6d 69 6c 79 2c 20 61 64 64 72 50 74 72 2d 3e 61  mily, addrPtr->a
dee0: 69 5f 73 6f 63 6b 74 79 70 65 2c 0a 09 09 61 64  i_socktype,...ad
def0: 64 72 50 74 72 2d 3e 61 69 5f 70 72 6f 74 6f 63  drPtr->ai_protoc
df00: 6f 6c 29 3b 0a 09 69 66 20 28 73 6f 63 6b 20 3d  ol);..if (sock =
df10: 3d 20 49 4e 56 41 4c 49 44 5f 53 4f 43 4b 45 54  = INVALID_SOCKET
df20: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 57 69 6e  ) {..    Tcl_Win
df30: 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 28 44 57  ConvertError((DW
df40: 4f 52 44 29 20 57 53 41 47 65 74 4c 61 73 74 45  ORD) WSAGetLastE
df50: 72 72 6f 72 28 29 29 3b 0a 09 20 20 20 20 63 6f  rror());..    co
df60: 6e 74 69 6e 75 65 3b 0a 09 7d 0a 0a 09 2f 2a 0a  ntinue;..}.../*.
df70: 09 20 2a 20 57 69 6e 2d 4e 54 20 68 61 73 20 61  . * Win-NT has a
df80: 20 6d 69 73 66 65 61 74 75 72 65 20 74 68 61 74   misfeature that
df90: 20 73 6f 63 6b 65 74 73 20 61 72 65 20 69 6e 68   sockets are inh
dfa0: 65 72 69 74 65 64 20 69 6e 20 63 68 69 6c 64 0a  erited in child.
dfb0: 09 20 2a 20 70 72 6f 63 65 73 73 65 73 20 62 79  . * processes by
dfc0: 20 64 65 66 61 75 6c 74 2e 20 54 75 72 6e 20 6f   default. Turn o
dfd0: 66 66 20 74 68 65 20 69 6e 68 65 72 69 74 20 62  ff the inherit b
dfe0: 69 74 2e 0a 09 20 2a 2f 0a 0a 09 53 65 74 48 61  it... */...SetHa
dff0: 6e 64 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 28  ndleInformation(
e000: 28 48 41 4e 44 4c 45 29 20 73 6f 63 6b 2c 20 48  (HANDLE) sock, H
e010: 41 4e 44 4c 45 5f 46 4c 41 47 5f 49 4e 48 45 52  ANDLE_FLAG_INHER
e020: 49 54 2c 20 30 29 3b 0a 0a 09 2f 2a 0a 09 20 2a  IT, 0);.../*.. *
e030: 20 53 65 74 20 6b 65 72 6e 65 6c 20 73 70 61 63   Set kernel spac
e040: 65 20 62 75 66 66 65 72 69 6e 67 0a 09 20 2a 2f  e buffering.. */
e050: 0a 0a 09 54 63 6c 53 6f 63 6b 4d 69 6e 69 6d 75  ...TclSockMinimu
e060: 6d 42 75 66 66 65 72 73 28 28 76 6f 69 64 20 2a  mBuffers((void *
e070: 29 73 6f 63 6b 2c 20 54 43 50 5f 42 55 46 46 45  )sock, TCP_BUFFE
e080: 52 5f 53 49 5a 45 29 3b 0a 0a 09 2f 2a 0a 09 20  R_SIZE);.../*.. 
e090: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 75  * Make sure we u
e0a0: 73 65 20 74 68 65 20 73 61 6d 65 20 70 6f 72 74  se the same port
e0b0: 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 77   when opening tw
e0c0: 6f 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74 73  o server sockets
e0d0: 0a 09 20 2a 20 66 6f 72 20 49 50 76 34 20 61 6e  .. * for IPv4 an
e0e0: 64 20 49 50 76 36 2e 0a 09 20 2a 0a 09 20 2a 20  d IPv6... *.. * 
e0f0: 41 73 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20  As sockaddr_in6 
e100: 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 6f 66  uses the same of
e110: 66 73 65 74 20 61 6e 64 20 73 69 7a 65 20 66 6f  fset and size fo
e120: 72 20 74 68 65 20 70 6f 72 74 0a 09 20 2a 20 6d  r the port.. * m
e130: 65 6d 62 65 72 20 61 73 20 73 6f 63 6b 61 64 64  ember as sockadd
e140: 72 5f 69 6e 2c 20 77 65 20 63 61 6e 20 68 61 6e  r_in, we can han
e150: 64 6c 65 20 62 6f 74 68 20 74 68 72 6f 75 67 68  dle both through
e160: 20 74 68 65 20 49 50 76 34 20 41 50 49 2e 0a 09   the IPv4 API...
e170: 20 2a 2f 0a 0a 09 69 66 20 28 70 6f 72 74 20 3d   */...if (port =
e180: 3d 20 30 20 26 26 20 63 68 6f 73 65 6e 70 6f 72  = 0 && chosenpor
e190: 74 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 28  t != 0) {..    (
e1a0: 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  (struct sockaddr
e1b0: 5f 69 6e 20 2a 29 20 61 64 64 72 50 74 72 2d 3e  _in *) addrPtr->
e1c0: 61 69 5f 61 64 64 72 29 2d 3e 73 69 6e 5f 70 6f  ai_addr)->sin_po
e1d0: 72 74 20 3d 0a 09 09 68 74 6f 6e 73 28 63 68 6f  rt =...htons(cho
e1e0: 73 65 6e 70 6f 72 74 29 3b 0a 09 7d 0a 0a 09 2f  senport);..}.../
e1f0: 2a 0a 09 20 2a 20 54 68 65 20 53 4f 5f 52 45 55  *.. * The SO_REU
e200: 53 45 41 44 44 52 20 6f 70 74 69 6f 6e 20 6f 6e  SEADDR option on
e210: 20 57 69 6e 64 6f 77 73 20 62 65 68 61 76 65 73   Windows behaves
e220: 20 6c 69 6b 65 20 53 4f 5f 52 45 55 53 45 50 4f   like SO_REUSEPO
e230: 52 54 20 6f 6e 0a 09 20 2a 20 75 6e 69 78 20 73  RT on.. * unix s
e240: 79 73 74 65 6d 73 2e 0a 09 20 2a 2f 0a 0a 09 69  ystems... */...i
e250: 66 20 28 47 4f 54 5f 42 49 54 53 28 66 6c 61 67  f (GOT_BITS(flag
e260: 73 2c 20 54 43 4c 5f 54 43 50 53 45 52 56 45 52  s, TCL_TCPSERVER
e270: 5f 52 45 55 53 45 50 4f 52 54 29 29 20 7b 0a 09  _REUSEPORT)) {..
e280: 20 20 20 20 6f 70 74 76 61 6c 75 65 20 3d 20 31      optvalue = 1
e290: 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 65  ;..    (void) se
e2a0: 74 73 6f 63 6b 6f 70 74 28 73 6f 63 6b 2c 20 53  tsockopt(sock, S
e2b0: 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f 5f 52 45  OL_SOCKET, SO_RE
e2c0: 55 53 45 41 44 44 52 2c 0a 09 09 20 20 20 20 28  USEADDR,...    (
e2d0: 63 68 61 72 20 2a 29 20 26 6f 70 74 76 61 6c 75  char *) &optvalu
e2e0: 65 2c 20 73 69 7a 65 6f 66 28 6f 70 74 76 61 6c  e, sizeof(optval
e2f0: 75 65 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  ue));..}.../*.. 
e300: 2a 20 42 69 6e 64 20 74 6f 20 74 68 65 20 73 70  * Bind to the sp
e310: 65 63 69 66 69 65 64 20 70 6f 72 74 2e 0a 09 20  ecified port... 
e320: 2a 0a 09 20 2a 20 42 69 6e 64 20 73 68 6f 75 6c  *.. * Bind shoul
e330: 64 20 6e 6f 74 20 62 65 20 61 66 66 65 63 74 65  d not be affecte
e340: 64 20 62 79 20 74 68 65 20 73 6f 63 6b 65 74 20  d by the socket 
e350: 68 61 76 69 6e 67 20 61 6c 72 65 61 64 79 20 62  having already b
e360: 65 65 6e 0a 09 20 2a 20 73 65 74 20 69 6e 74 6f  een.. * set into
e370: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64   nonblocking mod
e380: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 74  e. If there is t
e390: 72 6f 75 62 6c 65 2c 20 74 68 69 73 20 69 73 20  rouble, this is 
e3a0: 6f 6e 65 0a 09 20 2a 20 70 6c 61 63 65 20 74 6f  one.. * place to
e3b0: 20 6c 6f 6f 6b 20 66 6f 72 20 62 75 67 73 2e 0a   look for bugs..
e3c0: 09 20 2a 2f 0a 0a 09 69 66 20 28 62 69 6e 64 28  . */...if (bind(
e3d0: 73 6f 63 6b 2c 20 61 64 64 72 50 74 72 2d 3e 61  sock, addrPtr->a
e3e0: 69 5f 61 64 64 72 2c 0a 09 09 28 73 6f 63 6b 6c  i_addr,...(sockl
e3f0: 65 6e 5f 74 29 61 64 64 72 50 74 72 2d 3e 61 69  en_t)addrPtr->ai
e400: 5f 61 64 64 72 6c 65 6e 29 20 3d 3d 20 53 4f 43  _addrlen) == SOC
e410: 4b 45 54 5f 45 52 52 4f 52 29 20 7b 0a 09 20 20  KET_ERROR) {..  
e420: 20 20 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74    Tcl_WinConvert
e430: 45 72 72 6f 72 28 28 44 57 4f 52 44 29 20 57 53  Error((DWORD) WS
e440: 41 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  AGetLastError())
e450: 3b 0a 09 20 20 20 20 63 6c 6f 73 65 73 6f 63 6b  ;..    closesock
e460: 65 74 28 73 6f 63 6b 29 3b 0a 09 20 20 20 20 63  et(sock);..    c
e470: 6f 6e 74 69 6e 75 65 3b 0a 09 7d 0a 09 69 66 20  ontinue;..}..if 
e480: 28 70 6f 72 74 20 3d 3d 20 30 20 26 26 20 63 68  (port == 0 && ch
e490: 6f 73 65 6e 70 6f 72 74 20 3d 3d 20 30 29 20 7b  osenport == 0) {
e4a0: 0a 09 20 20 20 20 61 64 64 72 65 73 73 20 73 6f  ..    address so
e4b0: 63 6b 6e 61 6d 65 3b 0a 09 20 20 20 20 73 6f 63  ckname;..    soc
e4c0: 6b 6c 65 6e 5f 74 20 6e 61 6d 65 6c 65 6e 20 3d  klen_t namelen =
e4d0: 20 73 69 7a 65 6f 66 28 73 6f 63 6b 6e 61 6d 65   sizeof(sockname
e4e0: 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  );...    /*..   
e4f0: 20 20 2a 20 53 79 6e 63 68 72 6f 6e 69 7a 65 20    * Synchronize 
e500: 70 6f 72 74 20 6e 75 6d 62 65 72 73 20 77 68 65  port numbers whe
e510: 6e 20 62 69 6e 64 69 6e 67 20 74 6f 20 70 6f 72  n binding to por
e520: 74 20 30 20 6f 66 20 6d 75 6c 74 69 70 6c 65 0a  t 0 of multiple.
e530: 09 20 20 20 20 20 2a 20 61 64 64 72 65 73 73 65  .     * addresse
e540: 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  s...     */...  
e550: 20 20 69 66 20 28 67 65 74 73 6f 63 6b 6e 61 6d    if (getsocknam
e560: 65 28 73 6f 63 6b 2c 20 26 73 6f 63 6b 6e 61 6d  e(sock, &socknam
e570: 65 2e 73 61 2c 20 26 6e 61 6d 65 6c 65 6e 29 20  e.sa, &namelen) 
e580: 3e 3d 20 30 29 20 7b 0a 09 09 63 68 6f 73 65 6e  >= 0) {...chosen
e590: 70 6f 72 74 20 3d 20 6e 74 6f 68 73 28 73 6f 63  port = ntohs(soc
e5a0: 6b 6e 61 6d 65 2e 73 61 34 2e 73 69 6e 5f 70 6f  kname.sa4.sin_po
e5b0: 72 74 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  rt);..    }..}..
e5c0: 09 2f 2a 0a 09 20 2a 20 53 65 74 20 74 68 65 20  ./*.. * Set the 
e5d0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
e5e0: 66 20 70 65 6e 64 69 6e 67 20 63 6f 6e 6e 65 63  f pending connec
e5f0: 74 20 72 65 71 75 65 73 74 73 20 74 6f 20 74 68  t requests to th
e600: 65 20 6d 61 78 0a 09 20 2a 20 76 61 6c 75 65 20  e max.. * value 
e610: 61 6c 6c 6f 77 65 64 20 6f 6e 20 65 61 63 68 20  allowed on each 
e620: 70 6c 61 74 66 6f 72 6d 20 28 57 69 6e 33 32 20  platform (Win32 
e630: 61 6e 64 20 57 69 6e 33 32 73 20 6d 61 79 20 62  and Win32s may b
e640: 65 0a 09 20 2a 20 64 69 66 66 65 72 65 6e 74 2c  e.. * different,
e650: 20 61 6e 64 20 74 68 65 72 65 20 6d 61 79 20 62   and there may b
e660: 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 62 65  e differences be
e670: 74 77 65 65 6e 20 54 43 50 2f 49 50 20 73 74 61  tween TCP/IP sta
e680: 63 6b 73 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  cks)... */...if 
e690: 28 62 61 63 6b 6c 6f 67 20 3c 20 30 29 20 7b 0a  (backlog < 0) {.
e6a0: 09 20 20 20 20 62 61 63 6b 6c 6f 67 20 3d 20 53  .    backlog = S
e6b0: 4f 4d 41 58 43 4f 4e 4e 3b 0a 09 7d 0a 09 69 66  OMAXCONN;..}..if
e6c0: 20 28 6c 69 73 74 65 6e 28 73 6f 63 6b 2c 20 62   (listen(sock, b
e6d0: 61 63 6b 6c 6f 67 29 20 3d 3d 20 53 4f 43 4b 45  acklog) == SOCKE
e6e0: 54 5f 45 52 52 4f 52 29 20 7b 0a 09 20 20 20 20  T_ERROR) {..    
e6f0: 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72  Tcl_WinConvertEr
e700: 72 6f 72 28 28 44 57 4f 52 44 29 20 57 53 41 47  ror((DWORD) WSAG
e710: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  etLastError());.
e720: 09 20 20 20 20 63 6c 6f 73 65 73 6f 63 6b 65 74  .    closesocket
e730: 28 73 6f 63 6b 29 3b 0a 09 20 20 20 20 63 6f 6e  (sock);..    con
e740: 74 69 6e 75 65 3b 0a 09 7d 0a 0a 09 69 66 20 28  tinue;..}...if (
e750: 73 74 61 74 65 50 74 72 20 3d 3d 20 4e 55 4c 4c  statePtr == NULL
e760: 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  ) {..    /*..   
e770: 20 20 2a 20 41 64 64 20 74 68 69 73 20 73 6f 63    * Add this soc
e780: 6b 65 74 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ket to the globa
e790: 6c 20 6c 69 73 74 20 6f 66 20 73 6f 63 6b 65 74  l list of socket
e7a0: 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  s...     */...  
e7b0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 4e 65 77    statePtr = New
e7c0: 53 6f 63 6b 65 74 49 6e 66 6f 28 73 6f 63 6b 29  SocketInfo(sock)
e7d0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
e7e0: 20 41 64 64 53 6f 63 6b 65 74 49 6e 66 6f 46 64   AddSocketInfoFd
e7f0: 28 73 74 61 74 65 50 74 72 2c 20 73 6f 63 6b 29  (statePtr, sock)
e800: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 65 72  ;..}.    }..  er
e810: 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 61 64 64  ror:.    if (add
e820: 72 6c 69 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  rlist != NULL) {
e830: 0a 09 66 72 65 65 61 64 64 72 69 6e 66 6f 28 61  ..freeaddrinfo(a
e840: 64 64 72 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  ddrlist);.    }.
e850: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
e860: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 68  r != NULL) {..Th
e870: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
e880: 20 2a 74 73 64 50 74 72 20 3d 20 28 54 68 72 65   *tsdPtr = (Thre
e890: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a  adSpecificData *
e8a0: 29 0a 09 09 54 63 6c 54 68 72 65 61 64 44 61 74  )...TclThreadDat
e8b0: 61 4b 65 79 47 65 74 28 26 64 61 74 61 4b 65 79  aKeyGet(&dataKey
e8c0: 29 3b 0a 0a 09 73 74 61 74 65 50 74 72 2d 3e 61  );...statePtr->a
e8d0: 63 63 65 70 74 50 72 6f 63 20 3d 20 61 63 63 65  cceptProc = acce
e8e0: 70 74 50 72 6f 63 3b 0a 09 73 74 61 74 65 50 74  ptProc;..statePt
e8f0: 72 2d 3e 61 63 63 65 70 74 50 72 6f 63 44 61 74  r->acceptProcDat
e900: 61 20 3d 20 61 63 63 65 70 74 50 72 6f 63 44 61  a = acceptProcDa
e910: 74 61 3b 0a 09 54 63 6c 57 69 6e 47 65 6e 65 72  ta;..TclWinGener
e920: 61 74 65 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  ateChannelName(c
e930: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 22 73 6f 63  hannelName, "soc
e940: 6b 22 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 09  k", statePtr);..
e950: 73 74 61 74 65 50 74 72 2d 3e 63 68 61 6e 6e 65  statePtr->channe
e960: 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68  l = Tcl_CreateCh
e970: 61 6e 6e 65 6c 28 26 74 63 70 43 68 61 6e 6e 65  annel(&tcpChanne
e980: 6c 54 79 70 65 2c 20 63 68 61 6e 6e 65 6c 4e 61  lType, channelNa
e990: 6d 65 2c 0a 09 09 73 74 61 74 65 50 74 72 2c 20  me,...statePtr, 
e9a0: 30 29 3b 0a 09 2f 2a 0a 09 20 2a 20 53 65 74 20  0);../*.. * Set 
e9b0: 75 70 20 74 68 65 20 73 65 6c 65 63 74 20 6d 61  up the select ma
e9c0: 73 6b 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  sk for connectio
e9d0: 6e 20 72 65 71 75 65 73 74 20 65 76 65 6e 74 73  n request events
e9e0: 2e 0a 09 20 2a 2f 0a 0a 09 73 74 61 74 65 50 74  ... */...statePt
e9f0: 72 2d 3e 73 65 6c 65 63 74 45 76 65 6e 74 73 20  r->selectEvents 
ea00: 3d 20 46 44 5f 41 43 43 45 50 54 3b 0a 0a 09 2f  = FD_ACCEPT;.../
ea10: 2a 0a 09 20 2a 20 52 65 67 69 73 74 65 72 20 66  *.. * Register f
ea20: 6f 72 20 69 6e 74 65 72 65 73 74 20 69 6e 20 65  or interest in e
ea30: 76 65 6e 74 73 20 69 6e 20 74 68 65 20 73 65 6c  vents in the sel
ea40: 65 63 74 20 6d 61 73 6b 2e 20 4e 6f 74 65 20 74  ect mask. Note t
ea50: 68 61 74 20 74 68 69 73 0a 09 20 2a 20 61 75 74  hat this.. * aut
ea60: 6f 6d 61 74 69 63 61 6c 6c 79 20 70 6c 61 63 65  omatically place
ea70: 73 20 74 68 65 20 73 6f 63 6b 65 74 20 69 6e 74  s the socket int
ea80: 6f 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d  o non-blocking m
ea90: 6f 64 65 2e 0a 09 20 2a 2f 0a 0a 09 69 6f 63 74  ode... */...ioct
eaa0: 6c 73 6f 63 6b 65 74 28 73 6f 63 6b 2c 20 28 6c  lsocket(sock, (l
eab0: 6f 6e 67 29 20 46 49 4f 4e 42 49 4f 2c 20 26 66  ong) FIONBIO, &f
eac0: 6c 61 67 29 3b 0a 09 53 65 6e 64 53 65 6c 65 63  lag);..SendSelec
ead0: 74 4d 65 73 73 61 67 65 28 74 73 64 50 74 72 2c  tMessage(tsdPtr,
eae0: 20 53 45 4c 45 43 54 2c 20 73 74 61 74 65 50 74   SELECT, statePt
eaf0: 72 29 3b 0a 09 69 66 20 28 54 63 6c 5f 53 65 74  r);..if (Tcl_Set
eb00: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
eb10: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
eb20: 63 68 61 6e 6e 65 6c 2c 20 22 2d 65 6f 66 63 68  channel, "-eofch
eb30: 61 72 22 2c 20 22 22 29 0a 09 09 3d 3d 20 54 43  ar", "")...== TC
eb40: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 20 20 20 20  L_ERROR) {..    
eb50: 54 63 6c 5f 43 6c 6f 73 65 45 78 28 4e 55 4c 4c  Tcl_CloseEx(NULL
eb60: 2c 20 73 74 61 74 65 50 74 72 2d 3e 63 68 61 6e  , statePtr->chan
eb70: 6e 65 6c 2c 20 30 29 3b 0a 09 20 20 20 20 72 65  nel, 0);..    re
eb80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 72  turn NULL;..}..r
eb90: 65 74 75 72 6e 20 73 74 61 74 65 50 74 72 2d 3e  eturn statePtr->
eba0: 63 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 7d 0a 0a  channel;.    }..
ebb0: 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 21      if (interp !
ebc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 53  = NULL) {..Tcl_S
ebd0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ebe0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  rp, Tcl_ObjPrint
ebf0: 66 28 0a 09 09 22 63 6f 75 6c 64 6e 27 74 20 6f  f(..."couldn't o
ec00: 70 65 6e 20 73 6f 63 6b 65 74 3a 20 25 73 22 2c  pen socket: %s",
ec10: 0a 09 09 28 65 72 72 6f 72 4d 73 67 20 3f 20 65  ...(errorMsg ? e
ec20: 72 72 6f 72 4d 73 67 20 3a 20 54 63 6c 5f 50 6f  rrorMsg : Tcl_Po
ec30: 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29  sixError(interp)
ec40: 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  )));.    }..    
ec50: 69 66 20 28 73 6f 63 6b 20 21 3d 20 49 4e 56 41  if (sock != INVA
ec60: 4c 49 44 5f 53 4f 43 4b 45 54 29 20 7b 0a 09 63  LID_SOCKET) {..c
ec70: 6c 6f 73 65 73 6f 63 6b 65 74 28 73 6f 63 6b 29  losesocket(sock)
ec80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
ec90: 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a  rn NULL;.}.../*.
eca0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
ecb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ece0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
ecf0: 63 70 41 63 63 65 70 74 20 2d 2d 0a 20 2a 09 41  cpAccept --. *.A
ed00: 63 63 65 70 74 20 61 20 54 43 50 20 73 6f 63 6b  ccept a TCP sock
ed10: 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 09 20  et connection.. 
ed20: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62  This is called b
ed30: 79 20 74 68 65 20 65 76 65 6e 74 20 6c 6f 6f 70  y the event loop
ed40: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
ed50: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
ed60: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
ed70: 09 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 63  .Creates a new c
ed80: 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f 63 6b 65 74  onnection socket
ed90: 2e 20 43 61 6c 6c 73 20 74 68 65 20 72 65 67 69  . Calls the regi
eda0: 73 74 65 72 65 64 20 63 61 6c 6c 62 61 63 6b 20  stered callback 
edb0: 66 6f 72 20 74 68 65 0a 20 2a 09 63 6f 6e 6e 65  for the. *.conne
edc0: 63 74 69 6f 6e 20 61 63 63 65 70 74 61 6e 63 65  ction acceptance
edd0: 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 20 2a 0a 20   mechanism.. *. 
ede0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
edf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee20: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
ee30: 74 69 63 20 76 6f 69 64 0a 54 63 70 41 63 63 65  tic void.TcpAcce
ee40: 70 74 28 0a 20 20 20 20 54 63 70 46 64 4c 69 73  pt(.    TcpFdLis
ee50: 74 20 2a 66 64 73 2c 09 09 2f 2a 20 53 65 72 76  t *fds,../* Serv
ee60: 65 72 20 73 6f 63 6b 65 74 20 74 68 61 74 20 61  er socket that a
ee70: 63 63 65 70 74 65 64 20 6e 65 77 53 6f 63 6b 65  ccepted newSocke
ee80: 74 2e 20 2a 2f 0a 20 20 20 20 53 4f 43 4b 45 54  t. */.    SOCKET
ee90: 20 6e 65 77 53 6f 63 6b 65 74 2c 09 09 2f 2a 20   newSocket,../* 
eea0: 4e 65 77 6c 79 20 61 63 63 65 70 74 65 64 20 73  Newly accepted s
eeb0: 6f 63 6b 65 74 2e 20 2a 2f 0a 20 20 20 20 61 64  ocket. */.    ad
eec0: 64 72 65 73 73 20 61 64 64 72 29 09 09 2f 2a 20  dress addr)../* 
eed0: 41 64 64 72 65 73 73 20 6f 66 20 6e 65 77 20 73  Address of new s
eee0: 6f 63 6b 65 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20  ocket. */.{.    
eef0: 54 63 70 53 74 61 74 65 20 2a 6e 65 77 49 6e 66  TcpState *newInf
ef00: 6f 50 74 72 3b 0a 20 20 20 20 54 63 70 53 74 61  oPtr;.    TcpSta
ef10: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 66  te *statePtr = f
ef20: 64 73 2d 3e 73 74 61 74 65 50 74 72 3b 0a 20 20  ds->statePtr;.  
ef30: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 69 7a 65    int len = size
ef40: 6f 66 28 61 64 64 72 29 3b 0a 20 20 20 20 63 68  of(addr);.    ch
ef50: 61 72 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 5b 53  ar channelName[S
ef60: 4f 43 4b 5f 43 48 41 4e 5f 4c 45 4e 47 54 48 5d  OCK_CHAN_LENGTH]
ef70: 3b 0a 20 20 20 20 63 68 61 72 20 68 6f 73 74 5b  ;.    char host[
ef80: 4e 49 5f 4d 41 58 48 4f 53 54 5d 2c 20 70 6f 72  NI_MAXHOST], por
ef90: 74 5b 4e 49 5f 4d 41 58 53 45 52 56 5d 3b 0a 20  t[NI_MAXSERV];. 
efa0: 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69     ThreadSpecifi
efb0: 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20  cData *tsdPtr = 
efc0: 28 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44  (ThreadSpecificD
efd0: 61 74 61 20 2a 29 0a 09 20 20 20 20 54 63 6c 54  ata *)..    TclT
efe0: 68 72 65 61 64 44 61 74 61 4b 65 79 47 65 74 28  hreadDataKeyGet(
eff0: 26 64 61 74 61 4b 65 79 29 3b 0a 0a 20 20 20 20  &dataKey);..    
f000: 2f 2a 0a 20 20 20 20 20 2a 20 57 69 6e 2d 4e 54  /*.     * Win-NT
f010: 20 68 61 73 20 61 20 6d 69 73 66 65 61 74 75 72   has a misfeatur
f020: 65 20 74 68 61 74 20 73 6f 63 6b 65 74 73 20 61  e that sockets a
f030: 72 65 20 69 6e 68 65 72 69 74 65 64 20 69 6e 20  re inherited in 
f040: 63 68 69 6c 64 20 70 72 6f 63 65 73 73 65 73 0a  child processes.
f050: 20 20 20 20 20 2a 20 62 79 20 64 65 66 61 75 6c       * by defaul
f060: 74 2e 20 54 75 72 6e 20 6f 66 66 20 74 68 65 20  t. Turn off the 
f070: 69 6e 68 65 72 69 74 20 62 69 74 2e 0a 20 20 20  inherit bit..   
f080: 20 20 2a 2f 0a 0a 20 20 20 20 53 65 74 48 61 6e    */..    SetHan
f090: 64 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 28 28  dleInformation((
f0a0: 48 41 4e 44 4c 45 29 20 6e 65 77 53 6f 63 6b 65  HANDLE) newSocke
f0b0: 74 2c 20 48 41 4e 44 4c 45 5f 46 4c 41 47 5f 49  t, HANDLE_FLAG_I
f0c0: 4e 48 45 52 49 54 2c 20 30 29 3b 0a 0a 20 20 20  NHERIT, 0);..   
f0d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 41 64 64 20 74   /*.     * Add t
f0e0: 68 69 73 20 73 6f 63 6b 65 74 20 74 6f 20 74 68  his socket to th
f0f0: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66  e global list of
f100: 20 73 6f 63 6b 65 74 73 2e 0a 20 20 20 20 20 2a   sockets..     *
f110: 2f 0a 0a 20 20 20 20 6e 65 77 49 6e 66 6f 50 74  /..    newInfoPt
f120: 72 20 3d 20 4e 65 77 53 6f 63 6b 65 74 49 6e 66  r = NewSocketInf
f130: 6f 28 6e 65 77 53 6f 63 6b 65 74 29 3b 0a 0a 20  o(newSocket);.. 
f140: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 6c     /*.     * Sel
f150: 65 63 74 20 6f 6e 20 72 65 61 64 2f 77 72 69 74  ect on read/writ
f160: 65 20 65 76 65 6e 74 73 20 61 6e 64 20 63 72 65  e events and cre
f170: 61 74 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e  ate the channel.
f180: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6e 65  .     */..    ne
f190: 77 49 6e 66 6f 50 74 72 2d 3e 73 65 6c 65 63 74  wInfoPtr->select
f1a0: 45 76 65 6e 74 73 20 3d 20 28 46 44 5f 52 45 41  Events = (FD_REA
f1b0: 44 20 7c 20 46 44 5f 57 52 49 54 45 20 7c 20 46  D | FD_WRITE | F
f1c0: 44 5f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 53 65  D_CLOSE);.    Se
f1d0: 6e 64 53 65 6c 65 63 74 4d 65 73 73 61 67 65 28  ndSelectMessage(
f1e0: 74 73 64 50 74 72 2c 20 53 45 4c 45 43 54 2c 20  tsdPtr, SELECT, 
f1f0: 6e 65 77 49 6e 66 6f 50 74 72 29 3b 0a 0a 20 20  newInfoPtr);..  
f200: 20 20 54 63 6c 57 69 6e 47 65 6e 65 72 61 74 65    TclWinGenerate
f210: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
f220: 6e 65 6c 4e 61 6d 65 2c 20 22 73 6f 63 6b 22 2c  nelName, "sock",
f230: 20 6e 65 77 49 6e 66 6f 50 74 72 29 3b 0a 20 20   newInfoPtr);.  
f240: 20 20 6e 65 77 49 6e 66 6f 50 74 72 2d 3e 63 68    newInfoPtr->ch
f250: 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61  annel = Tcl_Crea
f260: 74 65 43 68 61 6e 6e 65 6c 28 26 74 63 70 43 68  teChannel(&tcpCh
f270: 61 6e 6e 65 6c 54 79 70 65 2c 20 63 68 61 6e 6e  annelType, chann
f280: 65 6c 4e 61 6d 65 2c 0a 09 20 20 20 20 6e 65 77  elName,..    new
f290: 49 6e 66 6f 50 74 72 2c 20 28 54 43 4c 5f 52 45  InfoPtr, (TCL_RE
f2a0: 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49  ADABLE | TCL_WRI
f2b0: 54 41 42 4c 45 29 29 3b 0a 20 20 20 20 69 66 20  TABLE));.    if 
f2c0: 28 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f  (Tcl_SetChannelO
f2d0: 70 74 69 6f 6e 28 4e 55 4c 4c 2c 20 6e 65 77 49  ption(NULL, newI
f2e0: 6e 66 6f 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 2c  nfoPtr->channel,
f2f0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
f300: 0a 09 20 20 20 20 22 61 75 74 6f 20 63 72 6c 66  ..    "auto crlf
f310: 22 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29  ") == TCL_ERROR)
f320: 20 7b 0a 09 54 63 6c 5f 43 6c 6f 73 65 45 78 28   {..Tcl_CloseEx(
f330: 4e 55 4c 4c 2c 20 6e 65 77 49 6e 66 6f 50 74 72  NULL, newInfoPtr
f340: 2d 3e 63 68 61 6e 6e 65 6c 2c 20 30 29 3b 0a 09  ->channel, 0);..
f350: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
f360: 20 20 69 66 20 28 54 63 6c 5f 53 65 74 43 68 61    if (Tcl_SetCha
f370: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 4e 55 4c 4c 2c  nnelOption(NULL,
f380: 20 6e 65 77 49 6e 66 6f 50 74 72 2d 3e 63 68 61   newInfoPtr->cha
f390: 6e 6e 65 6c 2c 20 22 2d 65 6f 66 63 68 61 72 22  nnel, "-eofchar"
f3a0: 2c 20 22 22 29 0a 09 20 20 20 20 3d 3d 20 54 43  , "")..    == TC
f3b0: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 54 63 6c 5f  L_ERROR) {..Tcl_
f3c0: 43 6c 6f 73 65 45 78 28 4e 55 4c 4c 2c 20 6e 65  CloseEx(NULL, ne
f3d0: 77 49 6e 66 6f 50 74 72 2d 3e 63 68 61 6e 6e 65  wInfoPtr->channe
f3e0: 6c 2c 20 30 29 3b 0a 09 72 65 74 75 72 6e 3b 0a  l, 0);..return;.
f3f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
f400: 20 20 20 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20     * Invoke the 
f410: 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63 6b 20  accept callback 
f420: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 2a  function..     *
f430: 2f 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  /..    if (state
f440: 50 74 72 2d 3e 61 63 63 65 70 74 50 72 6f 63 20  Ptr->acceptProc 
f450: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 67 65 74 6e  != NULL) {..getn
f460: 61 6d 65 69 6e 66 6f 28 26 28 61 64 64 72 2e 73  ameinfo(&(addr.s
f470: 61 29 2c 20 6c 65 6e 2c 20 68 6f 73 74 2c 20 73  a), len, host, s
f480: 69 7a 65 6f 66 28 68 6f 73 74 29 2c 20 70 6f 72  izeof(host), por
f490: 74 2c 20 73 69 7a 65 6f 66 28 70 6f 72 74 29 2c  t, sizeof(port),
f4a0: 0a 09 09 4e 49 5f 4e 55 4d 45 52 49 43 48 4f 53  ...NI_NUMERICHOS
f4b0: 54 7c 4e 49 5f 4e 55 4d 45 52 49 43 53 45 52 56  T|NI_NUMERICSERV
f4c0: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 61 63  );..statePtr->ac
f4d0: 63 65 70 74 50 72 6f 63 28 73 74 61 74 65 50 74  ceptProc(statePt
f4e0: 72 2d 3e 61 63 63 65 70 74 50 72 6f 63 44 61 74  r->acceptProcDat
f4f0: 61 2c 20 6e 65 77 49 6e 66 6f 50 74 72 2d 3e 63  a, newInfoPtr->c
f500: 68 61 6e 6e 65 6c 2c 0a 09 09 68 6f 73 74 2c 20  hannel,...host, 
f510: 61 74 6f 69 28 70 6f 72 74 29 29 3b 0a 20 20 20  atoi(port));.   
f520: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
f530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f570: 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 69 74 53 6f 63  --. *. * InitSoc
f580: 6b 65 74 57 69 6e 64 6f 77 43 6c 61 73 73 20 2d  ketWindowClass -
f590: 2d 0a 20 2a 0a 20 2a 09 52 65 67 69 73 74 65 72  -. *. *.Register
f5a0: 73 20 74 68 65 20 65 76 65 6e 74 20 77 69 6e 64  s the event wind
f5b0: 6f 77 20 63 6c 61 73 73 20 66 6f 72 20 74 68 65  ow class for the
f5c0: 20 73 6f 63 6b 65 74 20 6e 6f 74 69 66 69 65 72   socket notifier
f5d0: 20 63 6f 64 65 2e 0a 20 2a 09 43 61 6c 6c 65 72   code.. *.Caller
f5e0: 20 6d 75 73 74 20 6e 6f 74 20 68 6f 6c 64 20 73   must not hold s
f5f0: 6f 63 6b 65 74 20 6d 75 74 65 78 20 6c 6f 63 6b  ocket mutex lock
f600: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
f610: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
f620: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
f630: 09 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20  .Register a new 
f640: 77 69 6e 64 6f 77 20 63 6c 61 73 73 2e 0a 20 2a  window class.. *
f650: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
f660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
f6a0: 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 69 74 53  tatic void.InitS
f6b0: 6f 63 6b 65 74 57 69 6e 64 6f 77 43 6c 61 73 73  ocketWindowClass
f6c0: 28 76 6f 69 64 29 0a 7b 0a 20 20 20 20 69 66 20  (void).{.    if 
f6d0: 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  (initialized) {.
f6e0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20  .return;.    }. 
f6f0: 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b     Tcl_MutexLock
f700: 28 26 73 6f 63 6b 65 74 4d 75 74 65 78 29 3b 0a  (&socketMutex);.
f710: 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 6c      if (!initial
f720: 69 7a 65 64 29 20 7b 0a 09 69 6e 69 74 69 61 6c  ized) {..initial
f730: 69 7a 65 64 20 3d 20 31 3b 0a 09 54 63 6c 43 72  ized = 1;..TclCr
f740: 65 61 74 65 4c 61 74 65 45 78 69 74 48 61 6e 64  eateLateExitHand
f750: 6c 65 72 28 53 6f 63 6b 65 74 45 78 69 74 48 61  ler(SocketExitHa
f760: 6e 64 6c 65 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  ndler, NULL);...
f770: 2f 2a 0a 09 20 2a 20 43 72 65 61 74 65 20 74 68  /*.. * Create th
f780: 65 20 61 73 79 6e 63 20 6e 6f 74 69 66 69 63 61  e async notifica
f790: 74 69 6f 6e 20 77 69 6e 64 6f 77 20 77 69 74 68  tion window with
f7a0: 20 61 20 6e 65 77 20 63 6c 61 73 73 2e 20 57 65   a new class. We
f7b0: 20 6d 75 73 74 0a 09 20 2a 20 63 72 65 61 74 65   must.. * create
f7c0: 20 61 20 6e 65 77 20 63 6c 61 73 73 20 74 6f 20   a new class to 
f7d0: 61 76 6f 69 64 20 61 20 57 69 6e 64 6f 77 73 20  avoid a Windows 
f7e0: 39 35 20 62 75 67 20 74 68 61 74 20 63 61 75 73  95 bug that caus
f7f0: 65 73 20 75 73 20 74 6f 20 67 65 74 0a 09 20 2a  es us to get.. *
f800: 20 74 68 65 20 77 72 6f 6e 67 20 6d 65 73 73 61   the wrong messa
f810: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 6f  ge number for so
f820: 63 6b 65 74 20 65 76 65 6e 74 73 20 69 66 20 74  cket events if t
f830: 68 65 20 6d 65 73 73 61 67 65 20 77 69 6e 64 6f  he message windo
f840: 77 20 69 73 0a 09 20 2a 20 61 20 73 75 62 63 6c  w is.. * a subcl
f850: 61 73 73 20 6f 66 20 61 20 73 74 61 74 69 63 20  ass of a static 
f860: 63 6f 6e 74 72 6f 6c 2e 0a 09 20 2a 2f 0a 0a 09  control... */...
f870: 77 69 6e 64 6f 77 43 6c 61 73 73 2e 73 74 79 6c  windowClass.styl
f880: 65 20 3d 20 30 3b 0a 09 77 69 6e 64 6f 77 43 6c  e = 0;..windowCl
f890: 61 73 73 2e 63 62 43 6c 73 45 78 74 72 61 20 3d  ass.cbClsExtra =
f8a0: 20 30 3b 0a 09 77 69 6e 64 6f 77 43 6c 61 73 73   0;..windowClass
f8b0: 2e 63 62 57 6e 64 45 78 74 72 61 20 3d 20 30 3b  .cbWndExtra = 0;
f8c0: 0a 09 77 69 6e 64 6f 77 43 6c 61 73 73 2e 68 49  ..windowClass.hI
f8d0: 6e 73 74 61 6e 63 65 20 3d 20 28 48 49 4e 53 54  nstance = (HINST
f8e0: 41 4e 43 45 29 54 63 6c 57 69 6e 47 65 74 54 63  ANCE)TclWinGetTc
f8f0: 6c 49 6e 73 74 61 6e 63 65 28 29 3b 0a 09 77 69  lInstance();..wi
f900: 6e 64 6f 77 43 6c 61 73 73 2e 68 62 72 42 61 63  ndowClass.hbrBac
f910: 6b 67 72 6f 75 6e 64 20 3d 20 4e 55 4c 4c 3b 0a  kground = NULL;.
f920: 09 77 69 6e 64 6f 77 43 6c 61 73 73 2e 6c 70 73  .windowClass.lps
f930: 7a 4d 65 6e 75 4e 61 6d 65 20 3d 20 4e 55 4c 4c  zMenuName = NULL
f940: 3b 0a 09 77 69 6e 64 6f 77 43 6c 61 73 73 2e 6c  ;..windowClass.l
f950: 70 73 7a 43 6c 61 73 73 4e 61 6d 65 20 3d 20 63  pszClassName = c
f960: 6c 61 73 73 4e 61 6d 65 3b 0a 09 77 69 6e 64 6f  lassName;..windo
f970: 77 43 6c 61 73 73 2e 6c 70 66 6e 57 6e 64 50 72  wClass.lpfnWndPr
f980: 6f 63 20 3d 20 53 6f 63 6b 65 74 50 72 6f 63 3b  oc = SocketProc;
f990: 0a 09 77 69 6e 64 6f 77 43 6c 61 73 73 2e 68 49  ..windowClass.hI
f9a0: 63 6f 6e 20 3d 20 4e 55 4c 4c 3b 0a 09 77 69 6e  con = NULL;..win
f9b0: 64 6f 77 43 6c 61 73 73 2e 68 43 75 72 73 6f 72  dowClass.hCursor
f9c0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 69 66 20 28 21   = NULL;...if (!
f9d0: 52 65 67 69 73 74 65 72 43 6c 61 73 73 57 28 26  RegisterClassW(&
f9e0: 77 69 6e 64 6f 77 43 6c 61 73 73 29 29 20 7b 0a  windowClass)) {.
f9f0: 09 20 20 20 20 54 63 6c 5f 57 69 6e 43 6f 6e 76  .    Tcl_WinConv
fa00: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74  ertError(GetLast
fa10: 45 72 72 6f 72 28 29 29 3b 0a 09 20 20 20 20 67  Error());..    g
fa20: 6f 74 6f 20 69 6e 69 74 46 61 69 6c 75 72 65 3b  oto initFailure;
fa30: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ..}.    }.    Tc
fa40: 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 73  l_MutexUnlock(&s
fa50: 6f 63 6b 65 74 4d 75 74 65 78 29 3b 0a 20 20 20  ocketMutex);.   
fa60: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 69 74   return;..  init
fa70: 46 61 69 6c 75 72 65 3a 0a 20 20 20 20 54 63 6c  Failure:.    Tcl
fa80: 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 73 6f  _MutexUnlock(&so
fa90: 63 6b 65 74 4d 75 74 65 78 29 3b 20 2f 2a 20 50  cketMutex); /* P
faa0: 72 6f 62 61 62 6c 79 20 70 6f 69 6e 74 6c 65 73  robably pointles
fab0: 73 20 62 65 66 6f 72 65 20 70 61 6e 69 63 69 6e  s before panicin
fac0: 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 50 61 6e  g */.    Tcl_Pan
fad0: 69 63 28 22 49 6e 69 74 53 6f 63 6b 65 74 73 20  ic("InitSockets 
fae0: 66 61 69 6c 65 64 22 29 3b 0a 7d 0a 0c 0a 2f 2a  failed");.}.../*
faf0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
fb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
fb40: 53 6f 63 6b 65 74 45 78 69 74 48 61 6e 64 6c 65  SocketExitHandle
fb50: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 62  r --. *. *.Callb
fb60: 61 63 6b 20 69 6e 76 6f 6b 65 64 20 64 75 72 69  ack invoked duri
fb70: 6e 67 20 65 78 69 74 20 63 6c 65 61 6e 20 75 70  ng exit clean up
fb80: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 73   to delete the s
fb90: 6f 63 6b 65 74 0a 20 2a 09 63 6f 6d 6d 75 6e 69  ocket. *.communi
fba0: 63 61 74 69 6f 6e 20 77 69 6e 64 6f 77 2e 0a 20  cation window.. 
fbb0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
fbc0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  .None.. *. * Sid
fbd0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
fbe0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
fbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
fc30: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
fc40: 0a 53 6f 63 6b 65 74 45 78 69 74 48 61 6e 64 6c  .SocketExitHandl
fc50: 65 72 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  er(.    TCL_UNUS
fc60: 45 44 28 76 6f 69 64 20 2a 29 29 0a 7b 0a 20 20  ED(void *)).{.  
fc70: 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28    Tcl_MutexLock(
fc80: 26 73 6f 63 6b 65 74 4d 75 74 65 78 29 3b 0a 0a  &socketMutex);..
fc90: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61      /*.     * Ma
fca0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 63 6b  ke sure the sock
fcb0: 65 74 20 65 76 65 6e 74 20 68 61 6e 64 6c 69 6e  et event handlin
fcc0: 67 20 77 69 6e 64 6f 77 20 69 73 20 63 6c 65 61  g window is clea
fcd0: 6e 65 64 2d 75 70 20 66 6f 72 2c 20 61 74 0a 20  ned-up for, at. 
fce0: 20 20 20 20 2a 20 6d 6f 73 74 2c 20 74 68 69 73      * most, this
fcf0: 20 74 68 72 65 61 64 2e 0a 20 20 20 20 20 2a 2f   thread..     */
fd00: 0a 0a 20 20 20 20 54 63 6c 70 46 69 6e 61 6c 69  ..    TclpFinali
fd10: 7a 65 53 6f 63 6b 65 74 73 28 29 3b 0a 20 20 20  zeSockets();.   
fd20: 20 55 6e 72 65 67 69 73 74 65 72 43 6c 61 73 73   UnregisterClass
fd30: 57 28 63 6c 61 73 73 4e 61 6d 65 2c 20 28 48 49  W(className, (HI
fd40: 4e 53 54 41 4e 43 45 29 54 63 6c 57 69 6e 47 65  NSTANCE)TclWinGe
fd50: 74 54 63 6c 49 6e 73 74 61 6e 63 65 28 29 29 3b  tTclInstance());
fd60: 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64  .    initialized
fd70: 20 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 4d 75   = 0;.    Tcl_Mu
fd80: 74 65 78 55 6e 6c 6f 63 6b 28 26 73 6f 63 6b 65  texUnlock(&socke
fd90: 74 4d 75 74 65 78 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  tMutex);.}.../*.
fda0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
fdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fde0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
fdf0: 6f 63 6b 65 74 53 65 74 75 70 50 72 6f 63 20 2d  ocketSetupProc -
fe00: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
fe10: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
fe20: 20 62 65 66 6f 72 65 20 54 63 6c 5f 44 6f 4f 6e   before Tcl_DoOn
fe30: 65 45 76 65 6e 74 20 62 6c 6f 63 6b 73 20 77 61  eEvent blocks wa
fe40: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 20 2a 09  iting for an. *.
fe50: 65 76 65 6e 74 2e 0a 20 2a 0a 20 2a 20 52 65 73  event.. *. * Res
fe60: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ults:. *.None.. 
fe70: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
fe80: 73 3a 0a 20 2a 09 41 64 6a 75 73 74 73 20 74 68  s:. *.Adjusts th
fe90: 65 20 62 6c 6f 63 6b 20 74 69 6d 65 20 69 66 20  e block time if 
fea0: 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d  needed.. *. *---
feb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fef0: 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 53 6f  ---. */..void.So
ff00: 63 6b 65 74 53 65 74 75 70 50 72 6f 63 28 0a 20  cketSetupProc(. 
ff10: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f     TCL_UNUSED(vo
ff20: 69 64 20 2a 29 2c 0a 20 20 20 20 69 6e 74 20 66  id *),.    int f
ff30: 6c 61 67 73 29 09 09 09 2f 2a 20 45 76 65 6e 74  lags).../* Event
ff40: 20 66 6c 61 67 73 20 61 73 20 70 61 73 73 65 64   flags as passed
ff50: 20 74 6f 20 54 63 6c 5f 44 6f 4f 6e 65 45 76 65   to Tcl_DoOneEve
ff60: 6e 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 70  nt. */.{.    Tcp
ff70: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
ff80: 0a 20 20 20 20 54 63 6c 5f 54 69 6d 65 20 62 6c  .    Tcl_Time bl
ff90: 6f 63 6b 54 69 6d 65 20 3d 20 7b 20 30 2c 20 30  ockTime = { 0, 0
ffa0: 20 7d 3b 0a 20 20 20 20 54 68 72 65 61 64 53 70   };.    ThreadSp
ffb0: 65 63 69 66 69 63 44 61 74 61 20 2a 74 73 64 50  ecificData *tsdP
ffc0: 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 4e 49  tr = TCL_TSD_INI
ffd0: 54 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 20 20  T(&dataKey);..  
ffe0: 20 20 69 66 20 28 21 47 4f 54 5f 42 49 54 53 28    if (!GOT_BITS(
fff0: 66 6c 61 67 73 2c 20 54 43 4c 5f 46 49 4c 45 5f  flags, TCL_FILE_
10000 45 56 45 4e 54 53 29 29 20 7b 0a 09 72 65 74 75  EVENTS)) {..retu
10010 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
10020 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b 20 74  *.     * Check t
10030 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
10040 73 20 61 20 72 65 61 64 79 20 73 6f 63 6b 65 74  s a ready socket
10050 2e 09 20 49 66 20 73 6f 2c 20 70 6f 6c 6c 2e 0a  .. If so, poll..
10060 20 20 20 20 20 2a 2f 0a 20 20 20 20 57 61 69 74       */.    Wait
10070 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28  ForSingleObject(
10080 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
10090 73 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e 49 54 45  stLock, INFINITE
100a0 29 3b 0a 20 20 20 20 66 6f 72 20 28 73 74 61 74  );.    for (stat
100b0 65 50 74 72 20 3d 20 74 73 64 50 74 72 2d 3e 73  ePtr = tsdPtr->s
100c0 6f 63 6b 65 74 4c 69 73 74 3b 20 73 74 61 74 65  ocketList; state
100d0 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 20 20  Ptr != NULL;..  
100e0 20 20 73 74 61 74 65 50 74 72 20 3d 20 73 74 61    statePtr = sta
100f0 74 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20  tePtr->nextPtr) 
10100 7b 0a 09 69 66 20 28 47 4f 54 5f 42 49 54 53 28  {..if (GOT_BITS(
10110 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64 79 45  statePtr->readyE
10120 76 65 6e 74 73 2c 0a 09 09 73 74 61 74 65 50 74  vents,...statePt
10130 72 2d 3e 77 61 74 63 68 45 76 65 6e 74 73 20 7c  r->watchEvents |
10140 20 46 44 5f 43 4f 4e 4e 45 43 54 20 7c 20 46 44   FD_CONNECT | FD
10150 5f 41 43 43 45 50 54 29 29 20 7b 0a 09 20 20 20  _ACCEPT)) {..   
10160 20 54 63 6c 5f 53 65 74 4d 61 78 42 6c 6f 63 6b   Tcl_SetMaxBlock
10170 54 69 6d 65 28 26 62 6c 6f 63 6b 54 69 6d 65 29  Time(&blockTime)
10180 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
10190 0a 20 20 20 20 7d 0a 20 20 20 20 53 65 74 45 76  .    }.    SetEv
101a0 65 6e 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b  ent(tsdPtr->sock
101b0 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a 7d 0a 0c  etListLock);.}..
101c0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
10210 20 2a 20 53 6f 63 6b 65 74 43 68 65 63 6b 50 72   * SocketCheckPr
10220 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  oc --. *. *.This
10230 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
10240 6c 65 64 20 62 79 20 54 63 6c 5f 44 6f 4f 6e 65  led by Tcl_DoOne
10250 45 76 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 74  Event to check t
10260 68 65 20 73 6f 63 6b 65 74 20 65 76 65 6e 74 0a  he socket event.
10270 20 2a 09 73 6f 75 72 63 65 20 66 6f 72 20 65 76   *.source for ev
10280 65 6e 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  ents.. *. * Resu
10290 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  lts:. *.None.. *
102a0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
102b0 3a 0a 20 2a 09 4d 61 79 20 71 75 65 75 65 20 61  :. *.May queue a
102c0 6e 20 65 76 65 6e 74 2e 0a 20 2a 0a 20 2a 2d 2d  n event.. *. *--
102d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10310 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
10320 20 76 6f 69 64 0a 53 6f 63 6b 65 74 43 68 65 63   void.SocketChec
10330 6b 50 72 6f 63 28 0a 20 20 20 20 54 43 4c 5f 55  kProc(.    TCL_U
10340 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20  NUSED(void *),. 
10350 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09 09     int flags)...
10360 2f 2a 20 45 76 65 6e 74 20 66 6c 61 67 73 20 61  /* Event flags a
10370 73 20 70 61 73 73 65 64 20 74 6f 20 54 63 6c 5f  s passed to Tcl_
10380 44 6f 4f 6e 65 45 76 65 6e 74 2e 20 2a 2f 0a 7b  DoOneEvent. */.{
10390 0a 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73  .    TcpState *s
103a0 74 61 74 65 50 74 72 3b 0a 20 20 20 20 53 6f 63  tatePtr;.    Soc
103b0 6b 65 74 45 76 65 6e 74 20 2a 65 76 50 74 72 3b  ketEvent *evPtr;
103c0 0a 20 20 20 20 54 68 72 65 61 64 53 70 65 63 69  .    ThreadSpeci
103d0 66 69 63 44 61 74 61 20 2a 74 73 64 50 74 72 20  ficData *tsdPtr 
103e0 3d 20 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26  = TCL_TSD_INIT(&
103f0 64 61 74 61 4b 65 79 29 3b 0a 0a 20 20 20 20 69  dataKey);..    i
10400 66 20 28 21 47 4f 54 5f 42 49 54 53 28 66 6c 61  f (!GOT_BITS(fla
10410 67 73 2c 20 54 43 4c 5f 46 49 4c 45 5f 45 56 45  gs, TCL_FILE_EVE
10420 4e 54 53 29 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NTS)) {..return;
10430 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
10440 20 20 20 20 2a 20 51 75 65 75 65 20 65 76 65 6e      * Queue even
10450 74 73 20 66 6f 72 20 61 6e 79 20 72 65 61 64 79  ts for any ready
10460 20 73 6f 63 6b 65 74 73 20 74 68 61 74 20 64 6f   sockets that do
10470 6e 27 74 20 61 6c 72 65 61 64 79 20 68 61 76 65  n't already have
10480 20 65 76 65 6e 74 73 0a 20 20 20 20 20 2a 20 71   events.     * q
10490 75 65 75 65 64 20 28 63 61 75 73 65 64 20 62 79  ueued (caused by
104a0 20 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74   persistent stat
104b0 65 73 20 74 68 61 74 20 77 6f 6e 27 74 20 67 65  es that won't ge
104c0 6e 65 72 61 74 65 20 57 69 6e 53 6f 63 6b 0a 20  nerate WinSock. 
104d0 20 20 20 20 2a 20 65 76 65 6e 74 73 29 2e 0a 20      * events).. 
104e0 20 20 20 20 2a 2f 0a 0a 20 20 20 20 57 61 69 74      */..    Wait
104f0 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28  ForSingleObject(
10500 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
10510 73 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e 49 54 45  stLock, INFINITE
10520 29 3b 0a 20 20 20 20 66 6f 72 20 28 73 74 61 74  );.    for (stat
10530 65 50 74 72 20 3d 20 74 73 64 50 74 72 2d 3e 73  ePtr = tsdPtr->s
10540 6f 63 6b 65 74 4c 69 73 74 3b 20 73 74 61 74 65  ocketList; state
10550 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 20 20  Ptr != NULL;..  
10560 20 20 73 74 61 74 65 50 74 72 20 3d 20 73 74 61    statePtr = sta
10570 74 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20  tePtr->nextPtr) 
10580 7b 0a 09 69 66 20 28 47 4f 54 5f 42 49 54 53 28  {..if (GOT_BITS(
10590 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64 79 45  statePtr->readyE
105a0 76 65 6e 74 73 2c 0a 09 09 73 74 61 74 65 50 74  vents,...statePt
105b0 72 2d 3e 77 61 74 63 68 45 76 65 6e 74 73 20 7c  r->watchEvents |
105c0 20 46 44 5f 43 4f 4e 4e 45 43 54 20 7c 20 46 44   FD_CONNECT | FD
105d0 5f 41 43 43 45 50 54 29 0a 09 09 26 26 20 21 47  _ACCEPT)...&& !G
105e0 4f 54 5f 42 49 54 53 28 73 74 61 74 65 50 74 72  OT_BITS(statePtr
105f0 2d 3e 66 6c 61 67 73 2c 20 53 4f 43 4b 45 54 5f  ->flags, SOCKET_
10600 50 45 4e 44 49 4e 47 29 29 20 7b 0a 09 20 20 20  PENDING)) {..   
10610 20 53 45 54 5f 42 49 54 53 28 73 74 61 74 65 50   SET_BITS(stateP
10620 74 72 2d 3e 66 6c 61 67 73 2c 20 53 4f 43 4b 45  tr->flags, SOCKE
10630 54 5f 50 45 4e 44 49 4e 47 29 3b 0a 09 20 20 20  T_PENDING);..   
10640 20 65 76 50 74 72 20 3d 20 28 53 6f 63 6b 65 74   evPtr = (Socket
10650 45 76 65 6e 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f  Event *)Tcl_Allo
10660 63 28 73 69 7a 65 6f 66 28 53 6f 63 6b 65 74 45  c(sizeof(SocketE
10670 76 65 6e 74 29 29 3b 0a 09 20 20 20 20 65 76 50  vent));..    evP
10680 74 72 2d 3e 68 65 61 64 65 72 2e 70 72 6f 63 20  tr->header.proc 
10690 3d 20 53 6f 63 6b 65 74 45 76 65 6e 74 50 72 6f  = SocketEventPro
106a0 63 3b 0a 09 20 20 20 20 65 76 50 74 72 2d 3e 73  c;..    evPtr->s
106b0 6f 63 6b 65 74 20 3d 20 73 74 61 74 65 50 74 72  ocket = statePtr
106c0 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 3b 0a 09  ->sockets->fd;..
106d0 20 20 20 20 54 63 6c 5f 51 75 65 75 65 45 76 65      Tcl_QueueEve
106e0 6e 74 28 28 54 63 6c 5f 45 76 65 6e 74 20 2a 29  nt((Tcl_Event *)
106f0 20 65 76 50 74 72 2c 20 54 43 4c 5f 51 55 45 55   evPtr, TCL_QUEU
10700 45 5f 54 41 49 4c 29 3b 0a 09 7d 0a 20 20 20 20  E_TAIL);..}.    
10710 7d 0a 20 20 20 20 53 65 74 45 76 65 6e 74 28 74  }.    SetEvent(t
10720 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73  sdPtr->socketLis
10730 74 4c 6f 63 6b 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  tLock);.}.../*. 
10740 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
10750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10780 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 6f  -------. *. * So
10790 63 6b 65 74 45 76 65 6e 74 50 72 6f 63 20 2d 2d  cketEventProc --
107a0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
107b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
107c0 79 20 54 63 6c 5f 53 65 72 76 69 63 65 45 76 65  y Tcl_ServiceEve
107d0 6e 74 20 77 68 65 6e 20 61 20 73 6f 63 6b 65 74  nt when a socket
107e0 20 65 76 65 6e 74 0a 20 2a 09 72 65 61 63 68 65   event. *.reache
107f0 73 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74  s the front of t
10800 68 65 20 65 76 65 6e 74 20 71 75 65 75 65 2e 20  he event queue. 
10810 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
10820 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
10830 0a 20 2a 09 6e 6f 74 69 66 79 69 6e 67 20 74 68  . *.notifying th
10840 65 20 67 65 6e 65 72 69 63 20 63 68 61 6e 6e 65  e generic channe
10850 6c 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20 52 65  l code.. *. * Re
10860 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e  sults:. *.Return
10870 73 20 31 20 69 66 20 74 68 65 20 65 76 65 6e 74  s 1 if the event
10880 20 77 61 73 20 68 61 6e 64 6c 65 64 2c 20 6d 65   was handled, me
10890 61 6e 69 6e 67 20 69 74 20 73 68 6f 75 6c 64 20  aning it should 
108a0 62 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 0a  be removed from.
108b0 20 2a 09 74 68 65 20 71 75 65 75 65 2e 20 52 65   *.the queue. Re
108c0 74 75 72 6e 73 20 30 20 69 66 20 74 68 65 20 65  turns 0 if the e
108d0 76 65 6e 74 20 77 61 73 20 6e 6f 74 20 68 61 6e  vent was not han
108e0 64 6c 65 64 2c 20 6d 65 61 6e 69 6e 67 20 69 74  dled, meaning it
108f0 20 73 68 6f 75 6c 64 0a 20 2a 09 73 74 61 79 20   should. *.stay 
10900 6f 6e 20 74 68 65 20 71 75 65 75 65 2e 20 54 68  on the queue. Th
10910 65 20 6f 6e 6c 79 20 74 69 6d 65 20 74 68 65 20  e only time the 
10920 65 76 65 6e 74 20 69 73 6e 27 74 20 68 61 6e 64  event isn't hand
10930 6c 65 64 20 69 73 20 69 66 20 74 68 65 0a 20 2a  led is if the. *
10940 09 54 43 4c 5f 46 49 4c 45 5f 45 56 45 4e 54 53  .TCL_FILE_EVENTS
10950 20 66 6c 61 67 20 62 69 74 20 69 73 6e 27 74 20   flag bit isn't 
10960 73 65 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  set.. *. * Side 
10970 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 68 61 74  effects:. *.What
10980 65 76 65 72 20 74 68 65 20 63 68 61 6e 6e 65 6c  ever the channel
10990 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
109a0 6f 6e 73 20 64 6f 2e 0a 20 2a 0a 20 2a 2d 2d 2d  ons do.. *. *---
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109f0 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
10a00 69 6e 74 0a 53 6f 63 6b 65 74 45 76 65 6e 74 50  int.SocketEventP
10a10 72 6f 63 28 0a 20 20 20 20 54 63 6c 5f 45 76 65  roc(.    Tcl_Eve
10a20 6e 74 20 2a 65 76 50 74 72 2c 09 09 2f 2a 20 45  nt *evPtr,../* E
10a30 76 65 6e 74 20 74 6f 20 73 65 72 76 69 63 65 2e  vent to service.
10a40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   */.    int flag
10a50 73 29 09 09 09 2f 2a 20 46 6c 61 67 73 20 74 68  s).../* Flags th
10a60 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
10a70 20 65 76 65 6e 74 73 20 74 6f 20 68 61 6e 64 6c   events to handl
10a80 65 2c 0a 09 09 09 09 20 2a 20 73 75 63 68 20 61  e,..... * such a
10a90 73 20 54 43 4c 5f 46 49 4c 45 5f 45 56 45 4e 54  s TCL_FILE_EVENT
10aa0 53 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 70 53  S. */.{.    TcpS
10ab0 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a  tate *statePtr;.
10ac0 20 20 20 20 53 6f 63 6b 65 74 45 76 65 6e 74 20      SocketEvent 
10ad0 2a 65 76 65 6e 74 50 74 72 20 3d 20 28 53 6f 63  *eventPtr = (Soc
10ae0 6b 65 74 45 76 65 6e 74 20 2a 29 20 65 76 50 74  ketEvent *) evPt
10af0 72 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 20  r;.    int mask 
10b00 3d 20 30 2c 20 65 76 65 6e 74 73 3b 0a 20 20 20  = 0, events;.   
10b10 20 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44   ThreadSpecificD
10b20 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20 54 43  ata *tsdPtr = TC
10b30 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64 61 74 61  L_TSD_INIT(&data
10b40 4b 65 79 29 3b 0a 20 20 20 20 54 63 70 46 64 4c  Key);.    TcpFdL
10b50 69 73 74 20 2a 66 64 73 3b 0a 20 20 20 20 53 4f  ist *fds;.    SO
10b60 43 4b 45 54 20 6e 65 77 53 6f 63 6b 65 74 3b 0a  CKET newSocket;.
10b70 20 20 20 20 61 64 64 72 65 73 73 20 61 64 64 72      address addr
10b80 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a  ;.    int len;..
10b90 20 20 20 20 69 66 20 28 21 47 4f 54 5f 42 49 54      if (!GOT_BIT
10ba0 53 28 66 6c 61 67 73 2c 20 54 43 4c 5f 46 49 4c  S(flags, TCL_FIL
10bb0 45 5f 45 56 45 4e 54 53 29 29 20 7b 0a 09 72 65  E_EVENTS)) {..re
10bc0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
10bd0 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6e     /*.     * Fin
10be0 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
10bf0 73 6f 63 6b 65 74 20 6f 6e 20 74 68 65 20 73 6f  socket on the so
10c00 63 6b 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  cket list..     
10c10 2a 2f 0a 0a 20 20 20 20 57 61 69 74 46 6f 72 53  */..    WaitForS
10c20 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50  ingleObject(tsdP
10c30 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f  tr->socketListLo
10c40 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20  ck, INFINITE);. 
10c50 20 20 20 66 6f 72 20 28 73 74 61 74 65 50 74 72     for (statePtr
10c60 20 3d 20 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65   = tsdPtr->socke
10c70 74 4c 69 73 74 3b 20 73 74 61 74 65 50 74 72 20  tList; statePtr 
10c80 21 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 73 74  != NULL;..    st
10c90 61 74 65 50 74 72 20 3d 20 73 74 61 74 65 50 74  atePtr = statePt
10ca0 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 69  r->nextPtr) {..i
10cb0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 6f 63  f (statePtr->soc
10cc0 6b 65 74 73 2d 3e 66 64 20 3d 3d 20 65 76 65 6e  kets->fd == even
10cd0 74 50 74 72 2d 3e 73 6f 63 6b 65 74 29 20 7b 0a  tPtr->socket) {.
10ce0 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20  .    break;..}. 
10cf0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
10d00 20 20 2a 20 44 69 73 63 61 72 64 20 65 76 65 6e    * Discard even
10d10 74 73 20 74 68 61 74 20 68 61 76 65 20 67 6f 6e  ts that have gon
10d20 65 20 73 74 61 6c 65 2e 0a 20 20 20 20 20 2a 2f  e stale..     */
10d30 0a 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ..    if (!state
10d40 50 74 72 29 20 7b 0a 09 53 65 74 45 76 65 6e 74  Ptr) {..SetEvent
10d50 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c  (tsdPtr->socketL
10d60 69 73 74 4c 6f 63 6b 29 3b 0a 09 72 65 74 75 72  istLock);..retur
10d70 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
10d80 2f 2a 0a 20 20 20 20 20 2a 20 43 6c 65 61 72 20  /*.     * Clear 
10d90 66 6c 61 67 20 74 68 61 74 20 28 74 68 69 73 29  flag that (this)
10da0 20 65 76 65 6e 74 20 69 73 20 70 65 6e 64 69 6e   event is pendin
10db0 67 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 43  g.     */..    C
10dc0 4c 45 41 52 5f 42 49 54 53 28 73 74 61 74 65 50  LEAR_BITS(stateP
10dd0 74 72 2d 3e 66 6c 61 67 73 2c 20 53 4f 43 4b 45  tr->flags, SOCKE
10de0 54 5f 50 45 4e 44 49 4e 47 29 3b 0a 0a 20 20 20  T_PENDING);..   
10df0 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 74 69   /*.     * Conti
10e00 6e 75 65 20 61 73 79 6e 63 20 63 6f 6e 6e 65 63  nue async connec
10e10 74 20 69 66 20 70 65 6e 64 69 6e 67 20 61 6e 64  t if pending and
10e20 20 72 65 61 64 79 0a 20 20 20 20 20 2a 2f 0a 0a   ready.     */..
10e30 20 20 20 20 69 66 20 28 47 4f 54 5f 42 49 54 53      if (GOT_BITS
10e40 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64 79  (statePtr->ready
10e50 45 76 65 6e 74 73 2c 20 46 44 5f 43 4f 4e 4e 45  Events, FD_CONNE
10e60 43 54 29 29 20 7b 0a 09 69 66 20 28 47 4f 54 5f  CT)) {..if (GOT_
10e70 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 66  BITS(statePtr->f
10e80 6c 61 67 73 2c 20 54 43 50 5f 41 53 59 4e 43 5f  lags, TCP_ASYNC_
10e90 50 45 4e 44 49 4e 47 29 29 20 7b 0a 09 20 20 20  PENDING)) {..   
10ea0 20 2f 2a 0a 09 20 20 20 20 20 2a 20 44 6f 20 6f   /*..     * Do o
10eb0 6e 65 20 73 74 65 70 20 61 6e 64 20 73 61 76 65  ne step and save
10ec0 20 65 76 65 6e 74 75 61 6c 20 63 6f 6e 6e 65 63   eventual connec
10ed0 74 20 65 72 72 6f 72 0a 09 20 20 20 20 20 2a 2f  t error..     */
10ee0 0a 0a 09 20 20 20 20 53 65 74 45 76 65 6e 74 28  ...    SetEvent(
10ef0 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
10f00 73 74 4c 6f 63 6b 29 3b 0a 09 20 20 20 20 57 61  stLock);..    Wa
10f10 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61  itForConnect(sta
10f20 74 65 50 74 72 2c 4e 55 4c 4c 29 3b 0a 09 7d 20  tePtr,NULL);..} 
10f30 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  else {..    /*..
10f40 20 20 20 20 20 2a 20 4e 6f 20 61 73 79 6e 63 20       * No async 
10f50 63 6f 6e 6e 65 63 74 20 72 65 65 6e 74 65 72 20  connect reenter 
10f60 70 65 6e 64 69 6e 67 2e 20 4a 75 73 74 20 63 6c  pending. Just cl
10f70 65 61 72 20 65 76 65 6e 74 2e 0a 09 20 20 20 20  ear event...    
10f80 20 2a 2f 0a 0a 09 20 20 20 20 43 4c 45 41 52 5f   */...    CLEAR_
10f90 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 72  BITS(statePtr->r
10fa0 65 61 64 79 45 76 65 6e 74 73 2c 20 46 44 5f 43  eadyEvents, FD_C
10fb0 4f 4e 4e 45 43 54 29 3b 0a 09 20 20 20 20 53 65  ONNECT);..    Se
10fc0 74 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e 73  tEvent(tsdPtr->s
10fd0 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a  ocketListLock);.
10fe0 09 7d 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20  .}..return 1;.  
10ff0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
11000 20 2a 20 48 61 6e 64 6c 65 20 63 6f 6e 6e 65 63   * Handle connec
11010 74 69 6f 6e 20 72 65 71 75 65 73 74 73 20 64 69  tion requests di
11020 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 2a 2f 0a  rectly..     */.
11030 0a 20 20 20 20 69 66 20 28 47 4f 54 5f 42 49 54  .    if (GOT_BIT
11040 53 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64  S(statePtr->read
11050 79 45 76 65 6e 74 73 2c 20 46 44 5f 41 43 43 45  yEvents, FD_ACCE
11060 50 54 29 29 20 7b 0a 09 66 6f 72 20 28 66 64 73  PT)) {..for (fds
11070 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 6f 63   = statePtr->soc
11080 6b 65 74 73 3b 20 66 64 73 20 21 3d 20 4e 55 4c  kets; fds != NUL
11090 4c 3b 20 66 64 73 20 3d 20 66 64 73 2d 3e 6e 65  L; fds = fds->ne
110a0 78 74 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20  xt) {..    /*.. 
110b0 20 20 20 20 2a 20 41 63 63 65 70 74 20 74 68 65      * Accept the
110c0 20 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63   incoming connec
110d0 74 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 09 20  tion request... 
110e0 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 6c 65 6e      */...    len
110f0 20 3d 20 73 69 7a 65 6f 66 28 61 64 64 72 65 73   = sizeof(addres
11100 73 29 3b 0a 09 20 20 20 20 6e 65 77 53 6f 63 6b  s);..    newSock
11110 65 74 20 3d 20 61 63 63 65 70 74 28 66 64 73 2d  et = accept(fds-
11120 3e 66 64 2c 20 26 28 61 64 64 72 2e 73 61 29 2c  >fd, &(addr.sa),
11130 20 26 6c 65 6e 29 3b 0a 0a 09 20 20 20 20 2f 2a   &len);...    /*
11140 0a 09 20 20 20 20 20 2a 20 4f 6e 20 54 63 6c 20  ..     * On Tcl 
11150 73 65 72 76 65 72 20 73 6f 63 6b 65 74 73 20 77  server sockets w
11160 69 74 68 20 6d 75 6c 74 69 70 6c 65 20 4f 53 20  ith multiple OS 
11170 66 64 73 20 77 65 20 6c 6f 6f 70 20 6f 76 65 72  fds we loop over
11180 20 74 68 65 20 66 64 73 0a 09 20 20 20 20 20 2a   the fds..     *
11190 20 74 72 79 69 6e 67 20 61 6e 20 61 63 63 65 70   trying an accep
111a0 74 28 29 20 6f 6e 20 65 61 63 68 2c 20 73 6f 20  t() on each, so 
111b0 77 65 20 65 78 70 65 63 74 20 49 4e 56 41 4c 49  we expect INVALI
111c0 44 5f 53 4f 43 4b 45 54 2e 20 20 54 68 65 72 65  D_SOCKET.  There
111d0 0a 09 20 20 20 20 20 2a 20 61 72 65 20 61 6c 73  ..     * are als
111e0 6f 20 6f 74 68 65 72 20 6e 65 74 77 6f 72 6b 20  o other network 
111f0 73 74 61 63 6b 20 63 6f 6e 64 69 74 69 6f 6e 73  stack conditions
11200 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
11210 20 69 6e 0a 09 20 20 20 20 20 2a 20 46 44 5f 41   in..     * FD_A
11220 43 43 45 50 54 20 62 75 74 20 61 20 73 75 62 73  CCEPT but a subs
11230 65 71 75 65 6e 74 20 66 61 69 6c 75 72 65 20 6f  equent failure o
11240 6e 20 61 63 63 65 70 74 28 29 20 62 79 20 74 68  n accept() by th
11250 65 20 74 69 6d 65 20 77 65 0a 09 20 20 20 20 20  e time we..     
11260 2a 20 67 65 74 20 61 72 6f 75 6e 64 20 74 6f 20  * get around to 
11270 69 74 2e 0a 09 20 20 20 20 20 2a 0a 09 20 20 20  it...     *..   
11280 20 20 2a 20 41 63 63 65 73 73 20 74 6f 20 73 6f    * Access to so
11290 63 6b 65 74 73 20 28 61 63 63 65 70 74 45 76 65  ckets (acceptEve
112a0 6e 74 43 6f 75 6e 74 2c 20 72 65 61 64 79 45 76  ntCount, readyEv
112b0 65 6e 74 73 29 20 69 6e 20 73 6f 63 6b 65 74 4c  ents) in socketL
112c0 69 73 74 0a 09 20 20 20 20 20 2a 20 69 73 20 73  ist..     * is s
112d0 74 69 6c 6c 20 70 72 6f 74 65 63 74 65 64 20 62  till protected b
112e0 79 20 74 68 65 20 6c 6f 63 6b 20 28 70 72 65 76  y the lock (prev
112f0 65 6e 74 73 20 72 65 69 6e 74 72 6f 64 75 63 74  ents reintroduct
11300 69 6f 6e 20 6f 66 0a 09 20 20 20 20 20 2a 20 53  ion of..     * S
11310 46 20 54 63 6c 20 42 75 67 20 33 30 35 36 37 37  F Tcl Bug 305677
11320 35 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  5...     */...  
11330 20 20 69 66 20 28 6e 65 77 53 6f 63 6b 65 74 20    if (newSocket 
11340 3d 3d 20 49 4e 56 41 4c 49 44 5f 53 4f 43 4b 45  == INVALID_SOCKE
11350 54 29 20 7b 0a 09 09 2f 2a 20 69 6e 74 20 65 72  T) {.../* int er
11360 72 20 3d 20 57 53 41 47 65 74 4c 61 73 74 45 72  r = WSAGetLastEr
11370 72 6f 72 28 29 3b 20 2a 2f 0a 09 09 63 6f 6e 74  ror(); */...cont
11380 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  inue;..    }... 
11390 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49 74     /*..     * It
113a0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
113b0 74 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  t more than one 
113c0 46 44 5f 41 43 43 45 50 54 20 68 61 73 20 62 65  FD_ACCEPT has be
113d0 65 6e 20 73 65 6e 74 2c 20 73 6f 0a 09 20 20 20  en sent, so..   
113e0 20 20 2a 20 61 6e 20 65 78 74 72 61 20 63 6f 75    * an extra cou
113f0 6e 74 20 6d 75 73 74 20 62 65 20 6b 65 70 74 2e  nt must be kept.
11400 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63   Decrement the c
11410 6f 75 6e 74 2c 20 61 6e 64 20 72 65 73 65 74 20  ount, and reset 
11420 74 68 65 0a 09 20 20 20 20 20 2a 20 72 65 61 64  the..     * read
11430 79 45 76 65 6e 74 20 62 69 74 20 69 66 20 74 68  yEvent bit if th
11440 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 20 6c 6f  e count is no lo
11450 6e 67 65 72 20 3e 20 30 2e 0a 09 20 20 20 20 20  nger > 0...     
11460 2a 2f 0a 0a 09 20 20 20 20 73 74 61 74 65 50 74  */...    statePt
11470 72 2d 3e 61 63 63 65 70 74 45 76 65 6e 74 43 6f  r->acceptEventCo
11480 75 6e 74 2d 2d 3b 0a 0a 09 20 20 20 20 69 66 20  unt--;...    if 
11490 28 73 74 61 74 65 50 74 72 2d 3e 61 63 63 65 70  (statePtr->accep
114a0 74 45 76 65 6e 74 43 6f 75 6e 74 20 3c 3d 20 30  tEventCount <= 0
114b0 29 20 7b 0a 09 09 43 4c 45 41 52 5f 42 49 54 53  ) {...CLEAR_BITS
114c0 28 73 74 61 74 65 50 74 72 2d 3e 72 65 61 64 79  (statePtr->ready
114d0 45 76 65 6e 74 73 2c 20 46 44 5f 41 43 43 45 50  Events, FD_ACCEP
114e0 54 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  T);..    }...   
114f0 20 53 65 74 45 76 65 6e 74 28 74 73 64 50 74 72   SetEvent(tsdPtr
11500 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b  ->socketListLock
11510 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  );...    /*..   
11520 20 20 2a 20 43 61 75 74 69 6f 6e 3a 20 54 63 70    * Caution: Tcp
11530 41 63 63 65 70 74 28 29 20 68 61 73 20 74 68 65  Accept() has the
11540 20 73 69 64 65 2d 65 66 66 65 63 74 20 6f 66 20   side-effect of 
11550 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 0a 09  evaluating the..
11560 20 20 20 20 20 2a 20 73 65 72 76 65 72 20 61 63       * server ac
11570 63 65 70 74 20 73 63 72 69 70 74 20 28 76 69 61  cept script (via
11580 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50   AcceptCallbackP
11590 72 6f 63 28 29 20 69 6e 20 74 63 6c 49 4f 43 6d  roc() in tclIOCm
115a0 64 2e 63 29 2c 0a 09 20 20 20 20 20 2a 20 77 68  d.c),..     * wh
115b0 69 63 68 20 63 61 6e 20 63 6c 6f 73 65 20 74 68  ich can close th
115c0 65 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74 20  e server socket 
115d0 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 73  and invalidate s
115e0 74 61 74 65 50 74 72 20 61 6e 64 0a 09 20 20 20  tatePtr and..   
115f0 20 20 2a 20 66 64 73 2e 20 49 66 20 54 63 70 41    * fds. If TcpA
11600 63 63 65 70 74 28 29 20 61 63 63 65 70 74 73 20  ccept() accepts 
11610 61 20 73 6f 63 6b 65 74 20 77 65 20 6d 75 73 74  a socket we must
11620 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
11630 65 6c 79 0a 09 20 20 20 20 20 2a 20 61 6e 64 20  ely..     * and 
11640 6c 65 74 20 53 6f 63 6b 65 74 43 68 65 63 6b 50  let SocketCheckP
11650 72 6f 63 20 71 75 65 75 65 20 61 64 64 69 74 69  roc queue additi
11660 6f 6e 61 6c 20 46 44 5f 41 43 43 45 50 54 20 65  onal FD_ACCEPT e
11670 76 65 6e 74 73 2e 0a 09 20 20 20 20 20 2a 2f 0a  vents...     */.
11680 0a 09 20 20 20 20 54 63 70 41 63 63 65 70 74 28  ..    TcpAccept(
11690 66 64 73 2c 20 6e 65 77 53 6f 63 6b 65 74 2c 20  fds, newSocket, 
116a0 61 64 64 72 29 3b 0a 09 20 20 20 20 72 65 74 75  addr);..    retu
116b0 72 6e 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  rn 1;..}.../*.. 
116c0 2a 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  * Loop terminate
116d0 64 20 77 69 74 68 20 6e 6f 20 73 6f 63 6b 65 74  d with no socket
116e0 73 20 61 63 63 65 70 74 65 64 3b 20 63 6c 65 61  s accepted; clea
116f0 72 20 74 68 65 20 72 65 61 64 79 20 6d 61 73 6b  r the ready mask
11700 20 73 6f 0a 09 20 2a 20 77 65 20 63 61 6e 20 64   so.. * we can d
11710 65 74 65 63 74 20 74 68 65 20 6e 65 78 74 20 63  etect the next c
11720 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 71 75 65 73  onnection reques
11730 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 63 6f 6e  t. Note that con
11740 6e 65 63 74 69 6f 6e 0a 09 20 2a 20 72 65 71 75  nection.. * requ
11750 65 73 74 73 20 61 72 65 20 6c 65 76 65 6c 20 74  ests are level t
11760 72 69 67 67 65 72 65 64 2c 20 73 6f 20 69 66 20  riggered, so if 
11770 74 68 65 72 65 20 69 73 20 61 20 72 65 71 75 65  there is a reque
11780 73 74 20 61 6c 72 65 61 64 79 0a 09 20 2a 20 70  st already.. * p
11790 65 6e 64 69 6e 67 2c 20 61 20 6e 65 77 20 65 76  ending, a new ev
117a0 65 6e 74 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ent will be gene
117b0 72 61 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 73 74  rated... */...st
117c0 61 74 65 50 74 72 2d 3e 61 63 63 65 70 74 45 76  atePtr->acceptEv
117d0 65 6e 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 43  entCount = 0;..C
117e0 4c 45 41 52 5f 42 49 54 53 28 73 74 61 74 65 50  LEAR_BITS(stateP
117f0 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 73 2c  tr->readyEvents,
11800 20 46 44 5f 41 43 43 45 50 54 29 3b 0a 0a 09 53   FD_ACCEPT);...S
11810 65 74 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e  etEvent(tsdPtr->
11820 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b  socketListLock);
11830 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ..return 1;.    
11840 7d 0a 0a 20 20 20 20 53 65 74 45 76 65 6e 74 28  }..    SetEvent(
11850 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
11860 73 74 4c 6f 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a  stLock);..    /*
11870 0a 20 20 20 20 20 2a 20 4d 61 73 6b 20 6f 66 66  .     * Mask off
11880 20 75 6e 77 61 6e 74 65 64 20 65 76 65 6e 74 73   unwanted events
11890 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65   and compute the
118a0 20 72 65 61 64 2f 77 72 69 74 65 20 6d 61 73 6b   read/write mask
118b0 20 73 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   so we can.     
118c0 2a 20 6e 6f 74 69 66 79 20 74 68 65 20 63 68 61  * notify the cha
118d0 6e 6e 65 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  nnel..     */.. 
118e0 20 20 20 65 76 65 6e 74 73 20 3d 20 73 74 61 74     events = stat
118f0 65 50 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74  ePtr->readyEvent
11900 73 20 26 20 73 74 61 74 65 50 74 72 2d 3e 77 61  s & statePtr->wa
11910 74 63 68 45 76 65 6e 74 73 3b 0a 0a 20 20 20 20  tchEvents;..    
11920 69 66 20 28 47 4f 54 5f 42 49 54 53 28 65 76 65  if (GOT_BITS(eve
11930 6e 74 73 2c 20 46 44 5f 43 4c 4f 53 45 29 29 20  nts, FD_CLOSE)) 
11940 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74 68 65  {../*.. * If the
11950 20 73 6f 63 6b 65 74 20 77 61 73 20 63 6c 6f 73   socket was clos
11960 65 64 20 61 6e 64 20 74 68 65 20 63 68 61 6e 6e  ed and the chann
11970 65 6c 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 65  el is still inte
11980 72 65 73 74 65 64 20 69 6e 0a 09 20 2a 20 72 65  rested in.. * re
11990 61 64 20 65 76 65 6e 74 73 2c 20 74 68 65 6e 20  ad events, then 
119a0 77 65 20 6e 65 65 64 20 74 6f 20 65 6e 73 75 72  we need to ensur
119b0 65 20 74 68 61 74 20 77 65 20 6b 65 65 70 20 70  e that we keep p
119c0 6f 6c 6c 69 6e 67 20 66 6f 72 20 74 68 69 73 0a  olling for this.
119d0 09 20 2a 20 65 76 65 6e 74 20 75 6e 74 69 6c 20  . * event until 
119e0 73 6f 6d 65 6f 6e 65 20 64 6f 65 73 20 73 6f 6d  someone does som
119f0 65 74 68 69 6e 67 20 77 69 74 68 20 74 68 65 20  ething with the 
11a00 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 65 20 74 68  channel. Note th
11a10 61 74 20 77 65 0a 09 20 2a 20 64 6f 20 74 68 69  at we.. * do thi
11a20 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
11a30 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e   Tcl_NotifyChann
11a40 65 6c 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68  el so we don't h
11a50 61 76 65 20 74 6f 20 77 61 74 63 68 0a 09 20 2a  ave to watch.. *
11a60 20 6f 75 74 20 66 6f 72 20 74 68 65 20 63 68 61   out for the cha
11a70 6e 6e 65 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  nnel being delet
11a80 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
11a90 72 20 75 73 2e 20 54 68 69 73 20 6d 61 79 20 63  r us. This may c
11aa0 61 75 73 65 0a 09 20 2a 20 61 20 72 65 64 75 6e  ause.. * a redun
11ab0 64 61 6e 74 20 74 72 69 70 20 74 68 72 6f 75 67  dant trip throug
11ac0 68 20 74 68 65 20 65 76 65 6e 74 20 6c 6f 6f 70  h the event loop
11ad0 2c 20 62 75 74 20 69 74 27 73 20 73 69 6d 70 6c  , but it's simpl
11ae0 65 72 20 74 68 61 6e 0a 09 20 2a 20 74 72 79 69  er than.. * tryi
11af0 6e 67 20 74 6f 20 64 6f 20 75 6e 77 69 6e 64 20  ng to do unwind 
11b00 70 72 6f 74 65 63 74 69 6f 6e 2e 0a 09 20 2a 2f  protection... */
11b10 0a 0a 09 54 63 6c 5f 54 69 6d 65 20 62 6c 6f 63  ...Tcl_Time bloc
11b20 6b 54 69 6d 65 20 3d 20 7b 20 30 2c 20 30 20 7d  kTime = { 0, 0 }
11b30 3b 0a 0a 09 54 63 6c 5f 53 65 74 4d 61 78 42 6c  ;...Tcl_SetMaxBl
11b40 6f 63 6b 54 69 6d 65 28 26 62 6c 6f 63 6b 54 69  ockTime(&blockTi
11b50 6d 65 29 3b 0a 09 53 45 54 5f 42 49 54 53 28 6d  me);..SET_BITS(m
11b60 61 73 6b 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c  ask, TCL_READABL
11b70 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  E | TCL_WRITABLE
11b80 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
11b90 20 28 47 4f 54 5f 42 49 54 53 28 65 76 65 6e 74   (GOT_BITS(event
11ba0 73 2c 20 46 44 5f 52 45 41 44 29 29 20 7b 0a 09  s, FD_READ)) {..
11bb0 2f 2a 0a 09 20 2a 20 54 68 72 6f 77 20 74 68 65  /*.. * Throw the
11bc0 20 72 65 61 64 61 62 6c 65 20 65 76 65 6e 74 20   readable event 
11bd0 69 66 20 61 6e 20 61 73 79 6e 63 20 63 6f 6e 6e  if an async conn
11be0 65 63 74 20 66 61 69 6c 65 64 2e 0a 09 20 2a 2f  ect failed... */
11bf0 0a 0a 09 69 66 20 28 47 4f 54 5f 42 49 54 53 28  ...if (GOT_BITS(
11c00 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 2c  statePtr->flags,
11c10 20 54 43 50 5f 41 53 59 4e 43 5f 46 41 49 4c 45   TCP_ASYNC_FAILE
11c20 44 29 29 20 7b 0a 09 20 20 20 20 53 45 54 5f 42  D)) {..    SET_B
11c30 49 54 53 28 6d 61 73 6b 2c 20 54 43 4c 5f 52 45  ITS(mask, TCL_RE
11c40 41 44 41 42 4c 45 29 3b 0a 09 7d 20 65 6c 73 65  ADABLE);..} else
11c50 20 7b 0a 09 20 20 20 20 66 64 5f 73 65 74 20 72   {..    fd_set r
11c60 65 61 64 46 64 73 3b 0a 09 20 20 20 20 73 74 72  eadFds;..    str
11c70 75 63 74 20 74 69 6d 65 76 61 6c 20 74 69 6d 65  uct timeval time
11c80 6f 75 74 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20  out;...    /*.. 
11c90 20 20 20 20 2a 20 57 65 20 6d 75 73 74 20 63 68      * We must ch
11ca0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 64 61  eck to see if da
11cb0 74 61 20 69 73 20 72 65 61 6c 6c 79 20 61 76 61  ta is really ava
11cc0 69 6c 61 62 6c 65 2c 20 73 69 6e 63 65 20 73 6f  ilable, since so
11cd0 6d 65 6f 6e 65 0a 09 20 20 20 20 20 2a 20 63 6f  meone..     * co
11ce0 75 6c 64 20 68 61 76 65 20 63 6f 6e 73 75 6d 65  uld have consume
11cf0 64 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  d the data in th
11d00 65 20 6d 65 61 6e 74 69 6d 65 2e 20 54 75 72 6e  e meantime. Turn
11d10 20 6f 66 66 20 61 73 79 6e 63 0a 09 20 20 20 20   off async..    
11d20 20 2a 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20   * notification 
11d30 73 6f 20 73 65 6c 65 63 74 20 77 69 6c 6c 20 77  so select will w
11d40 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 49  ork correctly. I
11d50 66 20 74 68 65 20 73 6f 63 6b 65 74 20 69 73 0a  f the socket is.
11d60 09 20 20 20 20 20 2a 20 73 74 69 6c 6c 20 72 65  .     * still re
11d70 61 64 61 62 6c 65 2c 20 6e 6f 74 69 66 79 20 74  adable, notify t
11d80 68 65 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65  he channel drive
11d90 72 2c 20 6f 74 68 65 72 77 69 73 65 20 72 65 73  r, otherwise res
11da0 65 74 20 74 68 65 0a 09 20 20 20 20 20 2a 20 61  et the..     * a
11db0 73 79 6e 63 20 73 65 6c 65 63 74 20 68 61 6e 64  sync select hand
11dc0 6c 65 72 20 61 6e 64 20 6b 65 65 70 20 77 61 69  ler and keep wai
11dd0 74 69 6e 67 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  ting...     */..
11de0 09 20 20 20 20 53 65 6e 64 53 65 6c 65 63 74 4d  .    SendSelectM
11df0 65 73 73 61 67 65 28 74 73 64 50 74 72 2c 20 55  essage(tsdPtr, U
11e00 4e 53 45 4c 45 43 54 2c 20 73 74 61 74 65 50 74  NSELECT, statePt
11e10 72 29 3b 0a 0a 09 20 20 20 20 46 44 5f 5a 45 52  r);...    FD_ZER
11e20 4f 28 26 72 65 61 64 46 64 73 29 3b 0a 09 20 20  O(&readFds);..  
11e30 20 20 46 44 5f 53 45 54 28 73 74 61 74 65 50 74    FD_SET(statePt
11e40 72 2d 3e 73 6f 63 6b 65 74 73 2d 3e 66 64 2c 20  r->sockets->fd, 
11e50 26 72 65 61 64 46 64 73 29 3b 0a 09 20 20 20 20  &readFds);..    
11e60 74 69 6d 65 6f 75 74 2e 74 76 5f 75 73 65 63 20  timeout.tv_usec 
11e70 3d 20 30 3b 0a 09 20 20 20 20 74 69 6d 65 6f 75  = 0;..    timeou
11e80 74 2e 74 76 5f 73 65 63 20 3d 20 30 3b 0a 0a 09  t.tv_sec = 0;...
11e90 20 20 20 20 69 66 20 28 73 65 6c 65 63 74 28 30      if (select(0
11ea0 2c 20 26 72 65 61 64 46 64 73 2c 20 4e 55 4c 4c  , &readFds, NULL
11eb0 2c 20 4e 55 4c 4c 2c 20 26 74 69 6d 65 6f 75 74  , NULL, &timeout
11ec0 29 20 21 3d 20 30 29 20 7b 0a 09 09 53 45 54 5f  ) != 0) {...SET_
11ed0 42 49 54 53 28 6d 61 73 6b 2c 20 54 43 4c 5f 52  BITS(mask, TCL_R
11ee0 45 41 44 41 42 4c 45 29 3b 0a 09 20 20 20 20 7d  EADABLE);..    }
11ef0 20 65 6c 73 65 20 7b 0a 09 09 43 4c 45 41 52 5f   else {...CLEAR_
11f00 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e 72  BITS(statePtr->r
11f10 65 61 64 79 45 76 65 6e 74 73 2c 20 46 44 5f 52  eadyEvents, FD_R
11f20 45 41 44 29 3b 0a 09 09 53 65 6e 64 53 65 6c 65  EAD);...SendSele
11f30 63 74 4d 65 73 73 61 67 65 28 74 73 64 50 74 72  ctMessage(tsdPtr
11f40 2c 20 53 45 4c 45 43 54 2c 20 73 74 61 74 65 50  , SELECT, stateP
11f50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  tr);..    }..}. 
11f60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
11f70 20 20 2a 20 77 72 69 74 61 62 6c 65 20 65 76 65    * writable eve
11f80 6e 74 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  nt.     */..    
11f90 69 66 20 28 47 4f 54 5f 42 49 54 53 28 65 76 65  if (GOT_BITS(eve
11fa0 6e 74 73 2c 20 46 44 5f 57 52 49 54 45 29 29 20  nts, FD_WRITE)) 
11fb0 7b 0a 09 53 45 54 5f 42 49 54 53 28 6d 61 73 6b  {..SET_BITS(mask
11fc0 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b  , TCL_WRITABLE);
11fd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
11fe0 20 20 20 20 2a 20 43 61 6c 6c 20 72 65 67 69 73      * Call regis
11ff0 74 65 72 65 64 20 65 76 65 6e 74 20 70 72 6f 63  tered event proc
12000 65 64 75 72 65 73 0a 20 20 20 20 20 2a 2f 0a 0a  edures.     */..
12010 20 20 20 20 69 66 20 28 6d 61 73 6b 29 20 7b 0a      if (mask) {.
12020 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e  .Tcl_NotifyChann
12030 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 63 68 61  el(statePtr->cha
12040 6e 6e 65 6c 2c 20 6d 61 73 6b 29 3b 0a 20 20 20  nnel, mask);.   
12050 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b   }.    return 1;
12060 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
12070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
120a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
120b0 0a 20 2a 0a 20 2a 20 41 64 64 53 6f 63 6b 65 74  . *. * AddSocket
120c0 49 6e 66 6f 46 64 20 2d 2d 0a 20 2a 0a 20 2a 09  InfoFd --. *. *.
120d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64  This function ad
120e0 64 73 20 61 20 53 4f 43 4b 45 54 20 66 69 6c 65  ds a SOCKET file
120f0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
12100 68 65 20 27 73 6f 63 6b 65 74 73 27 20 6c 69 6e  he 'sockets' lin
12110 6b 65 64 0a 20 2a 09 6c 69 73 74 20 6f 66 20 61  ked. *.list of a
12120 20 54 63 70 53 74 61 74 65 20 73 74 72 75 63 74   TcpState struct
12130 75 72 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ure.. *. * Resul
12140 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
12150 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
12160 0a 20 2a 09 4e 6f 6e 65 2c 20 65 78 63 65 70 74  . *.None, except
12170 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
12180 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 2a 0a 20 2a  of memory.. *. *
12190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121d0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
121e0 69 63 20 76 6f 69 64 0a 41 64 64 53 6f 63 6b 65  ic void.AddSocke
121f0 74 49 6e 66 6f 46 64 28 0a 20 20 20 20 54 63 70  tInfoFd(.    Tcp
12200 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
12210 0a 20 20 20 20 53 4f 43 4b 45 54 20 73 6f 63 6b  .    SOCKET sock
12220 65 74 29 0a 7b 0a 20 20 20 20 54 63 70 46 64 4c  et).{.    TcpFdL
12230 69 73 74 20 2a 66 64 73 20 3d 20 73 74 61 74 65  ist *fds = state
12240 50 74 72 2d 3e 73 6f 63 6b 65 74 73 3b 0a 0a 20  Ptr->sockets;.. 
12250 20 20 20 69 66 20 28 66 64 73 20 3d 3d 20 4e 55     if (fds == NU
12260 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 41 64  LL) {../*.. * Ad
12270 64 20 74 68 65 20 66 69 72 73 74 20 46 44 2e 0a  d the first FD..
12280 09 20 2a 2f 0a 0a 09 73 74 61 74 65 50 74 72 2d  . */...statePtr-
12290 3e 73 6f 63 6b 65 74 73 20 3d 20 28 54 63 70 46  >sockets = (TcpF
122a0 64 4c 69 73 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f  dList *)Tcl_Allo
122b0 63 28 73 69 7a 65 6f 66 28 54 63 70 46 64 4c 69  c(sizeof(TcpFdLi
122c0 73 74 29 29 3b 0a 09 66 64 73 20 3d 20 73 74 61  st));..fds = sta
122d0 74 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 3b 0a  tePtr->sockets;.
122e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
122f0 0a 09 20 2a 20 46 69 6e 64 20 65 6e 64 20 6f 66  .. * Find end of
12300 20 6c 69 73 74 20 61 6e 64 20 61 70 70 65 6e 64   list and append
12310 20 46 44 2e 0a 09 20 2a 2f 0a 0a 09 77 68 69 6c   FD... */...whil
12320 65 20 28 66 64 73 2d 3e 6e 65 78 74 20 21 3d 20  e (fds->next != 
12330 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 66 64 73  NULL) {..    fds
12340 20 3d 20 66 64 73 2d 3e 6e 65 78 74 3b 0a 09 7d   = fds->next;..}
12350 0a 0a 09 66 64 73 2d 3e 6e 65 78 74 20 3d 20 28  ...fds->next = (
12360 54 63 70 46 64 4c 69 73 74 20 2a 29 54 63 6c 5f  TcpFdList *)Tcl_
12370 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 63 70  Alloc(sizeof(Tcp
12380 46 64 4c 69 73 74 29 29 3b 0a 09 66 64 73 20 3d  FdList));..fds =
12390 20 66 64 73 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   fds->next;.    
123a0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
123b0 20 50 6f 70 75 6c 61 74 65 20 6e 65 77 20 46 44   Populate new FD
123c0 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66  ..     */..    f
123d0 64 73 2d 3e 66 64 20 3d 20 73 6f 63 6b 65 74 3b  ds->fd = socket;
123e0 0a 20 20 20 20 66 64 73 2d 3e 73 74 61 74 65 50  .    fds->stateP
123f0 74 72 20 3d 20 73 74 61 74 65 50 74 72 3b 0a 20  tr = statePtr;. 
12400 20 20 20 66 64 73 2d 3e 6e 65 78 74 20 3d 20 4e     fds->next = N
12410 55 4c 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ULL;.}.../*. *--
12420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12460 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 65 77 53 6f  ----. *. * NewSo
12470 63 6b 65 74 49 6e 66 6f 20 2d 2d 0a 20 2a 0a 20  cketInfo --. *. 
12480 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
12490 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 69 6e  allocates and in
124a0 69 74 69 61 6c 69 7a 65 73 20 61 20 6e 65 77 20  itializes a new 
124b0 54 63 70 53 74 61 74 65 20 73 74 72 75 63 74 75  TcpState structu
124c0 72 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  re.. *. * Result
124d0 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 61 20  s:. *.Returns a 
124e0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
124f0 54 63 70 53 74 61 74 65 2e 0a 20 2a 0a 20 2a 20  TcpState.. *. * 
12500 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
12510 09 4e 6f 6e 65 2c 20 65 78 63 65 70 74 20 66 6f  .None, except fo
12520 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  r allocation of 
12530 6d 65 6d 6f 72 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d  memory.. *. *---
12540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12580 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
12590 54 63 70 53 74 61 74 65 20 2a 0a 4e 65 77 53 6f  TcpState *.NewSo
125a0 63 6b 65 74 49 6e 66 6f 28 0a 20 20 20 20 53 4f  cketInfo(.    SO
125b0 43 4b 45 54 20 73 6f 63 6b 65 74 29 0a 7b 0a 20  CKET socket).{. 
125c0 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74 61     TcpState *sta
125d0 74 65 50 74 72 20 3d 20 28 54 63 70 53 74 61 74  tePtr = (TcpStat
125e0 65 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  e *)Tcl_Alloc(si
125f0 7a 65 6f 66 28 54 63 70 53 74 61 74 65 29 29 3b  zeof(TcpState));
12600 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ..    memset(sta
12610 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
12620 28 54 63 70 53 74 61 74 65 29 29 3b 0a 0a 20 20  (TcpState));..  
12630 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50 20    /*.     * TIP 
12640 23 32 31 38 2e 20 52 65 6d 6f 76 65 64 20 74 68  #218. Removed th
12650 65 20 63 6f 64 65 20 69 6e 73 65 72 74 69 6e 67  e code inserting
12660 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74 75   the new structu
12670 72 65 20 69 6e 74 6f 20 74 68 65 20 67 6c 6f 62  re into the glob
12680 61 6c 0a 20 20 20 20 20 2a 20 6c 69 73 74 2e 20  al.     * list. 
12690 54 68 69 73 20 69 73 20 6e 6f 77 20 68 61 6e 64  This is now hand
126a0 6c 65 64 20 69 6e 20 74 68 65 20 74 68 72 65 61  led in the threa
126b0 64 20 61 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63  d action callbac
126c0 6b 73 2c 20 61 6e 64 20 6f 6e 6c 79 0a 20 20 20  ks, and only.   
126d0 20 20 2a 20 74 68 65 72 65 2e 0a 20 20 20 20 20    * there..     
126e0 2a 2f 0a 0a 20 20 20 20 41 64 64 53 6f 63 6b 65  */..    AddSocke
126f0 74 49 6e 66 6f 46 64 28 73 74 61 74 65 50 74 72  tInfoFd(statePtr
12700 2c 20 73 6f 63 6b 65 74 29 3b 0a 0a 20 20 20 20  , socket);..    
12710 72 65 74 75 72 6e 20 73 74 61 74 65 50 74 72 3b  return statePtr;
12720 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12770 0a 20 2a 0a 20 2a 20 57 61 69 74 46 6f 72 53 6f  . *. * WaitForSo
12780 63 6b 65 74 45 76 65 6e 74 20 2d 2d 0a 20 2a 0a  cketEvent --. *.
12790 20 2a 09 57 61 69 74 73 20 75 6e 74 69 6c 20 6f   *.Waits until o
127a0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 66  ne of the specif
127b0 69 65 64 20 65 76 65 6e 74 73 20 6f 63 63 75 72  ied events occur
127c0 73 20 6f 6e 20 61 20 73 6f 63 6b 65 74 2e 0a 20  s on a socket.. 
127d0 2a 09 46 6f 72 20 65 76 65 6e 74 20 46 44 5f 43  *.For event FD_C
127e0 4f 4e 4e 45 43 54 20 75 73 65 20 57 61 69 74 46  ONNECT use WaitF
127f0 6f 72 43 6f 6e 6e 65 63 74 2e 0a 20 2a 0a 20 2a  orConnect.. *. *
12800 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74   Results:. *.Ret
12810 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73  urns 1 on succes
12820 73 20 6f 72 20 30 20 6f 6e 20 66 61 69 6c 75 72  s or 0 on failur
12830 65 2c 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  e, with an error
12840 20 63 6f 64 65 20 69 6e 0a 20 2a 09 65 72 72 6f   code in. *.erro
12850 72 43 6f 64 65 50 74 72 2e 0a 20 2a 0a 20 2a 20  rCodePtr.. *. * 
12860 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
12870 09 50 72 6f 63 65 73 73 65 73 20 73 6f 63 6b 65  .Processes socke
12880 74 20 65 76 65 6e 74 73 20 6f 66 66 20 74 68 65  t events off the
12890 20 73 79 73 74 65 6d 20 71 75 65 75 65 2e 0a 20   system queue.. 
128a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
128b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
128f0 73 74 61 74 69 63 20 69 6e 74 0a 57 61 69 74 46  static int.WaitF
12900 6f 72 53 6f 63 6b 65 74 45 76 65 6e 74 28 0a 20  orSocketEvent(. 
12910 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74 61     TcpState *sta
12920 74 65 50 74 72 2c 09 09 2f 2a 20 49 6e 66 6f 72  tePtr,../* Infor
12930 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
12940 73 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 20 20 20  s socket. */.   
12950 20 69 6e 74 20 65 76 65 6e 74 73 2c 09 09 09 2f   int events,.../
12960 2a 20 45 76 65 6e 74 73 20 74 6f 20 6c 6f 6f 6b  * Events to look
12970 20 66 6f 72 2e 20 4d 61 79 20 62 65 20 6f 6e 65   for. May be one
12980 20 6f 66 0a 09 09 09 09 20 2a 20 46 44 5f 52 45   of..... * FD_RE
12990 41 44 20 6f 72 20 46 44 5f 57 52 49 54 45 2e 20  AD or FD_WRITE. 
129a0 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f  */.    int *erro
129b0 72 43 6f 64 65 50 74 72 29 09 09 2f 2a 20 57 68  rCodePtr)../* Wh
129c0 65 72 65 20 74 6f 20 73 74 6f 72 65 20 65 72 72  ere to store err
129d0 6f 72 73 3f 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e  ors? */.{.    in
129e0 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20  t result = 1;.  
129f0 20 20 69 6e 74 20 6f 6c 64 4d 6f 64 65 3b 0a 20    int oldMode;. 
12a00 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69     ThreadSpecifi
12a10 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20  cData *tsdPtr = 
12a20 28 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44  (ThreadSpecificD
12a30 61 74 61 20 2a 29 0a 09 20 20 20 20 54 63 6c 54  ata *)..    TclT
12a40 68 72 65 61 64 44 61 74 61 4b 65 79 47 65 74 28  hreadDataKeyGet(
12a50 26 64 61 74 61 4b 65 79 29 3b 0a 0a 20 20 20 20  &dataKey);..    
12a60 2f 2a 0a 20 20 20 20 20 2a 20 42 65 20 73 75 72  /*.     * Be sur
12a70 65 20 74 6f 20 64 69 73 61 62 6c 65 20 65 76 65  e to disable eve
12a80 6e 74 20 73 65 72 76 69 63 69 6e 67 20 73 6f 20  nt servicing so 
12a90 77 65 20 61 72 65 20 74 72 75 6c 79 20 6d 6f 64  we are truly mod
12aa0 61 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  al..     */..   
12ab0 20 6f 6c 64 4d 6f 64 65 20 3d 20 54 63 6c 5f 53   oldMode = Tcl_S
12ac0 65 74 53 65 72 76 69 63 65 4d 6f 64 65 28 54 43  etServiceMode(TC
12ad0 4c 5f 53 45 52 56 49 43 45 5f 4e 4f 4e 45 29 3b  L_SERVICE_NONE);
12ae0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
12af0 52 65 73 65 74 20 57 53 41 41 73 79 6e 63 53 65  Reset WSAAsyncSe
12b00 6c 65 63 74 20 73 6f 20 77 65 20 68 61 76 65 20  lect so we have 
12b10 61 20 66 72 65 73 68 20 73 65 74 20 6f 66 20 65  a fresh set of e
12b20 76 65 6e 74 73 20 70 65 6e 64 69 6e 67 2e 0a 20  vents pending.. 
12b30 20 20 20 20 2a 2f 0a 0a 20 20 20 20 53 65 6e 64      */..    Send
12b40 53 65 6c 65 63 74 4d 65 73 73 61 67 65 28 74 73  SelectMessage(ts
12b50 64 50 74 72 2c 20 55 4e 53 45 4c 45 43 54 2c 20  dPtr, UNSELECT, 
12b60 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53  statePtr);.    S
12b70 65 6e 64 53 65 6c 65 63 74 4d 65 73 73 61 67 65  endSelectMessage
12b80 28 74 73 64 50 74 72 2c 20 53 45 4c 45 43 54 2c  (tsdPtr, SELECT,
12b90 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
12ba0 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 69 6e   while (1) {..in
12bb0 74 20 65 76 65 6e 74 5f 66 6f 75 6e 64 3b 0a 0a  t event_found;..
12bc0 09 2f 2a 0a 09 20 2a 20 47 65 74 20 73 74 61 74  ./*.. * Get stat
12bd0 65 50 74 72 20 6c 6f 63 6b 2e 0a 09 20 2a 2f 0a  ePtr lock... */.
12be0 0a 09 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  ..WaitForSingleO
12bf0 62 6a 65 63 74 28 74 73 64 50 74 72 2d 3e 73 6f  bject(tsdPtr->so
12c00 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e  cketListLock, IN
12c10 46 49 4e 49 54 45 29 3b 0a 0a 09 2f 2a 0a 09 20  FINITE);.../*.. 
12c20 2a 20 43 68 65 63 6b 20 69 66 20 65 76 65 6e 74  * Check if event
12c30 20 6f 63 63 75 72 72 65 64 2e 0a 09 20 2a 2f 0a   occurred... */.
12c40 0a 09 65 76 65 6e 74 5f 66 6f 75 6e 64 20 3d 20  ..event_found = 
12c50 47 4f 54 5f 42 49 54 53 28 73 74 61 74 65 50 74  GOT_BITS(statePt
12c60 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 73 2c 20  r->readyEvents, 
12c70 65 76 65 6e 74 73 29 3b 0a 0a 09 2f 2a 0a 09 20  events);.../*.. 
12c80 2a 20 46 72 65 65 20 6c 69 73 74 20 6c 6f 63 6b  * Free list lock
12c90 2e 0a 09 20 2a 2f 0a 0a 09 53 65 74 45 76 65 6e  ... */...SetEven
12ca0 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74  t(tsdPtr->socket
12cb0 4c 69 73 74 4c 6f 63 6b 29 3b 0a 0a 09 2f 2a 0a  ListLock);.../*.
12cc0 09 20 2a 20 45 78 69 74 20 6c 6f 6f 70 20 69 66  . * Exit loop if
12cd0 20 65 76 65 6e 74 20 6f 63 63 75 72 72 65 64 2e   event occurred.
12ce0 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 65 76 65 6e  .. */...if (even
12cf0 74 5f 66 6f 75 6e 64 29 20 7b 0a 09 20 20 20 20  t_found) {..    
12d00 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  break;..}.../*..
12d10 20 2a 20 45 78 69 74 20 6c 6f 6f 70 20 69 66 20   * Exit loop if 
12d20 65 76 65 6e 74 20 64 69 64 20 6e 6f 74 20 6f 63  event did not oc
12d30 63 75 72 20 62 75 74 20 74 68 69 73 20 69 73 20  cur but this is 
12d40 61 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 63  a non-blocking c
12d50 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 0a 09 69 66  hannel.. */...if
12d60 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67   (statePtr->flag
12d70 73 20 26 20 54 43 50 5f 4e 4f 4e 42 4c 4f 43 4b  s & TCP_NONBLOCK
12d80 49 4e 47 29 20 7b 0a 09 20 20 20 20 2a 65 72 72  ING) {..    *err
12d90 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 57 4f 55  orCodePtr = EWOU
12da0 4c 44 42 4c 4f 43 4b 3b 0a 09 20 20 20 20 72 65  LDBLOCK;..    re
12db0 73 75 6c 74 20 3d 20 30 3b 0a 09 20 20 20 20 62  sult = 0;..    b
12dc0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  reak;..}.../*.. 
12dd0 2a 20 57 61 69 74 20 75 6e 74 69 6c 20 73 6f 6d  * Wait until som
12de0 65 74 68 69 6e 67 20 68 61 70 70 65 6e 73 2e 0a  ething happens..
12df0 09 20 2a 2f 0a 0a 09 57 61 69 74 46 6f 72 53 69  . */...WaitForSi
12e00 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50 74  ngleObject(tsdPt
12e10 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 2c 20 49  r->readyEvent, I
12e20 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 20 7d 0a  NFINITE);.    }.
12e30 0a 20 20 20 20 28 76 6f 69 64 29 20 54 63 6c 5f  .    (void) Tcl_
12e40 53 65 74 53 65 72 76 69 63 65 4d 6f 64 65 28 6f  SetServiceMode(o
12e50 6c 64 4d 6f 64 65 29 3b 0a 20 20 20 20 72 65 74  ldMode);.    ret
12e60 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a  urn result;.}...
12e70 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
12e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
12ec0 2a 20 53 6f 63 6b 65 74 54 68 72 65 61 64 20 2d  * SocketThread -
12ed0 2d 0a 20 2a 0a 20 2a 09 48 65 6c 70 65 72 20 74  -. *. *.Helper t
12ee0 68 72 65 61 64 20 75 73 65 64 20 74 6f 20 6d 61  hread used to ma
12ef0 6e 61 67 65 20 74 68 65 20 73 6f 63 6b 65 74 20  nage the socket 
12f00 65 76 65 6e 74 20 68 61 6e 64 6c 69 6e 67 20 77  event handling w
12f10 69 6e 64 6f 77 2e 0a 20 2a 0a 20 2a 20 52 65 73  indow.. *. * Res
12f20 75 6c 74 73 3a 0a 20 2a 09 31 20 69 66 20 75 6e  ults:. *.1 if un
12f30 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 73  able to create s
12f40 6f 63 6b 65 74 20 65 76 65 6e 74 20 77 69 6e 64  ocket event wind
12f50 6f 77 2c 20 30 20 6f 74 68 65 72 77 69 73 65 2e  ow, 0 otherwise.
12f60 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
12f70 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
12f80 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
12fd0 74 61 74 69 63 20 44 57 4f 52 44 20 57 49 4e 41  tatic DWORD WINA
12fe0 50 49 0a 53 6f 63 6b 65 74 54 68 72 65 61 64 28  PI.SocketThread(
12ff0 0a 20 20 20 20 4c 50 56 4f 49 44 20 61 72 67 29  .    LPVOID arg)
13000 0a 7b 0a 20 20 20 20 4d 53 47 20 6d 73 67 3b 0a  .{.    MSG msg;.
13010 20 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66      ThreadSpecif
13020 69 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d  icData *tsdPtr =
13030 20 28 54 68 72 65 61 64 53 70 65 63 69 66 69 63   (ThreadSpecific
13040 44 61 74 61 20 2a 29 61 72 67 3b 0a 0a 20 20 20  Data *)arg;..   
13050 20 2f 2a 0a 20 20 20 20 20 2a 20 43 72 65 61 74   /*.     * Creat
13060 65 20 61 20 64 75 6d 6d 79 20 77 69 6e 64 6f 77  e a dummy window
13070 20 72 65 63 65 69 76 69 6e 67 20 73 6f 63 6b 65   receiving socke
13080 74 20 65 76 65 6e 74 73 2e 0a 20 20 20 20 20 2a  t events..     *
13090 2f 0a 0a 20 20 20 20 74 73 64 50 74 72 2d 3e 68  /..    tsdPtr->h
130a0 77 6e 64 20 3d 20 43 72 65 61 74 65 57 69 6e 64  wnd = CreateWind
130b0 6f 77 57 28 63 6c 61 73 73 4e 61 6d 65 2c 20 63  owW(className, c
130c0 6c 61 73 73 4e 61 6d 65 2c 20 57 53 5f 54 49 4c  lassName, WS_TIL
130d0 45 44 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a  ED, 0, 0, 0, 0,.
130e0 09 20 20 20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  .    NULL, NULL,
130f0 20 77 69 6e 64 6f 77 43 6c 61 73 73 2e 68 49 6e   windowClass.hIn
13100 73 74 61 6e 63 65 2c 20 61 72 67 29 3b 0a 0a 20  stance, arg);.. 
13110 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 69 67     /*.     * Sig
13120 6e 61 6c 69 7a 65 20 74 68 72 65 61 64 20 63 72  nalize thread cr
13130 65 61 74 6f 72 20 74 68 61 74 20 77 65 20 61 72  eator that we ar
13140 65 20 64 6f 6e 65 20 63 72 65 61 74 69 6e 67 20  e done creating 
13150 74 68 65 20 77 69 6e 64 6f 77 2e 0a 20 20 20 20  the window..    
13160 20 2a 2f 0a 0a 20 20 20 20 53 65 74 45 76 65 6e   */..    SetEven
13170 74 28 74 73 64 50 74 72 2d 3e 72 65 61 64 79 45  t(tsdPtr->readyE
13180 76 65 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  vent);..    /*. 
13190 20 20 20 20 2a 20 49 66 20 75 6e 61 62 6c 65 20      * If unable 
131a0 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 77 69  to create the wi
131b0 6e 64 6f 77 2c 20 65 78 69 74 20 74 68 69 73 20  ndow, exit this 
131c0 74 68 72 65 61 64 20 69 6d 6d 65 64 69 61 74 65  thread immediate
131d0 6c 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ly..     */..   
131e0 20 69 66 20 28 74 73 64 50 74 72 2d 3e 68 77 6e   if (tsdPtr->hwn
131f0 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  d == NULL) {..re
13200 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
13210 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 50 72 6f     /*.     * Pro
13220 63 65 73 73 20 61 6c 6c 20 6d 65 73 73 61 67 65  cess all message
13230 73 20 6f 6e 20 74 68 65 20 73 6f 63 6b 65 74 20  s on the socket 
13240 77 69 6e 64 6f 77 20 75 6e 74 69 6c 20 57 4d 5f  window until WM_
13250 51 55 49 54 2e 20 54 68 69 73 20 74 68 72 65 61  QUIT. This threa
13260 64 73 0a 20 20 20 20 20 2a 20 65 78 69 74 73 20  ds.     * exits 
13270 6f 6e 6c 79 20 77 68 65 6e 20 69 6e 73 74 72 75  only when instru
13280 63 74 65 64 20 74 6f 20 64 6f 20 73 6f 20 62 79  cted to do so by
13290 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20   the call to.   
132a0 20 20 2a 20 50 6f 73 74 4d 65 73 73 61 67 65 57    * PostMessageW
132b0 28 53 4f 43 4b 45 54 5f 54 45 52 4d 49 4e 41 54  (SOCKET_TERMINAT
132c0 45 29 20 69 6e 20 54 63 6c 70 46 69 6e 61 6c 69  E) in TclpFinali
132d0 7a 65 53 6f 63 6b 65 74 73 28 29 2e 0a 20 20 20  zeSockets()..   
132e0 20 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 20    */..    while 
132f0 28 47 65 74 4d 65 73 73 61 67 65 57 28 26 6d 73  (GetMessageW(&ms
13300 67 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3e  g, NULL, 0, 0) >
13310 20 30 29 20 7b 0a 09 44 69 73 70 61 74 63 68 4d   0) {..DispatchM
13320 65 73 73 61 67 65 57 28 26 6d 73 67 29 3b 0a 20  essageW(&msg);. 
13330 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
13340 20 20 2a 20 54 68 69 73 20 72 65 6c 65 61 73 65    * This release
13350 73 20 77 61 69 74 65 72 73 20 6f 6e 20 74 68 72  s waiters on thr
13360 65 61 64 20 65 78 69 74 20 69 6e 20 54 63 6c 70  ead exit in Tclp
13370 46 69 6e 61 6c 69 7a 65 53 6f 63 6b 65 74 73 28  FinalizeSockets(
13380 29 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 53  ).     */..    S
13390 65 74 45 76 65 6e 74 28 74 73 64 50 74 72 2d 3e  etEvent(tsdPtr->
133a0 72 65 61 64 79 45 76 65 6e 74 29 3b 0a 0a 20 20  readyEvent);..  
133b0 20 20 72 65 74 75 72 6e 20 28 44 57 4f 52 44 29    return (DWORD)
133c0 6d 73 67 2e 77 50 61 72 61 6d 3b 0a 7d 0a 0c 0a  msg.wParam;.}...
133d0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
133e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
13420 2a 20 53 6f 63 6b 65 74 50 72 6f 63 20 2d 2d 0a  * SocketProc --.
13430 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
13440 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
13450 65 6e 20 57 53 41 41 73 79 6e 63 53 65 6c 65 63  en WSAAsyncSelec
13460 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  t has been used 
13470 74 6f 20 72 65 67 69 73 74 65 72 0a 20 2a 09 69  to register. *.i
13480 6e 74 65 72 65 73 74 20 69 6e 20 61 20 73 6f 63  nterest in a soc
13490 6b 65 74 20 65 76 65 6e 74 2c 20 61 6e 64 20 74  ket event, and t
134a0 68 65 20 65 76 65 6e 74 20 68 61 73 20 6f 63 63  he event has occ
134b0 75 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  urred.. *. * Res
134c0 75 6c 74 73 3a 0a 20 2a 09 30 20 6f 6e 20 73 75  ults:. *.0 on su
134d0 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 20 53 69 64  ccess.. *. * Sid
134e0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68  e effects:. *.Th
134f0 65 20 66 6c 61 67 73 20 66 6f 72 20 74 68 65 20  e flags for the 
13500 67 69 76 65 6e 20 73 6f 63 6b 65 74 20 61 72 65  given socket are
13510 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
13520 65 63 74 20 74 68 65 20 65 76 65 6e 74 20 74 68  ect the event th
13530 61 74 0a 20 2a 09 6f 63 63 75 72 72 65 64 2e 0a  at. *.occurred..
13540 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
13550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
13590 0a 73 74 61 74 69 63 20 4c 52 45 53 55 4c 54 20  .static LRESULT 
135a0 43 41 4c 4c 42 41 43 4b 0a 53 6f 63 6b 65 74 50  CALLBACK.SocketP
135b0 72 6f 63 28 0a 20 20 20 20 48 57 4e 44 20 68 77  roc(.    HWND hw
135c0 6e 64 2c 0a 20 20 20 20 55 49 4e 54 20 6d 65 73  nd,.    UINT mes
135d0 73 61 67 65 2c 0a 20 20 20 20 57 50 41 52 41 4d  sage,.    WPARAM
135e0 20 77 50 61 72 61 6d 2c 0a 20 20 20 20 4c 50 41   wParam,.    LPA
135f0 52 41 4d 20 6c 50 61 72 61 6d 29 0a 7b 0a 20 20  RAM lParam).{.  
13600 20 20 69 6e 74 20 65 76 65 6e 74 2c 20 65 72 72    int event, err
13610 6f 72 3b 0a 20 20 20 20 53 4f 43 4b 45 54 20 73  or;.    SOCKET s
13620 6f 63 6b 65 74 3b 0a 20 20 20 20 54 63 70 53 74  ocket;.    TcpSt
13630 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
13640 20 20 20 69 6e 74 20 69 6e 66 6f 5f 66 6f 75 6e     int info_foun
13650 64 20 3d 20 30 3b 0a 20 20 20 20 54 63 70 46 64  d = 0;.    TcpFd
13660 4c 69 73 74 20 2a 66 64 73 20 3d 20 4e 55 4c 4c  List *fds = NULL
13670 3b 0a 20 20 20 20 54 68 72 65 61 64 53 70 65 63  ;.    ThreadSpec
13680 69 66 69 63 44 61 74 61 20 2a 74 73 64 50 74 72  ificData *tsdPtr
13690 20 3d 20 28 54 68 72 65 61 64 53 70 65 63 69 66   = (ThreadSpecif
136a0 69 63 44 61 74 61 20 2a 29 0a 23 69 66 64 65 66  icData *).#ifdef
136b0 20 5f 57 49 4e 36 34 0a 09 20 20 20 20 47 65 74   _WIN64..    Get
136c0 57 69 6e 64 6f 77 4c 6f 6e 67 50 74 72 57 28 68  WindowLongPtrW(h
136d0 77 6e 64 2c 20 47 57 4c 50 5f 55 53 45 52 44 41  wnd, GWLP_USERDA
136e0 54 41 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  TA);.#else..    
136f0 47 65 74 57 69 6e 64 6f 77 4c 6f 6e 67 57 28 68  GetWindowLongW(h
13700 77 6e 64 2c 20 47 57 4c 5f 55 53 45 52 44 41 54  wnd, GWL_USERDAT
13710 41 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  A);.#endif..    
13720 73 77 69 74 63 68 20 28 6d 65 73 73 61 67 65 29  switch (message)
13730 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a   {.    default:.
13740 09 72 65 74 75 72 6e 20 44 65 66 57 69 6e 64 6f  .return DefWindo
13750 77 50 72 6f 63 57 28 68 77 6e 64 2c 20 6d 65 73  wProcW(hwnd, mes
13760 73 61 67 65 2c 20 77 50 61 72 61 6d 2c 20 6c 50  sage, wParam, lP
13770 61 72 61 6d 29 3b 0a 09 62 72 65 61 6b 3b 0a 0a  aram);..break;..
13780 20 20 20 20 63 61 73 65 20 57 4d 5f 43 52 45 41      case WM_CREA
13790 54 45 3a 0a 09 2f 2a 0a 09 20 2a 20 53 74 6f 72  TE:../*.. * Stor
137a0 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20 74 73  e the initial ts
137b0 64 50 74 72 2c 20 69 74 27 73 20 66 72 6f 6d 20  dPtr, it's from 
137c0 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
137d0 61 64 2c 20 73 6f 20 69 74 27 73 20 6e 6f 74 0a  ad, so it's not.
137e0 09 20 2a 20 64 69 72 65 63 74 6c 79 20 61 63 63  . * directly acc
137f0 65 73 73 69 62 6c 65 2c 20 62 75 74 20 6e 65 65  essible, but nee
13800 64 65 64 2e 0a 09 20 2a 2f 0a 0a 23 69 66 64 65  ded... */..#ifde
13810 66 20 5f 57 49 4e 36 34 0a 09 53 65 74 57 69 6e  f _WIN64..SetWin
13820 64 6f 77 4c 6f 6e 67 50 74 72 57 28 68 77 6e 64  dowLongPtrW(hwnd
13830 2c 20 47 57 4c 50 5f 55 53 45 52 44 41 54 41 2c  , GWLP_USERDATA,
13840 0a 09 09 28 4c 4f 4e 47 5f 50 54 52 29 20 28 28  ...(LONG_PTR) ((
13850 4c 50 43 52 45 41 54 45 53 54 52 55 43 54 29 6c  LPCREATESTRUCT)l
13860 50 61 72 61 6d 29 2d 3e 6c 70 43 72 65 61 74 65  Param)->lpCreate
13870 50 61 72 61 6d 73 29 3b 0a 23 65 6c 73 65 0a 09  Params);.#else..
13880 53 65 74 57 69 6e 64 6f 77 4c 6f 6e 67 57 28 68  SetWindowLongW(h
13890 77 6e 64 2c 20 47 57 4c 5f 55 53 45 52 44 41 54  wnd, GWL_USERDAT
138a0 41 2c 0a 09 09 28 4c 4f 4e 47 29 20 28 28 4c 50  A,...(LONG) ((LP
138b0 43 52 45 41 54 45 53 54 52 55 43 54 29 6c 50 61  CREATESTRUCT)lPa
138c0 72 61 6d 29 2d 3e 6c 70 43 72 65 61 74 65 50 61  ram)->lpCreatePa
138d0 72 61 6d 73 29 3b 0a 23 65 6e 64 69 66 0a 09 62  rams);.#endif..b
138e0 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
138f0 57 4d 5f 44 45 53 54 52 4f 59 3a 0a 09 50 6f 73  WM_DESTROY:..Pos
13900 74 51 75 69 74 4d 65 73 73 61 67 65 28 30 29 3b  tQuitMessage(0);
13910 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61  ..break;..    ca
13920 73 65 20 53 4f 43 4b 45 54 5f 4d 45 53 53 41 47  se SOCKET_MESSAG
13930 45 3a 0a 09 65 76 65 6e 74 20 3d 20 57 53 41 47  E:..event = WSAG
13940 45 54 53 45 4c 45 43 54 45 56 45 4e 54 28 6c 50  ETSELECTEVENT(lP
13950 61 72 61 6d 29 3b 0a 09 65 72 72 6f 72 20 3d 20  aram);..error = 
13960 57 53 41 47 45 54 53 45 4c 45 43 54 45 52 52 4f  WSAGETSELECTERRO
13970 52 28 6c 50 61 72 61 6d 29 3b 0a 09 73 6f 63 6b  R(lParam);..sock
13980 65 74 20 3d 20 28 53 4f 43 4b 45 54 29 20 77 50  et = (SOCKET) wP
13990 61 72 61 6d 3b 0a 0a 09 57 61 69 74 46 6f 72 53  aram;...WaitForS
139a0 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64 50  ingleObject(tsdP
139b0 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f  tr->socketListLo
139c0 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 0a  ck, INFINITE);..
139d0 09 2f 2a 0a 09 20 2a 20 46 69 6e 64 20 74 68 65  ./*.. * Find the
139e0 20 73 70 65 63 69 66 69 65 64 20 73 6f 63 6b 65   specified socke
139f0 74 20 6f 6e 20 74 68 65 20 73 6f 63 6b 65 74 20  t on the socket 
13a00 6c 69 73 74 20 61 6e 64 20 75 70 64 61 74 65 20  list and update 
13a10 69 74 73 0a 09 20 2a 20 65 76 65 6e 74 53 74 61  its.. * eventSta
13a20 74 65 20 66 6c 61 67 2e 0a 09 20 2a 2f 0a 0a 09  te flag... */...
13a30 66 6f 72 20 28 73 74 61 74 65 50 74 72 20 3d 20  for (statePtr = 
13a40 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
13a50 73 74 3b 20 73 74 61 74 65 50 74 72 20 21 3d 20  st; statePtr != 
13a60 4e 55 4c 4c 3b 0a 09 09 73 74 61 74 65 50 74 72  NULL;...statePtr
13a70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 6e 65 78   = statePtr->nex
13a80 74 50 74 72 29 20 7b 0a 09 20 20 20 20 69 66 20  tPtr) {..    if 
13a90 28 46 69 6e 64 46 44 49 6e 4c 69 73 74 28 73 74  (FindFDInList(st
13aa0 61 74 65 50 74 72 2c 20 73 6f 63 6b 65 74 29 29  atePtr, socket))
13ab0 20 7b 0a 09 09 69 6e 66 6f 5f 66 6f 75 6e 64 20   {...info_found 
13ac0 3d 20 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  = 1;...break;.. 
13ad0 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a     }..}.../*.. *
13ae0 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   Check if there 
13af0 69 73 20 61 20 70 65 6e 64 69 6e 67 20 69 6e 66  is a pending inf
13b00 6f 20 73 74 72 75 63 74 75 72 65 20 6e 6f 74 20  o structure not 
13b10 6a 65 74 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  jet in the list.
13b20 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21 69 6e 66  .. */...if (!inf
13b30 6f 5f 66 6f 75 6e 64 0a 09 09 26 26 20 74 73 64  o_found...&& tsd
13b40 50 74 72 2d 3e 70 65 6e 64 69 6e 67 54 63 70 53  Ptr->pendingTcpS
13b50 74 61 74 65 20 21 3d 20 4e 55 4c 4c 0a 09 09 26  tate != NULL...&
13b60 26 20 46 69 6e 64 46 44 49 6e 4c 69 73 74 28 74  & FindFDInList(t
13b70 73 64 50 74 72 2d 3e 70 65 6e 64 69 6e 67 54 63  sdPtr->pendingTc
13b80 70 53 74 61 74 65 2c 20 73 6f 63 6b 65 74 29 29  pState, socket))
13b90 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
13ba0 20 3d 20 74 73 64 50 74 72 2d 3e 70 65 6e 64 69   = tsdPtr->pendi
13bb0 6e 67 54 63 70 53 74 61 74 65 3b 0a 09 20 20 20  ngTcpState;..   
13bc0 20 69 6e 66 6f 5f 66 6f 75 6e 64 20 3d 20 31 3b   info_found = 1;
13bd0 0a 09 7d 0a 09 69 66 20 28 69 6e 66 6f 5f 66 6f  ..}..if (info_fo
13be0 75 6e 64 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  und) {..    /*..
13bf0 20 20 20 20 20 2a 20 55 70 64 61 74 65 20 74 68       * Update th
13c00 65 20 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 0a  e socket state..
13c10 09 20 20 20 20 20 2a 0a 09 20 20 20 20 20 2a 20  .     *..     * 
13c20 41 20 63 6f 75 6e 74 20 6f 66 20 46 44 5f 41 43  A count of FD_AC
13c30 43 45 50 54 53 20 69 73 20 73 74 6f 72 65 64 2c  CEPTS is stored,
13c40 20 73 6f 20 69 66 20 61 6e 20 46 44 5f 43 4c 4f   so if an FD_CLO
13c50 53 45 20 65 76 65 6e 74 0a 09 20 20 20 20 20 2a  SE event..     *
13c60 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 63   happens, then c
13c70 6c 65 61 72 20 74 68 65 20 46 44 5f 41 43 43 45  lear the FD_ACCE
13c80 50 54 20 63 6f 75 6e 74 2e 20 4f 74 68 65 72 77  PT count. Otherw
13c90 69 73 65 2c 20 69 6e 63 72 65 6d 65 6e 74 0a 09  ise, increment..
13ca0 20 20 20 20 20 2a 20 74 68 65 20 63 6f 75 6e 74       * the count
13cb0 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
13cc0 65 76 65 6e 74 20 69 73 20 61 6e 20 46 44 5f 41  event is an FD_A
13cd0 43 43 45 50 54 2e 0a 09 20 20 20 20 20 2a 2f 0a  CCEPT...     */.
13ce0 0a 09 20 20 20 20 69 66 20 28 47 4f 54 5f 42 49  ..    if (GOT_BI
13cf0 54 53 28 65 76 65 6e 74 2c 20 46 44 5f 43 4c 4f  TS(event, FD_CLO
13d00 53 45 29 29 20 7b 0a 09 09 73 74 61 74 65 50 74  SE)) {...statePt
13d10 72 2d 3e 61 63 63 65 70 74 45 76 65 6e 74 43 6f  r->acceptEventCo
13d20 75 6e 74 20 3d 20 30 3b 0a 09 09 43 4c 45 41 52  unt = 0;...CLEAR
13d30 5f 42 49 54 53 28 73 74 61 74 65 50 74 72 2d 3e  _BITS(statePtr->
13d40 72 65 61 64 79 45 76 65 6e 74 73 2c 20 46 44 5f  readyEvents, FD_
13d50 57 52 49 54 45 20 7c 20 46 44 5f 41 43 43 45 50  WRITE | FD_ACCEP
13d60 54 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  T);..    } else 
13d70 69 66 20 28 47 4f 54 5f 42 49 54 53 28 65 76 65  if (GOT_BITS(eve
13d80 6e 74 2c 20 46 44 5f 41 43 43 45 50 54 29 29 20  nt, FD_ACCEPT)) 
13d90 7b 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 61 63  {...statePtr->ac
13da0 63 65 70 74 45 76 65 6e 74 43 6f 75 6e 74 2b 2b  ceptEventCount++
13db0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
13dc0 66 20 28 47 4f 54 5f 42 49 54 53 28 65 76 65 6e  f (GOT_BITS(even
13dd0 74 2c 20 46 44 5f 43 4f 4e 4e 45 43 54 29 29 20  t, FD_CONNECT)) 
13de0 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 52 65 6d 65  {.../*... * Reme
13df0 6d 62 65 72 20 61 6e 79 20 65 72 72 6f 72 20 74  mber any error t
13e00 68 61 74 20 6f 63 63 75 72 72 65 64 20 73 6f 20  hat occurred so 
13e10 77 65 20 63 61 6e 20 72 65 70 6f 72 74 0a 09 09  we can report...
13e20 20 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 61   * connection fa
13e30 69 6c 75 72 65 73 2e 0a 09 09 20 2a 2f 0a 0a 09  ilures.... */...
13e40 09 69 66 20 28 65 72 72 6f 72 20 21 3d 20 45 52  .if (error != ER
13e50 52 4f 52 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  ROR_SUCCESS) {..
13e60 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 6e  .    statePtr->n
13e70 6f 74 69 66 69 65 72 43 6f 6e 6e 65 63 74 45 72  otifierConnectEr
13e80 72 6f 72 20 3d 20 65 72 72 6f 72 3b 0a 09 09 7d  ror = error;...}
13e90 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a  ..    }...    /*
13ea0 0a 09 20 20 20 20 20 2a 20 49 6e 66 6f 72 6d 20  ..     * Inform 
13eb0 6d 61 69 6e 20 74 68 72 65 61 64 20 61 62 6f 75  main thread abou
13ec0 74 20 73 69 67 6e 61 6c 65 64 20 65 76 65 6e 74  t signaled event
13ed0 73 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  s..     */...   
13ee0 20 53 45 54 5f 42 49 54 53 28 73 74 61 74 65 50   SET_BITS(stateP
13ef0 74 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 73 2c  tr->readyEvents,
13f00 20 65 76 65 6e 74 29 3b 0a 0a 09 20 20 20 20 2f   event);...    /
13f10 2a 0a 09 20 20 20 20 20 2a 20 57 61 6b 65 20 75  *..     * Wake u
13f20 70 20 74 68 65 20 4d 61 69 6e 20 54 68 72 65 61  p the Main Threa
13f30 64 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  d...     */...  
13f40 20 20 53 65 74 45 76 65 6e 74 28 74 73 64 50 74    SetEvent(tsdPt
13f50 72 2d 3e 72 65 61 64 79 45 76 65 6e 74 29 3b 0a  r->readyEvent);.
13f60 09 20 20 20 20 54 63 6c 5f 54 68 72 65 61 64 41  .    Tcl_ThreadA
13f70 6c 65 72 74 28 74 73 64 50 74 72 2d 3e 74 68 72  lert(tsdPtr->thr
13f80 65 61 64 49 64 29 3b 0a 09 7d 0a 09 53 65 74 45  eadId);..}..SetE
13f90 76 65 6e 74 28 74 73 64 50 74 72 2d 3e 73 6f 63  vent(tsdPtr->soc
13fa0 6b 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a 09 62  ketListLock);..b
13fb0 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
13fc0 53 4f 43 4b 45 54 5f 53 45 4c 45 43 54 3a 0a 09  SOCKET_SELECT:..
13fd0 73 74 61 74 65 50 74 72 20 3d 20 28 54 63 70 53  statePtr = (TcpS
13fe0 74 61 74 65 20 2a 29 20 6c 50 61 72 61 6d 3b 0a  tate *) lParam;.
13ff0 09 66 6f 72 20 28 66 64 73 20 3d 20 73 74 61 74  .for (fds = stat
14000 65 50 74 72 2d 3e 73 6f 63 6b 65 74 73 3b 20 66  ePtr->sockets; f
14010 64 73 20 21 3d 20 4e 55 4c 4c 3b 20 66 64 73 20  ds != NULL; fds 
14020 3d 20 66 64 73 2d 3e 6e 65 78 74 29 20 7b 0a 09  = fds->next) {..
14030 20 20 20 20 69 66 20 28 77 50 61 72 61 6d 20 3d      if (wParam =
14040 3d 20 53 45 4c 45 43 54 29 20 7b 0a 09 09 57 53  = SELECT) {...WS
14050 41 41 73 79 6e 63 53 65 6c 65 63 74 28 66 64 73  AAsyncSelect(fds
14060 2d 3e 66 64 2c 20 68 77 6e 64 2c 0a 09 09 09 53  ->fd, hwnd,....S
14070 4f 43 4b 45 54 5f 4d 45 53 53 41 47 45 2c 20 73  OCKET_MESSAGE, s
14080 74 61 74 65 50 74 72 2d 3e 73 65 6c 65 63 74 45  tatePtr->selectE
14090 76 65 6e 74 73 29 3b 0a 09 20 20 20 20 7d 20 65  vents);..    } e
140a0 6c 73 65 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20  lse {.../*... * 
140b0 43 6c 65 61 72 20 74 68 65 20 73 65 6c 65 63 74  Clear the select
140c0 69 6f 6e 20 6d 61 73 6b 0a 09 09 20 2a 2f 0a 0a  ion mask... */..
140d0 09 09 57 53 41 41 73 79 6e 63 53 65 6c 65 63 74  ..WSAAsyncSelect
140e0 28 66 64 73 2d 3e 66 64 2c 20 68 77 6e 64 2c 20  (fds->fd, hwnd, 
140f0 30 2c 20 30 29 3b 0a 09 20 20 20 20 7d 0a 09 7d  0, 0);..    }..}
14100 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61  ..break;..    ca
14110 73 65 20 53 4f 43 4b 45 54 5f 54 45 52 4d 49 4e  se SOCKET_TERMIN
14120 41 54 45 3a 0a 09 44 65 73 74 72 6f 79 57 69 6e  ATE:..DestroyWin
14130 64 6f 77 28 68 77 6e 64 29 3b 0a 09 62 72 65 61  dow(hwnd);..brea
14140 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  k;.    }..    re
14150 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  turn 0;.}.../*. 
14160 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141a0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 69  -------. *. * Fi
141b0 6e 64 46 44 49 6e 4c 69 73 74 20 2d 2d 0a 20 2a  ndFDInList --. *
141c0 0a 20 2a 09 52 65 74 75 72 6e 20 74 72 75 65 2c  . *.Return true,
141d0 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 66 69   if the given fi
141e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
141f0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
14200 65 0a 20 2a 09 66 69 6c 65 20 64 65 73 63 72 69  e. *.file descri
14210 70 74 6f 72 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  ptor list.. *. *
14220 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 74 72 75   Results:. *.tru
14230 65 20 69 66 20 66 6f 75 6e 64 2e 0a 20 2a 0a 20  e if found.. *. 
14240 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
14250 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
142a0 0a 73 74 61 74 69 63 20 69 6e 74 0a 46 69 6e 64  .static int.Find
142b0 46 44 49 6e 4c 69 73 74 28 0a 20 20 20 20 54 63  FDInList(.    Tc
142c0 70 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  pState *statePtr
142d0 2c 0a 20 20 20 20 53 4f 43 4b 45 54 20 73 6f 63  ,.    SOCKET soc
142e0 6b 65 74 29 0a 7b 0a 20 20 20 20 54 63 70 46 64  ket).{.    TcpFd
142f0 4c 69 73 74 20 2a 66 64 73 3b 0a 20 20 20 20 66  List *fds;.    f
14300 6f 72 20 28 66 64 73 20 3d 20 73 74 61 74 65 50  or (fds = stateP
14310 74 72 2d 3e 73 6f 63 6b 65 74 73 3b 20 66 64 73  tr->sockets; fds
14320 20 21 3d 20 4e 55 4c 4c 3b 20 66 64 73 20 3d 20   != NULL; fds = 
14330 66 64 73 2d 3e 6e 65 78 74 29 20 7b 0a 09 69 66  fds->next) {..if
14340 20 28 66 64 73 2d 3e 66 64 20 3d 3d 20 73 6f 63   (fds->fd == soc
14350 6b 65 74 29 20 7b 0a 09 20 20 20 20 72 65 74 75  ket) {..    retu
14360 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  rn 1;..}.    }. 
14370 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c     return 0;.}..
14380 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
14390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
143a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
143b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
143c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
143d0 20 2a 20 54 63 70 54 68 72 65 61 64 41 63 74 69   * TcpThreadActi
143e0 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  onProc --. *. *.
143f0 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65  Insert or remove
14400 20 61 6e 79 20 74 68 72 65 61 64 20 6c 6f 63 61   any thread loca
14410 6c 20 72 65 66 73 20 74 6f 20 74 68 69 73 20 63  l refs to this c
14420 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
14430 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
14440 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
14450 74 73 3a 0a 20 2a 09 43 68 61 6e 67 65 73 20 74  ts:. *.Changes t
14460 68 72 65 61 64 20 6c 6f 63 61 6c 20 6c 69 73 74  hread local list
14470 20 6f 66 20 76 61 6c 69 64 20 63 68 61 6e 6e 65   of valid channe
14480 6c 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ls.. *. *-------
14490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
144d0 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
144e0 0a 54 63 70 54 68 72 65 61 64 41 63 74 69 6f 6e  .TcpThreadAction
144f0 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a  Proc(.    void *
14500 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20  instanceData,.  
14510 20 20 69 6e 74 20 61 63 74 69 6f 6e 29 0a 7b 0a    int action).{.
14520 20 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66      ThreadSpecif
14530 69 63 44 61 74 61 20 2a 74 73 64 50 74 72 3b 0a  icData *tsdPtr;.
14540 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74      TcpState *st
14550 61 74 65 50 74 72 20 3d 20 28 54 63 70 53 74 61  atePtr = (TcpSta
14560 74 65 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  te *)instanceDat
14570 61 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 69 66  a;.    int notif
14580 79 43 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 61  yCmd;..    if (a
14590 63 74 69 6f 6e 20 3d 3d 20 54 43 4c 5f 43 48 41  ction == TCL_CHA
145a0 4e 4e 45 4c 5f 54 48 52 45 41 44 5f 49 4e 53 45  NNEL_THREAD_INSE
145b0 52 54 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 45 6e  RT) {../*.. * En
145c0 73 75 72 65 20 74 68 61 74 20 73 6f 63 6b 65 74  sure that socket
145d0 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e   subsystem is in
145e0 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 74 68 69  itialized in thi
145f0 73 20 74 68 72 65 61 64 2c 20 6f 72 20 65 6c 73  s thread, or els
14600 65 0a 09 20 2a 20 73 6f 63 6b 65 74 73 20 77 69  e.. * sockets wi
14610 6c 6c 20 6e 6f 74 20 77 6f 72 6b 2e 0a 09 20 2a  ll not work... *
14620 2f 0a 0a 09 54 63 6c 49 6e 69 74 53 6f 63 6b 65  /...TclInitSocke
14630 74 73 28 29 3b 0a 0a 09 74 73 64 50 74 72 20 3d  ts();...tsdPtr =
14640 20 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64   TCL_TSD_INIT(&d
14650 61 74 61 4b 65 79 29 3b 0a 0a 09 57 61 69 74 46  ataKey);...WaitF
14660 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74  orSingleObject(t
14670 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73  sdPtr->socketLis
14680 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29  tLock, INFINITE)
14690 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 6e 65 78  ;..statePtr->nex
146a0 74 50 74 72 20 3d 20 74 73 64 50 74 72 2d 3e 73  tPtr = tsdPtr->s
146b0 6f 63 6b 65 74 4c 69 73 74 3b 0a 09 74 73 64 50  ocketList;..tsdP
146c0 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 20 3d  tr->socketList =
146d0 20 73 74 61 74 65 50 74 72 3b 0a 0a 09 69 66 20   statePtr;...if 
146e0 28 73 74 61 74 65 50 74 72 20 3d 3d 20 74 73 64  (statePtr == tsd
146f0 50 74 72 2d 3e 70 65 6e 64 69 6e 67 54 63 70 53  Ptr->pendingTcpS
14700 74 61 74 65 29 20 7b 0a 09 20 20 20 20 74 73 64  tate) {..    tsd
14710 50 74 72 2d 3e 70 65 6e 64 69 6e 67 54 63 70 53  Ptr->pendingTcpS
14720 74 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  tate = NULL;..}.
14730 0a 09 53 65 74 45 76 65 6e 74 28 74 73 64 50 74  ..SetEvent(tsdPt
14740 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63  r->socketListLoc
14750 6b 29 3b 0a 0a 09 6e 6f 74 69 66 79 43 6d 64 20  k);...notifyCmd 
14760 3d 20 53 45 4c 45 43 54 3b 0a 20 20 20 20 7d 20  = SELECT;.    } 
14770 65 6c 73 65 20 7b 0a 09 54 63 70 53 74 61 74 65  else {..TcpState
14780 20 2a 2a 6e 65 78 74 50 74 72 50 74 72 3b 0a 09   **nextPtrPtr;..
14790 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
147a0 0a 0a 09 74 73 64 50 74 72 20 3d 20 54 43 4c 5f  ...tsdPtr = TCL_
147b0 54 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65  TSD_INIT(&dataKe
147c0 79 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 54 49 50  y);.../*.. * TIP
147d0 20 23 32 31 38 2c 20 42 75 67 66 69 78 3a 20 41   #218, Bugfix: A
147e0 6c 6c 20 61 63 63 65 73 73 20 74 6f 20 73 6f 63  ll access to soc
147f0 6b 65 74 4c 69 73 74 20 68 61 73 20 74 6f 20 62  ketList has to b
14800 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 0a 09  e protected by..
14810 20 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 09 20 2a   * the lock... *
14820 2f 0a 0a 09 57 61 69 74 46 6f 72 53 69 6e 67 6c  /...WaitForSingl
14830 65 4f 62 6a 65 63 74 28 74 73 64 50 74 72 2d 3e  eObject(tsdPtr->
14840 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 2c 20  socketListLock, 
14850 49 4e 46 49 4e 49 54 45 29 3b 0a 09 66 6f 72 20  INFINITE);..for 
14860 28 6e 65 78 74 50 74 72 50 74 72 20 3d 20 26 28  (nextPtrPtr = &(
14870 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
14880 73 74 29 3b 20 28 2a 6e 65 78 74 50 74 72 50 74  st); (*nextPtrPt
14890 72 29 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 6e 65  r) != NULL;...ne
148a0 78 74 50 74 72 50 74 72 20 3d 20 26 28 28 2a 6e  xtPtrPtr = &((*n
148b0 65 78 74 50 74 72 50 74 72 29 2d 3e 6e 65 78 74  extPtrPtr)->next
148c0 50 74 72 29 29 20 7b 0a 09 20 20 20 20 69 66 20  Ptr)) {..    if 
148d0 28 28 2a 6e 65 78 74 50 74 72 50 74 72 29 20 3d  ((*nextPtrPtr) =
148e0 3d 20 73 74 61 74 65 50 74 72 29 20 7b 0a 09 09  = statePtr) {...
148f0 28 2a 6e 65 78 74 50 74 72 50 74 72 29 20 3d 20  (*nextPtrPtr) = 
14900 73 74 61 74 65 50 74 72 2d 3e 6e 65 78 74 50 74  statePtr->nextPt
14910 72 3b 0a 09 09 72 65 6d 6f 76 65 64 20 3d 20 31  r;...removed = 1
14920 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
14930 7d 0a 09 7d 0a 09 53 65 74 45 76 65 6e 74 28 74  }..}..SetEvent(t
14940 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73  sdPtr->socketLis
14950 74 4c 6f 63 6b 29 3b 0a 0a 09 2f 2a 0a 09 20 2a  tLock);.../*.. *
14960 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70   This could happ
14970 65 6e 20 69 66 20 74 68 65 20 63 68 61 6e 6e 65  en if the channe
14980 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 69 6e  l was created in
14990 20 6f 6e 65 20 74 68 72 65 61 64 20 61 6e 64 20   one thread and 
149a0 74 68 65 6e 0a 09 20 2a 20 6d 6f 76 65 64 20 74  then.. * moved t
149b0 6f 20 61 6e 6f 74 68 65 72 20 77 69 74 68 6f 75  o another withou
149c0 74 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  t updating the t
149d0 68 72 65 61 64 20 6c 6f 63 61 6c 20 64 61 74 61  hread local data
149e0 20 69 6e 20 65 61 63 68 0a 09 20 2a 20 74 68 72   in each.. * thr
149f0 65 61 64 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28  ead... */...if (
14a00 21 72 65 6d 6f 76 65 64 29 20 7b 0a 09 20 20 20  !removed) {..   
14a10 20 54 63 6c 5f 50 61 6e 69 63 28 22 66 69 6c 65   Tcl_Panic("file
14a20 20 69 6e 66 6f 20 70 74 72 20 6e 6f 74 20 6f 6e   info ptr not on
14a30 20 74 68 72 65 61 64 20 63 68 61 6e 6e 65 6c 20   thread channel 
14a40 6c 69 73 74 22 29 3b 0a 09 7d 0a 0a 09 6e 6f 74  list");..}...not
14a50 69 66 79 43 6d 64 20 3d 20 55 4e 53 45 4c 45 43  ifyCmd = UNSELEC
14a60 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  T;.    }..    /*
14a70 0a 20 20 20 20 20 2a 20 45 6e 73 75 72 65 20 74  .     * Ensure t
14a80 68 61 74 2c 20 6f 72 20 73 74 6f 70 2c 20 6e 6f  hat, or stop, no
14a90 74 69 66 69 63 61 74 69 6f 6e 73 20 66 6f 72 20  tifications for 
14aa0 74 68 65 20 73 6f 63 6b 65 74 20 6f 63 63 75 72  the socket occur
14ab0 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 20   in this.     * 
14ac0 74 68 72 65 61 64 2e 0a 20 20 20 20 20 2a 2f 0a  thread..     */.
14ad0 0a 20 20 20 20 53 65 6e 64 53 65 6c 65 63 74 4d  .    SendSelectM
14ae0 65 73 73 61 67 65 28 74 73 64 50 74 72 2c 20 6e  essage(tsdPtr, n
14af0 6f 74 69 66 79 43 6d 64 2c 20 73 74 61 74 65 50  otifyCmd, stateP
14b00 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 4c  tr);.}.../*. * L
14b10 6f 63 61 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a  ocal Variables:.
14b20 20 2a 20 6d 6f 64 65 3a 20 63 0a 20 2a 20 63 2d   * mode: c. * c-
14b30 62 61 73 69 63 2d 6f 66 66 73 65 74 3a 20 34 0a  basic-offset: 4.
14b40 20 2a 20 66 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20   * fill-column: 
14b50 37 38 0a 20 2a 20 74 61 62 2d 77 69 64 74 68 3a  78. * tab-width:
14b60 20 38 0a 20 2a 20 69 6e 64 65 6e 74 2d 74 61 62   8. * indent-tab
14b70 73 2d 6d 6f 64 65 3a 20 6e 69 6c 0a 20 2a 20 45  s-mode: nil. * E
14b80 6e 64 3a 0a 20 2a 2f 0a                          nd:. */.