Tcl Source Code

Hex Artifact Content
Login

Artifact 5e337fd488927da2bafea11a3e976b3c4edf49c2:

Attachment "halfclosesock-3.patch" to ticket [219159ffff] added by ferrieux 2008-12-01 21:22:06.
0000: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74  Index: generic/t
0010: 63 6c 2e 64 65 63 6c 73 0a 3d 3d 3d 3d 3d 3d 3d  cl.decls.=======
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 3d 0a 52 43 53  ============.RCS
0060: 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f   file: /cvsroot/
0070: 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 2f  tcl/tcl/generic/
0080: 74 63 6c 2e 64 65 63 6c 73 2c 76 0a 72 65 74 72  tcl.decls,v.retr
0090: 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20  ieving revision 
00a0: 31 2e 31 35 34 0a 64 69 66 66 20 2d 75 20 2d 72  1.154.diff -u -r
00b0: 31 2e 31 35 34 20 74 63 6c 2e 64 65 63 6c 73 0a  1.154 tcl.decls.
00c0: 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 2e  --- generic/tcl.
00d0: 64 65 63 6c 73 09 31 37 20 4e 6f 76 20 32 30 30  decls.17 Nov 200
00e0: 38 20 32 32 3a 31 35 3a 33 34 20 2d 30 30 30 30  8 22:15:34 -0000
00f0: 09 31 2e 31 35 34 0a 2b 2b 2b 20 67 65 6e 65 72  .1.154.+++ gener
0100: 69 63 2f 74 63 6c 2e 64 65 63 6c 73 09 31 20 44  ic/tcl.decls.1 D
0110: 65 63 20 32 30 30 38 20 31 34 3a 31 36 3a 34 31  ec 2008 14:16:41
0120: 20 2d 30 30 30 30 0a 40 40 20 2d 32 32 30 34 2c   -0000.@@ -2204,
0130: 36 20 2b 32 32 30 34 2c 31 31 20 40 40 0a 20 09  6 +2204,11 @@. .
0140: 20 20 20 20 69 6e 74 20 2a 6f 62 6a 63 50 74 72      int *objcPtr
0150: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
0160: 20 2a 6f 62 6a 76 2c 20 54 63 6c 5f 4f 62 6a 20   *objv, Tcl_Obj 
0170: 2a 2a 2a 72 65 6d 4f 62 6a 76 29 0a 20 7d 0a 20  ***remObjv). }. 
0180: 0a 2b 23 20 54 49 50 23 33 33 32 2c 20 48 61 6c  .+# TIP#332, Hal
0190: 66 20 43 6c 6f 73 65 20 6d 61 64 65 20 70 75 62  f Close made pub
01a0: 6c 69 63 0a 2b 64 65 63 6c 61 72 65 20 36 30 35  lic.+declare 605
01b0: 20 67 65 6e 65 72 69 63 20 7b 0a 2b 20 20 20 20   generic {.+    
01c0: 69 6e 74 20 54 63 6c 5f 43 6c 6f 73 65 45 78 28  int Tcl_CloseEx(
01d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
01e0: 72 70 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  rp, Tcl_Channel 
01f0: 63 68 61 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29  chan, int flags)
0200: 0a 2b 7d 0a 2b 0a 20 23 23 23 23 23 23 23 23 23  .+}.+. #########
0210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 0a 20 0a 20 23 20 44 65 66 69 6e  #####. . # Defin
0260: 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 73  e the platform s
0270: 70 65 63 69 66 69 63 20 70 75 62 6c 69 63 20 54  pecific public T
0280: 63 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54  cl interface.  T
0290: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
02a0: 72 65 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69  re.Index: generi
02b0: 63 2f 74 63 6c 44 65 63 6c 73 2e 68 0a 3d 3d 3d  c/tclDecls.h.===
02c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
02d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
02e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
02f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0300: 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72  .RCS file: /cvsr
0310: 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65  oot/tcl/tcl/gene
0320: 72 69 63 2f 74 63 6c 44 65 63 6c 73 2e 68 2c 76  ric/tclDecls.h,v
0330: 0a 72 65 74 72 69 65 76 69 6e 67 20 72 65 76 69  .retrieving revi
0340: 73 69 6f 6e 20 31 2e 31 35 36 0a 64 69 66 66 20  sion 1.156.diff 
0350: 2d 75 20 2d 72 31 2e 31 35 36 20 74 63 6c 44 65  -u -r1.156 tclDe
0360: 63 6c 73 2e 68 0a 2d 2d 2d 20 67 65 6e 65 72 69  cls.h.--- generi
0370: 63 2f 74 63 6c 44 65 63 6c 73 2e 68 09 31 37 20  c/tclDecls.h.17 
0380: 4e 6f 76 20 32 30 30 38 20 32 32 3a 31 35 3a 33  Nov 2008 22:15:3
0390: 34 20 2d 30 30 30 30 09 31 2e 31 35 36 0a 2b 2b  4 -0000.1.156.++
03a0: 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 44 65 63  + generic/tclDec
03b0: 6c 73 2e 68 09 31 20 44 65 63 20 32 30 30 38 20  ls.h.1 Dec 2008 
03c0: 31 34 3a 31 36 3a 34 32 20 2d 30 30 30 30 0a 40  14:16:42 -0000.@
03d0: 40 20 2d 33 36 35 37 2c 36 20 2b 33 36 35 37 2c  @ -3657,6 +3657,
03e0: 31 32 20 40 40 0a 20 09 09 09 09 63 6f 6e 73 74  12 @@. ....const
03f0: 20 54 63 6c 5f 41 72 67 76 49 6e 66 6f 20 2a 20   Tcl_ArgvInfo * 
0400: 61 72 67 54 61 62 6c 65 2c 20 69 6e 74 20 2a 20  argTable, int * 
0410: 6f 62 6a 63 50 74 72 2c 0a 20 09 09 09 09 54 63  objcPtr,. ....Tc
0420: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 20 6f  l_Obj *const * o
0430: 62 6a 76 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a  bjv, Tcl_Obj ***
0440: 20 72 65 6d 4f 62 6a 76 29 3b 0a 20 23 65 6e 64   remObjv);. #end
0450: 69 66 0a 2b 23 69 66 6e 64 65 66 20 54 63 6c 5f  if.+#ifndef Tcl_
0460: 43 6c 6f 73 65 45 78 5f 54 43 4c 5f 44 45 43 4c  CloseEx_TCL_DECL
0470: 41 52 45 44 0a 2b 23 64 65 66 69 6e 65 20 54 63  ARED.+#define Tc
0480: 6c 5f 43 6c 6f 73 65 45 78 5f 54 43 4c 5f 44 45  l_CloseEx_TCL_DE
0490: 43 4c 41 52 45 44 0a 2b 2f 2a 20 36 30 35 20 2a  CLARED.+/* 605 *
04a0: 2f 0a 2b 45 58 54 45 52 4e 20 69 6e 74 09 09 54  /.+EXTERN int..T
04b0: 63 6c 5f 43 6c 6f 73 65 45 78 20 28 54 63 6c 5f  cl_CloseEx (Tcl_
04c0: 49 6e 74 65 72 70 20 2a 20 69 6e 74 65 72 70 2c  Interp * interp,
04d0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
04e0: 6e 2c 0a 2b 09 09 09 09 69 6e 74 20 66 6c 61 67  n,.+....int flag
04f0: 73 29 3b 0a 2b 23 65 6e 64 69 66 0a 20 0a 20 74  s);.+#endif. . t
0500: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 63  ypedef struct Tc
0510: 6c 53 74 75 62 48 6f 6f 6b 73 20 7b 0a 20 20 20  lStubHooks {.   
0520: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 54    const struct T
0530: 63 6c 50 6c 61 74 53 74 75 62 73 20 2a 74 63 6c  clPlatStubs *tcl
0540: 50 6c 61 74 53 74 75 62 73 3b 0a 40 40 20 2d 34  PlatStubs;.@@ -4
0550: 33 32 31 2c 36 20 2b 34 33 32 37 2c 37 20 40 40  321,6 +4327,7 @@
0560: 0a 20 20 20 20 20 69 6e 74 20 28 2a 74 63 6c 5f  .     int (*tcl_
0570: 53 65 74 45 6e 73 65 6d 62 6c 65 50 61 72 61 6d  SetEnsembleParam
0580: 65 74 65 72 4c 69 73 74 29 20 28 54 63 6c 5f 49  eterList) (Tcl_I
0590: 6e 74 65 72 70 20 2a 20 69 6e 74 65 72 70 2c 20  nterp * interp, 
05a0: 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65  Tcl_Command toke
05b0: 6e 2c 20 54 63 6c 5f 4f 62 6a 20 2a 20 70 61 72  n, Tcl_Obj * par
05c0: 61 6d 4c 69 73 74 29 3b 20 2f 2a 20 36 30 32 20  amList); /* 602 
05d0: 2a 2f 0a 20 20 20 20 20 69 6e 74 20 28 2a 74 63  */.     int (*tc
05e0: 6c 5f 47 65 74 45 6e 73 65 6d 62 6c 65 50 61 72  l_GetEnsemblePar
05f0: 61 6d 65 74 65 72 4c 69 73 74 29 20 28 54 63 6c  ameterList) (Tcl
0600: 5f 49 6e 74 65 72 70 20 2a 20 69 6e 74 65 72 70  _Interp * interp
0610: 2c 20 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f  , Tcl_Command to
0620: 6b 65 6e 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 20  ken, Tcl_Obj ** 
0630: 70 61 72 61 6d 4c 69 73 74 50 74 72 29 3b 20 2f  paramListPtr); /
0640: 2a 20 36 30 33 20 2a 2f 0a 20 20 20 20 20 69 6e  * 603 */.     in
0650: 74 20 28 2a 74 63 6c 5f 50 61 72 73 65 41 72 67  t (*tcl_ParseArg
0660: 73 4f 62 6a 76 29 20 28 54 63 6c 5f 49 6e 74 65  sObjv) (Tcl_Inte
0670: 72 70 20 2a 20 69 6e 74 65 72 70 2c 20 63 6f 6e  rp * interp, con
0680: 73 74 20 54 63 6c 5f 41 72 67 76 49 6e 66 6f 20  st Tcl_ArgvInfo 
0690: 2a 20 61 72 67 54 61 62 6c 65 2c 20 69 6e 74 20  * argTable, int 
06a0: 2a 20 6f 62 6a 63 50 74 72 2c 20 54 63 6c 5f 4f  * objcPtr, Tcl_O
06b0: 62 6a 20 2a 63 6f 6e 73 74 20 2a 20 6f 62 6a 76  bj *const * objv
06c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 20 72 65  , Tcl_Obj *** re
06d0: 6d 4f 62 6a 76 29 3b 20 2f 2a 20 36 30 34 20 2a  mObjv); /* 604 *
06e0: 2f 0a 2b 20 20 20 20 69 6e 74 20 28 2a 74 63 6c  /.+    int (*tcl
06f0: 5f 43 6c 6f 73 65 45 78 29 20 28 54 63 6c 5f 49  _CloseEx) (Tcl_I
0700: 6e 74 65 72 70 20 2a 20 69 6e 74 65 72 70 2c 20  nterp * interp, 
0710: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
0720: 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 20 2f 2a  , int flags); /*
0730: 20 36 30 35 20 2a 2f 0a 20 7d 20 54 63 6c 53 74   605 */. } TclSt
0740: 75 62 73 3b 0a 20 0a 20 23 69 66 20 64 65 66 69  ubs;. . #if defi
0750: 6e 65 64 28 55 53 45 5f 54 43 4c 5f 53 54 55 42  ned(USE_TCL_STUB
0760: 53 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  S) && !defined(U
0770: 53 45 5f 54 43 4c 5f 53 54 55 42 5f 50 52 4f 43  SE_TCL_STUB_PROC
0780: 53 29 0a 40 40 20 2d 36 38 31 33 2c 36 20 2b 36  S).@@ -6813,6 +6
0790: 38 32 30 2c 31 30 20 40 40 0a 20 23 64 65 66 69  820,10 @@. #defi
07a0: 6e 65 20 54 63 6c 5f 50 61 72 73 65 41 72 67 73  ne Tcl_ParseArgs
07b0: 4f 62 6a 76 20 5c 0a 20 09 28 74 63 6c 53 74 75  Objv \. .(tclStu
07c0: 62 73 50 74 72 2d 3e 74 63 6c 5f 50 61 72 73 65  bsPtr->tcl_Parse
07d0: 41 72 67 73 4f 62 6a 76 29 20 2f 2a 20 36 30 34  ArgsObjv) /* 604
07e0: 20 2a 2f 0a 20 23 65 6e 64 69 66 0a 2b 23 69 66   */. #endif.+#if
07f0: 6e 64 65 66 20 54 63 6c 5f 43 6c 6f 73 65 45 78  ndef Tcl_CloseEx
0800: 0a 2b 23 64 65 66 69 6e 65 20 54 63 6c 5f 43 6c  .+#define Tcl_Cl
0810: 6f 73 65 45 78 20 5c 0a 2b 09 28 74 63 6c 53 74  oseEx \.+.(tclSt
0820: 75 62 73 50 74 72 2d 3e 74 63 6c 5f 43 6c 6f 73  ubsPtr->tcl_Clos
0830: 65 45 78 29 20 2f 2a 20 36 30 35 20 2a 2f 0a 2b  eEx) /* 605 */.+
0840: 23 65 6e 64 69 66 0a 20 0a 20 23 65 6e 64 69 66  #endif. . #endif
0850: 20 2f 2a 20 64 65 66 69 6e 65 64 28 55 53 45 5f   /* defined(USE_
0860: 54 43 4c 5f 53 54 55 42 53 29 20 26 26 20 21 64  TCL_STUBS) && !d
0870: 65 66 69 6e 65 64 28 55 53 45 5f 54 43 4c 5f 53  efined(USE_TCL_S
0880: 54 55 42 5f 50 52 4f 43 53 29 20 2a 2f 0a 20 0a  TUB_PROCS) */. .
0890: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74  Index: generic/t
08a0: 63 6c 49 4f 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d  clIO.c.=========
08b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66  ==========.RCS f
08f0: 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63  ile: /cvsroot/tc
0900: 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 2f 74 63  l/tcl/generic/tc
0910: 6c 49 4f 2e 63 2c 76 0a 72 65 74 72 69 65 76 69  lIO.c,v.retrievi
0920: 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 31 35  ng revision 1.15
0930: 30 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e 31 35  0.diff -u -r1.15
0940: 30 20 74 63 6c 49 4f 2e 63 0a 2d 2d 2d 20 67 65  0 tclIO.c.--- ge
0950: 6e 65 72 69 63 2f 74 63 6c 49 4f 2e 63 09 32 35  neric/tclIO.c.25
0960: 20 4e 6f 76 20 32 30 30 38 20 32 33 3a 31 39 3a   Nov 2008 23:19:
0970: 30 31 20 2d 30 30 30 30 09 31 2e 31 35 30 0a 2b  01 -0000.1.150.+
0980: 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 49 4f  ++ generic/tclIO
0990: 2e 63 09 31 20 44 65 63 20 32 30 30 38 20 31 34  .c.1 Dec 2008 14
09a0: 3a 31 36 3a 34 32 20 2d 30 30 30 30 0a 40 40 20  :16:42 -0000.@@ 
09b0: 2d 33 30 32 38 2c 36 20 2b 33 30 32 38 2c 31 33  -3028,6 +3028,13
09c0: 37 20 40 40 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d  7 @@. /*.  *----
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 0a 20 20 2a 0a 2b 20 2a 20 54 63 6c 5f 43  --.  *.+ * Tcl_C
0a20: 6c 6f 73 65 45 78 20 2d 2d 0a 2b 20 2a 0a 2b 20  loseEx --.+ *.+ 
0a30: 2a 09 48 61 6c 66 20 63 6c 6f 73 65 73 20 61 20  *.Half closes a 
0a40: 63 68 61 6e 6e 65 6c 2e 0a 2b 20 2a 0a 2b 20 2a  channel..+ *.+ *
0a50: 20 52 65 73 75 6c 74 73 3a 0a 2b 20 2a 09 41 20   Results:.+ *.A 
0a60: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
0a70: 75 6c 74 2e 0a 2b 20 2a 0a 2b 20 2a 20 53 69 64  ult..+ *.+ * Sid
0a80: 65 20 65 66 66 65 63 74 73 3a 0a 2b 20 2a 09 43  e effects:.+ *.C
0a90: 6c 6f 73 65 73 20 6f 6e 65 20 64 69 72 65 63 74  loses one direct
0aa0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 6e  ion of the chann
0ab0: 65 6c 2e 0a 2b 20 2a 0a 2b 20 2a 20 4e 4f 54 45  el..+ *.+ * NOTE
0ac0: 3a 0a 2b 20 2a 09 54 63 6c 5f 43 6c 6f 73 65 45  :.+ *.Tcl_CloseE
0ad0: 78 20 63 6c 6f 73 65 73 20 74 68 65 20 73 70 65  x closes the spe
0ae0: 63 69 66 69 65 64 20 64 69 72 65 63 74 69 6f 6e  cified direction
0af0: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20   of the channel 
0b00: 61 73 20 66 61 72 20 61 73 0a 2b 20 2a 09 74 68  as far as.+ *.th
0b10: 65 20 75 73 65 72 20 69 73 20 63 6f 6e 63 65 72  e user is concer
0b20: 6e 65 64 2e 20 54 68 65 20 63 68 61 6e 6e 65 6c  ned. The channel
0b30: 20 6b 65 65 70 73 20 65 78 69 73 74 69 6e 67 20   keeps existing 
0b40: 68 6f 77 65 76 65 72 2e 20 59 6f 75 20 63 61 6e  however. You can
0b50: 6e 6f 74 0a 2b 20 2a 09 63 61 6c 6c 73 20 74 68  not.+ *.calls th
0b60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  is function to c
0b70: 6c 6f 73 65 20 74 68 65 20 6c 61 73 74 20 70 6f  lose the last po
0b80: 73 73 69 62 6c 65 20 64 69 72 65 63 74 69 6f 6e  ssible direction
0b90: 20 6f 66 20 74 68 65 0a 2b 20 2a 09 63 68 61 6e   of the.+ *.chan
0ba0: 6e 65 6c 2e 20 55 73 65 20 54 63 6c 5f 43 6c 6f  nel. Use Tcl_Clo
0bb0: 73 65 20 66 6f 72 20 74 68 61 74 2e 0a 2b 20 2a  se for that..+ *
0bc0: 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .+ *------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 2f 0a  ----------.+ */.
0c10: 2b 0a 2b 09 2f 2a 20 41 52 47 53 55 53 45 44 20  +.+./* ARGSUSED 
0c20: 2a 2f 0a 2b 69 6e 74 0a 2b 54 63 6c 5f 43 6c 6f  */.+int.+Tcl_Clo
0c30: 73 65 45 78 28 0a 2b 20 20 20 20 54 63 6c 5f 49  seEx(.+    Tcl_I
0c40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
0c50: 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20 66  /* Interpreter f
0c60: 6f 72 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 2b 20  or errors. */.+ 
0c70: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
0c80: 68 61 6e 2c 09 09 2f 2a 20 54 68 65 20 63 68 61  han,../* The cha
0c90: 6e 6e 65 6c 20 62 65 69 6e 67 20 63 6c 6f 73 65  nnel being close
0ca0: 64 2e 20 4d 61 79 20 73 74 69 6c 6c 20 62 65 20  d. May still be 
0cb0: 75 73 65 64 20 62 79 20 73 6f 6d 65 20 69 6e 74  used by some int
0cc0: 65 72 70 72 65 74 65 72 20 2a 2f 0a 2b 20 20 20  erpreter */.+   
0cd0: 20 69 6e 74 20 66 6c 61 67 73 29 20 20 20 20 20   int flags)     
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0cf0: 46 6c 61 67 73 20 74 65 6c 6c 69 6e 67 20 75 73  Flags telling us
0d00: 20 77 68 69 63 68 20 73 69 64 65 20 74 6f 20 63   which side to c
0d10: 6c 6f 73 65 2e 20 2a 2f 0a 2b 7b 0a 2b 20 20 20  lose. */.+{.+   
0d20: 20 43 68 61 6e 6e 65 6c 20 2a 63 68 61 6e 50 74   Channel *chanPt
0d30: 72 3b 09 09 2f 2a 20 54 68 65 20 72 65 61 6c 20  r;../* The real 
0d40: 49 4f 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2b  IO channel. */.+
0d50: 20 20 20 20 43 68 61 6e 6e 65 6c 53 74 61 74 65      ChannelState
0d60: 20 2a 73 74 61 74 65 50 74 72 3b 09 2f 2a 20 53   *statePtr;./* S
0d70: 74 61 74 65 20 6f 66 20 72 65 61 6c 20 49 4f 20  tate of real IO 
0d80: 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2b 20 20 20  channel. */.+   
0d90: 20 69 6e 74 20 72 65 73 75 6c 74 3b 09 09 09 2f   int result;.../
0da0: 2a 20 4f 66 20 63 61 6c 6c 69 6e 67 20 46 6c 75  * Of calling Flu
0db0: 73 68 43 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2b 0a  shChannel. */.+.
0dc0: 2b 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  +    if (chan ==
0dd0: 20 4e 55 4c 4c 29 20 7b 0a 2b 09 72 65 74 75 72   NULL) {.+.retur
0de0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 2b 20 20 20 20 7d  n TCL_OK;.+    }
0df0: 0a 2b 0a 2b 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  .+.+    /* TODO:
0e00: 20 61 73 73 65 72 74 20 66 6c 61 67 73 20 76 61   assert flags va
0e10: 6c 69 64 69 74 79 20 3f 20 2a 2f 0a 2b 0a 2b 20  lidity ? */.+.+ 
0e20: 20 20 20 63 68 61 6e 50 74 72 20 3d 20 28 43 68     chanPtr = (Ch
0e30: 61 6e 6e 65 6c 20 2a 29 20 63 68 61 6e 3b 0a 2b  annel *) chan;.+
0e40: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 63      statePtr = c
0e50: 68 61 6e 50 74 72 2d 3e 73 74 61 74 65 3b 0a 2b  hanPtr->state;.+
0e60: 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a  .+    /*.+     *
0e70: 20 44 6f 65 73 20 74 68 65 20 63 68 61 6e 6e 65   Does the channe
0e80: 6c 20 73 75 70 70 6f 72 74 20 68 61 6c 66 2d 63  l support half-c
0e90: 6c 6f 73 65 20 61 6e 79 77 61 79 20 3f 20 45 72  lose anyway ? Er
0ea0: 72 6f 72 20 69 66 20 6e 6f 74 2e 0a 2b 20 20 20  ror if not..+   
0eb0: 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20 69 66 20 28    */.+.+    if (
0ec0: 21 63 68 61 6e 50 74 72 2d 3e 74 79 70 65 50 74  !chanPtr->typePt
0ed0: 72 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 29 20 7b  r->close2Proc) {
0ee0: 0a 2b 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .+.Tcl_AppendRes
0ef0: 75 6c 74 20 28 69 6e 74 65 72 70 2c 20 22 48 61  ult (interp, "Ha
0f00: 6c 66 2d 63 6c 6f 73 65 20 6f 66 20 63 68 61 6e  lf-close of chan
0f10: 6e 65 6c 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  nels not support
0f20: 65 64 20 62 79 20 22 2c 0a 2b 09 09 09 20 20 63  ed by ",.+...  c
0f30: 68 61 6e 50 74 72 2d 3e 74 79 70 65 50 74 72 2d  hanPtr->typePtr-
0f40: 3e 74 79 70 65 4e 61 6d 65 2c 20 22 73 22 2c 20  >typeName, "s", 
0f50: 4e 55 4c 4c 29 3b 0a 2b 09 72 65 74 75 72 6e 20  NULL);.+.return 
0f60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 2b 20 20 20 20  TCL_ERROR;.+    
0f70: 7d 0a 2b 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20  }.+.+    /*.+   
0f80: 20 20 2a 20 49 73 20 74 68 65 20 63 68 61 6e 6e    * Is the chann
0f90: 65 6c 20 75 6e 73 74 61 63 6b 65 64 20 3f 20 49  el unstacked ? I
0fa0: 66 20 6e 6f 74 20 77 65 20 66 61 69 6c 2e 0a 2b  f not we fail..+
0fb0: 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20 69       */.+.+    i
0fc0: 66 20 28 63 68 61 6e 50 74 72 20 21 3d 20 73 74  f (chanPtr != st
0fd0: 61 74 65 50 74 72 2d 3e 74 6f 70 43 68 61 6e 50  atePtr->topChanP
0fe0: 74 72 29 20 7b 0a 2b 09 54 63 6c 5f 41 70 70 65  tr) {.+.Tcl_Appe
0ff0: 6e 64 52 65 73 75 6c 74 20 28 69 6e 74 65 72 70  ndResult (interp
1000: 2c 0a 2b 09 09 09 20 20 22 48 61 6c 66 2d 63 6c  ,.+...  "Half-cl
1010: 6f 73 65 20 6e 6f 74 20 61 70 70 6c 69 63 61 62  ose not applicab
1020: 6c 65 20 74 6f 20 73 74 61 63 6b 20 6f 66 20 74  le to stack of t
1030: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 22 2c  ransformations",
1040: 0a 2b 09 09 09 20 20 4e 55 4c 4c 29 3b 0a 2b 09  .+...  NULL);.+.
1050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1060: 3b 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 0a 2b  ;.+    }.+    .+
1070: 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 43      /*.+     * C
1080: 68 65 63 6b 20 64 69 72 65 63 74 69 6f 6e 20 61  heck direction a
1090: 67 61 69 6e 73 74 20 63 68 61 6e 6e 65 6c 20 6d  gainst channel m
10a0: 6f 64 65 2e 20 49 74 20 69 73 20 61 6e 20 65 72  ode. It is an er
10b0: 72 6f 72 20 69 66 20 77 65 20 74 72 79 20 74 6f  ror if we try to
10c0: 20 63 6c 6f 73 65 0a 2b 20 20 20 20 20 2a 20 61   close.+     * a
10d0: 20 64 69 72 65 63 74 69 6f 6e 20 6e 6f 74 20 73   direction not s
10e0: 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 65 20  upported by the 
10f0: 63 68 61 6e 6e 65 6c 20 28 61 6c 72 65 61 64 79  channel (already
1100: 20 63 6c 6f 73 65 64 2c 20 6f 72 20 6e 65 76 65   closed, or neve
1110: 72 0a 2b 20 20 20 20 20 2a 20 6f 70 65 6e 65 64  r.+     * opened
1120: 20 66 6f 72 20 74 68 61 74 20 64 69 72 65 63 74   for that direct
1130: 69 6f 6e 29 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b  ion)..+     */.+
1140: 0a 2b 20 20 20 20 69 66 20 28 21 28 73 74 61 74  .+    if (!(stat
1150: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 28 54  ePtr->flags & (T
1160: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
1170: 4c 5f 57 52 49 54 41 42 4c 45 29 20 26 20 66 6c  L_WRITABLE) & fl
1180: 61 67 73 29 29 20 7b 0a 2b 09 63 6f 6e 73 74 20  ags)) {.+.const 
1190: 63 68 61 72 20 2a 6d 73 67 3b 0a 2b 09 69 66 20  char *msg;.+.if 
11a0: 28 66 6c 61 67 73 20 26 20 54 43 4c 5f 43 4c 4f  (flags & TCL_CLO
11b0: 53 45 5f 52 45 41 44 29 20 7b 0a 2b 09 20 20 20  SE_READ) {.+.   
11c0: 20 6d 73 67 20 3d 20 22 72 65 61 64 22 3b 0a 2b   msg = "read";.+
11d0: 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 20 20 20 20  .} else {.+.    
11e0: 6d 73 67 20 3d 20 22 77 72 69 74 65 22 3b 0a 2b  msg = "write";.+
11f0: 09 7d 0a 2b 09 54 63 6c 5f 41 70 70 65 6e 64 52  .}.+.Tcl_AppendR
1200: 65 73 75 6c 74 20 28 69 6e 74 65 72 70 2c 20 22  esult (interp, "
1210: 48 61 6c 66 2d 63 6c 6f 73 65 20 6f 66 20 22 2c  Half-close of ",
1220: 20 6d 73 67 2c 0a 2b 09 09 09 20 20 20 20 20 20   msg,.+...      
1230: 22 2d 73 69 64 65 20 6e 6f 74 20 70 6f 73 73 69  "-side not possi
1240: 62 6c 65 2c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ble, not support
1250: 65 64 20 62 79 20 63 68 61 6e 6e 65 6c 22 2c 0a  ed by channel",.
1260: 2b 09 09 09 20 20 20 20 20 20 4e 55 4c 4c 29 3b  +...      NULL);
1270: 0a 2b 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .+.return TCL_ER
1280: 52 4f 52 3b 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20  ROR;.+    }.+.+ 
1290: 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 41 20     /*.+     * A 
12a0: 75 73 65 72 20 6d 61 79 20 74 72 79 20 74 6f 20  user may try to 
12b0: 63 61 6c 6c 20 68 61 6c 66 2d 63 6c 6f 73 65 20  call half-close 
12c0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 63 68  from within a ch
12d0: 61 6e 6e 65 6c 20 63 6c 6f 73 65 0a 2b 20 20 20  annel close.+   
12e0: 20 20 2a 20 68 61 6e 64 6c 65 72 2e 20 54 68 61    * handler. Tha
12f0: 74 20 77 6f 6e 27 74 20 64 6f 2e 0a 2b 20 20 20  t won't do..+   
1300: 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20 69 66 20 28    */.+.+    if (
1310: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
1320: 26 20 43 48 41 4e 4e 45 4c 5f 49 4e 43 4c 4f 53  & CHANNEL_INCLOS
1330: 45 29 20 7b 0a 2b 09 69 66 20 28 69 6e 74 65 72  E) {.+.if (inter
1340: 70 29 20 7b 0a 2b 09 20 20 20 20 54 63 6c 5f 41  p) {.+.    Tcl_A
1350: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1360: 72 70 2c 20 22 49 6c 6c 65 67 61 6c 20 72 65 63  rp, "Illegal rec
1370: 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 63  ursive call to c
1380: 6c 6f 73 65 20 22 0a 2b 09 09 20 20 20 20 22 74  lose ".+..    "t
1390: 68 72 6f 75 67 68 20 63 6c 6f 73 65 2d 68 61 6e  hrough close-han
13a0: 64 6c 65 72 20 6f 66 20 63 68 61 6e 6e 65 6c 22  dler of channel"
13b0: 2c 20 4e 55 4c 4c 29 3b 0a 2b 09 7d 0a 2b 09 72  , NULL);.+.}.+.r
13c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13d0: 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20 20 20 20 2f  .+    }.+.+    /
13e0: 2a 0a 2b 20 20 20 20 20 2a 20 46 69 6e 61 6c 6c  *.+     * Finall
13f0: 79 20 64 6f 20 77 68 61 74 20 69 73 20 61 73 6b  y do what is ask
1400: 65 64 20 6f 66 20 75 73 2e 0a 2b 20 20 20 20 20  ed of us..+     
1410: 2a 2f 0a 2b 0a 2b 20 20 20 20 72 65 73 75 6c 74  */.+.+    result
1420: 20 3d 20 63 68 61 6e 50 74 72 2d 3e 74 79 70 65   = chanPtr->type
1430: 50 74 72 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 28  Ptr->close2Proc(
1440: 63 68 61 6e 50 74 72 2d 3e 69 6e 73 74 61 6e 63  chanPtr->instanc
1450: 65 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 0a 2b  eData, interp,.+
1460: 09 09 09 09 09 20 20 66 6c 61 67 73 29 3b 0a 2b  .....  flags);.+
1470: 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a  .+    /*.+     *
1480: 20 54 49 50 20 23 32 31 39 2e 0a 2b 20 20 20 20   TIP #219..+    
1490: 20 2a 20 43 61 70 74 75 72 65 20 65 72 72 6f 72   * Capture error
14a0: 20 6d 65 73 73 61 67 65 73 20 70 75 74 20 62 79   messages put by
14b0: 20 74 68 65 20 64 72 69 76 65 72 20 69 6e 74 6f   the driver into
14c0: 20 74 68 65 20 62 79 70 61 73 73 20 61 72 65 61   the bypass area
14d0: 20 61 6e 64 20 70 75 74 0a 2b 20 20 20 20 20 2a   and put.+     *
14e0: 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 20 72   them into the r
14f0: 65 67 75 6c 61 72 20 69 6e 74 65 72 70 72 65 74  egular interpret
1500: 65 72 20 72 65 73 75 6c 74 2e 0a 2b 20 20 20 20  er result..+    
1510: 20 2a 0a 2b 09 20 2a 0a 2b 09 20 2a 20 5b 41 6c   *.+. *.+. * [Al
1520: 65 78 3a 20 49 20 64 6f 6e 27 74 20 75 6e 64 65  ex: I don't unde
1530: 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6d 6d 65  rstand the comme
1540: 6e 74 20 62 65 6c 6f 77 2e 20 54 68 65 20 68 61  nt below. The ha
1550: 6c 66 2d 63 6c 6f 73 65 20 70 72 65 73 65 72 76  lf-close preserv
1560: 65 73 20 63 68 61 6e 50 74 72 20 5d 0a 2b 09 20  es chanPtr ].+. 
1570: 2a 0a 2b 20 20 20 20 20 2a 20 4e 6f 74 65 73 3a  *.+     * Notes:
1580: 20 44 75 65 20 74 6f 20 74 68 65 20 61 73 73 65   Due to the asse
1590: 72 74 69 6f 6e 20 6f 66 20 43 48 41 4e 4e 45 4c  rtion of CHANNEL
15a0: 5f 43 4c 4f 53 45 44 20 69 6e 20 74 68 65 20 66  _CLOSED in the f
15b0: 6c 61 67 73 0a 2b 20 20 20 20 20 2a 20 46 6c 75  lags.+     * Flu
15c0: 73 68 43 68 61 6e 6e 65 6c 28 29 20 68 61 73 20  shChannel() has 
15d0: 63 61 6c 6c 65 64 20 43 6c 6f 73 65 43 68 61 6e  called CloseChan
15e0: 6e 65 6c 28 29 20 61 6e 64 20 74 68 75 73 20 66  nel() and thus f
15f0: 72 65 65 64 20 61 6c 6c 20 74 68 65 20 63 68 61  reed all the cha
1600: 6e 6e 65 6c 0a 2b 20 20 20 20 20 2a 20 73 74 72  nnel.+     * str
1610: 75 63 74 75 72 65 73 2e 20 57 65 20 6d 75 73 74  uctures. We must
1620: 20 6e 6f 74 20 74 72 79 20 74 6f 20 61 63 63 65   not try to acce
1630: 73 73 20 22 63 68 61 6e 22 20 61 6e 79 6d 6f 72  ss "chan" anymor
1640: 65 2c 20 68 65 6e 63 65 20 74 68 65 20 4e 55 4c  e, hence the NUL
1650: 4c 0a 2b 20 20 20 20 20 2a 20 61 72 67 75 6d 65  L.+     * argume
1660: 6e 74 20 69 6e 20 74 68 65 20 63 61 6c 6c 20 62  nt in the call b
1670: 65 6c 6f 77 2e 20 54 68 65 20 6f 6e 6c 79 20 70  elow. The only p
1680: 6c 61 63 65 20 77 68 69 63 68 20 6d 61 79 20 73  lace which may s
1690: 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 0a 2b  till contain a.+
16a0: 20 20 20 20 20 2a 20 6d 65 73 73 61 67 65 20 69       * message i
16b0: 73 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  s the interprete
16c0: 72 20 69 74 73 65 6c 66 2c 20 61 6e 64 20 22 43  r itself, and "C
16d0: 6c 6f 73 65 43 68 61 6e 6e 65 6c 22 20 6d 61 64  loseChannel" mad
16e0: 65 20 73 75 72 65 20 74 6f 20 6c 69 66 74 0a 2b  e sure to lift.+
16f0: 20 20 20 20 20 2a 20 61 6e 79 20 63 68 61 6e 6e       * any chann
1700: 65 6c 20 6d 65 73 73 61 67 65 20 69 74 20 67 65  el message it ge
1710: 6e 65 72 61 74 65 64 20 69 6e 74 6f 20 69 74 2e  nerated into it.
1720: 0a 2b 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20 20  .+     */.+.+   
1730: 20 69 66 20 28 54 63 6c 43 68 61 6e 43 61 75 67   if (TclChanCaug
1740: 68 74 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e  htErrorBypass(in
1750: 74 65 72 70 2c 20 4e 55 4c 4c 29 29 20 7b 0a 2b  terp, NULL)) {.+
1760: 09 72 65 73 75 6c 74 20 3d 20 45 49 4e 56 41 4c  .result = EINVAL
1770: 3b 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20 20 20 20  ;.+    }.+.+    
1780: 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 30 29  if (result != 0)
1790: 20 7b 0a 2b 09 72 65 74 75 72 6e 20 54 43 4c 5f   {.+.return TCL_
17a0: 45 52 52 4f 52 3b 0a 2b 20 20 20 20 7d 0a 2b 0a  ERROR;.+    }.+.
17b0: 2b 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  +.statePtr->flag
17c0: 73 20 26 3d 20 7e 28 66 6c 61 67 73 20 26 20 28  s &= ~(flags & (
17d0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54  TCL_READABLE | T
17e0: 43 4c 5f 57 52 49 54 41 42 4c 45 29 29 3b 0a 2b  CL_WRITABLE));.+
17f0: 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  .+    return TCL
1800: 5f 4f 4b 3b 0a 2b 7d 0a 2b 0c 0a 2b 2f 2a 0a 2b  _OK;.+}.+..+/*.+
1810: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a 20 20 2a  --------.+ *.  *
1860: 20 54 63 6c 5f 43 6c 65 61 72 43 68 61 6e 6e 65   Tcl_ClearChanne
1870: 6c 48 61 6e 64 6c 65 72 73 20 2d 2d 0a 20 20 2a  lHandlers --.  *
1880: 0a 20 20 2a 09 52 65 6d 6f 76 65 73 20 61 6c 6c  .  *.Removes all
1890: 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72   channel handler
18a0: 73 20 61 6e 64 20 65 76 65 6e 74 20 73 63 72 69  s and event scri
18b0: 70 74 73 20 66 72 6f 6d 20 74 68 65 20 63 68 61  pts from the cha
18c0: 6e 6e 65 6c 2c 0a 49 6e 64 65 78 3a 20 67 65 6e  nnel,.Index: gen
18d0: 65 72 69 63 2f 74 63 6c 49 4f 43 6d 64 2e 63 0a  eric/tclIOCmd.c.
18e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
18f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1920: 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63  ===.RCS file: /c
1930: 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67  vsroot/tcl/tcl/g
1940: 65 6e 65 72 69 63 2f 74 63 6c 49 4f 43 6d 64 2e  eneric/tclIOCmd.
1950: 63 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20 72  c,v.retrieving r
1960: 65 76 69 73 69 6f 6e 20 31 2e 35 39 0a 64 69 66  evision 1.59.dif
1970: 66 20 2d 75 20 2d 72 31 2e 35 39 20 74 63 6c 49  f -u -r1.59 tclI
1980: 4f 43 6d 64 2e 63 0a 2d 2d 2d 20 67 65 6e 65 72  OCmd.c.--- gener
1990: 69 63 2f 74 63 6c 49 4f 43 6d 64 2e 63 09 31 36  ic/tclIOCmd.c.16
19a0: 20 4f 63 74 20 32 30 30 38 20 32 32 3a 33 34 3a   Oct 2008 22:34:
19b0: 31 39 20 2d 30 30 30 30 09 31 2e 35 39 0a 2b 2b  19 -0000.1.59.++
19c0: 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 49 4f 43  + generic/tclIOC
19d0: 6d 64 2e 63 09 31 20 44 65 63 20 32 30 30 38 20  md.c.1 Dec 2008 
19e0: 31 34 3a 31 36 3a 34 33 20 2d 30 30 30 30 0a 40  14:16:43 -0000.@
19f0: 40 20 2d 36 34 38 2c 38 20 2b 36 34 38 2c 38 20  @ -648,8 +648,8 
1a00: 40 40 0a 20 7b 0a 20 20 20 20 20 54 63 6c 5f 43  @@. {.     Tcl_C
1a10: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
1a20: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
1a30: 63 6c 6f 73 65 2e 20 2a 2f 0a 20 0a 2d 20 20 20  close. */. .-   
1a40: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
1a50: 7b 0a 2d 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  {.-.Tcl_WrongNum
1a60: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1a70: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 49 64  objv, "channelId
1a80: 22 29 3b 0a 2b 20 20 20 20 69 66 20 28 28 6f 62  ");.+    if ((ob
1a90: 6a 63 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a  jc != 2) && (obj
1aa0: 63 20 21 3d 20 33 29 29 20 7b 0a 2b 09 54 63 6c  c != 3)) {.+.Tcl
1ab0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1ac0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1ad0: 63 68 61 6e 6e 65 6c 49 64 20 3f 64 69 72 65 63  channelId ?direc
1ae0: 74 69 6f 6e 3f 22 29 3b 0a 20 09 72 65 74 75 72  tion?");. .retur
1af0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1b00: 20 20 7d 0a 20 0a 40 40 20 2d 36 35 37 2c 36 20    }. .@@ -657,6 
1b10: 2b 36 35 37 2c 34 38 20 40 40 0a 20 09 72 65 74  +657,48 @@. .ret
1b20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b30: 20 20 20 20 7d 0a 20 0a 2b 20 20 20 20 69 66 20      }. .+    if 
1b40: 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 2b 09  (objc == 3) {.+.
1b50: 69 6e 74 20 6f 70 74 69 6f 6e 49 6e 64 65 78 2c  int optionIndex,
1b60: 20 64 69 72 3b 0a 2b 09 73 74 61 74 69 63 20 63   dir;.+.static c
1b70: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
1b80: 20 64 69 72 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20   dirOptions[] = 
1b90: 7b 0a 2b 09 20 20 20 20 22 72 65 61 64 22 2c 20  {.+.    "read", 
1ba0: 22 77 72 69 74 65 22 2c 20 4e 55 4c 4c 0a 2b 09  "write", NULL.+.
1bb0: 7d 3b 0a 2b 09 73 74 61 74 69 63 20 69 6e 74 20  };.+.static int 
1bc0: 64 69 72 41 72 72 61 79 5b 5d 20 3d 20 7b 54 43  dirArray[] = {TC
1bd0: 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 2c 20 54 43  L_CLOSE_READ, TC
1be0: 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 7d 3b 0a  L_CLOSE_WRITE};.
1bf0: 2b 0a 2b 09 2f 2a 0a 2b 09 20 2a 20 47 65 74 20  +.+./*.+. * Get 
1c00: 64 69 72 65 63 74 69 6f 6e 20 72 65 71 75 65 73  direction reques
1c10: 74 65 64 20 74 6f 20 63 6c 6f 73 65 2c 20 61 6e  ted to close, an
1c20: 64 20 63 68 65 63 6b 20 73 79 6e 74 61 78 2e 0a  d check syntax..
1c30: 2b 09 20 2a 2f 0a 2b 0a 2b 09 69 66 20 28 54 63  +. */.+.+.if (Tc
1c40: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
1c50: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1c60: 5d 2c 20 64 69 72 4f 70 74 69 6f 6e 73 2c 20 22  ], dirOptions, "
1c70: 64 69 72 65 63 74 69 6f 6e 22 2c 20 30 2c 0a 2b  direction", 0,.+
1c80: 09 09 26 6f 70 74 69 6f 6e 49 6e 64 65 78 29 20  ..&optionIndex) 
1c90: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 09 20  != TCL_OK) {.+. 
1ca0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1cb0: 52 4f 52 3b 0a 2b 09 7d 0a 2b 09 64 69 72 20 3d  ROR;.+.}.+.dir =
1cc0: 20 64 69 72 41 72 72 61 79 5b 6f 70 74 69 6f 6e   dirArray[option
1cd0: 49 6e 64 65 78 5d 3b 0a 2b 0a 2b 09 2f 2a 0a 2b  Index];.+.+./*.+
1ce0: 09 20 2a 20 43 68 65 63 6b 20 64 69 72 65 63 74  . * Check direct
1cf0: 69 6f 6e 20 61 67 61 69 6e 73 74 20 63 68 61 6e  ion against chan
1d00: 6e 65 6c 20 6d 6f 64 65 2e 20 49 74 20 69 73 20  nel mode. It is 
1d10: 61 6e 20 65 72 72 6f 72 20 69 66 20 77 65 20 74  an error if we t
1d20: 72 79 20 74 6f 0a 2b 09 20 2a 20 63 6c 6f 73 65  ry to.+. * close
1d30: 20 61 20 64 69 72 65 63 74 69 6f 6e 20 6e 6f 74   a direction not
1d40: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68   supported by th
1d50: 65 20 63 68 61 6e 6e 65 6c 20 28 61 6c 72 65 61  e channel (alrea
1d60: 64 79 20 63 6c 6f 73 65 64 2c 20 6f 72 0a 2b 09  dy closed, or.+.
1d70: 20 2a 20 6e 65 76 65 72 20 6f 70 65 6e 65 64 20   * never opened 
1d80: 66 6f 72 20 74 68 61 74 20 64 69 72 65 63 74 69  for that directi
1d90: 6f 6e 29 2e 0a 2b 09 20 2a 2f 0a 2b 0a 2b 09 69  on)..+. */.+.+.i
1da0: 66 20 28 21 28 64 69 72 20 26 20 54 63 6c 5f 47  f (!(dir & Tcl_G
1db0: 65 74 43 68 61 6e 6e 65 6c 4d 6f 64 65 20 28 63  etChannelMode (c
1dc0: 68 61 6e 29 29 29 20 7b 0a 2b 09 20 20 20 20 54  han))) {.+.    T
1dd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 20  cl_AppendResult 
1de0: 28 69 6e 74 65 72 70 2c 20 22 48 61 6c 66 2d 63  (interp, "Half-c
1df0: 6c 6f 73 65 20 6f 66 20 22 2c 20 64 69 72 4f 70  lose of ", dirOp
1e00: 74 69 6f 6e 73 5b 6f 70 74 69 6f 6e 49 6e 64 65  tions[optionInde
1e10: 78 5d 2c 0a 2b 09 09 09 20 20 20 20 20 20 22 2d  x],.+...      "-
1e20: 73 69 64 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  side not possibl
1e30: 65 2c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  e, not supported
1e40: 20 62 79 20 63 68 61 6e 6e 65 6c 22 2c 0a 2b 09   by channel",.+.
1e50: 09 09 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 2b  ..      NULL);.+
1e60: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e70: 45 52 52 4f 52 3b 0a 2b 09 7d 0a 2b 0a 2b 09 2f  ERROR;.+.}.+.+./
1e80: 2a 0a 2b 09 20 2a 20 53 70 65 63 69 61 6c 20 68  *.+. * Special h
1e90: 61 6e 64 6c 69 6e 67 20 69 73 20 6e 65 65 64 65  andling is neede
1ea0: 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  d if and only if
1eb0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 6d 6f 64   the channel mod
1ec0: 65 20 73 75 70 70 6f 72 74 73 0a 2b 09 20 2a 20  e supports.+. * 
1ed0: 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 64 69  more than the di
1ee0: 72 65 63 74 69 6f 6e 20 74 6f 20 63 6c 6f 73 65  rection to close
1ef0: 2e 20 42 65 63 61 75 73 65 20 69 66 20 74 68 65  . Because if the
1f00: 20 63 6c 6f 73 65 20 74 68 65 20 6c 61 73 74 0a   close the last.
1f10: 2b 09 20 2a 20 64 69 72 65 63 74 69 6f 6e 20 73  +. * direction s
1f20: 75 70 70 70 6f 72 74 65 64 20 77 65 20 63 61 6e  uppported we can
1f30: 20 61 6e 64 20 77 69 6c 6c 20 67 6f 20 74 68 72   and will go thr
1f40: 6f 75 67 68 20 74 68 65 20 72 65 67 75 6c 61 72  ough the regular
1f50: 0a 2b 09 20 2a 20 70 72 6f 63 65 73 73 2e 0a 2b  .+. * process..+
1f60: 09 20 2a 2f 0a 2b 0a 2b 09 69 66 20 28 28 54 63  . */.+.+.if ((Tc
1f70: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4d 6f 64 65  l_GetChannelMode
1f80: 20 28 63 68 61 6e 29 20 26 20 28 54 43 4c 5f 43   (chan) & (TCL_C
1f90: 4c 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 4c  LOSE_READ|TCL_CL
1fa0: 4f 53 45 5f 57 52 49 54 45 29 29 20 21 3d 20 64  OSE_WRITE)) != d
1fb0: 69 72 29 20 7b 0a 2b 09 20 20 20 20 72 65 74 75  ir) {.+.    retu
1fc0: 72 6e 20 54 63 6c 5f 43 6c 6f 73 65 45 78 20 28  rn Tcl_CloseEx (
1fd0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 64 69  interp, chan, di
1fe0: 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 3b 0a 2b 09  r) != TCL_OK;.+.
1ff0: 7d 0a 2b 20 20 20 20 7d 0a 2b 0a 20 20 20 20 20  }.+    }.+.     
2000: 69 66 20 28 54 63 6c 5f 55 6e 72 65 67 69 73 74  if (Tcl_Unregist
2010: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  erChannel(interp
2020: 2c 20 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f  , chan) != TCL_O
2030: 4b 29 20 7b 0a 20 09 2f 2a 0a 20 09 20 2a 20 49  K) {. ./*. . * I
2040: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72  f there is an er
2050: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
2060: 69 74 20 65 6e 64 73 20 77 69 74 68 20 61 20 6e  it ends with a n
2070: 65 77 6c 69 6e 65 2c 20 72 65 6d 6f 76 65 20 74  ewline, remove t
2080: 68 65 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69  he.Index: generi
2090: 63 2f 74 63 6c 53 74 75 62 49 6e 69 74 2e 63 0a  c/tclStubInit.c.
20a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20e0: 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63  ===.RCS file: /c
20f0: 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67  vsroot/tcl/tcl/g
2100: 65 6e 65 72 69 63 2f 74 63 6c 53 74 75 62 49 6e  eneric/tclStubIn
2110: 69 74 2e 63 2c 76 0a 72 65 74 72 69 65 76 69 6e  it.c,v.retrievin
2120: 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 31 36 37  g revision 1.167
2130: 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e 31 36 37  .diff -u -r1.167
2140: 20 74 63 6c 53 74 75 62 49 6e 69 74 2e 63 0a 2d   tclStubInit.c.-
2150: 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 53 74  -- generic/tclSt
2160: 75 62 49 6e 69 74 2e 63 09 32 32 20 4f 63 74 20  ubInit.c.22 Oct 
2170: 32 30 30 38 20 32 30 3a 32 33 3a 35 39 20 2d 30  2008 20:23:59 -0
2180: 30 30 30 09 31 2e 31 36 37 0a 2b 2b 2b 20 67 65  000.1.167.+++ ge
2190: 6e 65 72 69 63 2f 74 63 6c 53 74 75 62 49 6e 69  neric/tclStubIni
21a0: 74 2e 63 09 31 20 44 65 63 20 32 30 30 38 20 31  t.c.1 Dec 2008 1
21b0: 34 3a 31 36 3a 34 33 20 2d 30 30 30 30 0a 40 40  4:16:43 -0000.@@
21c0: 20 2d 31 31 33 30 2c 36 20 2b 31 31 33 30 2c 37   -1130,6 +1130,7
21d0: 20 40 40 0a 20 20 20 20 20 54 63 6c 5f 53 65 74   @@.     Tcl_Set
21e0: 45 6e 73 65 6d 62 6c 65 50 61 72 61 6d 65 74 65  EnsembleParamete
21f0: 72 4c 69 73 74 2c 20 2f 2a 20 36 30 32 20 2a 2f  rList, /* 602 */
2200: 0a 20 20 20 20 20 54 63 6c 5f 47 65 74 45 6e 73  .     Tcl_GetEns
2210: 65 6d 62 6c 65 50 61 72 61 6d 65 74 65 72 4c 69  embleParameterLi
2220: 73 74 2c 20 2f 2a 20 36 30 33 20 2a 2f 0a 20 20  st, /* 603 */.  
2230: 20 20 20 54 63 6c 5f 50 61 72 73 65 41 72 67 73     Tcl_ParseArgs
2240: 4f 62 6a 76 2c 20 2f 2a 20 36 30 34 20 2a 2f 0a  Objv, /* 604 */.
2250: 2b 20 20 20 20 54 63 6c 5f 43 6c 6f 73 65 45 78  +    Tcl_CloseEx
2260: 2c 20 2f 2a 20 36 30 35 20 2a 2f 0a 20 7d 3b 0a  , /* 605 */. };.
2270: 20 0a 20 2f 2a 20 21 45 4e 44 21 3a 20 44 6f 20   . /* !END!: Do 
2280: 6e 6f 74 20 65 64 69 74 20 61 62 6f 76 65 20 74  not edit above t
2290: 68 69 73 20 6c 69 6e 65 2e 20 2a 2f 0a 49 6e 64  his line. */.Ind
22a0: 65 78 3a 20 75 6e 69 78 2f 74 63 6c 55 6e 69 78  ex: unix/tclUnix
22b0: 43 68 61 6e 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d  Chan.c.=========
22c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
22d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
22e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
22f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66  ==========.RCS f
2300: 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63  ile: /cvsroot/tc
2310: 6c 2f 74 63 6c 2f 75 6e 69 78 2f 74 63 6c 55 6e  l/tcl/unix/tclUn
2320: 69 78 43 68 61 6e 2e 63 2c 76 0a 72 65 74 72 69  ixChan.c,v.retri
2330: 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31  eving revision 1
2340: 2e 39 36 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e  .96.diff -u -r1.
2350: 39 36 20 74 63 6c 55 6e 69 78 43 68 61 6e 2e 63  96 tclUnixChan.c
2360: 0a 2d 2d 2d 20 75 6e 69 78 2f 74 63 6c 55 6e 69  .--- unix/tclUni
2370: 78 43 68 61 6e 2e 63 09 32 36 20 4f 63 74 20 32  xChan.c.26 Oct 2
2380: 30 30 38 20 31 32 3a 34 35 3a 30 34 20 2d 30 30  008 12:45:04 -00
2390: 30 30 09 31 2e 39 36 0a 2b 2b 2b 20 75 6e 69 78  00.1.96.+++ unix
23a0: 2f 74 63 6c 55 6e 69 78 43 68 61 6e 2e 63 09 31  /tclUnixChan.c.1
23b0: 20 44 65 63 20 32 30 30 38 20 31 34 3a 31 36 3a   Dec 2008 14:16:
23c0: 34 33 20 2d 30 30 30 30 0a 40 40 20 2d 32 31 38  43 -0000.@@ -218
23d0: 2c 36 20 2b 32 31 38 2c 39 20 40 40 0a 20 73 74  ,6 +218,9 @@. st
23e0: 61 74 69 63 20 69 6e 74 09 09 54 63 70 42 6c 6f  atic int..TcpBlo
23f0: 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e  ckModeProc(Clien
2400: 74 44 61 74 61 20 64 61 74 61 2c 20 69 6e 74 20  tData data, int 
2410: 6d 6f 64 65 29 3b 0a 20 73 74 61 74 69 63 20 69  mode);. static i
2420: 6e 74 09 09 54 63 70 43 6c 6f 73 65 50 72 6f 63  nt..TcpCloseProc
2430: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
2440: 61 6e 63 65 44 61 74 61 2c 0a 20 09 09 09 20 20  anceData,. ...  
2450: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2460: 74 65 72 70 29 3b 0a 2b 73 74 61 74 69 63 20 69  terp);.+static i
2470: 6e 74 09 09 54 63 70 43 6c 6f 73 65 32 50 72 6f  nt..TcpClose2Pro
2480: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
2490: 74 61 6e 63 65 44 61 74 61 2c 0a 2b 09 09 09 09  tanceData,.+....
24a0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
24b0: 20 2a 69 6e 74 65 72 70 2c 0a 2b 09 09 09 09 20   *interp,.+.... 
24c0: 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 3b       int flags);
24d0: 0a 20 73 74 61 74 69 63 20 69 6e 74 09 09 54 63  . static int..Tc
24e0: 70 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 43  pGetHandleProc(C
24f0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
2500: 63 65 44 61 74 61 2c 0a 20 09 09 09 20 20 20 20  ceData,. ...    
2510: 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43  int direction, C
2520: 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c  lientData *handl
2530: 65 50 74 72 29 3b 0a 20 73 74 61 74 69 63 20 69  ePtr);. static i
2540: 6e 74 09 09 54 63 70 47 65 74 4f 70 74 69 6f 6e  nt..TcpGetOption
2550: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
2560: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 40 40  instanceData,.@@
2570: 20 2d 33 31 38 2c 37 20 2b 33 32 31 2c 37 20 40   -318,7 +321,7 @
2580: 40 0a 20 20 20 20 20 54 63 70 47 65 74 4f 70 74  @.     TcpGetOpt
2590: 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74  ionProc,../* Get
25a0: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f   option proc. */
25b0: 0a 20 20 20 20 20 54 63 70 57 61 74 63 68 50 72  .     TcpWatchPr
25c0: 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69  oc,../* Initiali
25d0: 7a 65 20 6e 6f 74 69 66 69 65 72 2e 20 2a 2f 0a  ze notifier. */.
25e0: 20 20 20 20 20 54 63 70 47 65 74 48 61 6e 64 6c       TcpGetHandl
25f0: 65 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 4f  eProc,../* Get O
2600: 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66  S handles out of
2610: 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2d 20 20   channel. */.-  
2620: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 63 6c 6f    NULL,.../* clo
2630: 73 65 32 70 72 6f 63 2e 20 2a 2f 0a 2b 20 20 20  se2proc. */.+   
2640: 20 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 2c 09   TcpClose2Proc,.
2650: 09 2f 2a 20 43 6c 6f 73 65 32 20 70 72 6f 63 2e  ./* Close2 proc.
2660: 20 2a 2f 0a 20 20 20 20 20 54 63 70 42 6c 6f 63   */.     TcpBloc
2670: 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f 2a 20 53  kModeProc,../* S
2680: 65 74 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e  et blocking or n
2690: 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  on-blocking mode
26a0: 2e 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09  .*/.     NULL,..
26b0: 09 2f 2a 20 66 6c 75 73 68 20 70 72 6f 63 2e 20  ./* flush proc. 
26c0: 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09 09  */.     NULL,...
26d0: 2f 2a 20 68 61 6e 64 6c 65 72 20 70 72 6f 63 2e  /* handler proc.
26e0: 20 2a 2f 0a 40 40 20 2d 32 30 31 38 2c 36 20 2b   */.@@ -2018,6 +
26f0: 32 30 32 31 2c 35 37 20 40 40 0a 20 2f 2a 0a 20  2021,57 @@. /*. 
2700: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 0a 2b 20 2a  --------.  *.+ *
2750: 20 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 20 2d   TcpClose2Proc -
2760: 2d 0a 2b 20 2a 0a 2b 20 2a 09 54 68 69 73 20 66  -.+ *.+ *.This f
2770: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2780: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
2790: 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72   IO level to per
27a0: 66 6f 72 6d 20 74 68 65 20 63 68 61 6e 6e 65 6c  form the channel
27b0: 0a 2b 20 2a 09 74 79 70 65 20 73 70 65 63 69 66  .+ *.type specif
27c0: 69 63 20 70 61 72 74 20 6f 66 20 61 20 68 61 6c  ic part of a hal
27d0: 66 2d 63 6c 6f 73 65 3a 20 6e 61 6d 65 6c 79 2c  f-close: namely,
27e0: 20 61 20 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e   a shutdown() on
27f0: 20 61 20 73 6f 63 6b 65 74 2e 0a 2b 20 2a 0a 2b   a socket..+ *.+
2800: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 2b 20 2a 09   * Results:.+ *.
2810: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  0 if successful,
2820: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72   the value of er
2830: 72 6e 6f 20 69 66 20 66 61 69 6c 65 64 2e 0a 2b  rno if failed..+
2840: 20 2a 0a 2b 20 2a 20 53 69 64 65 20 65 66 66 65   *.+ * Side effe
2850: 63 74 73 3a 0a 2b 20 2a 09 53 68 75 74 73 20 64  cts:.+ *.Shuts d
2860: 6f 77 6e 20 6f 6e 65 20 73 69 64 65 20 6f 66 20  own one side of 
2870: 74 68 65 20 73 6f 63 6b 65 74 2e 0a 2b 20 2a 0a  the socket..+ *.
2880: 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  + *-------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 2f 0a 2b  ---------.+ */.+
28d0: 0a 2b 73 74 61 74 69 63 20 69 6e 74 0a 2b 54 63  .+static int.+Tc
28e0: 70 43 6c 6f 73 65 32 50 72 6f 63 28 0a 2b 20 20  pClose2Proc(.+  
28f0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
2900: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54 68  tanceData,./* Th
2910: 65 20 73 6f 63 6b 65 74 20 74 6f 20 63 6c 6f 73  e socket to clos
2920: 65 2e 20 2a 2f 0a 2b 20 20 20 20 54 63 6c 5f 49  e. */.+    Tcl_I
2930: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
2940: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65 70  /* For error rep
2950: 6f 72 74 69 6e 67 2e 20 2a 2f 0a 2b 20 20 20 20  orting. */.+    
2960: 69 6e 74 20 66 6c 61 67 73 29 09 09 09 2f 2a 20  int flags).../* 
2970: 46 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  Flags that indic
2980: 61 74 65 20 77 68 69 63 68 20 73 69 64 65 20 74  ate which side t
2990: 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 2b 7b 0a 2b  o close. */.+{.+
29a0: 20 20 20 20 54 63 70 53 74 61 74 65 20 2a 73 74      TcpState *st
29b0: 61 74 65 50 74 72 20 3d 20 28 54 63 70 53 74 61  atePtr = (TcpSta
29c0: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61  te *) instanceDa
29d0: 74 61 3b 0a 2b 20 20 20 20 69 6e 74 20 65 72 72  ta;.+    int err
29e0: 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 2b 20 20 20  orCode = 0;.+   
29f0: 20 69 6e 74 20 73 64 3b 0a 2b 0a 2b 20 20 20 20   int sd;.+.+    
2a00: 2f 2a 0a 2b 20 20 20 20 20 2a 20 53 68 75 74 64  /*.+     * Shutd
2a10: 6f 77 6e 20 74 68 65 20 4f 53 20 73 6f 63 6b 65  own the OS socke
2a20: 74 20 68 61 6e 64 6c 65 2e 0a 2b 20 20 20 20 20  t handle..+     
2a30: 2a 2f 0a 2b 20 20 20 20 73 77 69 74 63 68 28 66  */.+    switch(f
2a40: 6c 61 67 73 29 0a 2b 09 7b 0a 2b 09 63 61 73 65  lags).+.{.+.case
2a50: 20 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 3a   TCL_CLOSE_READ:
2a60: 0a 2b 09 20 20 20 20 73 64 3d 53 48 55 54 5f 52  .+.    sd=SHUT_R
2a70: 44 3b 0a 2b 09 20 20 20 20 62 72 65 61 6b 3b 0a  D;.+.    break;.
2a80: 2b 09 63 61 73 65 20 54 43 4c 5f 43 4c 4f 53 45  +.case TCL_CLOSE
2a90: 5f 57 52 49 54 45 3a 0a 2b 09 20 20 20 20 73 64  _WRITE:.+.    sd
2aa0: 3d 53 48 55 54 5f 57 52 3b 0a 2b 09 20 20 20 20  =SHUT_WR;.+.    
2ab0: 62 72 65 61 6b 3b 0a 2b 09 64 65 66 61 75 6c 74  break;.+.default
2ac0: 3a 0a 2b 09 20 20 20 20 69 66 20 28 69 6e 74 65  :.+.    if (inte
2ad0: 72 70 29 20 7b 0a 2b 09 09 54 63 6c 5f 41 70 70  rp) {.+..Tcl_App
2ae0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2af0: 2c 20 22 53 6f 63 6b 65 74 20 63 6c 6f 73 65 32  , "Socket close2
2b00: 70 72 6f 63 20 63 61 6c 6c 65 64 20 62 69 64 69  proc called bidi
2b10: 72 65 63 74 69 6f 6e 61 6c 6c 79 22 2c 20 4e 55  rectionally", NU
2b20: 4c 4c 29 3b 0a 2b 09 20 20 20 20 7d 0a 2b 09 20  LL);.+.    }.+. 
2b30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2b40: 52 4f 52 3b 0a 2b 09 7d 0a 2b 20 20 20 20 69 66  ROR;.+.}.+    if
2b50: 20 28 73 68 75 74 64 6f 77 6e 28 73 74 61 74 65   (shutdown(state
2b60: 50 74 72 2d 3e 66 64 2c 73 64 29 3c 30 29 20 7b  Ptr->fd,sd)<0) {
2b70: 0a 2b 09 65 72 72 6f 72 43 6f 64 65 20 3d 20 65  .+.errorCode = e
2b80: 72 72 6e 6f 3b 0a 2b 20 20 20 20 7d 0a 2b 0a 2b  rrno;.+    }.+.+
2b90: 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 6f 72      return error
2ba0: 43 6f 64 65 3b 0a 2b 7d 0a 2b 0c 0a 2b 2f 2a 0a  Code;.+}.+..+/*.
2bb0: 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  + *-------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a 20 20  ---------.+ *.  
2c00: 2a 20 54 63 70 47 65 74 4f 70 74 69 6f 6e 50 72  * TcpGetOptionPr
2c10: 6f 63 20 2d 2d 0a 20 20 2a 0a 20 20 2a 09 43 6f  oc --.  *.  *.Co
2c20: 6d 70 75 74 65 73 20 61 6e 20 6f 70 74 69 6f 6e  mputes an option
2c30: 20 76 61 6c 75 65 20 66 6f 72 20 61 20 54 43 50   value for a TCP
2c40: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
2c50: 61 6e 6e 65 6c 2c 20 6f 72 20 61 20 6c 69 73 74  annel, or a list
2c60: 20 6f 66 0a 49 6e 64 65 78 3a 20 77 69 6e 2f 74   of.Index: win/t
2c70: 63 6c 57 69 6e 53 6f 63 6b 2e 63 0a 3d 3d 3d 3d  clWinSock.c.====
2c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2cb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
2cc0: 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f  RCS file: /cvsro
2cd0: 6f 74 2f 74 63 6c 2f 74 63 6c 2f 77 69 6e 2f 74  ot/tcl/tcl/win/t
2ce0: 63 6c 57 69 6e 53 6f 63 6b 2e 63 2c 76 0a 72 65  clWinSock.c,v.re
2cf0: 74 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f  trieving revisio
2d00: 6e 20 31 2e 36 33 0a 64 69 66 66 20 2d 75 20 2d  n 1.63.diff -u -
2d10: 72 31 2e 36 33 20 74 63 6c 57 69 6e 53 6f 63 6b  r1.63 tclWinSock
2d20: 2e 63 0a 2d 2d 2d 20 77 69 6e 2f 74 63 6c 57 69  .c.--- win/tclWi
2d30: 6e 53 6f 63 6b 2e 63 09 32 36 20 4f 63 74 20 32  nSock.c.26 Oct 2
2d40: 30 30 38 20 31 38 3a 34 33 3a 32 37 20 2d 30 30  008 18:43:27 -00
2d50: 30 30 09 31 2e 36 33 0a 2b 2b 2b 20 77 69 6e 2f  00.1.63.+++ win/
2d60: 74 63 6c 57 69 6e 53 6f 63 6b 2e 63 09 31 20 44  tclWinSock.c.1 D
2d70: 65 63 20 32 30 30 38 20 31 34 3a 31 36 3a 34 33  ec 2008 14:16:43
2d80: 20 2d 30 30 30 30 0a 40 40 20 2d 31 36 38 2c 36   -0000.@@ -168,6
2d90: 20 2b 31 36 38 2c 37 20 40 40 0a 20 73 74 61 74   +168,7 @@. stat
2da0: 69 63 20 54 63 6c 5f 45 76 65 6e 74 53 65 74 75  ic Tcl_EventSetu
2db0: 70 50 72 6f 63 09 53 6f 63 6b 65 74 53 65 74 75  pProc.SocketSetu
2dc0: 70 50 72 6f 63 3b 0a 20 73 74 61 74 69 63 20 54  pProc;. static T
2dd0: 63 6c 5f 44 72 69 76 65 72 42 6c 6f 63 6b 4d 6f  cl_DriverBlockMo
2de0: 64 65 50 72 6f 63 09 54 63 70 42 6c 6f 63 6b 50  deProc.TcpBlockP
2df0: 72 6f 63 3b 0a 20 73 74 61 74 69 63 20 54 63 6c  roc;. static Tcl
2e00: 5f 44 72 69 76 65 72 43 6c 6f 73 65 50 72 6f 63  _DriverCloseProc
2e10: 09 54 63 70 43 6c 6f 73 65 50 72 6f 63 3b 0a 2b  .TcpCloseProc;.+
2e20: 73 74 61 74 69 63 20 54 63 6c 5f 44 72 69 76 65  static Tcl_Drive
2e30: 72 43 6c 6f 73 65 32 50 72 6f 63 09 54 63 70 43  rClose2Proc.TcpC
2e40: 6c 6f 73 65 32 50 72 6f 63 3b 0a 20 73 74 61 74  lose2Proc;. stat
2e50: 69 63 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74  ic Tcl_DriverSet
2e60: 4f 70 74 69 6f 6e 50 72 6f 63 09 54 63 70 53 65  OptionProc.TcpSe
2e70: 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 20 73 74  tOptionProc;. st
2e80: 61 74 69 63 20 54 63 6c 5f 44 72 69 76 65 72 47  atic Tcl_DriverG
2e90: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 09 54 63 70  etOptionProc.Tcp
2ea0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 20  GetOptionProc;. 
2eb0: 73 74 61 74 69 63 20 54 63 6c 5f 44 72 69 76 65  static Tcl_Drive
2ec0: 72 49 6e 70 75 74 50 72 6f 63 09 54 63 70 49 6e  rInputProc.TcpIn
2ed0: 70 75 74 50 72 6f 63 3b 0a 40 40 20 2d 31 39 31  putProc;.@@ -191
2ee0: 2c 37 20 2b 31 39 32 2c 37 20 40 40 0a 20 20 20  ,7 +192,7 @@.   
2ef0: 20 20 54 63 70 47 65 74 4f 70 74 69 6f 6e 50 72    TcpGetOptionPr
2f00: 6f 63 2c 09 20 20 20 20 2f 2a 20 47 65 74 20 6f  oc,.    /* Get o
2f10: 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20  ption proc. */. 
2f20: 20 20 20 20 54 63 70 57 61 74 63 68 50 72 6f 63      TcpWatchProc
2f30: 2c 09 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20  ,.    /* Set up 
2f40: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63  notifier to watc
2f50: 68 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20  h this channel. 
2f60: 2a 2f 0a 20 20 20 20 20 54 63 70 47 65 74 48 61  */.     TcpGetHa
2f70: 6e 64 6c 65 50 72 6f 63 2c 09 20 20 20 20 2f 2a  ndleProc,.    /*
2f80: 20 47 65 74 20 61 6e 20 4f 53 20 68 61 6e 64 6c   Get an OS handl
2f90: 65 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 2e 20  e from channel. 
2fa0: 2a 2f 0a 2d 20 20 20 20 4e 55 4c 4c 2c 09 09 20  */.-    NULL,.. 
2fb0: 20 20 20 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63     /* close2proc
2fc0: 2e 20 2a 2f 0a 2b 20 20 20 20 54 63 70 43 6c 6f  . */.+    TcpClo
2fd0: 73 65 32 50 72 6f 63 2c 09 20 20 20 20 2f 2a 20  se2Proc,.    /* 
2fe0: 43 6c 6f 73 65 32 70 72 6f 63 2e 20 2a 2f 0a 20  Close2proc. */. 
2ff0: 20 20 20 20 54 63 70 42 6c 6f 63 6b 50 72 6f 63      TcpBlockProc
3000: 2c 09 20 20 20 20 2f 2a 20 53 65 74 20 73 6f 63  ,.    /* Set soc
3010: 6b 65 74 20 69 6e 74 6f 20 28 6e 6f 6e 2d 29 62  ket into (non-)b
3020: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 20 2a 2f  locking mode. */
3030: 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09 20 20 20  .     NULL,..   
3040: 20 2f 2a 20 66 6c 75 73 68 20 70 72 6f 63 2e 20   /* flush proc. 
3050: 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09 20  */.     NULL,.. 
3060: 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 20 70 72     /* handler pr
3070: 6f 63 2e 20 2a 2f 0a 40 40 20 2d 38 31 38 2c 36  oc. */.@@ -818,6
3080: 20 2b 38 31 39 2c 35 38 20 40 40 0a 20 2f 2a 0a   +819,58 @@. /*.
3090: 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    *-------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 0a 2b 20  ---------.  *.+ 
30e0: 2a 20 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 20  * TcpClose2Proc 
30f0: 2d 2d 0a 2b 20 2a 0a 2b 20 2a 09 54 68 69 73 20  --.+ *.+ *.This 
3100: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
3110: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
3120: 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65  c IO level to pe
3130: 72 66 6f 72 6d 20 74 68 65 20 63 68 61 6e 6e 65  rform the channe
3140: 6c 0a 2b 20 2a 09 74 79 70 65 20 73 70 65 63 69  l.+ *.type speci
3150: 66 69 63 20 70 61 72 74 20 6f 66 20 61 20 68 61  fic part of a ha
3160: 6c 66 2d 63 6c 6f 73 65 3a 20 6e 61 6d 65 6c 79  lf-close: namely
3170: 2c 20 61 20 73 68 75 74 64 6f 77 6e 28 29 20 6f  , a shutdown() o
3180: 6e 20 61 20 73 6f 63 6b 65 74 2e 0a 2b 20 2a 0a  n a socket..+ *.
3190: 2b 20 2a 20 52 65 73 75 6c 74 73 3a 0a 2b 20 2a  + * Results:.+ *
31a0: 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  .0 if successful
31b0: 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  , the value of e
31c0: 72 72 6e 6f 20 69 66 20 66 61 69 6c 65 64 2e 0a  rrno if failed..
31d0: 2b 20 2a 0a 2b 20 2a 20 53 69 64 65 20 65 66 66  + *.+ * Side eff
31e0: 65 63 74 73 3a 0a 2b 20 2a 09 53 68 75 74 73 20  ects:.+ *.Shuts 
31f0: 64 6f 77 6e 20 6f 6e 65 20 73 69 64 65 20 6f 66  down one side of
3200: 20 74 68 65 20 73 6f 63 6b 65 74 2e 0a 2b 20 2a   the socket..+ *
3210: 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .+ *------------
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 2f 0a  ----------.+ */.
3260: 2b 0a 2b 73 74 61 74 69 63 20 69 6e 74 0a 2b 54  +.+static int.+T
3270: 63 70 43 6c 6f 73 65 32 50 72 6f 63 28 0a 2b 20  cpClose2Proc(.+ 
3280: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e     ClientData in
3290: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 54  stanceData,./* T
32a0: 68 65 20 73 6f 63 6b 65 74 20 74 6f 20 63 6c 6f  he socket to clo
32b0: 73 65 2e 20 2a 2f 0a 2b 20 20 20 20 54 63 6c 5f  se. */.+    Tcl_
32c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09  Interp *interp,.
32d0: 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 65  ./* For error re
32e0: 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 2b 20 20 20  porting. */.+   
32f0: 20 69 6e 74 20 66 6c 61 67 73 29 09 09 09 2f 2a   int flags).../*
3300: 20 46 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   Flags that indi
3310: 63 61 74 65 20 77 68 69 63 68 20 73 69 64 65 20  cate which side 
3320: 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 2b 7b 0a  to close. */.+{.
3330: 2b 20 20 20 20 53 6f 63 6b 65 74 49 6e 66 6f 20  +    SocketInfo 
3340: 2a 69 6e 66 6f 50 74 72 20 3d 20 28 53 6f 63 6b  *infoPtr = (Sock
3350: 65 74 49 6e 66 6f 20 2a 29 20 69 6e 73 74 61 6e  etInfo *) instan
3360: 63 65 44 61 74 61 3b 0a 2b 20 20 20 20 69 6e 74  ceData;.+    int
3370: 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a   errorCode = 0;.
3380: 2b 20 20 20 20 69 6e 74 20 73 64 3b 0a 2b 0a 2b  +    int sd;.+.+
3390: 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 53      /*.+     * S
33a0: 68 75 74 64 6f 77 6e 20 74 68 65 20 4f 53 20 73  hutdown the OS s
33b0: 6f 63 6b 65 74 20 68 61 6e 64 6c 65 2e 0a 2b 20  ocket handle..+ 
33c0: 20 20 20 20 2a 2f 0a 2b 20 20 20 20 73 77 69 74      */.+    swit
33d0: 63 68 28 66 6c 61 67 73 29 0a 2b 09 7b 0a 2b 09  ch(flags).+.{.+.
33e0: 63 61 73 65 20 54 43 4c 5f 43 4c 4f 53 45 5f 52  case TCL_CLOSE_R
33f0: 45 41 44 3a 0a 2b 09 20 20 20 20 73 64 3d 53 44  EAD:.+.    sd=SD
3400: 5f 52 45 43 45 49 56 45 3b 0a 2b 09 20 20 20 20  _RECEIVE;.+.    
3410: 62 72 65 61 6b 3b 0a 2b 09 63 61 73 65 20 54 43  break;.+.case TC
3420: 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 3a 0a 2b  L_CLOSE_WRITE:.+
3430: 09 20 20 20 20 73 64 3d 53 44 5f 53 45 4e 44 3b  .    sd=SD_SEND;
3440: 0a 2b 09 20 20 20 20 62 72 65 61 6b 3b 0a 2b 09  .+.    break;.+.
3450: 64 65 66 61 75 6c 74 3a 0a 2b 09 20 20 20 20 69  default:.+.    i
3460: 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 2b 09 09  f (interp) {.+..
3470: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3480: 28 69 6e 74 65 72 70 2c 20 22 53 6f 63 6b 65 74  (interp, "Socket
3490: 20 63 6c 6f 73 65 32 70 72 6f 63 20 63 61 6c 6c   close2proc call
34a0: 65 64 20 62 69 64 69 72 65 63 74 69 6f 6e 61 6c  ed bidirectional
34b0: 6c 79 22 2c 20 4e 55 4c 4c 29 3b 0a 2b 09 20 20  ly", NULL);.+.  
34c0: 20 20 7d 0a 2b 09 20 20 20 20 72 65 74 75 72 6e    }.+.    return
34d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 2b 09 7d 0a   TCL_ERROR;.+.}.
34e0: 2b 20 20 20 20 69 66 20 28 73 68 75 74 64 6f 77  +    if (shutdow
34f0: 6e 28 69 6e 66 6f 50 74 72 2d 3e 73 6f 63 6b 65  n(infoPtr->socke
3500: 74 2c 73 64 29 20 3d 3d 20 53 4f 43 4b 45 54 5f  t,sd) == SOCKET_
3510: 45 52 52 4f 52 29 20 7b 0a 2b 09 54 63 6c 57 69  ERROR) {.+.TclWi
3520: 6e 43 6f 6e 76 65 72 74 57 53 41 45 72 72 6f 72  nConvertWSAError
3530: 28 28 44 57 4f 52 44 29 20 57 53 41 47 65 74 4c  ((DWORD) WSAGetL
3540: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 2b 09 65  astError());.+.e
3550: 72 72 6f 72 43 6f 64 65 20 3d 20 54 63 6c 5f 47  rrorCode = Tcl_G
3560: 65 74 45 72 72 6e 6f 28 29 3b 0a 2b 20 20 20 20  etErrno();.+    
3570: 7d 0a 2b 0a 2b 20 20 20 20 72 65 74 75 72 6e 20  }.+.+    return 
3580: 65 72 72 6f 72 43 6f 64 65 3b 0a 2b 7d 0a 2b 0c  errorCode;.+}.+.
3590: 0a 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .+/*.+ *--------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b  --------------.+
35e0: 20 2a 0a 20 20 2a 20 4e 65 77 53 6f 63 6b 65 74   *.  * NewSocket
35f0: 49 6e 66 6f 20 2d 2d 0a 20 20 2a 0a 20 20 2a 09  Info --.  *.  *.
3600: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
3610: 6c 6f 63 61 74 65 73 20 61 6e 64 20 69 6e 69 74  locates and init
3620: 69 61 6c 69 7a 65 73 20 61 20 6e 65 77 20 53 6f  ializes a new So
3630: 63 6b 65 74 49 6e 66 6f 20 73 74 72 75 63 74 75  cketInfo structu
3640: 72 65 2e 0a                                      re..