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:. */.