Artifact
50bf63f05507412a5fbd4695dd2e8b22305c8c83:
Attachment "halfclosesock.patch" to
ticket [219159ffff]
added by
ferrieux
2008-11-17 05:10:56.
0000: 49 6e 64 65 78 3a 20 77 69 6e 2f 74 63 6c 57 69 Index: win/tclWi
0010: 6e 53 6f 63 6b 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d nSock.c.========
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 ===========.RCS
0060: 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 file: /cvsroot/t
0070: 63 6c 2f 74 63 6c 2f 77 69 6e 2f 74 63 6c 57 69 cl/tcl/win/tclWi
0080: 6e 53 6f 63 6b 2e 63 2c 76 0a 72 65 74 72 69 65 nSock.c,v.retrie
0090: 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e ving revision 1.
00a0: 36 33 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e 36 63.diff -u -r1.6
00b0: 33 20 74 63 6c 57 69 6e 53 6f 63 6b 2e 63 0a 2d 3 tclWinSock.c.-
00c0: 2d 2d 20 77 69 6e 2f 74 63 6c 57 69 6e 53 6f 63 -- win/tclWinSoc
00d0: 6b 2e 63 09 32 36 20 4f 63 74 20 32 30 30 38 20 k.c.26 Oct 2008
00e0: 31 38 3a 34 33 3a 32 37 20 2d 30 30 30 30 09 31 18:43:27 -0000.1
00f0: 2e 36 33 0a 2b 2b 2b 20 77 69 6e 2f 74 63 6c 57 .63.+++ win/tclW
0100: 69 6e 53 6f 63 6b 2e 63 09 31 36 20 4e 6f 76 20 inSock.c.16 Nov
0110: 32 30 30 38 20 32 32 3a 30 35 3a 32 34 20 2d 30 2008 22:05:24 -0
0120: 30 30 30 0a 40 40 20 2d 31 36 38 2c 36 20 2b 31 000.@@ -168,6 +1
0130: 36 38 2c 37 20 40 40 0a 20 73 74 61 74 69 63 20 68,7 @@. static
0140: 54 63 6c 5f 45 76 65 6e 74 53 65 74 75 70 50 72 Tcl_EventSetupPr
0150: 6f 63 09 53 6f 63 6b 65 74 53 65 74 75 70 50 72 oc.SocketSetupPr
0160: 6f 63 3b 0a 20 73 74 61 74 69 63 20 54 63 6c 5f oc;. static Tcl_
0170: 44 72 69 76 65 72 42 6c 6f 63 6b 4d 6f 64 65 50 DriverBlockModeP
0180: 72 6f 63 09 54 63 70 42 6c 6f 63 6b 50 72 6f 63 roc.TcpBlockProc
0190: 3b 0a 20 73 74 61 74 69 63 20 54 63 6c 5f 44 72 ;. static Tcl_Dr
01a0: 69 76 65 72 43 6c 6f 73 65 50 72 6f 63 09 54 63 iverCloseProc.Tc
01b0: 70 43 6c 6f 73 65 50 72 6f 63 3b 0a 2b 73 74 61 pCloseProc;.+sta
01c0: 74 69 63 20 54 63 6c 5f 44 72 69 76 65 72 43 6c tic Tcl_DriverCl
01d0: 6f 73 65 32 50 72 6f 63 09 54 63 70 43 6c 6f 73 ose2Proc.TcpClos
01e0: 65 32 50 72 6f 63 3b 0a 20 73 74 61 74 69 63 20 e2Proc;. static
01f0: 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 Tcl_DriverSetOpt
0200: 69 6f 6e 50 72 6f 63 09 54 63 70 53 65 74 4f 70 ionProc.TcpSetOp
0210: 74 69 6f 6e 50 72 6f 63 3b 0a 20 73 74 61 74 69 tionProc;. stati
0220: 63 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f c Tcl_DriverGetO
0230: 70 74 69 6f 6e 50 72 6f 63 09 54 63 70 47 65 74 ptionProc.TcpGet
0240: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 20 73 74 61 OptionProc;. sta
0250: 74 69 63 20 54 63 6c 5f 44 72 69 76 65 72 49 6e tic Tcl_DriverIn
0260: 70 75 74 50 72 6f 63 09 54 63 70 49 6e 70 75 74 putProc.TcpInput
0270: 50 72 6f 63 3b 0a 40 40 20 2d 31 39 31 2c 37 20 Proc;.@@ -191,7
0280: 2b 31 39 32 2c 37 20 40 40 0a 20 20 20 20 20 54 +192,7 @@. T
0290: 63 70 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c cpGetOptionProc,
02a0: 09 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 . /* Get opti
02b0: 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 on proc. */.
02c0: 20 54 63 70 57 61 74 63 68 50 72 6f 63 2c 09 20 TcpWatchProc,.
02d0: 20 20 20 2f 2a 20 53 65 74 20 75 70 20 6e 6f 74 /* Set up not
02e0: 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 74 ifier to watch t
02f0: 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a his channel. */.
0300: 20 20 20 20 20 54 63 70 47 65 74 48 61 6e 64 6c TcpGetHandl
0310: 65 50 72 6f 63 2c 09 20 20 20 20 2f 2a 20 47 65 eProc,. /* Ge
0320: 74 20 61 6e 20 4f 53 20 68 61 6e 64 6c 65 20 66 t an OS handle f
0330: 72 6f 6d 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a rom channel. */.
0340: 2d 20 20 20 20 4e 55 4c 4c 2c 09 09 20 20 20 20 - NULL,..
0350: 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 2e 20 2a /* close2proc. *
0360: 2f 0a 2b 20 20 20 20 54 63 70 43 6c 6f 73 65 32 /.+ TcpClose2
0370: 50 72 6f 63 2c 09 20 20 20 20 2f 2a 20 43 6c 6f Proc,. /* Clo
0380: 73 65 32 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 se2proc. */.
0390: 20 54 63 70 42 6c 6f 63 6b 50 72 6f 63 2c 09 20 TcpBlockProc,.
03a0: 20 20 20 2f 2a 20 53 65 74 20 73 6f 63 6b 65 74 /* Set socket
03b0: 20 69 6e 74 6f 20 28 6e 6f 6e 2d 29 62 6c 6f 63 into (non-)bloc
03c0: 6b 69 6e 67 20 6d 6f 64 65 2e 20 2a 2f 0a 20 20 king mode. */.
03d0: 20 20 20 4e 55 4c 4c 2c 09 09 20 20 20 20 2f 2a NULL,.. /*
03e0: 20 66 6c 75 73 68 20 70 72 6f 63 2e 20 2a 2f 0a flush proc. */.
03f0: 20 20 20 20 20 4e 55 4c 4c 2c 09 09 20 20 20 20 NULL,..
0400: 2f 2a 20 68 61 6e 64 6c 65 72 20 70 72 6f 63 2e /* handler proc.
0410: 20 2a 2f 0a 40 40 20 2d 38 31 38 2c 36 20 2b 38 */.@@ -818,6 +8
0420: 31 39 2c 35 38 20 40 40 0a 20 2f 2a 0a 20 20 2a 19,58 @@. /*. *
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0470: 2d 2d 2d 2d 2d 2d 0a 20 20 2a 0a 2b 20 2a 20 54 ------. *.+ * T
0480: 63 70 43 6c 6f 73 65 32 50 72 6f 63 20 2d 2d 0a cpClose2Proc --.
0490: 2b 20 2a 0a 2b 20 2a 09 54 68 69 73 20 66 75 6e + *.+ *.This fun
04a0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 ction is called
04b0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
04c0: 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f O level to perfo
04d0: 72 6d 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 2b rm the channel.+
04e0: 20 2a 09 74 79 70 65 20 73 70 65 63 69 66 69 63 *.type specific
04f0: 20 70 61 72 74 20 6f 66 20 61 20 68 61 6c 66 2d part of a half-
0500: 63 6c 6f 73 65 3a 20 6e 61 6d 65 6c 79 2c 20 61 close: namely, a
0510: 20 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 20 61 shutdown() on a
0520: 20 73 6f 63 6b 65 74 2e 0a 2b 20 2a 0a 2b 20 2a socket..+ *.+ *
0530: 20 52 65 73 75 6c 74 73 3a 0a 2b 20 2a 09 30 20 Results:.+ *.0
0540: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 if successful, t
0550: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e he value of errn
0560: 6f 20 69 66 20 66 61 69 6c 65 64 2e 0a 2b 20 2a o if failed..+ *
0570: 0a 2b 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 .+ * Side effect
0580: 73 3a 0a 2b 20 2a 09 53 68 75 74 73 20 64 6f 77 s:.+ *.Shuts dow
0590: 6e 20 6f 6e 65 20 73 69 64 65 20 6f 66 20 74 68 n one side of th
05a0: 65 20 73 6f 63 6b 65 74 2e 0a 2b 20 2a 0a 2b 20 e socket..+ *.+
05b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 2f 0a 2b 0a 2b -------.+ */.+.+
0600: 73 74 61 74 69 63 20 69 6e 74 0a 2b 54 63 70 43 static int.+TcpC
0610: 6c 6f 73 65 32 50 72 6f 63 28 0a 2b 20 20 20 20 lose2Proc(.+
0620: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 ClientData insta
0630: 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 nceData,./* The
0640: 73 6f 63 6b 65 74 20 74 6f 20 63 6c 6f 73 65 2e socket to close.
0650: 20 2a 2f 0a 2b 20 20 20 20 54 63 6c 5f 49 6e 74 */.+ Tcl_Int
0660: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a erp *interp,../*
0670: 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 For error repor
0680: 74 69 6e 67 2e 20 2a 2f 0a 2b 20 20 20 20 69 6e ting. */.+ in
0690: 74 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 46 6c t flags).../* Fl
06a0: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 ags that indicat
06b0: 65 20 77 68 69 63 68 20 73 69 64 65 20 74 6f 20 e which side to
06c0: 63 6c 6f 73 65 2e 20 2a 2f 0a 2b 7b 0a 2b 20 20 close. */.+{.+
06d0: 20 20 53 6f 63 6b 65 74 49 6e 66 6f 20 2a 69 6e SocketInfo *in
06e0: 66 6f 50 74 72 20 3d 20 28 53 6f 63 6b 65 74 49 foPtr = (SocketI
06f0: 6e 66 6f 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 nfo *) instanceD
0700: 61 74 61 3b 0a 2b 20 20 20 20 69 6e 74 20 65 72 ata;.+ int er
0710: 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 2b 20 20 rorCode = 0;.+
0720: 20 20 69 6e 74 20 73 64 3b 0a 2b 0a 2b 20 20 20 int sd;.+.+
0730: 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 53 68 75 74 /*.+ * Shut
0740: 64 6f 77 6e 20 74 68 65 20 4f 53 20 73 6f 63 6b down the OS sock
0750: 65 74 20 68 61 6e 64 6c 65 2e 0a 2b 20 20 20 20 et handle..+
0760: 20 2a 2f 0a 2b 20 20 20 20 73 77 69 74 63 68 28 */.+ switch(
0770: 66 6c 61 67 73 29 0a 2b 09 7b 0a 2b 09 63 61 73 flags).+.{.+.cas
0780: 65 20 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 e TCL_CLOSE_READ
0790: 3a 0a 2b 09 20 20 20 20 73 64 3d 53 44 5f 52 45 :.+. sd=SD_RE
07a0: 43 45 49 56 45 3b 0a 2b 09 20 20 20 20 62 72 65 CEIVE;.+. bre
07b0: 61 6b 3b 0a 2b 09 63 61 73 65 20 54 43 4c 5f 43 ak;.+.case TCL_C
07c0: 4c 4f 53 45 5f 57 52 49 54 45 3a 0a 2b 09 20 20 LOSE_WRITE:.+.
07d0: 20 20 73 64 3d 53 44 5f 53 45 4e 44 3b 0a 2b 09 sd=SD_SEND;.+.
07e0: 20 20 20 20 62 72 65 61 6b 3b 0a 2b 09 64 65 66 break;.+.def
07f0: 61 75 6c 74 3a 0a 2b 09 20 20 20 20 69 66 20 28 ault:.+. if (
0800: 69 6e 74 65 72 70 29 20 7b 0a 2b 09 09 54 63 6c interp) {.+..Tcl
0810: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
0820: 74 65 72 70 2c 20 22 53 6f 63 6b 65 74 20 63 6c terp, "Socket cl
0830: 6f 73 65 32 70 72 6f 63 20 63 61 6c 6c 65 64 20 ose2proc called
0840: 62 69 64 69 72 65 63 74 69 6f 6e 61 6c 6c 79 22 bidirectionally"
0850: 2c 20 4e 55 4c 4c 29 3b 0a 2b 09 20 20 20 20 7d , NULL);.+. }
0860: 0a 2b 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 .+. return TC
0870: 4c 5f 45 52 52 4f 52 3b 0a 2b 09 7d 0a 2b 20 20 L_ERROR;.+.}.+
0880: 20 20 69 66 20 28 73 68 75 74 64 6f 77 6e 28 69 if (shutdown(i
0890: 6e 66 6f 50 74 72 2d 3e 73 6f 63 6b 65 74 2c 73 nfoPtr->socket,s
08a0: 64 29 20 3d 3d 20 53 4f 43 4b 45 54 5f 45 52 52 d) == SOCKET_ERR
08b0: 4f 52 29 20 7b 0a 2b 09 54 63 6c 57 69 6e 43 6f OR) {.+.TclWinCo
08c0: 6e 76 65 72 74 57 53 41 45 72 72 6f 72 28 28 44 nvertWSAError((D
08d0: 57 4f 52 44 29 20 57 53 41 47 65 74 4c 61 73 74 WORD) WSAGetLast
08e0: 45 72 72 6f 72 28 29 29 3b 0a 2b 09 65 72 72 6f Error());.+.erro
08f0: 72 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 45 rCode = Tcl_GetE
0900: 72 72 6e 6f 28 29 3b 0a 2b 20 20 20 20 7d 0a 2b rrno();.+ }.+
0910: 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 .+ return err
0920: 6f 72 43 6f 64 65 3b 0a 2b 7d 0a 2b 0c 0a 2b 2f orCode;.+}.+..+/
0930: 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.+ *-----------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a -----------.+ *.
0980: 20 20 2a 20 4e 65 77 53 6f 63 6b 65 74 49 6e 66 * NewSocketInf
0990: 6f 20 2d 2d 0a 20 20 2a 0a 20 20 2a 09 54 68 69 o --. *. *.Thi
09a0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 s function alloc
09b0: 61 74 65 73 20 61 6e 64 20 69 6e 69 74 69 61 6c ates and initial
09c0: 69 7a 65 73 20 61 20 6e 65 77 20 53 6f 63 6b 65 izes a new Socke
09d0: 74 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e tInfo structure.
09e0: 0a 49 6e 64 65 78 3a 20 75 6e 69 78 2f 74 63 6c .Index: unix/tcl
09f0: 55 6e 69 78 43 68 61 6e 2e 63 0a 3d 3d 3d 3d 3d UnixChan.c.=====
0a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 ==============.R
0a40: 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f CS file: /cvsroo
0a50: 74 2f 74 63 6c 2f 74 63 6c 2f 75 6e 69 78 2f 74 t/tcl/tcl/unix/t
0a60: 63 6c 55 6e 69 78 43 68 61 6e 2e 63 2c 76 0a 72 clUnixChan.c,v.r
0a70: 65 74 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 etrieving revisi
0a80: 6f 6e 20 31 2e 39 36 0a 64 69 66 66 20 2d 75 20 on 1.96.diff -u
0a90: 2d 72 31 2e 39 36 20 74 63 6c 55 6e 69 78 43 68 -r1.96 tclUnixCh
0aa0: 61 6e 2e 63 0a 2d 2d 2d 20 75 6e 69 78 2f 74 63 an.c.--- unix/tc
0ab0: 6c 55 6e 69 78 43 68 61 6e 2e 63 09 32 36 20 4f lUnixChan.c.26 O
0ac0: 63 74 20 32 30 30 38 20 31 32 3a 34 35 3a 30 34 ct 2008 12:45:04
0ad0: 20 2d 30 30 30 30 09 31 2e 39 36 0a 2b 2b 2b 20 -0000.1.96.+++
0ae0: 75 6e 69 78 2f 74 63 6c 55 6e 69 78 43 68 61 6e unix/tclUnixChan
0af0: 2e 63 09 31 36 20 4e 6f 76 20 32 30 30 38 20 32 .c.16 Nov 2008 2
0b00: 32 3a 30 35 3a 32 38 20 2d 30 30 30 30 0a 40 40 2:05:28 -0000.@@
0b10: 20 2d 32 31 38 2c 36 20 2b 32 31 38 2c 39 20 40 -218,6 +218,9 @
0b20: 40 0a 20 73 74 61 74 69 63 20 69 6e 74 09 09 54 @. static int..T
0b30: 63 70 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 cpBlockModeProc(
0b40: 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 2c ClientData data,
0b50: 20 69 6e 74 20 6d 6f 64 65 29 3b 0a 20 73 74 61 int mode);. sta
0b60: 74 69 63 20 69 6e 74 09 09 54 63 70 43 6c 6f 73 tic int..TcpClos
0b70: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 eProc(ClientData
0b80: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 instanceData,.
0b90: 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ... Tcl_Inter
0ba0: 70 20 2a 69 6e 74 65 72 70 29 3b 0a 2b 73 74 61 p *interp);.+sta
0bb0: 74 69 63 20 69 6e 74 09 09 54 63 70 43 6c 6f 73 tic int..TcpClos
0bc0: 65 32 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 e2Proc(ClientDat
0bd0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a a instanceData,.
0be0: 2b 09 09 09 09 20 20 20 20 20 20 54 63 6c 5f 49 +.... Tcl_I
0bf0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 2b nterp *interp,.+
0c00: 09 09 09 09 20 20 20 20 20 20 69 6e 74 20 66 6c .... int fl
0c10: 61 67 73 29 3b 0a 20 73 74 61 74 69 63 20 69 6e ags);. static in
0c20: 74 09 09 54 63 70 47 65 74 48 61 6e 64 6c 65 50 t..TcpGetHandleP
0c30: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 roc(ClientData i
0c40: 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 09 09 nstanceData,. ..
0c50: 09 20 20 20 20 69 6e 74 20 64 69 72 65 63 74 69 . int directi
0c60: 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a on, ClientData *
0c70: 68 61 6e 64 6c 65 50 74 72 29 3b 0a 20 73 74 61 handlePtr);. sta
0c80: 74 69 63 20 69 6e 74 09 09 54 63 70 47 65 74 4f tic int..TcpGetO
0c90: 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 ptionProc(Client
0ca0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
0cb0: 61 2c 0a 40 40 20 2d 33 31 38 2c 37 20 2b 33 32 a,.@@ -318,7 +32
0cc0: 31 2c 37 20 40 40 0a 20 20 20 20 20 54 63 70 47 1,7 @@. TcpG
0cd0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f etOptionProc,../
0ce0: 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f * Get option pro
0cf0: 63 2e 20 2a 2f 0a 20 20 20 20 20 54 63 70 57 61 c. */. TcpWa
0d00: 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 tchProc,../* Ini
0d10: 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 tialize notifier
0d20: 2e 20 2a 2f 0a 20 20 20 20 20 54 63 70 47 65 74 . */. TcpGet
0d30: 48 61 6e 64 6c 65 50 72 6f 63 2c 09 09 2f 2a 20 HandleProc,../*
0d40: 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f Get OS handles o
0d50: 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a ut of channel. *
0d60: 2f 0a 2d 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f /.- NULL,.../
0d70: 2a 20 63 6c 6f 73 65 32 70 72 6f 63 2e 20 2a 2f * close2proc. */
0d80: 0a 2b 20 20 20 20 54 63 70 43 6c 6f 73 65 32 50 .+ TcpClose2P
0d90: 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 32 20 roc,../* Close2
0da0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 54 63 proc. */. Tc
0db0: 70 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 pBlockModeProc,.
0dc0: 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 ./* Set blocking
0dd0: 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 or non-blocking
0de0: 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20 20 4e 55 mode.*/. NU
0df0: 4c 4c 2c 09 09 09 2f 2a 20 66 6c 75 73 68 20 70 LL,.../* flush p
0e00: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 4e 55 4c roc. */. NUL
0e10: 4c 2c 09 09 09 2f 2a 20 68 61 6e 64 6c 65 72 20 L,.../* handler
0e20: 70 72 6f 63 2e 20 2a 2f 0a 40 40 20 2d 32 30 31 proc. */.@@ -201
0e30: 38 2c 36 20 2b 32 30 32 31 2c 35 37 20 40 40 0a 8,6 +2021,57 @@.
0e40: 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *---------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 -------------.
0e90: 2a 0a 2b 20 2a 20 54 63 70 43 6c 6f 73 65 32 50 *.+ * TcpClose2P
0ea0: 72 6f 63 20 2d 2d 0a 2b 20 2a 0a 2b 20 2a 09 54 roc --.+ *.+ *.T
0eb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
0ec0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 called by the ge
0ed0: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 neric IO level t
0ee0: 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 63 68 o perform the ch
0ef0: 61 6e 6e 65 6c 0a 2b 20 2a 09 74 79 70 65 20 73 annel.+ *.type s
0f00: 70 65 63 69 66 69 63 20 70 61 72 74 20 6f 66 20 pecific part of
0f10: 61 20 68 61 6c 66 2d 63 6c 6f 73 65 3a 20 6e 61 a half-close: na
0f20: 6d 65 6c 79 2c 20 61 20 73 68 75 74 64 6f 77 6e mely, a shutdown
0f30: 28 29 20 6f 6e 20 61 20 73 6f 63 6b 65 74 2e 0a () on a socket..
0f40: 2b 20 2a 0a 2b 20 2a 20 52 65 73 75 6c 74 73 3a + *.+ * Results:
0f50: 0a 2b 20 2a 09 30 20 69 66 20 73 75 63 63 65 73 .+ *.0 if succes
0f60: 73 66 75 6c 2c 20 74 68 65 20 76 61 6c 75 65 20 sful, the value
0f70: 6f 66 20 65 72 72 6e 6f 20 69 66 20 66 61 69 6c of errno if fail
0f80: 65 64 2e 0a 2b 20 2a 0a 2b 20 2a 20 53 69 64 65 ed..+ *.+ * Side
0f90: 20 65 66 66 65 63 74 73 3a 0a 2b 20 2a 09 53 68 effects:.+ *.Sh
0fa0: 75 74 73 20 64 6f 77 6e 20 6f 6e 65 20 73 69 64 uts down one sid
0fb0: 65 20 6f 66 20 74 68 65 20 73 6f 63 6b 65 74 2e e of the socket.
0fc0: 0a 2b 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .+ *.+ *--------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b --------------.+
1010: 20 2a 2f 0a 2b 0a 2b 73 74 61 74 69 63 20 69 6e */.+.+static in
1020: 74 0a 2b 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 t.+TcpClose2Proc
1030: 28 0a 2b 20 20 20 20 43 6c 69 65 6e 74 44 61 74 (.+ ClientDat
1040: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 a instanceData,.
1050: 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 74 6f /* The socket to
1060: 20 63 6c 6f 73 65 2e 20 2a 2f 0a 2b 20 20 20 20 close. */.+
1070: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1080: 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f rp,../* For erro
1090: 72 20 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a r reporting. */.
10a0: 2b 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 + int flags).
10b0: 09 09 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 ../* Flags that
10c0: 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 73 indicate which s
10d0: 69 64 65 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f ide to close. */
10e0: 0a 2b 7b 0a 2b 20 20 20 20 54 63 70 53 74 61 74 .+{.+ TcpStat
10f0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 54 e *statePtr = (T
1100: 63 70 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 cpState *) insta
1110: 6e 63 65 44 61 74 61 3b 0a 2b 20 20 20 20 69 6e nceData;.+ in
1120: 74 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b t errorCode = 0;
1130: 0a 2b 20 20 20 20 69 6e 74 20 73 64 3b 0a 2b 0a .+ int sd;.+.
1140: 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 + /*.+ *
1150: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 4f 53 20 Shutdown the OS
1160: 73 6f 63 6b 65 74 20 68 61 6e 64 6c 65 2e 0a 2b socket handle..+
1170: 20 20 20 20 20 2a 2f 0a 2b 20 20 20 20 73 77 69 */.+ swi
1180: 74 63 68 28 66 6c 61 67 73 29 0a 2b 09 7b 0a 2b tch(flags).+.{.+
1190: 09 63 61 73 65 20 54 43 4c 5f 43 4c 4f 53 45 5f .case TCL_CLOSE_
11a0: 52 45 41 44 3a 0a 2b 09 20 20 20 20 73 64 3d 53 READ:.+. sd=S
11b0: 44 5f 52 45 43 45 49 56 45 3b 0a 2b 09 20 20 20 D_RECEIVE;.+.
11c0: 20 62 72 65 61 6b 3b 0a 2b 09 63 61 73 65 20 54 break;.+.case T
11d0: 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 3a 0a CL_CLOSE_WRITE:.
11e0: 2b 09 20 20 20 20 73 64 3d 53 44 5f 53 45 4e 44 +. sd=SD_SEND
11f0: 3b 0a 2b 09 20 20 20 20 62 72 65 61 6b 3b 0a 2b ;.+. break;.+
1200: 09 64 65 66 61 75 6c 74 3a 0a 2b 09 20 20 20 20 .default:.+.
1210: 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 2b 09 if (interp) {.+.
1220: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
1230: 74 28 69 6e 74 65 72 70 2c 20 22 53 6f 63 6b 65 t(interp, "Socke
1240: 74 20 63 6c 6f 73 65 32 70 72 6f 63 20 63 61 6c t close2proc cal
1250: 6c 65 64 20 62 69 64 69 72 65 63 74 69 6f 6e 61 led bidirectiona
1260: 6c 6c 79 22 2c 20 4e 55 4c 4c 29 3b 0a 2b 09 20 lly", NULL);.+.
1270: 20 20 20 7d 0a 2b 09 20 20 20 20 72 65 74 75 72 }.+. retur
1280: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 2b 09 7d n TCL_ERROR;.+.}
1290: 0a 2b 20 20 20 20 69 66 20 28 73 68 75 74 64 6f .+ if (shutdo
12a0: 77 6e 28 73 74 61 74 65 50 74 72 2d 3e 66 64 2c wn(statePtr->fd,
12b0: 73 64 29 3c 30 29 20 7b 0a 2b 09 65 72 72 6f 72 sd)<0) {.+.error
12c0: 43 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 2b 20 Code = errno;.+
12d0: 20 20 20 7d 0a 2b 0a 2b 20 20 20 20 72 65 74 75 }.+.+ retu
12e0: 72 6e 20 65 72 72 6f 72 43 6f 64 65 3b 0a 2b 7d rn errorCode;.+}
12f0: 0a 2b 0c 0a 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d .+..+/*.+ *-----
1300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1340: 2d 0a 2b 20 2a 0a 20 20 2a 20 54 63 70 47 65 74 -.+ *. * TcpGet
1350: 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 20 OptionProc --.
1360: 2a 0a 20 20 2a 09 43 6f 6d 70 75 74 65 73 20 61 *. *.Computes a
1370: 6e 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 66 n option value f
1380: 6f 72 20 61 20 54 43 50 20 73 6f 63 6b 65 74 20 or a TCP socket
1390: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f based channel, o
13a0: 72 20 61 20 6c 69 73 74 20 6f 66 0a r a list of.