Tcl Source Code

Hex Artifact Content
Login

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.