Tcl Source Code

Hex Artifact Content
Login

Artifact edf786c127828092f48740316d049772f04e5a25:

Attachment "halfclose-5.patch" to ticket [219159ffff] added by andreas_kupries 2008-12-02 03:59:11.
0000: 2d 2d 2d 20 74 63 6c 38 36 2e 6f 72 69 67 2f 67  --- tcl86.orig/g
0010: 65 6e 65 72 69 63 2f 74 63 6c 2e 64 65 63 6c 73  eneric/tcl.decls
0020: 09 32 30 30 38 2d 31 31 2d 32 37 20 31 34 3a 34  .2008-11-27 14:4
0030: 38 3a 31 37 2e 30 30 30 30 30 30 30 30 30 20 2d  8:17.000000000 -
0040: 30 38 30 30 0a 2b 2b 2b 20 74 63 6c 38 36 2f 67  0800.+++ tcl86/g
0050: 65 6e 65 72 69 63 2f 74 63 6c 2e 64 65 63 6c 73  eneric/tcl.decls
0060: 09 32 30 30 38 2d 31 32 2d 30 31 20 31 30 3a 35  .2008-12-01 10:5
0070: 35 3a 31 32 2e 30 30 30 30 30 30 30 30 30 20 2d  5:12.000000000 -
0080: 30 38 30 30 0a 40 40 20 2d 32 32 30 34 2c 36 20  0800.@@ -2204,6 
0090: 2b 32 32 30 34 2c 31 31 20 40 40 0a 20 09 20 20  +2204,11 @@. .  
00a0: 20 20 69 6e 74 20 2a 6f 62 6a 63 50 74 72 2c 20    int *objcPtr, 
00b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a  Tcl_Obj *const *
00c0: 6f 62 6a 76 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a  objv, Tcl_Obj **
00d0: 2a 72 65 6d 4f 62 6a 76 29 0a 20 7d 0a 20 0a 2b  *remObjv). }. .+
00e0: 23 20 54 49 50 23 33 33 32 2c 20 48 61 6c 66 20  # TIP#332, Half 
00f0: 43 6c 6f 73 65 20 6d 61 64 65 20 70 75 62 6c 69  Close made publi
0100: 63 0a 2b 64 65 63 6c 61 72 65 20 36 30 35 20 67  c.+declare 605 g
0110: 65 6e 65 72 69 63 20 7b 0a 2b 20 20 20 20 69 6e  eneric {.+    in
0120: 74 20 54 63 6c 5f 43 6c 6f 73 65 45 78 28 54 63  t Tcl_CloseEx(Tc
0130: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0140: 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68  , Tcl_Channel ch
0150: 61 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29 0a 2b  an, int flags).+
0160: 7d 0a 2b 0a 20 23 23 23 23 23 23 23 23 23 23 23  }.+. ###########
0170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01b0: 23 23 23 0a 20 0a 20 23 20 44 65 66 69 6e 65 20  ###. . # Define 
01c0: 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 73 70 65  the platform spe
01d0: 63 69 66 69 63 20 70 75 62 6c 69 63 20 54 63 6c  cific public Tcl
01e0: 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 65   interface.  The
01f0: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  se functions are
0200: 0a 2d 2d 2d 20 74 63 6c 38 36 2e 6f 72 69 67 2f  .--- tcl86.orig/
0210: 67 65 6e 65 72 69 63 2f 74 63 6c 44 65 63 6c 73  generic/tclDecls
0220: 2e 68 09 32 30 30 38 2d 31 31 2d 32 37 20 31 34  .h.2008-11-27 14
0230: 3a 34 38 3a 31 37 2e 30 30 30 30 30 30 30 30 30  :48:17.000000000
0240: 20 2d 30 38 30 30 0a 2b 2b 2b 20 74 63 6c 38 36   -0800.+++ tcl86
0250: 2f 67 65 6e 65 72 69 63 2f 74 63 6c 44 65 63 6c  /generic/tclDecl
0260: 73 2e 68 09 32 30 30 38 2d 31 32 2d 30 31 20 31  s.h.2008-12-01 1
0270: 30 3a 35 35 3a 31 32 2e 30 30 30 30 30 30 30 30  0:55:12.00000000
0280: 30 20 2d 30 38 30 30 0a 40 40 20 2d 33 36 35 37  0 -0800.@@ -3657
0290: 2c 36 20 2b 33 36 35 37 2c 31 32 20 40 40 0a 20  ,6 +3657,12 @@. 
02a0: 09 09 09 09 63 6f 6e 73 74 20 54 63 6c 5f 41 72  ....const Tcl_Ar
02b0: 67 76 49 6e 66 6f 20 2a 20 61 72 67 54 61 62 6c  gvInfo * argTabl
02c0: 65 2c 20 69 6e 74 20 2a 20 6f 62 6a 63 50 74 72  e, int * objcPtr
02d0: 2c 0a 20 09 09 09 09 54 63 6c 5f 4f 62 6a 20 2a  ,. ....Tcl_Obj *
02e0: 63 6f 6e 73 74 20 2a 20 6f 62 6a 76 2c 20 54 63  const * objv, Tc
02f0: 6c 5f 4f 62 6a 20 2a 2a 2a 20 72 65 6d 4f 62 6a  l_Obj *** remObj
0300: 76 29 3b 0a 20 23 65 6e 64 69 66 0a 2b 23 69 66  v);. #endif.+#if
0310: 6e 64 65 66 20 54 63 6c 5f 43 6c 6f 73 65 45 78  ndef Tcl_CloseEx
0320: 5f 54 43 4c 5f 44 45 43 4c 41 52 45 44 0a 2b 23  _TCL_DECLARED.+#
0330: 64 65 66 69 6e 65 20 54 63 6c 5f 43 6c 6f 73 65  define Tcl_Close
0340: 45 78 5f 54 43 4c 5f 44 45 43 4c 41 52 45 44 0a  Ex_TCL_DECLARED.
0350: 2b 2f 2a 20 36 30 35 20 2a 2f 0a 2b 45 58 54 45  +/* 605 */.+EXTE
0360: 52 4e 20 69 6e 74 09 09 54 63 6c 5f 43 6c 6f 73  RN int..Tcl_Clos
0370: 65 45 78 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  eEx (Tcl_Interp 
0380: 2a 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 43 68  * interp, Tcl_Ch
0390: 61 6e 6e 65 6c 20 63 68 61 6e 2c 0a 2b 09 09 09  annel chan,.+...
03a0: 09 69 6e 74 20 66 6c 61 67 73 29 3b 0a 2b 23 65  .int flags);.+#e
03b0: 6e 64 69 66 0a 20 0a 20 74 79 70 65 64 65 66 20  ndif. . typedef 
03c0: 73 74 72 75 63 74 20 54 63 6c 53 74 75 62 48 6f  struct TclStubHo
03d0: 6f 6b 73 20 7b 0a 20 20 20 20 20 63 6f 6e 73 74  oks {.     const
03e0: 20 73 74 72 75 63 74 20 54 63 6c 50 6c 61 74 53   struct TclPlatS
03f0: 74 75 62 73 20 2a 74 63 6c 50 6c 61 74 53 74 75  tubs *tclPlatStu
0400: 62 73 3b 0a 40 40 20 2d 34 33 32 31 2c 36 20 2b  bs;.@@ -4321,6 +
0410: 34 33 32 37 2c 37 20 40 40 0a 20 20 20 20 20 69  4327,7 @@.     i
0420: 6e 74 20 28 2a 74 63 6c 5f 53 65 74 45 6e 73 65  nt (*tcl_SetEnse
0430: 6d 62 6c 65 50 61 72 61 6d 65 74 65 72 4c 69 73  mbleParameterLis
0440: 74 29 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  t) (Tcl_Interp *
0450: 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 43 6f 6d   interp, Tcl_Com
0460: 6d 61 6e 64 20 74 6f 6b 65 6e 2c 20 54 63 6c 5f  mand token, Tcl_
0470: 4f 62 6a 20 2a 20 70 61 72 61 6d 4c 69 73 74 29  Obj * paramList)
0480: 3b 20 2f 2a 20 36 30 32 20 2a 2f 0a 20 20 20 20  ; /* 602 */.    
0490: 20 69 6e 74 20 28 2a 74 63 6c 5f 47 65 74 45 6e   int (*tcl_GetEn
04a0: 73 65 6d 62 6c 65 50 61 72 61 6d 65 74 65 72 4c  sembleParameterL
04b0: 69 73 74 29 20 28 54 63 6c 5f 49 6e 74 65 72 70  ist) (Tcl_Interp
04c0: 20 2a 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 43   * interp, Tcl_C
04d0: 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 2c 20 54 63  ommand token, Tc
04e0: 6c 5f 4f 62 6a 20 2a 2a 20 70 61 72 61 6d 4c 69  l_Obj ** paramLi
04f0: 73 74 50 74 72 29 3b 20 2f 2a 20 36 30 33 20 2a  stPtr); /* 603 *
0500: 2f 0a 20 20 20 20 20 69 6e 74 20 28 2a 74 63 6c  /.     int (*tcl
0510: 5f 50 61 72 73 65 41 72 67 73 4f 62 6a 76 29 20  _ParseArgsObjv) 
0520: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 20 69 6e  (Tcl_Interp * in
0530: 74 65 72 70 2c 20 63 6f 6e 73 74 20 54 63 6c 5f  terp, const Tcl_
0540: 41 72 67 76 49 6e 66 6f 20 2a 20 61 72 67 54 61  ArgvInfo * argTa
0550: 62 6c 65 2c 20 69 6e 74 20 2a 20 6f 62 6a 63 50  ble, int * objcP
0560: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  tr, Tcl_Obj *con
0570: 73 74 20 2a 20 6f 62 6a 76 2c 20 54 63 6c 5f 4f  st * objv, Tcl_O
0580: 62 6a 20 2a 2a 2a 20 72 65 6d 4f 62 6a 76 29 3b  bj *** remObjv);
0590: 20 2f 2a 20 36 30 34 20 2a 2f 0a 2b 20 20 20 20   /* 604 */.+    
05a0: 69 6e 74 20 28 2a 74 63 6c 5f 43 6c 6f 73 65 45  int (*tcl_CloseE
05b0: 78 29 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  x) (Tcl_Interp *
05c0: 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 43 68 61   interp, Tcl_Cha
05d0: 6e 6e 65 6c 20 63 68 61 6e 2c 20 69 6e 74 20 66  nnel chan, int f
05e0: 6c 61 67 73 29 3b 20 2f 2a 20 36 30 35 20 2a 2f  lags); /* 605 */
05f0: 0a 20 7d 20 54 63 6c 53 74 75 62 73 3b 0a 20 0a  . } TclStubs;. .
0600: 20 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45   #if defined(USE
0610: 5f 54 43 4c 5f 53 54 55 42 53 29 20 26 26 20 21  _TCL_STUBS) && !
0620: 64 65 66 69 6e 65 64 28 55 53 45 5f 54 43 4c 5f  defined(USE_TCL_
0630: 53 54 55 42 5f 50 52 4f 43 53 29 0a 40 40 20 2d  STUB_PROCS).@@ -
0640: 36 38 31 33 2c 36 20 2b 36 38 32 30 2c 31 30 20  6813,6 +6820,10 
0650: 40 40 0a 20 23 64 65 66 69 6e 65 20 54 63 6c 5f  @@. #define Tcl_
0660: 50 61 72 73 65 41 72 67 73 4f 62 6a 76 20 5c 0a  ParseArgsObjv \.
0670: 20 09 28 74 63 6c 53 74 75 62 73 50 74 72 2d 3e   .(tclStubsPtr->
0680: 74 63 6c 5f 50 61 72 73 65 41 72 67 73 4f 62 6a  tcl_ParseArgsObj
0690: 76 29 20 2f 2a 20 36 30 34 20 2a 2f 0a 20 23 65  v) /* 604 */. #e
06a0: 6e 64 69 66 0a 2b 23 69 66 6e 64 65 66 20 54 63  ndif.+#ifndef Tc
06b0: 6c 5f 43 6c 6f 73 65 45 78 0a 2b 23 64 65 66 69  l_CloseEx.+#defi
06c0: 6e 65 20 54 63 6c 5f 43 6c 6f 73 65 45 78 20 5c  ne Tcl_CloseEx \
06d0: 0a 2b 09 28 74 63 6c 53 74 75 62 73 50 74 72 2d  .+.(tclStubsPtr-
06e0: 3e 74 63 6c 5f 43 6c 6f 73 65 45 78 29 20 2f 2a  >tcl_CloseEx) /*
06f0: 20 36 30 35 20 2a 2f 0a 2b 23 65 6e 64 69 66 0a   605 */.+#endif.
0700: 20 0a 20 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   . #endif /* def
0710: 69 6e 65 64 28 55 53 45 5f 54 43 4c 5f 53 54 55  ined(USE_TCL_STU
0720: 42 53 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  BS) && !defined(
0730: 55 53 45 5f 54 43 4c 5f 53 54 55 42 5f 50 52 4f  USE_TCL_STUB_PRO
0740: 43 53 29 20 2a 2f 0a 20 0a 2d 2d 2d 20 74 63 6c  CS) */. .--- tcl
0750: 38 36 2e 6f 72 69 67 2f 67 65 6e 65 72 69 63 2f  86.orig/generic/
0760: 74 63 6c 49 4f 2e 63 09 32 30 30 38 2d 31 31 2d  tclIO.c.2008-11-
0770: 32 37 20 31 34 3a 34 38 3a 31 37 2e 30 30 30 30  27 14:48:17.0000
0780: 30 30 30 30 30 20 2d 30 38 30 30 0a 2b 2b 2b 20  00000 -0800.+++ 
0790: 74 63 6c 38 36 2f 67 65 6e 65 72 69 63 2f 74 63  tcl86/generic/tc
07a0: 6c 49 4f 2e 63 09 32 30 30 38 2d 31 32 2d 30 31  lIO.c.2008-12-01
07b0: 20 31 32 3a 35 36 3a 31 33 2e 30 30 30 30 30 30   12:56:13.000000
07c0: 30 30 30 20 2d 30 38 30 30 0a 40 40 20 2d 33 30  000 -0800.@@ -30
07d0: 32 38 2c 36 20 2b 33 30 32 38 2c 31 33 31 20 40  28,6 +3028,131 @
07e0: 40 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d  @. /*.  *-------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0830: 20 20 2a 0a 2b 20 2a 20 54 63 6c 5f 43 6c 6f 73    *.+ * Tcl_Clos
0840: 65 45 78 20 2d 2d 0a 2b 20 2a 0a 2b 20 2a 09 48  eEx --.+ *.+ *.H
0850: 61 6c 66 20 63 6c 6f 73 65 73 20 61 20 63 68 61  alf closes a cha
0860: 6e 6e 65 6c 2e 0a 2b 20 2a 0a 2b 20 2a 20 52 65  nnel..+ *.+ * Re
0870: 73 75 6c 74 73 3a 0a 2b 20 2a 09 41 20 73 74 61  sults:.+ *.A sta
0880: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
0890: 2e 0a 2b 20 2a 0a 2b 20 2a 20 53 69 64 65 20 65  ..+ *.+ * Side e
08a0: 66 66 65 63 74 73 3a 0a 2b 20 2a 09 43 6c 6f 73  ffects:.+ *.Clos
08b0: 65 73 20 6f 6e 65 20 64 69 72 65 63 74 69 6f 6e  es one direction
08c0: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e   of the channel.
08d0: 0a 2b 20 2a 0a 2b 20 2a 20 4e 4f 54 45 3a 0a 2b  .+ *.+ * NOTE:.+
08e0: 20 2a 09 54 63 6c 5f 43 6c 6f 73 65 45 78 20 63   *.Tcl_CloseEx c
08f0: 6c 6f 73 65 73 20 74 68 65 20 73 70 65 63 69 66  loses the specif
0900: 69 65 64 20 64 69 72 65 63 74 69 6f 6e 20 6f 66  ied direction of
0910: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 61 73 20   the channel as 
0920: 66 61 72 20 61 73 0a 2b 20 2a 09 74 68 65 20 75  far as.+ *.the u
0930: 73 65 72 20 69 73 20 63 6f 6e 63 65 72 6e 65 64  ser is concerned
0940: 2e 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 6b 65  . The channel ke
0950: 65 70 73 20 65 78 69 73 74 69 6e 67 20 68 6f 77  eps existing how
0960: 65 76 65 72 2e 20 59 6f 75 20 63 61 6e 6e 6f 74  ever. You cannot
0970: 0a 2b 20 2a 09 63 61 6c 6c 73 20 74 68 69 73 20  .+ *.calls this 
0980: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6c 6f 73  function to clos
0990: 65 20 74 68 65 20 6c 61 73 74 20 70 6f 73 73 69  e the last possi
09a0: 62 6c 65 20 64 69 72 65 63 74 69 6f 6e 20 6f 66  ble direction of
09b0: 20 74 68 65 0a 2b 20 2a 09 63 68 61 6e 6e 65 6c   the.+ *.channel
09c0: 2e 20 55 73 65 20 54 63 6c 5f 43 6c 6f 73 65 20  . Use Tcl_Close 
09d0: 66 6f 72 20 74 68 61 74 2e 0a 2b 20 2a 0a 2b 20  for that..+ *.+ 
09e0: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 2f 0a 2b 0a 2b  -------.+ */.+.+
0a30: 09 2f 2a 20 41 52 47 53 55 53 45 44 20 2a 2f 0a  ./* ARGSUSED */.
0a40: 2b 69 6e 74 0a 2b 54 63 6c 5f 43 6c 6f 73 65 45  +int.+Tcl_CloseE
0a50: 78 28 0a 2b 20 20 20 20 54 63 6c 5f 49 6e 74 65  x(.+    Tcl_Inte
0a60: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
0a70: 49 6e 74 65 72 70 72 65 74 65 72 20 66 6f 72 20  Interpreter for 
0a80: 65 72 72 6f 72 73 2e 20 2a 2f 0a 2b 20 20 20 20  errors. */.+    
0a90: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
0aa0: 2c 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ,../* The channe
0ab0: 6c 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 20  l being closed. 
0ac0: 4d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65  May still be use
0ad0: 64 20 62 79 20 73 6f 6d 65 20 69 6e 74 65 72 70  d by some interp
0ae0: 72 65 74 65 72 20 2a 2f 0a 2b 20 20 20 20 69 6e  reter */.+    in
0af0: 74 20 66 6c 61 67 73 29 20 20 20 20 20 20 20 20  t flags)        
0b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
0b10: 67 73 20 74 65 6c 6c 69 6e 67 20 75 73 20 77 68  gs telling us wh
0b20: 69 63 68 20 73 69 64 65 20 74 6f 20 63 6c 6f 73  ich side to clos
0b30: 65 2e 20 2a 2f 0a 2b 7b 0a 2b 20 20 20 20 43 68  e. */.+{.+    Ch
0b40: 61 6e 6e 65 6c 20 2a 63 68 61 6e 50 74 72 3b 09  annel *chanPtr;.
0b50: 09 2f 2a 20 54 68 65 20 72 65 61 6c 20 49 4f 20  ./* The real IO 
0b60: 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2b 20 20 20  channel. */.+   
0b70: 20 43 68 61 6e 6e 65 6c 53 74 61 74 65 20 2a 73   ChannelState *s
0b80: 74 61 74 65 50 74 72 3b 09 2f 2a 20 53 74 61 74  tatePtr;./* Stat
0b90: 65 20 6f 66 20 72 65 61 6c 20 49 4f 20 63 68 61  e of real IO cha
0ba0: 6e 6e 65 6c 2e 20 2a 2f 0a 2b 20 20 20 20 69 6e  nnel. */.+    in
0bb0: 74 20 72 65 73 75 6c 74 3b 09 09 09 2f 2a 20 4f  t result;.../* O
0bc0: 66 20 63 61 6c 6c 69 6e 67 20 46 6c 75 73 68 43  f calling FlushC
0bd0: 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2b 0a 2b 20 20  hannel. */.+.+  
0be0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 4e 55    if (chan == NU
0bf0: 4c 4c 29 20 7b 0a 2b 09 72 65 74 75 72 6e 20 54  LL) {.+.return T
0c00: 43 4c 5f 4f 4b 3b 0a 2b 20 20 20 20 7d 0a 2b 0a  CL_OK;.+    }.+.
0c10: 2b 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 61 73  +    /* TODO: as
0c20: 73 65 72 74 20 66 6c 61 67 73 20 76 61 6c 69 64  sert flags valid
0c30: 69 74 79 20 3f 20 2a 2f 0a 2b 0a 2b 20 20 20 20  ity ? */.+.+    
0c40: 63 68 61 6e 50 74 72 20 3d 20 28 43 68 61 6e 6e  chanPtr = (Chann
0c50: 65 6c 20 2a 29 20 63 68 61 6e 3b 0a 2b 20 20 20  el *) chan;.+   
0c60: 20 73 74 61 74 65 50 74 72 20 3d 20 63 68 61 6e   statePtr = chan
0c70: 50 74 72 2d 3e 73 74 61 74 65 3b 0a 2b 0a 2b 20  Ptr->state;.+.+ 
0c80: 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 44 6f     /*.+     * Do
0c90: 65 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 73  es the channel s
0ca0: 75 70 70 6f 72 74 20 68 61 6c 66 2d 63 6c 6f 73  upport half-clos
0cb0: 65 20 61 6e 79 77 61 79 20 3f 20 45 72 72 6f 72  e anyway ? Error
0cc0: 20 69 66 20 6e 6f 74 2e 0a 2b 20 20 20 20 20 2a   if not..+     *
0cd0: 2f 0a 2b 0a 2b 20 20 20 20 69 66 20 28 21 63 68  /.+.+    if (!ch
0ce0: 61 6e 50 74 72 2d 3e 74 79 70 65 50 74 72 2d 3e  anPtr->typePtr->
0cf0: 63 6c 6f 73 65 32 50 72 6f 63 29 20 7b 0a 2b 09  close2Proc) {.+.
0d00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0d10: 20 28 69 6e 74 65 72 70 2c 20 22 48 61 6c 66 2d   (interp, "Half-
0d20: 63 6c 6f 73 65 20 6f 66 20 63 68 61 6e 6e 65 6c  close of channel
0d30: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
0d40: 62 79 20 22 2c 0a 2b 09 09 09 20 20 63 68 61 6e  by ",.+...  chan
0d50: 50 74 72 2d 3e 74 79 70 65 50 74 72 2d 3e 74 79  Ptr->typePtr->ty
0d60: 70 65 4e 61 6d 65 2c 20 22 73 22 2c 20 4e 55 4c  peName, "s", NUL
0d70: 4c 29 3b 0a 2b 09 72 65 74 75 72 6e 20 54 43 4c  L);.+.return TCL
0d80: 5f 45 52 52 4f 52 3b 0a 2b 20 20 20 20 7d 0a 2b  _ERROR;.+    }.+
0d90: 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a  .+    /*.+     *
0da0: 20 49 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 20   Is the channel 
0db0: 75 6e 73 74 61 63 6b 65 64 20 3f 20 49 66 20 6e  unstacked ? If n
0dc0: 6f 74 20 77 65 20 66 61 69 6c 2e 0a 2b 20 20 20  ot we fail..+   
0dd0: 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20 69 66 20 28    */.+.+    if (
0de0: 63 68 61 6e 50 74 72 20 21 3d 20 73 74 61 74 65  chanPtr != state
0df0: 50 74 72 2d 3e 74 6f 70 43 68 61 6e 50 74 72 29  Ptr->topChanPtr)
0e00: 20 7b 0a 2b 09 54 63 6c 5f 41 70 70 65 6e 64 52   {.+.Tcl_AppendR
0e10: 65 73 75 6c 74 20 28 69 6e 74 65 72 70 2c 0a 2b  esult (interp,.+
0e20: 09 09 09 20 20 22 48 61 6c 66 2d 63 6c 6f 73 65  ...  "Half-close
0e30: 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20   not applicable 
0e40: 74 6f 20 73 74 61 63 6b 20 6f 66 20 74 72 61 6e  to stack of tran
0e50: 73 66 6f 72 6d 61 74 69 6f 6e 73 22 2c 0a 2b 09  sformations",.+.
0e60: 09 09 20 20 4e 55 4c 4c 29 3b 0a 2b 09 72 65 74  ..  NULL);.+.ret
0e70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 2b  urn TCL_ERROR;.+
0e80: 20 20 20 20 7d 0a 2b 20 20 20 20 0a 2b 20 20 20      }.+    .+   
0e90: 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 43 68 65 63   /*.+     * Chec
0ea0: 6b 20 64 69 72 65 63 74 69 6f 6e 20 61 67 61 69  k direction agai
0eb0: 6e 73 74 20 63 68 61 6e 6e 65 6c 20 6d 6f 64 65  nst channel mode
0ec0: 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  . It is an error
0ed0: 20 69 66 20 77 65 20 74 72 79 20 74 6f 20 63 6c   if we try to cl
0ee0: 6f 73 65 0a 2b 20 20 20 20 20 2a 20 61 20 64 69  ose.+     * a di
0ef0: 72 65 63 74 69 6f 6e 20 6e 6f 74 20 73 75 70 70  rection not supp
0f00: 6f 72 74 65 64 20 62 79 20 74 68 65 20 63 68 61  orted by the cha
0f10: 6e 6e 65 6c 20 28 61 6c 72 65 61 64 79 20 63 6c  nnel (already cl
0f20: 6f 73 65 64 2c 20 6f 72 20 6e 65 76 65 72 0a 2b  osed, or never.+
0f30: 20 20 20 20 20 2a 20 6f 70 65 6e 65 64 20 66 6f       * opened fo
0f40: 72 20 74 68 61 74 20 64 69 72 65 63 74 69 6f 6e  r that direction
0f50: 29 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20  )..+     */.+.+ 
0f60: 20 20 20 69 66 20 28 21 28 73 74 61 74 65 50 74     if (!(statePt
0f70: 72 2d 3e 66 6c 61 67 73 20 26 20 28 54 43 4c 5f  r->flags & (TCL_
0f80: 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57  READABLE | TCL_W
0f90: 52 49 54 41 42 4c 45 29 20 26 20 66 6c 61 67 73  RITABLE) & flags
0fa0: 29 29 20 7b 0a 2b 09 63 6f 6e 73 74 20 63 68 61  )) {.+.const cha
0fb0: 72 20 2a 6d 73 67 3b 0a 2b 09 69 66 20 28 66 6c  r *msg;.+.if (fl
0fc0: 61 67 73 20 26 20 54 43 4c 5f 43 4c 4f 53 45 5f  ags & TCL_CLOSE_
0fd0: 52 45 41 44 29 20 7b 0a 2b 09 20 20 20 20 6d 73  READ) {.+.    ms
0fe0: 67 20 3d 20 22 72 65 61 64 22 3b 0a 2b 09 7d 20  g = "read";.+.} 
0ff0: 65 6c 73 65 20 7b 0a 2b 09 20 20 20 20 6d 73 67  else {.+.    msg
1000: 20 3d 20 22 77 72 69 74 65 22 3b 0a 2b 09 7d 0a   = "write";.+.}.
1010: 2b 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  +.Tcl_AppendResu
1020: 6c 74 20 28 69 6e 74 65 72 70 2c 20 22 48 61 6c  lt (interp, "Hal
1030: 66 2d 63 6c 6f 73 65 20 6f 66 20 22 2c 20 6d 73  f-close of ", ms
1040: 67 2c 0a 2b 09 09 09 20 20 20 20 20 20 22 2d 73  g,.+...      "-s
1050: 69 64 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ide not possible
1060: 2c 20 73 69 64 65 20 6e 6f 74 20 6f 70 65 6e 65  , side not opene
1070: 64 20 6f 72 20 61 6c 72 65 61 64 79 20 63 6c 6f  d or already clo
1080: 73 65 64 22 2c 0a 2b 09 09 09 20 20 20 20 20 20  sed",.+...      
1090: 4e 55 4c 4c 29 3b 0a 2b 09 72 65 74 75 72 6e 20  NULL);.+.return 
10a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 2b 20 20 20 20  TCL_ERROR;.+    
10b0: 7d 0a 2b 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20  }.+.+    /*.+   
10c0: 20 20 2a 20 41 20 75 73 65 72 20 6d 61 79 20 74    * A user may t
10d0: 72 79 20 74 6f 20 63 61 6c 6c 20 68 61 6c 66 2d  ry to call half-
10e0: 63 6c 6f 73 65 20 66 72 6f 6d 20 77 69 74 68 69  close from withi
10f0: 6e 20 61 20 63 68 61 6e 6e 65 6c 20 63 6c 6f 73  n a channel clos
1100: 65 0a 2b 20 20 20 20 20 2a 20 68 61 6e 64 6c 65  e.+     * handle
1110: 72 2e 20 54 68 61 74 20 77 6f 6e 27 74 20 64 6f  r. That won't do
1120: 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20  ..+     */.+.+  
1130: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1140: 66 6c 61 67 73 20 26 20 43 48 41 4e 4e 45 4c 5f  flags & CHANNEL_
1150: 49 4e 43 4c 4f 53 45 29 20 7b 0a 2b 09 69 66 20  INCLOSE) {.+.if 
1160: 28 69 6e 74 65 72 70 29 20 7b 0a 2b 09 20 20 20  (interp) {.+.   
1170: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1180: 74 28 69 6e 74 65 72 70 2c 20 22 49 6c 6c 65 67  t(interp, "Illeg
1190: 61 6c 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  al recursive cal
11a0: 6c 20 74 6f 20 63 6c 6f 73 65 20 22 0a 2b 09 09  l to close ".+..
11b0: 20 20 20 20 22 74 68 72 6f 75 67 68 20 63 6c 6f      "through clo
11c0: 73 65 2d 68 61 6e 64 6c 65 72 20 6f 66 20 63 68  se-handler of ch
11d0: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 2b  annel", NULL);.+
11e0: 09 7d 0a 2b 09 72 65 74 75 72 6e 20 54 43 4c 5f  .}.+.return TCL_
11f0: 45 52 52 4f 52 3b 0a 2b 20 20 20 20 7d 0a 2b 0a  ERROR;.+    }.+.
1200: 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20  +    /*.+     * 
1210: 46 69 6e 61 6c 6c 79 20 64 6f 20 77 68 61 74 20  Finally do what 
1220: 69 73 20 61 73 6b 65 64 20 6f 66 20 75 73 2e 0a  is asked of us..
1230: 2b 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20  +     */.+.+    
1240: 72 65 73 75 6c 74 20 3d 20 63 68 61 6e 50 74 72  result = chanPtr
1250: 2d 3e 74 79 70 65 50 74 72 2d 3e 63 6c 6f 73 65  ->typePtr->close
1260: 32 50 72 6f 63 28 63 68 61 6e 50 74 72 2d 3e 69  2Proc(chanPtr->i
1270: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
1280: 65 72 70 2c 0a 2b 09 09 09 09 09 20 20 66 6c 61  erp,.+.....  fla
1290: 67 73 29 3b 0a 2b 0a 2b 20 20 20 20 2f 2a 0a 2b  gs);.+.+    /*.+
12a0: 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39 2e       * TIP #219.
12b0: 0a 2b 20 20 20 20 20 2a 20 43 61 70 74 75 72 65  .+     * Capture
12c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
12d0: 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65  put by the drive
12e0: 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73  r into the bypas
12f0: 73 20 61 72 65 61 20 61 6e 64 20 70 75 74 0a 2b  s area and put.+
1300: 20 20 20 20 20 2a 20 74 68 65 6d 20 69 6e 74 6f       * them into
1310: 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e 74   the regular int
1320: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e  erpreter result.
1330: 0a 2b 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20 20  .+     */.+.+   
1340: 20 69 66 20 28 54 63 6c 43 68 61 6e 43 61 75 67   if (TclChanCaug
1350: 68 74 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e  htErrorBypass(in
1360: 74 65 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a 2b  terp, chan)) {.+
1370: 09 72 65 73 75 6c 74 20 3d 20 45 49 4e 56 41 4c  .result = EINVAL
1380: 3b 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20 20 20 20  ;.+    }.+.+    
1390: 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 30 29  if (result != 0)
13a0: 20 7b 0a 2b 09 72 65 74 75 72 6e 20 54 43 4c 5f   {.+.return TCL_
13b0: 45 52 52 4f 52 3b 0a 2b 20 20 20 20 7d 0a 2b 0a  ERROR;.+    }.+.
13c0: 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20  +    /*.+     * 
13d0: 52 65 6d 6f 76 65 20 74 68 65 20 63 6c 6f 73 65  Remove the close
13e0: 64 20 73 69 64 65 20 66 72 6f 6d 20 74 68 65 20  d side from the 
13f0: 63 68 61 6e 6e 65 6c 20 6d 6f 64 65 2f 66 6c 61  channel mode/fla
1400: 67 73 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b 0a 2b  gs..+     */.+.+
1410: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
1420: 61 67 73 20 26 3d 20 7e 28 66 6c 61 67 73 20 26  ags &= ~(flags &
1430: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c   (TCL_READABLE |
1440: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 29 3b   TCL_WRITABLE));
1450: 0a 2b 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 54  .+.+    return T
1460: 43 4c 5f 4f 4b 3b 0a 2b 7d 0a 2b 0c 0a 2b 2f 2a  CL_OK;.+}.+..+/*
1470: 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .+ *------------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a 20  ----------.+ *. 
14c0: 20 2a 20 54 63 6c 5f 43 6c 65 61 72 43 68 61 6e   * Tcl_ClearChan
14d0: 6e 65 6c 48 61 6e 64 6c 65 72 73 20 2d 2d 0a 20  nelHandlers --. 
14e0: 20 2a 0a 20 20 2a 09 52 65 6d 6f 76 65 73 20 61   *.  *.Removes a
14f0: 6c 6c 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c  ll channel handl
1500: 65 72 73 20 61 6e 64 20 65 76 65 6e 74 20 73 63  ers and event sc
1510: 72 69 70 74 73 20 66 72 6f 6d 20 74 68 65 20 63  ripts from the c
1520: 68 61 6e 6e 65 6c 2c 0a 2d 2d 2d 20 74 63 6c 38  hannel,.--- tcl8
1530: 36 2e 6f 72 69 67 2f 67 65 6e 65 72 69 63 2f 74  6.orig/generic/t
1540: 63 6c 49 4f 43 6d 64 2e 63 09 32 30 30 38 2d 31  clIOCmd.c.2008-1
1550: 31 2d 32 37 20 31 34 3a 34 35 3a 35 37 2e 30 30  1-27 14:45:57.00
1560: 30 30 30 30 30 30 30 20 2d 30 38 30 30 0a 2b 2b  0000000 -0800.++
1570: 2b 20 74 63 6c 38 36 2f 67 65 6e 65 72 69 63 2f  + tcl86/generic/
1580: 74 63 6c 49 4f 43 6d 64 2e 63 09 32 30 30 38 2d  tclIOCmd.c.2008-
1590: 31 32 2d 30 31 20 31 30 3a 35 35 3a 31 32 2e 30  12-01 10:55:12.0
15a0: 30 30 30 30 30 30 30 30 20 2d 30 38 30 30 0a 40  00000000 -0800.@
15b0: 40 20 2d 36 34 38 2c 38 20 2b 36 34 38 2c 38 20  @ -648,8 +648,8 
15c0: 40 40 0a 20 7b 0a 20 20 20 20 20 54 63 6c 5f 43  @@. {.     Tcl_C
15d0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
15e0: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
15f0: 63 6c 6f 73 65 2e 20 2a 2f 0a 20 0a 2d 20 20 20  close. */. .-   
1600: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
1610: 7b 0a 2d 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  {.-.Tcl_WrongNum
1620: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1630: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 49 64  objv, "channelId
1640: 22 29 3b 0a 2b 20 20 20 20 69 66 20 28 28 6f 62  ");.+    if ((ob
1650: 6a 63 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a  jc != 2) && (obj
1660: 63 20 21 3d 20 33 29 29 20 7b 0a 2b 09 54 63 6c  c != 3)) {.+.Tcl
1670: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1680: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1690: 63 68 61 6e 6e 65 6c 49 64 20 3f 64 69 72 65 63  channelId ?direc
16a0: 74 69 6f 6e 3f 22 29 3b 0a 20 09 72 65 74 75 72  tion?");. .retur
16b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16c0: 20 20 7d 0a 20 0a 40 40 20 2d 36 35 37 2c 36 20    }. .@@ -657,6 
16d0: 2b 36 35 37 2c 34 38 20 40 40 0a 20 09 72 65 74  +657,48 @@. .ret
16e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16f0: 20 20 20 20 7d 0a 20 0a 2b 20 20 20 20 69 66 20      }. .+    if 
1700: 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 2b 09  (objc == 3) {.+.
1710: 69 6e 74 20 6f 70 74 69 6f 6e 49 6e 64 65 78 2c  int optionIndex,
1720: 20 64 69 72 3b 0a 2b 09 73 74 61 74 69 63 20 63   dir;.+.static c
1730: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
1740: 20 64 69 72 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20   dirOptions[] = 
1750: 7b 0a 2b 09 20 20 20 20 22 72 65 61 64 22 2c 20  {.+.    "read", 
1760: 22 77 72 69 74 65 22 2c 20 4e 55 4c 4c 0a 2b 09  "write", NULL.+.
1770: 7d 3b 0a 2b 09 73 74 61 74 69 63 20 69 6e 74 20  };.+.static int 
1780: 64 69 72 41 72 72 61 79 5b 5d 20 3d 20 7b 54 43  dirArray[] = {TC
1790: 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 2c 20 54 43  L_CLOSE_READ, TC
17a0: 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 7d 3b 0a  L_CLOSE_WRITE};.
17b0: 2b 0a 2b 09 2f 2a 0a 2b 09 20 2a 20 47 65 74 20  +.+./*.+. * Get 
17c0: 64 69 72 65 63 74 69 6f 6e 20 72 65 71 75 65 73  direction reques
17d0: 74 65 64 20 74 6f 20 63 6c 6f 73 65 2c 20 61 6e  ted to close, an
17e0: 64 20 63 68 65 63 6b 20 73 79 6e 74 61 78 2e 0a  d check syntax..
17f0: 2b 09 20 2a 2f 0a 2b 0a 2b 09 69 66 20 28 54 63  +. */.+.+.if (Tc
1800: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
1810: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1820: 5d 2c 20 64 69 72 4f 70 74 69 6f 6e 73 2c 20 22  ], dirOptions, "
1830: 64 69 72 65 63 74 69 6f 6e 22 2c 20 30 2c 0a 2b  direction", 0,.+
1840: 09 09 26 6f 70 74 69 6f 6e 49 6e 64 65 78 29 20  ..&optionIndex) 
1850: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2b 09 20  != TCL_OK) {.+. 
1860: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1870: 52 4f 52 3b 0a 2b 09 7d 0a 2b 09 64 69 72 20 3d  ROR;.+.}.+.dir =
1880: 20 64 69 72 41 72 72 61 79 5b 6f 70 74 69 6f 6e   dirArray[option
1890: 49 6e 64 65 78 5d 3b 0a 2b 0a 2b 09 2f 2a 0a 2b  Index];.+.+./*.+
18a0: 09 20 2a 20 43 68 65 63 6b 20 64 69 72 65 63 74  . * Check direct
18b0: 69 6f 6e 20 61 67 61 69 6e 73 74 20 63 68 61 6e  ion against chan
18c0: 6e 65 6c 20 6d 6f 64 65 2e 20 49 74 20 69 73 20  nel mode. It is 
18d0: 61 6e 20 65 72 72 6f 72 20 69 66 20 77 65 20 74  an error if we t
18e0: 72 79 20 74 6f 0a 2b 09 20 2a 20 63 6c 6f 73 65  ry to.+. * close
18f0: 20 61 20 64 69 72 65 63 74 69 6f 6e 20 6e 6f 74   a direction not
1900: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68   supported by th
1910: 65 20 63 68 61 6e 6e 65 6c 20 28 61 6c 72 65 61  e channel (alrea
1920: 64 79 20 63 6c 6f 73 65 64 2c 20 6f 72 0a 2b 09  dy closed, or.+.
1930: 20 2a 20 6e 65 76 65 72 20 6f 70 65 6e 65 64 20   * never opened 
1940: 66 6f 72 20 74 68 61 74 20 64 69 72 65 63 74 69  for that directi
1950: 6f 6e 29 2e 0a 2b 09 20 2a 2f 0a 2b 0a 2b 09 69  on)..+. */.+.+.i
1960: 66 20 28 21 28 64 69 72 20 26 20 54 63 6c 5f 47  f (!(dir & Tcl_G
1970: 65 74 43 68 61 6e 6e 65 6c 4d 6f 64 65 20 28 63  etChannelMode (c
1980: 68 61 6e 29 29 29 20 7b 0a 2b 09 20 20 20 20 54  han))) {.+.    T
1990: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 20  cl_AppendResult 
19a0: 28 69 6e 74 65 72 70 2c 20 22 48 61 6c 66 2d 63  (interp, "Half-c
19b0: 6c 6f 73 65 20 6f 66 20 22 2c 20 64 69 72 4f 70  lose of ", dirOp
19c0: 74 69 6f 6e 73 5b 6f 70 74 69 6f 6e 49 6e 64 65  tions[optionInde
19d0: 78 5d 2c 0a 2b 09 09 09 20 20 20 20 20 20 22 2d  x],.+...      "-
19e0: 73 69 64 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  side not possibl
19f0: 65 2c 20 73 69 64 65 20 6e 6f 74 20 6f 70 65 6e  e, side not open
1a00: 65 64 20 6f 72 20 61 6c 72 65 61 64 79 20 63 6c  ed or already cl
1a10: 6f 73 65 64 22 2c 0a 2b 09 09 09 20 20 20 20 20  osed",.+...     
1a20: 20 4e 55 4c 4c 29 3b 0a 2b 09 20 20 20 20 72 65   NULL);.+.    re
1a30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a40: 2b 09 7d 0a 2b 0a 2b 09 2f 2a 0a 2b 09 20 2a 20  +.}.+.+./*.+. * 
1a50: 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
1a60: 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 61 6e   is needed if an
1a70: 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 63 68  d only if the ch
1a80: 61 6e 6e 65 6c 20 6d 6f 64 65 20 73 75 70 70 6f  annel mode suppo
1a90: 72 74 73 0a 2b 09 20 2a 20 6d 6f 72 65 20 74 68  rts.+. * more th
1aa0: 61 6e 20 74 68 65 20 64 69 72 65 63 74 69 6f 6e  an the direction
1ab0: 20 74 6f 20 63 6c 6f 73 65 2e 20 42 65 63 61 75   to close. Becau
1ac0: 73 65 20 69 66 20 74 68 65 20 63 6c 6f 73 65 20  se if the close 
1ad0: 74 68 65 20 6c 61 73 74 0a 2b 09 20 2a 20 64 69  the last.+. * di
1ae0: 72 65 63 74 69 6f 6e 20 73 75 70 70 70 6f 72 74  rection suppport
1af0: 65 64 20 77 65 20 63 61 6e 20 61 6e 64 20 77 69  ed we can and wi
1b00: 6c 6c 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  ll go through th
1b10: 65 20 72 65 67 75 6c 61 72 0a 2b 09 20 2a 20 70  e regular.+. * p
1b20: 72 6f 63 65 73 73 2e 0a 2b 09 20 2a 2f 0a 2b 0a  rocess..+. */.+.
1b30: 2b 09 69 66 20 28 28 54 63 6c 5f 47 65 74 43 68  +.if ((Tcl_GetCh
1b40: 61 6e 6e 65 6c 4d 6f 64 65 20 28 63 68 61 6e 29  annelMode (chan)
1b50: 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45   & (TCL_CLOSE_RE
1b60: 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49  AD|TCL_CLOSE_WRI
1b70: 54 45 29 29 20 21 3d 20 64 69 72 29 20 7b 0a 2b  TE)) != dir) {.+
1b80: 09 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
1b90: 43 6c 6f 73 65 45 78 20 28 69 6e 74 65 72 70 2c  CloseEx (interp,
1ba0: 20 63 68 61 6e 2c 20 64 69 72 29 20 21 3d 20 54   chan, dir) != T
1bb0: 43 4c 5f 4f 4b 3b 0a 2b 09 7d 0a 2b 20 20 20 20  CL_OK;.+.}.+    
1bc0: 7d 0a 2b 0a 20 20 20 20 20 69 66 20 28 54 63 6c  }.+.     if (Tcl
1bd0: 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e  _UnregisterChann
1be0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
1bf0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 20 09   != TCL_OK) {. .
1c00: 2f 2a 0a 20 09 20 2a 20 49 66 20 74 68 65 72 65  /*. . * If there
1c10: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   is an error mes
1c20: 73 61 67 65 20 61 6e 64 20 69 74 20 65 6e 64 73  sage and it ends
1c30: 20 77 69 74 68 20 61 20 6e 65 77 6c 69 6e 65 2c   with a newline,
1c40: 20 72 65 6d 6f 76 65 20 74 68 65 0a 2d 2d 2d 20   remove the.--- 
1c50: 74 63 6c 38 36 2e 6f 72 69 67 2f 67 65 6e 65 72  tcl86.orig/gener
1c60: 69 63 2f 74 63 6c 53 74 75 62 49 6e 69 74 2e 63  ic/tclStubInit.c
1c70: 09 32 30 30 38 2d 31 31 2d 32 37 20 31 34 3a 34  .2008-11-27 14:4
1c80: 35 3a 35 37 2e 30 30 30 30 30 30 30 30 30 20 2d  5:57.000000000 -
1c90: 30 38 30 30 0a 2b 2b 2b 20 74 63 6c 38 36 2f 67  0800.+++ tcl86/g
1ca0: 65 6e 65 72 69 63 2f 74 63 6c 53 74 75 62 49 6e  eneric/tclStubIn
1cb0: 69 74 2e 63 09 32 30 30 38 2d 31 32 2d 30 31 20  it.c.2008-12-01 
1cc0: 31 30 3a 35 35 3a 31 32 2e 30 30 30 30 30 30 30  10:55:12.0000000
1cd0: 30 30 20 2d 30 38 30 30 0a 40 40 20 2d 31 31 33  00 -0800.@@ -113
1ce0: 30 2c 36 20 2b 31 31 33 30 2c 37 20 40 40 0a 20  0,6 +1130,7 @@. 
1cf0: 20 20 20 20 54 63 6c 5f 53 65 74 45 6e 73 65 6d      Tcl_SetEnsem
1d00: 62 6c 65 50 61 72 61 6d 65 74 65 72 4c 69 73 74  bleParameterList
1d10: 2c 20 2f 2a 20 36 30 32 20 2a 2f 0a 20 20 20 20  , /* 602 */.    
1d20: 20 54 63 6c 5f 47 65 74 45 6e 73 65 6d 62 6c 65   Tcl_GetEnsemble
1d30: 50 61 72 61 6d 65 74 65 72 4c 69 73 74 2c 20 2f  ParameterList, /
1d40: 2a 20 36 30 33 20 2a 2f 0a 20 20 20 20 20 54 63  * 603 */.     Tc
1d50: 6c 5f 50 61 72 73 65 41 72 67 73 4f 62 6a 76 2c  l_ParseArgsObjv,
1d60: 20 2f 2a 20 36 30 34 20 2a 2f 0a 2b 20 20 20 20   /* 604 */.+    
1d70: 54 63 6c 5f 43 6c 6f 73 65 45 78 2c 20 2f 2a 20  Tcl_CloseEx, /* 
1d80: 36 30 35 20 2a 2f 0a 20 7d 3b 0a 20 0a 20 2f 2a  605 */. };. . /*
1d90: 20 21 45 4e 44 21 3a 20 44 6f 20 6e 6f 74 20 65   !END!: Do not e
1da0: 64 69 74 20 61 62 6f 76 65 20 74 68 69 73 20 6c  dit above this l
1db0: 69 6e 65 2e 20 2a 2f 0a 2d 2d 2d 20 74 63 6c 38  ine. */.--- tcl8
1dc0: 36 2e 6f 72 69 67 2f 74 65 73 74 73 2f 63 68 61  6.orig/tests/cha
1dd0: 6e 2e 74 65 73 74 09 32 30 30 38 2d 31 31 2d 32  n.test.2008-11-2
1de0: 37 20 31 34 3a 34 35 3a 35 32 2e 30 30 30 30 30  7 14:45:52.00000
1df0: 30 30 30 30 20 2d 30 38 30 30 0a 2b 2b 2b 20 74  0000 -0800.+++ t
1e00: 63 6c 38 36 2f 74 65 73 74 73 2f 63 68 61 6e 2e  cl86/tests/chan.
1e10: 74 65 73 74 09 32 30 30 38 2d 31 32 2d 30 31 20  test.2008-12-01 
1e20: 31 32 3a 35 30 3a 31 36 2e 30 30 30 30 30 30 30  12:50:16.0000000
1e30: 30 30 20 2d 30 38 30 30 0a 40 40 20 2d 32 39 2c  00 -0800.@@ -29,
1e40: 31 31 20 2b 32 39 2c 32 33 20 40 40 0a 20 74 65  11 +29,23 @@. te
1e50: 73 74 20 63 68 61 6e 2d 32 2e 31 20 7b 63 68 61  st chan-2.1 {cha
1e60: 6e 20 63 6f 6d 6d 61 6e 64 3a 20 62 6c 6f 63 6b  n command: block
1e70: 65 64 20 73 75 62 63 6f 6d 6d 61 6e 64 7d 20 2d  ed subcommand} -
1e80: 62 6f 64 79 20 7b 0a 20 20 20 20 20 63 68 61 6e  body {.     chan
1e90: 20 62 6c 6f 63 6b 65 64 20 66 6f 6f 20 62 61 72   blocked foo bar
1ea0: 0a 20 7d 20 2d 72 65 74 75 72 6e 43 6f 64 65 73  . } -returnCodes
1eb0: 20 65 72 72 6f 72 20 2d 72 65 73 75 6c 74 20 22   error -result "
1ec0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1ed0: 6f 75 6c 64 20 62 65 20 5c 22 63 68 61 6e 20 62  ould be \"chan b
1ee0: 6c 6f 63 6b 65 64 20 63 68 61 6e 6e 65 6c 49 64  locked channelId
1ef0: 5c 22 22 0a 2d 0a 20 74 65 73 74 20 63 68 61 6e  \"".-. test chan
1f00: 2d 33 2e 31 20 7b 63 68 61 6e 20 63 6f 6d 6d 61  -3.1 {chan comma
1f10: 6e 64 3a 20 63 6c 6f 73 65 20 73 75 62 63 6f 6d  nd: close subcom
1f20: 6d 61 6e 64 7d 20 2d 62 6f 64 79 20 7b 0a 2d 20  mand} -body {.- 
1f30: 20 20 20 63 68 61 6e 20 63 6c 6f 73 65 20 66 6f     chan close fo
1f40: 6f 20 62 61 72 0a 2d 7d 20 2d 72 65 74 75 72 6e  o bar.-} -return
1f50: 43 6f 64 65 73 20 65 72 72 6f 72 20 2d 72 65 73  Codes error -res
1f60: 75 6c 74 20 22 77 72 6f 6e 67 20 23 20 61 72 67  ult "wrong # arg
1f70: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 63  s: should be \"c
1f80: 68 61 6e 20 63 6c 6f 73 65 20 63 68 61 6e 6e 65  han close channe
1f90: 6c 49 64 5c 22 22 0a 2d 0a 2b 20 20 20 20 63 68  lId\"".-.+    ch
1fa0: 61 6e 20 63 6c 6f 73 65 20 66 6f 6f 20 62 61 72  an close foo bar
1fb0: 20 7a 65 74 0a 2b 7d 20 2d 72 65 74 75 72 6e 43   zet.+} -returnC
1fc0: 6f 64 65 73 20 65 72 72 6f 72 20 2d 72 65 73 75  odes error -resu
1fd0: 6c 74 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  lt "wrong # args
1fe0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 63 68  : should be \"ch
1ff0: 61 6e 20 63 6c 6f 73 65 20 63 68 61 6e 6e 65 6c  an close channel
2000: 49 64 20 3f 64 69 72 65 63 74 69 6f 6e 3f 5c 22  Id ?direction?\"
2010: 22 0a 2b 74 65 73 74 20 63 68 61 6e 2d 33 2e 32  ".+test chan-3.2
2020: 20 7b 63 68 61 6e 20 63 6f 6d 6d 61 6e 64 3a 20   {chan command: 
2030: 63 6c 6f 73 65 20 73 75 62 63 6f 6d 6d 61 6e 64  close subcommand
2040: 7d 20 2d 73 65 74 75 70 20 7b 0a 2b 20 20 20 20  } -setup {.+    
2050: 73 65 74 20 63 68 61 6e 20 5b 6f 70 65 6e 20 5b  set chan [open [
2060: 69 6e 66 6f 20 73 63 72 69 70 74 5d 20 72 5d 0a  info script] r].
2070: 2b 7d 20 2d 62 6f 64 79 20 7b 0a 2b 20 20 20 20  +} -body {.+    
2080: 63 68 61 6e 20 63 6c 6f 73 65 20 24 63 68 61 6e  chan close $chan
2090: 20 62 61 72 0a 2b 7d 20 2d 63 6c 65 61 6e 75 70   bar.+} -cleanup
20a0: 20 7b 0a 2b 20 20 20 20 63 6c 6f 73 65 20 24 63   {.+    close $c
20b0: 68 61 6e 0a 2b 7d 20 2d 72 65 74 75 72 6e 43 6f  han.+} -returnCo
20c0: 64 65 73 20 65 72 72 6f 72 20 2d 72 65 73 75 6c  des error -resul
20d0: 74 20 22 62 61 64 20 64 69 72 65 63 74 69 6f 6e  t "bad direction
20e0: 20 5c 22 62 61 72 5c 22 3a 20 6d 75 73 74 20 62   \"bar\": must b
20f0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 22  e read or write"
2100: 0a 2b 74 65 73 74 20 63 68 61 6e 2d 33 2e 33 20  .+test chan-3.3 
2110: 7b 63 68 61 6e 20 63 6f 6d 6d 61 6e 64 3a 20 63  {chan command: c
2120: 6c 6f 73 65 20 73 75 62 63 6f 6d 6d 61 6e 64 7d  lose subcommand}
2130: 20 2d 73 65 74 75 70 20 7b 0a 2b 20 20 20 20 73   -setup {.+    s
2140: 65 74 20 63 68 61 6e 20 5b 6f 70 65 6e 20 5b 69  et chan [open [i
2150: 6e 66 6f 20 73 63 72 69 70 74 5d 20 72 5d 0a 2b  nfo script] r].+
2160: 7d 20 2d 62 6f 64 79 20 7b 0a 2b 20 20 20 20 63  } -body {.+    c
2170: 68 61 6e 20 63 6c 6f 73 65 20 24 63 68 61 6e 20  han close $chan 
2180: 77 72 69 74 65 0a 2b 7d 20 2d 63 6c 65 61 6e 75  write.+} -cleanu
2190: 70 20 7b 0a 2b 20 20 20 20 63 6c 6f 73 65 20 24  p {.+    close $
21a0: 63 68 61 6e 0a 2b 7d 20 2d 72 65 74 75 72 6e 43  chan.+} -returnC
21b0: 6f 64 65 73 20 65 72 72 6f 72 20 2d 72 65 73 75  odes error -resu
21c0: 6c 74 20 22 48 61 6c 66 2d 63 6c 6f 73 65 20 6f  lt "Half-close o
21d0: 66 20 77 72 69 74 65 2d 73 69 64 65 20 6e 6f 74  f write-side not
21e0: 20 70 6f 73 73 69 62 6c 65 2c 20 73 69 64 65 20   possible, side 
21f0: 6e 6f 74 20 6f 70 65 6e 65 64 20 6f 72 20 61 6c  not opened or al
2200: 72 65 61 64 79 20 63 6c 6f 73 65 64 22 0a 20 74  ready closed". t
2210: 65 73 74 20 63 68 61 6e 2d 34 2e 31 20 7b 63 68  est chan-4.1 {ch
2220: 61 6e 20 63 6f 6d 6d 61 6e 64 3a 20 63 6f 6e 66  an command: conf
2230: 69 67 75 72 65 20 73 75 62 63 6f 6d 6d 61 6e 64  igure subcommand
2240: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 20 63  } -body {.     c
2250: 68 61 6e 20 63 6f 6e 66 69 67 75 72 65 0a 20 7d  han configure. }
2260: 20 2d 72 65 74 75 72 6e 43 6f 64 65 73 20 65 72   -returnCodes er
2270: 72 6f 72 20 2d 72 65 73 75 6c 74 20 22 77 72 6f  ror -result "wro
2280: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2290: 64 20 62 65 20 5c 22 63 68 61 6e 20 63 6f 6e 66  d be \"chan conf
22a0: 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 49 64 20  igure channelId 
22b0: 3f 2d 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 2e  ?-option value .
22c0: 2e 2e 3f 5c 22 22 0a 2d 2d 2d 20 74 63 6c 38 36  ..?\"".--- tcl86
22d0: 2e 6f 72 69 67 2f 74 65 73 74 73 2f 69 6f 43 6d  .orig/tests/ioCm
22e0: 64 2e 74 65 73 74 09 32 30 30 38 2d 31 31 2d 32  d.test.2008-11-2
22f0: 37 20 31 34 3a 34 35 3a 35 33 2e 30 30 30 30 30  7 14:45:53.00000
2300: 30 30 30 30 20 2d 30 38 30 30 0a 2b 2b 2b 20 74  0000 -0800.+++ t
2310: 63 6c 38 36 2f 74 65 73 74 73 2f 69 6f 43 6d 64  cl86/tests/ioCmd
2320: 2e 74 65 73 74 09 32 30 30 38 2d 31 32 2d 30 31  .test.2008-12-01
2330: 20 31 32 3a 35 31 3a 35 34 2e 30 30 30 30 30 30   12:51:54.000000
2340: 30 30 30 20 2d 30 38 30 30 0a 40 40 20 2d 31 38  000 -0800.@@ -18
2350: 32 2c 31 33 20 2b 31 38 32 2c 32 37 20 40 40 0a  2,13 +182,27 @@.
2360: 20 0a 20 74 65 73 74 20 69 6f 63 6d 64 2d 37 2e   . test iocmd-7.
2370: 31 20 7b 63 6c 6f 73 65 20 63 6f 6d 6d 61 6e 64  1 {close command
2380: 7d 20 7b 0a 20 20 20 20 20 6c 69 73 74 20 5b 63  } {.     list [c
2390: 61 74 63 68 20 7b 63 6c 6f 73 65 7d 20 6d 73 67  atch {close} msg
23a0: 5d 20 24 6d 73 67 0a 2d 7d 20 7b 31 20 7b 77 72  ] $msg.-} {1 {wr
23b0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
23c0: 6c 64 20 62 65 20 22 63 6c 6f 73 65 20 63 68 61  ld be "close cha
23d0: 6e 6e 65 6c 49 64 22 7d 7d 0a 2b 7d 20 7b 31 20  nnelId"}}.+} {1 
23e0: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
23f0: 68 6f 75 6c 64 20 62 65 20 22 63 6c 6f 73 65 20  hould be "close 
2400: 63 68 61 6e 6e 65 6c 49 64 20 3f 64 69 72 65 63  channelId ?direc
2410: 74 69 6f 6e 3f 22 7d 7d 0a 20 74 65 73 74 20 69  tion?"}}. test i
2420: 6f 63 6d 64 2d 37 2e 32 20 7b 63 6c 6f 73 65 20  ocmd-7.2 {close 
2430: 63 6f 6d 6d 61 6e 64 7d 20 7b 0a 20 20 20 20 20  command} {.     
2440: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 63 6c 6f  list [catch {clo
2450: 73 65 20 61 20 62 20 63 20 64 20 65 7d 20 6d 73  se a b c d e} ms
2460: 67 5d 20 24 6d 73 67 0a 2d 7d 20 7b 31 20 7b 77  g] $msg.-} {1 {w
2470: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2480: 75 6c 64 20 62 65 20 22 63 6c 6f 73 65 20 63 68  uld be "close ch
2490: 61 6e 6e 65 6c 49 64 22 7d 7d 0a 2b 7d 20 7b 31  annelId"}}.+} {1
24a0: 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   {wrong # args: 
24b0: 73 68 6f 75 6c 64 20 62 65 20 22 63 6c 6f 73 65  should be "close
24c0: 20 63 68 61 6e 6e 65 6c 49 64 20 3f 64 69 72 65   channelId ?dire
24d0: 63 74 69 6f 6e 3f 22 7d 7d 0a 20 74 65 73 74 20  ction?"}}. test 
24e0: 69 6f 63 6d 64 2d 37 2e 33 20 7b 63 6c 6f 73 65  iocmd-7.3 {close
24f0: 20 63 6f 6d 6d 61 6e 64 7d 20 7b 0a 20 20 20 20   command} {.    
2500: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 63 6c   list [catch {cl
2510: 6f 73 65 20 61 61 61 7d 20 6d 73 67 5d 20 24 6d  ose aaa} msg] $m
2520: 73 67 0a 20 7d 20 7b 31 20 7b 63 61 6e 20 6e 6f  sg. } {1 {can no
2530: 74 20 66 69 6e 64 20 63 68 61 6e 6e 65 6c 20 6e  t find channel n
2540: 61 6d 65 64 20 22 61 61 61 22 7d 7d 0a 2b 74 65  amed "aaa"}}.+te
2550: 73 74 20 69 6f 63 6d 64 2d 37 2e 34 20 7b 63 6c  st iocmd-7.4 {cl
2560: 6f 73 65 20 63 6f 6d 6d 61 6e 64 7d 20 2d 73 65  ose command} -se
2570: 74 75 70 20 7b 0a 2b 20 20 20 20 73 65 74 20 63  tup {.+    set c
2580: 68 61 6e 20 5b 6f 70 65 6e 20 5b 69 6e 66 6f 20  han [open [info 
2590: 73 63 72 69 70 74 5d 20 72 5d 0a 2b 7d 20 2d 62  script] r].+} -b
25a0: 6f 64 79 20 7b 0a 2b 20 20 20 20 63 68 61 6e 20  ody {.+    chan 
25b0: 63 6c 6f 73 65 20 24 63 68 61 6e 20 62 61 72 0a  close $chan bar.
25c0: 2b 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 2b 20  +} -cleanup {.+ 
25d0: 20 20 20 63 6c 6f 73 65 20 24 63 68 61 6e 0a 2b     close $chan.+
25e0: 7d 20 2d 72 65 74 75 72 6e 43 6f 64 65 73 20 65  } -returnCodes e
25f0: 72 72 6f 72 20 2d 72 65 73 75 6c 74 20 22 62 61  rror -result "ba
2600: 64 20 64 69 72 65 63 74 69 6f 6e 20 5c 22 62 61  d direction \"ba
2610: 72 5c 22 3a 20 6d 75 73 74 20 62 65 20 72 65 61  r\": must be rea
2620: 64 20 6f 72 20 77 72 69 74 65 22 0a 2b 74 65 73  d or write".+tes
2630: 74 20 69 6f 63 6d 64 2d 37 2e 35 20 7b 63 6c 6f  t iocmd-7.5 {clo
2640: 73 65 20 63 6f 6d 6d 61 6e 64 7d 20 2d 73 65 74  se command} -set
2650: 75 70 20 7b 0a 2b 20 20 20 20 73 65 74 20 63 68  up {.+    set ch
2660: 61 6e 20 5b 6f 70 65 6e 20 5b 69 6e 66 6f 20 73  an [open [info s
2670: 63 72 69 70 74 5d 20 72 5d 0a 2b 7d 20 2d 62 6f  cript] r].+} -bo
2680: 64 79 20 7b 0a 2b 20 20 20 20 63 68 61 6e 20 63  dy {.+    chan c
2690: 6c 6f 73 65 20 24 63 68 61 6e 20 77 72 69 74 65  lose $chan write
26a0: 0a 2b 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 2b  .+} -cleanup {.+
26b0: 20 20 20 20 63 6c 6f 73 65 20 24 63 68 61 6e 0a      close $chan.
26c0: 2b 7d 20 2d 72 65 74 75 72 6e 43 6f 64 65 73 20  +} -returnCodes 
26d0: 65 72 72 6f 72 20 2d 72 65 73 75 6c 74 20 22 48  error -result "H
26e0: 61 6c 66 2d 63 6c 6f 73 65 20 6f 66 20 77 72 69  alf-close of wri
26f0: 74 65 2d 73 69 64 65 20 6e 6f 74 20 70 6f 73 73  te-side not poss
2700: 69 62 6c 65 2c 20 73 69 64 65 20 6e 6f 74 20 6f  ible, side not o
2710: 70 65 6e 65 64 20 6f 72 20 61 6c 72 65 61 64 79  pened or already
2720: 20 63 6c 6f 73 65 64 22 0a 20 0a 20 74 65 73 74   closed". . test
2730: 20 69 6f 63 6d 64 2d 38 2e 31 20 7b 66 63 6f 6e   iocmd-8.1 {fcon
2740: 66 69 67 75 72 65 20 63 6f 6d 6d 61 6e 64 7d 20  figure command} 
2750: 7b 0a 20 20 20 20 20 6c 69 73 74 20 5b 63 61 74  {.     list [cat
2760: 63 68 20 7b 66 63 6f 6e 66 69 67 75 72 65 7d 20  ch {fconfigure} 
2770: 6d 73 67 5d 20 24 6d 73 67 0a 2d 2d 2d 20 74 63  msg] $msg.--- tc
2780: 6c 38 36 2e 6f 72 69 67 2f 75 6e 69 78 2f 74 63  l86.orig/unix/tc
2790: 6c 55 6e 69 78 43 68 61 6e 2e 63 09 32 30 30 38  lUnixChan.c.2008
27a0: 2d 31 31 2d 32 37 20 31 34 3a 34 35 3a 35 32 2e  -11-27 14:45:52.
27b0: 30 30 30 30 30 30 30 30 30 20 2d 30 38 30 30 0a  000000000 -0800.
27c0: 2b 2b 2b 20 74 63 6c 38 36 2f 75 6e 69 78 2f 74  +++ tcl86/unix/t
27d0: 63 6c 55 6e 69 78 43 68 61 6e 2e 63 09 32 30 30  clUnixChan.c.200
27e0: 38 2d 31 32 2d 30 31 20 31 30 3a 35 35 3a 31 32  8-12-01 10:55:12
27f0: 2e 30 30 30 30 30 30 30 30 30 20 2d 30 38 30 30  .000000000 -0800
2800: 0a 40 40 20 2d 32 31 38 2c 36 20 2b 32 31 38 2c  .@@ -218,6 +218,
2810: 39 20 40 40 0a 20 73 74 61 74 69 63 20 69 6e 74  9 @@. static int
2820: 09 09 54 63 70 42 6c 6f 63 6b 4d 6f 64 65 50 72  ..TcpBlockModePr
2830: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 64 61  oc(ClientData da
2840: 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 3b 0a 20  ta, int mode);. 
2850: 73 74 61 74 69 63 20 69 6e 74 09 09 54 63 70 43  static int..TcpC
2860: 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 44  loseProc(ClientD
2870: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2880: 2c 0a 20 09 09 09 20 20 20 20 54 63 6c 5f 49 6e  ,. ...    Tcl_In
2890: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a 2b  terp *interp);.+
28a0: 73 74 61 74 69 63 20 69 6e 74 09 09 54 63 70 43  static int..TcpC
28b0: 6c 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 6e 74  lose2Proc(Client
28c0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
28d0: 61 2c 0a 2b 09 09 09 09 20 20 20 20 20 20 54 63  a,.+....      Tc
28e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
28f0: 2c 0a 2b 09 09 09 09 20 20 20 20 20 20 69 6e 74  ,.+....      int
2900: 20 66 6c 61 67 73 29 3b 0a 20 73 74 61 74 69 63   flags);. static
2910: 20 69 6e 74 09 09 54 63 70 47 65 74 48 61 6e 64   int..TcpGetHand
2920: 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  leProc(ClientDat
2930: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a  a instanceData,.
2940: 20 09 09 09 20 20 20 20 69 6e 74 20 64 69 72 65   ...    int dire
2950: 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74  ction, ClientDat
2960: 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 3b 0a 20  a *handlePtr);. 
2970: 73 74 61 74 69 63 20 69 6e 74 09 09 54 63 70 47  static int..TcpG
2980: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69  etOptionProc(Cli
2990: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
29a0: 44 61 74 61 2c 0a 40 40 20 2d 33 31 38 2c 37 20  Data,.@@ -318,7 
29b0: 2b 33 32 31 2c 37 20 40 40 0a 20 20 20 20 20 54  +321,7 @@.     T
29c0: 63 70 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c  cpGetOptionProc,
29d0: 09 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20  ../* Get option 
29e0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 54 63  proc. */.     Tc
29f0: 70 57 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20  pWatchProc,../* 
2a00: 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66  Initialize notif
2a10: 69 65 72 2e 20 2a 2f 0a 20 20 20 20 20 54 63 70  ier. */.     Tcp
2a20: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 09  GetHandleProc,..
2a30: 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65  /* Get OS handle
2a40: 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c  s out of channel
2a50: 2e 20 2a 2f 0a 2d 20 20 20 20 4e 55 4c 4c 2c 09  . */.-    NULL,.
2a60: 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 2e  ../* close2proc.
2a70: 20 2a 2f 0a 2b 20 20 20 20 54 63 70 43 6c 6f 73   */.+    TcpClos
2a80: 65 32 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73  e2Proc,../* Clos
2a90: 65 32 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20  e2 proc. */.    
2aa0: 20 54 63 70 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f   TcpBlockModePro
2ab0: 63 2c 09 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b  c,../* Set block
2ac0: 69 6e 67 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b  ing or non-block
2ad0: 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20  ing mode.*/.    
2ae0: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 66 6c 75 73   NULL,.../* flus
2af0: 68 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20  h proc. */.     
2b00: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 68 61 6e 64 6c  NULL,.../* handl
2b10: 65 72 20 70 72 6f 63 2e 20 2a 2f 0a 40 40 20 2d  er proc. */.@@ -
2b20: 32 30 31 38 2c 36 20 2b 32 30 32 31 2c 35 37 20  2018,6 +2021,57 
2b30: 40 40 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d  @@. /*.  *------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 0a 20 20 2a 0a 2b 20 2a 20 54 63 70 43 6c 6f 73  .  *.+ * TcpClos
2b90: 65 32 50 72 6f 63 20 2d 2d 0a 2b 20 2a 0a 2b 20  e2Proc --.+ *.+ 
2ba0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
2bb0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
2bc0: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65   generic IO leve
2bd0: 6c 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  l to perform the
2be0: 20 63 68 61 6e 6e 65 6c 0a 2b 20 2a 09 74 79 70   channel.+ *.typ
2bf0: 65 20 73 70 65 63 69 66 69 63 20 70 61 72 74 20  e specific part 
2c00: 6f 66 20 61 20 68 61 6c 66 2d 63 6c 6f 73 65 3a  of a half-close:
2c10: 20 6e 61 6d 65 6c 79 2c 20 61 20 73 68 75 74 64   namely, a shutd
2c20: 6f 77 6e 28 29 20 6f 6e 20 61 20 73 6f 63 6b 65  own() on a socke
2c30: 74 2e 0a 2b 20 2a 0a 2b 20 2a 20 52 65 73 75 6c  t..+ *.+ * Resul
2c40: 74 73 3a 0a 2b 20 2a 09 30 20 69 66 20 73 75 63  ts:.+ *.0 if suc
2c50: 63 65 73 73 66 75 6c 2c 20 74 68 65 20 76 61 6c  cessful, the val
2c60: 75 65 20 6f 66 20 65 72 72 6e 6f 20 69 66 20 66  ue of errno if f
2c70: 61 69 6c 65 64 2e 0a 2b 20 2a 0a 2b 20 2a 20 53  ailed..+ *.+ * S
2c80: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2b 20 2a  ide effects:.+ *
2c90: 09 53 68 75 74 73 20 64 6f 77 6e 20 6f 6e 65 20  .Shuts down one 
2ca0: 73 69 64 65 20 6f 66 20 74 68 65 20 73 6f 63 6b  side of the sock
2cb0: 65 74 2e 0a 2b 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d  et..+ *.+ *-----
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d00: 2d 0a 2b 20 2a 2f 0a 2b 0a 2b 73 74 61 74 69 63  -.+ */.+.+static
2d10: 20 69 6e 74 0a 2b 54 63 70 43 6c 6f 73 65 32 50   int.+TcpClose2P
2d20: 72 6f 63 28 0a 2b 20 20 20 20 43 6c 69 65 6e 74  roc(.+    Client
2d30: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
2d40: 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74  a,./* The socket
2d50: 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 2b 20   to close. */.+ 
2d60: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
2d70: 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65  nterp,../* For e
2d80: 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 2e 20  rror reporting. 
2d90: 2a 2f 0a 2b 20 20 20 20 69 6e 74 20 66 6c 61 67  */.+    int flag
2da0: 73 29 09 09 09 2f 2a 20 46 6c 61 67 73 20 74 68  s).../* Flags th
2db0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  at indicate whic
2dc0: 68 20 73 69 64 65 20 74 6f 20 63 6c 6f 73 65 2e  h side to close.
2dd0: 20 2a 2f 0a 2b 7b 0a 2b 20 20 20 20 54 63 70 53   */.+{.+    TcpS
2de0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
2df0: 20 28 54 63 70 53 74 61 74 65 20 2a 29 20 69 6e   (TcpState *) in
2e00: 73 74 61 6e 63 65 44 61 74 61 3b 0a 2b 20 20 20  stanceData;.+   
2e10: 20 69 6e 74 20 65 72 72 6f 72 43 6f 64 65 20 3d   int errorCode =
2e20: 20 30 3b 0a 2b 20 20 20 20 69 6e 74 20 73 64 3b   0;.+    int sd;
2e30: 0a 2b 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20  .+.+    /*.+    
2e40: 20 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20   * Shutdown the 
2e50: 4f 53 20 73 6f 63 6b 65 74 20 68 61 6e 64 6c 65  OS socket handle
2e60: 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b 20 20 20 20  ..+     */.+    
2e70: 73 77 69 74 63 68 28 66 6c 61 67 73 29 0a 2b 09  switch(flags).+.
2e80: 7b 0a 2b 09 63 61 73 65 20 54 43 4c 5f 43 4c 4f  {.+.case TCL_CLO
2e90: 53 45 5f 52 45 41 44 3a 0a 2b 09 20 20 20 20 73  SE_READ:.+.    s
2ea0: 64 3d 53 48 55 54 5f 52 44 3b 0a 2b 09 20 20 20  d=SHUT_RD;.+.   
2eb0: 20 62 72 65 61 6b 3b 0a 2b 09 63 61 73 65 20 54   break;.+.case T
2ec0: 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 3a 0a  CL_CLOSE_WRITE:.
2ed0: 2b 09 20 20 20 20 73 64 3d 53 48 55 54 5f 57 52  +.    sd=SHUT_WR
2ee0: 3b 0a 2b 09 20 20 20 20 62 72 65 61 6b 3b 0a 2b  ;.+.    break;.+
2ef0: 09 64 65 66 61 75 6c 74 3a 0a 2b 09 20 20 20 20  .default:.+.    
2f00: 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 2b 09  if (interp) {.+.
2f10: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
2f20: 74 28 69 6e 74 65 72 70 2c 20 22 53 6f 63 6b 65  t(interp, "Socke
2f30: 74 20 63 6c 6f 73 65 32 70 72 6f 63 20 63 61 6c  t close2proc cal
2f40: 6c 65 64 20 62 69 64 69 72 65 63 74 69 6f 6e 61  led bidirectiona
2f50: 6c 6c 79 22 2c 20 4e 55 4c 4c 29 3b 0a 2b 09 20  lly", NULL);.+. 
2f60: 20 20 20 7d 0a 2b 09 20 20 20 20 72 65 74 75 72     }.+.    retur
2f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 2b 09 7d  n TCL_ERROR;.+.}
2f80: 0a 2b 20 20 20 20 69 66 20 28 73 68 75 74 64 6f  .+    if (shutdo
2f90: 77 6e 28 73 74 61 74 65 50 74 72 2d 3e 66 64 2c  wn(statePtr->fd,
2fa0: 73 64 29 3c 30 29 20 7b 0a 2b 09 65 72 72 6f 72  sd)<0) {.+.error
2fb0: 43 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 2b 20  Code = errno;.+ 
2fc0: 20 20 20 7d 0a 2b 0a 2b 20 20 20 20 72 65 74 75     }.+.+    retu
2fd0: 72 6e 20 65 72 72 6f 72 43 6f 64 65 3b 0a 2b 7d  rn errorCode;.+}
2fe0: 0a 2b 0c 0a 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d  .+..+/*.+ *-----
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 0a 2b 20 2a 0a 20 20 2a 20 54 63 70 47 65 74  -.+ *.  * TcpGet
3040: 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 20  OptionProc --.  
3050: 2a 0a 20 20 2a 09 43 6f 6d 70 75 74 65 73 20 61  *.  *.Computes a
3060: 6e 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 66  n option value f
3070: 6f 72 20 61 20 54 43 50 20 73 6f 63 6b 65 74 20  or a TCP socket 
3080: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f  based channel, o
3090: 72 20 61 20 6c 69 73 74 20 6f 66 0a 2d 2d 2d 20  r a list of.--- 
30a0: 74 63 6c 38 36 2e 6f 72 69 67 2f 75 6e 69 78 2f  tcl86.orig/unix/
30b0: 74 63 6c 55 6e 69 78 50 69 70 65 2e 63 09 32 30  tclUnixPipe.c.20
30c0: 30 38 2d 31 31 2d 32 37 20 31 34 3a 34 35 3a 35  08-11-27 14:45:5
30d0: 32 2e 30 30 30 30 30 30 30 30 30 20 2d 30 38 30  2.000000000 -080
30e0: 30 0a 2b 2b 2b 20 74 63 6c 38 36 2f 75 6e 69 78  0.+++ tcl86/unix
30f0: 2f 74 63 6c 55 6e 69 78 50 69 70 65 2e 63 09 32  /tclUnixPipe.c.2
3100: 30 30 38 2d 31 32 2d 30 31 20 31 30 3a 35 35 3a  008-12-01 10:55:
3110: 31 32 2e 30 30 30 30 30 30 30 30 30 20 2d 30 38  12.000000000 -08
3120: 30 30 0a 40 40 20 2d 35 31 2c 38 20 2b 35 31 2c  00.@@ -51,8 +51,
3130: 31 30 20 40 40 0a 20 20 2a 2f 0a 20 0a 20 73 74  10 @@.  */. . st
3140: 61 74 69 63 20 69 6e 74 09 09 50 69 70 65 42 6c  atic int..PipeBl
3150: 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65  ockModeProc(Clie
3160: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
3170: 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 3b 0a  ata, int mode);.
3180: 2d 73 74 61 74 69 63 20 69 6e 74 09 09 50 69 70  -static int..Pip
3190: 65 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e  eCloseProc(Clien
31a0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
31b0: 74 61 2c 0a 2d 09 09 09 20 20 20 20 54 63 6c 5f  ta,.-...    Tcl_
31c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b  Interp *interp);
31d0: 0a 2b 73 74 61 74 69 63 20 69 6e 74 09 09 50 69  .+static int..Pi
31e0: 70 65 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c 69  peClose2Proc(Cli
31f0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
3200: 44 61 74 61 2c 0a 2b 09 09 09 20 20 20 20 54 63  Data,.+...    Tc
3210: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3220: 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 2b 2f  , int flags);.+/
3230: 2a 20 73 74 61 74 69 63 20 69 6e 74 09 09 50 69  * static int..Pi
3240: 70 65 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65  peCloseProc(Clie
3250: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
3260: 61 74 61 2c 0a 2b 20 20 20 54 63 6c 5f 49 6e 74  ata,.+   Tcl_Int
3270: 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 20 2a 2f  erp *interp); */
3280: 0a 20 73 74 61 74 69 63 20 69 6e 74 09 09 50 69  . static int..Pi
3290: 70 65 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 28  peGetHandleProc(
32a0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
32b0: 6e 63 65 44 61 74 61 2c 0a 20 09 09 09 20 20 20  nceData,. ...   
32c0: 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20   int direction, 
32d0: 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64  ClientData *hand
32e0: 6c 65 50 74 72 29 3b 0a 20 73 74 61 74 69 63 20  lePtr);. static 
32f0: 69 6e 74 09 09 50 69 70 65 49 6e 70 75 74 50 72  int..PipeInputPr
3300: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  oc(ClientData in
3310: 73 74 61 6e 63 65 44 61 74 61 2c 20 63 68 61 72  stanceData, char
3320: 20 2a 62 75 66 2c 0a 40 40 20 2d 37 31 2c 37 20   *buf,.@@ -71,7 
3330: 2b 37 33 2c 37 20 40 40 0a 20 73 74 61 74 69 63  +73,7 @@. static
3340: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tcl_ChannelType
3350: 20 70 69 70 65 43 68 61 6e 6e 65 6c 54 79 70 65   pipeChannelType
3360: 20 3d 20 7b 0a 20 20 20 20 20 22 70 69 70 65 22   = {.     "pipe"
3370: 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65  ,.../* Type name
3380: 2e 20 2a 2f 0a 20 20 20 20 20 54 43 4c 5f 43 48  . */.     TCL_CH
3390: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c  ANNEL_VERSION_5,
33a0: 09 2f 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a  ./* v5 channel *
33b0: 2f 0a 2d 20 20 20 20 50 69 70 65 43 6c 6f 73 65  /.-    PipeClose
33c0: 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20  Proc,../* Close 
33d0: 70 72 6f 63 2e 20 2a 2f 0a 2b 20 20 20 20 54 43  proc. */.+    TC
33e0: 4c 5f 43 4c 4f 53 45 32 50 52 4f 43 2c 09 09 2f  L_CLOSE2PROC,../
33f0: 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a 2f  * Close proc. */
3400: 0a 20 20 20 20 20 50 69 70 65 49 6e 70 75 74 50  .     PipeInputP
3410: 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70  roc,../* Input p
3420: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 50 69 70  roc. */.     Pip
3430: 65 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a  eOutputProc,../*
3440: 20 4f 75 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f   Output proc. */
3450: 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  .     NULL,.../*
3460: 20 53 65 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a 40   Seek proc. */.@
3470: 40 20 2d 37 39 2c 37 20 2b 38 31 2c 37 20 40 40  @ -79,7 +81,7 @@
3480: 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  .     NULL,.../*
3490: 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63   Get option proc
34a0: 2e 20 2a 2f 0a 20 20 20 20 20 50 69 70 65 57 61  . */.     PipeWa
34b0: 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69  tchProc,../* Ini
34c0: 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72  tialize notifier
34d0: 2e 20 2a 2f 0a 20 20 20 20 20 50 69 70 65 47 65  . */.     PipeGe
34e0: 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 09 2f 2a  tHandleProc,../*
34f0: 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20   Get OS handles 
3500: 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20  out of channel. 
3510: 2a 2f 0a 2d 20 20 20 20 4e 55 4c 4c 2c 09 09 09  */.-    NULL,...
3520: 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 2e 20 2a  /* close2proc. *
3530: 2f 0a 2b 20 20 20 20 50 69 70 65 43 6c 6f 73 65  /.+    PipeClose
3540: 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65  2Proc,../* close
3550: 32 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 50  2proc. */.     P
3560: 69 70 65 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63  ipeBlockModeProc
3570: 2c 09 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69  ,../* Set blocki
3580: 6e 67 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  ng or non-blocki
3590: 6e 67 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20 20  ng mode.*/.     
35a0: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 66 6c 75 73 68  NULL,.../* flush
35b0: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 4e   proc. */.     N
35c0: 55 4c 4c 2c 09 09 09 2f 2a 20 68 61 6e 64 6c 65  ULL,.../* handle
35d0: 72 20 70 72 6f 63 2e 20 2a 2f 0a 40 40 20 2d 39  r proc. */.@@ -9
35e0: 30 35 2c 37 20 2b 39 30 37 2c 39 36 20 40 40 0a  05,7 +907,96 @@.
35f0: 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d   /*.  *---------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
3640: 2a 0a 2d 20 2a 20 50 69 70 65 43 6c 6f 73 65 50  *.- * PipeCloseP
3650: 72 6f 63 20 2d 2d 0a 2b 20 2a 20 50 69 70 65 43  roc --.+ * PipeC
3660: 6c 6f 73 65 32 50 72 6f 63 0a 2b 20 2a 0a 2b 20  lose2Proc.+ *.+ 
3670: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
3680: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
3690: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76  e generic IO lev
36a0: 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a 2b 20  el to perform.+ 
36b0: 2a 09 70 69 70 65 6c 69 6e 65 2d 74 79 70 65 2d  *.pipeline-type-
36c0: 73 70 65 63 69 66 69 63 20 68 61 6c 66 20 6f 72  specific half or
36d0: 20 66 75 6c 6c 2d 63 6c 6f 73 65 2e 0a 2b 20 2a   full-close..+ *
36e0: 0a 2b 20 2a 20 52 65 73 75 6c 74 73 3a 0a 2b 20  .+ * Results:.+ 
36f0: 2a 09 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  *.0 on success, 
3700: 65 72 72 6e 6f 20 6f 74 68 65 72 77 69 73 65 2e  errno otherwise.
3710: 0a 2b 20 2a 0a 2b 20 2a 20 53 69 64 65 20 65 66  .+ *.+ * Side ef
3720: 66 65 63 74 73 3a 0a 2b 20 2a 09 43 6c 6f 73 65  fects:.+ *.Close
3730: 73 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 70 69  s the command pi
3740: 70 65 6c 69 6e 65 20 63 68 61 6e 6e 65 6c 2e 0a  peline channel..
3750: 2b 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  + *.+ *---------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20  -------------.+ 
37a0: 2a 2f 0a 2b 0a 2b 73 74 61 74 69 63 20 69 6e 74  */.+.+static int
37b0: 0a 2b 50 69 70 65 43 6c 6f 73 65 32 50 72 6f 63  .+PipeClose2Proc
37c0: 28 0a 2b 20 20 20 20 43 6c 69 65 6e 74 44 61 74  (.+    ClientDat
37d0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09  a instanceData,.
37e0: 2f 2a 20 54 68 65 20 70 69 70 65 20 74 6f 20 63  /* The pipe to c
37f0: 6c 6f 73 65 2e 20 2a 2f 0a 2b 20 20 20 20 54 63  lose. */.+    Tc
3800: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3810: 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20  ,../* For error 
3820: 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 2b 20  reporting. */.+ 
3830: 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09 09     int flags)...
3840: 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 69 6e  /* Flags that in
3850: 64 69 63 61 74 65 20 77 68 69 63 68 20 73 69 64  dicate which sid
3860: 65 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 2b  e to close. */.+
3870: 7b 0a 2b 20 20 20 20 50 69 70 65 53 74 61 74 65  {.+    PipeState
3880: 20 2a 70 69 70 65 50 74 72 3d 20 28 50 69 70 65   *pipePtr= (Pipe
3890: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
38a0: 65 44 61 74 61 3b 0a 2b 20 20 20 20 54 63 6c 5f  eData;.+    Tcl_
38b0: 43 68 61 6e 6e 65 6c 20 65 72 72 43 68 61 6e 3b  Channel errChan;
38c0: 0a 2b 20 20 20 20 69 6e 74 20 65 72 72 6f 72 43  .+    int errorC
38d0: 6f 64 65 2c 20 72 65 73 75 6c 74 3b 0a 2b 0a 2b  ode, result;.+.+
38e0: 20 20 20 20 65 72 72 6f 72 43 6f 64 65 20 3d 20      errorCode = 
38f0: 30 3b 0a 2b 20 20 20 20 72 65 73 75 6c 74 20 3d  0;.+    result =
3900: 20 30 3b 0a 2b 0a 2b 20 20 20 20 69 66 20 28 28   0;.+.+    if ((
3910: 28 21 66 6c 61 67 73 29 7c 7c 28 66 6c 61 67 73  (!flags)||(flags
3920: 20 26 20 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41   & TCL_CLOSE_REA
3930: 44 29 29 20 26 26 20 28 70 69 70 65 50 74 72 2d  D)) && (pipePtr-
3940: 3e 69 6e 46 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  >inFile != NULL)
3950: 29 20 7b 0a 2b 09 69 66 20 28 54 63 6c 70 43 6c  ) {.+.if (TclpCl
3960: 6f 73 65 46 69 6c 65 28 70 69 70 65 50 74 72 2d  oseFile(pipePtr-
3970: 3e 69 6e 46 69 6c 65 29 20 3c 20 30 29 20 7b 0a  >inFile) < 0) {.
3980: 2b 09 20 20 20 20 65 72 72 6f 72 43 6f 64 65 20  +.    errorCode 
3990: 3d 20 65 72 72 6e 6f 3b 0a 2b 09 7d 20 65 6c 73  = errno;.+.} els
39a0: 65 20 7b 0a 2b 09 20 20 20 20 70 69 70 65 50 74  e {.+.    pipePt
39b0: 72 2d 3e 69 6e 46 69 6c 65 3d 4e 55 4c 4c 3b 0a  r->inFile=NULL;.
39c0: 2b 09 7d 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20  +.}.+    }.+    
39d0: 69 66 20 28 28 28 21 66 6c 61 67 73 29 7c 7c 28  if (((!flags)||(
39e0: 66 6c 61 67 73 20 26 20 54 43 4c 5f 43 4c 4f 53  flags & TCL_CLOS
39f0: 45 5f 57 52 49 54 45 29 29 20 26 26 20 28 70 69  E_WRITE)) && (pi
3a00: 70 65 50 74 72 2d 3e 6f 75 74 46 69 6c 65 20 21  pePtr->outFile !
3a10: 3d 20 4e 55 4c 4c 29 20 26 26 20 28 65 72 72 6f  = NULL) && (erro
3a20: 72 43 6f 64 65 20 3d 3d 20 30 29 29 20 7b 0a 2b  rCode == 0)) {.+
3a30: 09 69 66 20 28 54 63 6c 70 43 6c 6f 73 65 46 69  .if (TclpCloseFi
3a40: 6c 65 28 70 69 70 65 50 74 72 2d 3e 6f 75 74 46  le(pipePtr->outF
3a50: 69 6c 65 29 20 3c 20 30 29 20 7b 0a 2b 09 20 20  ile) < 0) {.+.  
3a60: 20 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 65 72    errorCode = er
3a70: 72 6e 6f 3b 0a 2b 09 7d 20 65 6c 73 65 20 7b 0a  rno;.+.} else {.
3a80: 2b 09 20 20 20 20 70 69 70 65 50 74 72 2d 3e 6f  +.    pipePtr->o
3a90: 75 74 46 69 6c 65 3d 4e 55 4c 4c 3b 0a 2b 09 7d  utFile=NULL;.+.}
3aa0: 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 0a 2b 20  .+    }.+    .+ 
3ab0: 20 20 20 2f 2a 20 69 66 20 68 61 6c 66 2d 63 6c     /* if half-cl
3ac0: 6f 73 69 6e 67 2c 20 73 74 6f 70 20 68 65 72 65  osing, stop here
3ad0: 2e 20 2a 2f 0a 2b 20 20 20 20 69 66 20 28 66 6c  . */.+    if (fl
3ae0: 61 67 73 29 20 7b 0a 2b 09 09 72 65 74 75 72 6e  ags) {.+..return
3af0: 20 65 72 72 6f 72 43 6f 64 65 3b 0a 2b 20 20 20   errorCode;.+   
3b00: 20 7d 0a 2b 0a 2b 20 20 20 20 69 66 20 28 70 69   }.+.+    if (pi
3b10: 70 65 50 74 72 2d 3e 69 73 4e 6f 6e 42 6c 6f 63  pePtr->isNonBloc
3b20: 6b 69 6e 67 20 7c 7c 20 54 63 6c 49 6e 45 78 69  king || TclInExi
3b30: 74 28 29 29 20 7b 0a 2b 09 2f 2a 0a 2b 09 20 2a  t()) {.+./*.+. *
3b40: 20 49 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20   If the channel 
3b50: 69 73 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20  is non-blocking 
3b60: 6f 72 20 54 63 6c 20 69 73 20 62 65 69 6e 67 20  or Tcl is being 
3b70: 63 6c 65 61 6e 65 64 20 75 70 2c 20 6a 75 73 74  cleaned up, just
3b80: 0a 2b 09 20 2a 20 64 65 74 61 63 68 20 74 68 65  .+. * detach the
3b90: 20 63 68 69 6c 64 72 65 6e 20 50 49 44 73 2c 20   children PIDs, 
3ba0: 72 65 61 70 20 74 68 65 6d 20 28 69 6d 70 6f 72  reap them (impor
3bb0: 74 61 6e 74 20 69 66 20 77 65 20 61 72 65 20 69  tant if we are i
3bc0: 6e 20 61 0a 2b 09 20 2a 20 64 79 6e 61 6d 69 63  n a.+. * dynamic
3bd0: 20 6c 6f 61 64 20 6d 6f 64 75 6c 65 29 2c 20 61   load module), a
3be0: 6e 64 20 64 69 73 63 61 72 64 20 74 68 65 20 65  nd discard the e
3bf0: 72 72 6f 72 46 69 6c 65 2e 0a 2b 09 20 2a 2f 0a  rrorFile..+. */.
3c00: 2b 0a 2b 09 54 63 6c 5f 44 65 74 61 63 68 50 69  +.+.Tcl_DetachPi
3c10: 64 73 28 70 69 70 65 50 74 72 2d 3e 6e 75 6d 50  ds(pipePtr->numP
3c20: 69 64 73 2c 20 70 69 70 65 50 74 72 2d 3e 70 69  ids, pipePtr->pi
3c30: 64 50 74 72 29 3b 0a 2b 09 54 63 6c 5f 52 65 61  dPtr);.+.Tcl_Rea
3c40: 70 44 65 74 61 63 68 65 64 50 72 6f 63 73 28 29  pDetachedProcs()
3c50: 3b 0a 2b 0a 2b 09 69 66 20 28 70 69 70 65 50 74  ;.+.+.if (pipePt
3c60: 72 2d 3e 65 72 72 6f 72 46 69 6c 65 29 20 7b 0a  r->errorFile) {.
3c70: 2b 09 20 20 20 20 54 63 6c 70 43 6c 6f 73 65 46  +.    TclpCloseF
3c80: 69 6c 65 28 70 69 70 65 50 74 72 2d 3e 65 72 72  ile(pipePtr->err
3c90: 6f 72 46 69 6c 65 29 3b 0a 2b 09 7d 0a 2b 20 20  orFile);.+.}.+  
3ca0: 20 20 7d 20 65 6c 73 65 20 7b 0a 2b 09 2f 2a 0a    } else {.+./*.
3cb0: 2b 09 20 2a 20 57 72 61 70 20 74 68 65 20 65 72  +. * Wrap the er
3cc0: 72 6f 72 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  ror file into a 
3cd0: 63 68 61 6e 6e 65 6c 20 61 6e 64 20 67 69 76 65  channel and give
3ce0: 20 69 74 20 74 6f 20 74 68 65 20 63 6c 65 61 6e   it to the clean
3cf0: 75 70 0a 2b 09 20 2a 20 72 6f 75 74 69 6e 65 2e  up.+. * routine.
3d00: 0a 2b 09 20 2a 2f 0a 2b 0a 2b 09 69 66 20 28 70  .+. */.+.+.if (p
3d10: 69 70 65 50 74 72 2d 3e 65 72 72 6f 72 46 69 6c  ipePtr->errorFil
3d20: 65 29 20 7b 0a 2b 09 20 20 20 20 65 72 72 43 68  e) {.+.    errCh
3d30: 61 6e 20 3d 20 54 63 6c 5f 4d 61 6b 65 46 69 6c  an = Tcl_MakeFil
3d40: 65 43 68 61 6e 6e 65 6c 28 0a 2b 09 09 28 43 6c  eChannel(.+..(Cl
3d50: 69 65 6e 74 44 61 74 61 29 20 49 4e 54 32 50 54  ientData) INT2PT
3d60: 52 28 47 65 74 46 64 28 70 69 70 65 50 74 72 2d  R(GetFd(pipePtr-
3d70: 3e 65 72 72 6f 72 46 69 6c 65 29 29 2c 20 54 43  >errorFile)), TC
3d80: 4c 5f 52 45 41 44 41 42 4c 45 29 3b 0a 2b 09 7d  L_READABLE);.+.}
3d90: 20 65 6c 73 65 20 7b 0a 2b 09 20 20 20 20 65 72   else {.+.    er
3da0: 72 43 68 61 6e 20 3d 20 4e 55 4c 4c 3b 0a 2b 09  rChan = NULL;.+.
3db0: 7d 0a 2b 09 72 65 73 75 6c 74 20 3d 20 54 63 6c  }.+.result = Tcl
3dc0: 43 6c 65 61 6e 75 70 43 68 69 6c 64 72 65 6e 28  CleanupChildren(
3dd0: 69 6e 74 65 72 70 2c 20 70 69 70 65 50 74 72 2d  interp, pipePtr-
3de0: 3e 6e 75 6d 50 69 64 73 2c 20 70 69 70 65 50 74  >numPids, pipePt
3df0: 72 2d 3e 70 69 64 50 74 72 2c 0a 2b 09 09 65 72  r->pidPtr,.+..er
3e00: 72 43 68 61 6e 29 3b 0a 2b 20 20 20 20 7d 0a 2b  rChan);.+    }.+
3e10: 0a 2b 20 20 20 20 69 66 20 28 70 69 70 65 50 74  .+    if (pipePt
3e20: 72 2d 3e 6e 75 6d 50 69 64 73 20 21 3d 20 30 29  r->numPids != 0)
3e30: 20 7b 0a 2b 09 63 6b 66 72 65 65 28 28 63 68 61   {.+.ckfree((cha
3e40: 72 20 2a 29 20 70 69 70 65 50 74 72 2d 3e 70 69  r *) pipePtr->pi
3e50: 64 50 74 72 29 3b 0a 2b 20 20 20 20 7d 0a 2b 20  dPtr);.+    }.+ 
3e60: 20 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20     ckfree((char 
3e70: 2a 29 20 70 69 70 65 50 74 72 29 3b 0a 2b 20 20  *) pipePtr);.+  
3e80: 20 20 69 66 20 28 65 72 72 6f 72 43 6f 64 65 20    if (errorCode 
3e90: 3d 3d 20 30 29 20 7b 0a 2b 09 72 65 74 75 72 6e  == 0) {.+.return
3ea0: 20 72 65 73 75 6c 74 3b 0a 2b 20 20 20 20 7d 0a   result;.+    }.
3eb0: 2b 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 6f  +    return erro
3ec0: 72 43 6f 64 65 3b 0a 2b 7d 0a 2b 0c 0a 2b 2f 2a  rCode;.+}.+..+/*
3ed0: 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .+ *------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a 2b  ----------.+ *.+
3f20: 20 2a 20 50 69 70 65 43 6c 6f 73 65 50 72 6f 63   * PipeCloseProc
3f30: 20 2d 2d 20 4f 42 53 4f 4c 45 54 45 0a 20 20 2a   -- OBSOLETE.  *
3f40: 0a 20 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  .  *.This functi
3f50: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  on is invoked by
3f60: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20   the generic IO 
3f70: 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d  level to perform
3f80: 0a 20 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70  .  *.channel-typ
3f90: 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e  e-specific clean
3fa0: 75 70 20 77 68 65 6e 20 61 20 63 6f 6d 6d 61 6e  up when a comman
3fb0: 64 20 70 69 70 65 6c 69 6e 65 20 63 68 61 6e 6e  d pipeline chann
3fc0: 65 6c 20 69 73 0a 40 40 20 2d 39 33 33 2c 36 20  el is.@@ -933,6 
3fd0: 2b 31 30 32 34 2c 37 20 40 40 0a 20 20 20 20 20  +1024,7 @@.     
3fe0: 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 20  errorCode = 0;. 
3ff0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a      result = 0;.
4000: 20 20 20 20 20 70 69 70 65 50 74 72 20 3d 20 28       pipePtr = (
4010: 50 69 70 65 53 74 61 74 65 20 2a 29 20 69 6e 73  PipeState *) ins
4020: 74 61 6e 63 65 44 61 74 61 3b 0a 2b 0a 20 20 20  tanceData;.+.   
4030: 20 20 69 66 20 28 70 69 70 65 50 74 72 2d 3e 69    if (pipePtr->i
4040: 6e 46 69 6c 65 29 20 7b 0a 20 09 69 66 20 28 54  nFile) {. .if (T
4050: 63 6c 70 43 6c 6f 73 65 46 69 6c 65 28 70 69 70  clpCloseFile(pip
4060: 65 50 74 72 2d 3e 69 6e 46 69 6c 65 29 20 3c 20  ePtr->inFile) < 
4070: 30 29 20 7b 0a 20 09 20 20 20 20 65 72 72 6f 72  0) {. .    error
4080: 43 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 2d 2d  Code = errno;.--
4090: 2d 20 74 63 6c 38 36 2e 6f 72 69 67 2f 77 69 6e  - tcl86.orig/win
40a0: 2f 74 63 6c 57 69 6e 53 6f 63 6b 2e 63 09 32 30  /tclWinSock.c.20
40b0: 30 38 2d 31 31 2d 32 37 20 31 34 3a 34 35 3a 35  08-11-27 14:45:5
40c0: 32 2e 30 30 30 30 30 30 30 30 30 20 2d 30 38 30  2.000000000 -080
40d0: 30 0a 2b 2b 2b 20 74 63 6c 38 36 2f 77 69 6e 2f  0.+++ tcl86/win/
40e0: 74 63 6c 57 69 6e 53 6f 63 6b 2e 63 09 32 30 30  tclWinSock.c.200
40f0: 38 2d 31 32 2d 30 31 20 31 30 3a 35 35 3a 31 32  8-12-01 10:55:12
4100: 2e 30 30 30 30 30 30 30 30 30 20 2d 30 38 30 30  .000000000 -0800
4110: 0a 40 40 20 2d 31 36 38 2c 36 20 2b 31 36 38 2c  .@@ -168,6 +168,
4120: 37 20 40 40 0a 20 73 74 61 74 69 63 20 54 63 6c  7 @@. static Tcl
4130: 5f 45 76 65 6e 74 53 65 74 75 70 50 72 6f 63 09  _EventSetupProc.
4140: 53 6f 63 6b 65 74 53 65 74 75 70 50 72 6f 63 3b  SocketSetupProc;
4150: 0a 20 73 74 61 74 69 63 20 54 63 6c 5f 44 72 69  . static Tcl_Dri
4160: 76 65 72 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63  verBlockModeProc
4170: 09 54 63 70 42 6c 6f 63 6b 50 72 6f 63 3b 0a 20  .TcpBlockProc;. 
4180: 73 74 61 74 69 63 20 54 63 6c 5f 44 72 69 76 65  static Tcl_Drive
4190: 72 43 6c 6f 73 65 50 72 6f 63 09 54 63 70 43 6c  rCloseProc.TcpCl
41a0: 6f 73 65 50 72 6f 63 3b 0a 2b 73 74 61 74 69 63  oseProc;.+static
41b0: 20 54 63 6c 5f 44 72 69 76 65 72 43 6c 6f 73 65   Tcl_DriverClose
41c0: 32 50 72 6f 63 09 54 63 70 43 6c 6f 73 65 32 50  2Proc.TcpClose2P
41d0: 72 6f 63 3b 0a 20 73 74 61 74 69 63 20 54 63 6c  roc;. static Tcl
41e0: 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e  _DriverSetOption
41f0: 50 72 6f 63 09 54 63 70 53 65 74 4f 70 74 69 6f  Proc.TcpSetOptio
4200: 6e 50 72 6f 63 3b 0a 20 73 74 61 74 69 63 20 54  nProc;. static T
4210: 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69  cl_DriverGetOpti
4220: 6f 6e 50 72 6f 63 09 54 63 70 47 65 74 4f 70 74  onProc.TcpGetOpt
4230: 69 6f 6e 50 72 6f 63 3b 0a 20 73 74 61 74 69 63  ionProc;. static
4240: 20 54 63 6c 5f 44 72 69 76 65 72 49 6e 70 75 74   Tcl_DriverInput
4250: 50 72 6f 63 09 54 63 70 49 6e 70 75 74 50 72 6f  Proc.TcpInputPro
4260: 63 3b 0a 40 40 20 2d 31 39 31 2c 37 20 2b 31 39  c;.@@ -191,7 +19
4270: 32 2c 37 20 40 40 0a 20 20 20 20 20 54 63 70 47  2,7 @@.     TcpG
4280: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 20 20  etOptionProc,.  
4290: 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20    /* Get option 
42a0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 54 63  proc. */.     Tc
42b0: 70 57 61 74 63 68 50 72 6f 63 2c 09 20 20 20 20  pWatchProc,.    
42c0: 2f 2a 20 53 65 74 20 75 70 20 6e 6f 74 69 66 69  /* Set up notifi
42d0: 65 72 20 74 6f 20 77 61 74 63 68 20 74 68 69 73  er to watch this
42e0: 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 20 20 20   channel. */.   
42f0: 20 20 54 63 70 47 65 74 48 61 6e 64 6c 65 50 72    TcpGetHandlePr
4300: 6f 63 2c 09 20 20 20 20 2f 2a 20 47 65 74 20 61  oc,.    /* Get a
4310: 6e 20 4f 53 20 68 61 6e 64 6c 65 20 66 72 6f 6d  n OS handle from
4320: 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2d 20 20   channel. */.-  
4330: 20 20 4e 55 4c 4c 2c 09 09 20 20 20 20 2f 2a 20    NULL,..    /* 
4340: 63 6c 6f 73 65 32 70 72 6f 63 2e 20 2a 2f 0a 2b  close2proc. */.+
4350: 20 20 20 20 54 63 70 43 6c 6f 73 65 32 50 72 6f      TcpClose2Pro
4360: 63 2c 09 20 20 20 20 2f 2a 20 43 6c 6f 73 65 32  c,.    /* Close2
4370: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 54 63  proc. */.     Tc
4380: 70 42 6c 6f 63 6b 50 72 6f 63 2c 09 20 20 20 20  pBlockProc,.    
4390: 2f 2a 20 53 65 74 20 73 6f 63 6b 65 74 20 69 6e  /* Set socket in
43a0: 74 6f 20 28 6e 6f 6e 2d 29 62 6c 6f 63 6b 69 6e  to (non-)blockin
43b0: 67 20 6d 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  g mode. */.     
43c0: 4e 55 4c 4c 2c 09 09 20 20 20 20 2f 2a 20 66 6c  NULL,..    /* fl
43d0: 75 73 68 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20  ush proc. */.   
43e0: 20 20 4e 55 4c 4c 2c 09 09 20 20 20 20 2f 2a 20    NULL,..    /* 
43f0: 68 61 6e 64 6c 65 72 20 70 72 6f 63 2e 20 2a 2f  handler proc. */
4400: 0a 40 40 20 2d 38 31 38 2c 36 20 2b 38 31 39 2c  .@@ -818,6 +819,
4410: 35 38 20 40 40 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d  58 @@. /*.  *---
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4460: 2d 2d 2d 0a 20 20 2a 0a 2b 20 2a 20 54 63 70 43  ---.  *.+ * TcpC
4470: 6c 6f 73 65 32 50 72 6f 63 20 2d 2d 0a 2b 20 2a  lose2Proc --.+ *
4480: 0a 2b 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  .+ *.This functi
4490: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
44a0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
44b0: 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 20  evel to perform 
44c0: 74 68 65 20 63 68 61 6e 6e 65 6c 0a 2b 20 2a 09  the channel.+ *.
44d0: 74 79 70 65 20 73 70 65 63 69 66 69 63 20 70 61  type specific pa
44e0: 72 74 20 6f 66 20 61 20 68 61 6c 66 2d 63 6c 6f  rt of a half-clo
44f0: 73 65 3a 20 6e 61 6d 65 6c 79 2c 20 61 20 73 68  se: namely, a sh
4500: 75 74 64 6f 77 6e 28 29 20 6f 6e 20 61 20 73 6f  utdown() on a so
4510: 63 6b 65 74 2e 0a 2b 20 2a 0a 2b 20 2a 20 52 65  cket..+ *.+ * Re
4520: 73 75 6c 74 73 3a 0a 2b 20 2a 09 30 20 69 66 20  sults:.+ *.0 if 
4530: 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20  successful, the 
4540: 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 69  value of errno i
4550: 66 20 66 61 69 6c 65 64 2e 0a 2b 20 2a 0a 2b 20  f failed..+ *.+ 
4560: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4570: 2b 20 2a 09 53 68 75 74 73 20 64 6f 77 6e 20 6f  + *.Shuts down o
4580: 6e 65 20 73 69 64 65 20 6f 66 20 74 68 65 20 73  ne side of the s
4590: 6f 63 6b 65 74 2e 0a 2b 20 2a 0a 2b 20 2a 2d 2d  ocket..+ *.+ *--
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45e0: 2d 2d 2d 2d 0a 2b 20 2a 2f 0a 2b 0a 2b 73 74 61  ----.+ */.+.+sta
45f0: 74 69 63 20 69 6e 74 0a 2b 54 63 70 43 6c 6f 73  tic int.+TcpClos
4600: 65 32 50 72 6f 63 28 0a 2b 20 20 20 20 43 6c 69  e2Proc(.+    Cli
4610: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
4620: 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63  Data,./* The soc
4630: 6b 65 74 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f  ket to close. */
4640: 0a 2b 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  .+    Tcl_Interp
4650: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f   *interp,../* Fo
4660: 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  r error reportin
4670: 67 2e 20 2a 2f 0a 2b 20 20 20 20 69 6e 74 20 66  g. */.+    int f
4680: 6c 61 67 73 29 09 09 09 2f 2a 20 46 6c 61 67 73  lags).../* Flags
4690: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
46a0: 68 69 63 68 20 73 69 64 65 20 74 6f 20 63 6c 6f  hich side to clo
46b0: 73 65 2e 20 2a 2f 0a 2b 7b 0a 2b 20 20 20 20 53  se. */.+{.+    S
46c0: 6f 63 6b 65 74 49 6e 66 6f 20 2a 69 6e 66 6f 50  ocketInfo *infoP
46d0: 74 72 20 3d 20 28 53 6f 63 6b 65 74 49 6e 66 6f  tr = (SocketInfo
46e0: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
46f0: 3b 0a 2b 20 20 20 20 69 6e 74 20 65 72 72 6f 72  ;.+    int error
4700: 43 6f 64 65 20 3d 20 30 3b 0a 2b 20 20 20 20 69  Code = 0;.+    i
4710: 6e 74 20 73 64 3b 0a 2b 0a 2b 20 20 20 20 2f 2a  nt sd;.+.+    /*
4720: 0a 2b 20 20 20 20 20 2a 20 53 68 75 74 64 6f 77  .+     * Shutdow
4730: 6e 20 74 68 65 20 4f 53 20 73 6f 63 6b 65 74 20  n the OS socket 
4740: 68 61 6e 64 6c 65 2e 0a 2b 20 20 20 20 20 2a 2f  handle..+     */
4750: 0a 2b 20 20 20 20 73 77 69 74 63 68 28 66 6c 61  .+    switch(fla
4760: 67 73 29 0a 2b 09 7b 0a 2b 09 63 61 73 65 20 54  gs).+.{.+.case T
4770: 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 3a 0a 2b  CL_CLOSE_READ:.+
4780: 09 20 20 20 20 73 64 3d 53 44 5f 52 45 43 45 49  .    sd=SD_RECEI
4790: 56 45 3b 0a 2b 09 20 20 20 20 62 72 65 61 6b 3b  VE;.+.    break;
47a0: 0a 2b 09 63 61 73 65 20 54 43 4c 5f 43 4c 4f 53  .+.case TCL_CLOS
47b0: 45 5f 57 52 49 54 45 3a 0a 2b 09 20 20 20 20 73  E_WRITE:.+.    s
47c0: 64 3d 53 44 5f 53 45 4e 44 3b 0a 2b 09 20 20 20  d=SD_SEND;.+.   
47d0: 20 62 72 65 61 6b 3b 0a 2b 09 64 65 66 61 75 6c   break;.+.defaul
47e0: 74 3a 0a 2b 09 20 20 20 20 69 66 20 28 69 6e 74  t:.+.    if (int
47f0: 65 72 70 29 20 7b 0a 2b 09 09 54 63 6c 5f 41 70  erp) {.+..Tcl_Ap
4800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4810: 70 2c 20 22 53 6f 63 6b 65 74 20 63 6c 6f 73 65  p, "Socket close
4820: 32 70 72 6f 63 20 63 61 6c 6c 65 64 20 62 69 64  2proc called bid
4830: 69 72 65 63 74 69 6f 6e 61 6c 6c 79 22 2c 20 4e  irectionally", N
4840: 55 4c 4c 29 3b 0a 2b 09 20 20 20 20 7d 0a 2b 09  ULL);.+.    }.+.
4850: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4860: 52 52 4f 52 3b 0a 2b 09 7d 0a 2b 20 20 20 20 69  RROR;.+.}.+    i
4870: 66 20 28 73 68 75 74 64 6f 77 6e 28 69 6e 66 6f  f (shutdown(info
4880: 50 74 72 2d 3e 73 6f 63 6b 65 74 2c 73 64 29 20  Ptr->socket,sd) 
4890: 3d 3d 20 53 4f 43 4b 45 54 5f 45 52 52 4f 52 29  == SOCKET_ERROR)
48a0: 20 7b 0a 2b 09 54 63 6c 57 69 6e 43 6f 6e 76 65   {.+.TclWinConve
48b0: 72 74 57 53 41 45 72 72 6f 72 28 28 44 57 4f 52  rtWSAError((DWOR
48c0: 44 29 20 57 53 41 47 65 74 4c 61 73 74 45 72 72  D) WSAGetLastErr
48d0: 6f 72 28 29 29 3b 0a 2b 09 65 72 72 6f 72 43 6f  or());.+.errorCo
48e0: 64 65 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e  de = Tcl_GetErrn
48f0: 6f 28 29 3b 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20  o();.+    }.+.+ 
4900: 20 20 20 72 65 74 75 72 6e 20 65 72 72 6f 72 43     return errorC
4910: 6f 64 65 3b 0a 2b 7d 0a 2b 0c 0a 2b 2f 2a 0a 2b  ode;.+}.+..+/*.+
4920: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a 20 20 2a  --------.+ *.  *
4970: 20 4e 65 77 53 6f 63 6b 65 74 49 6e 66 6f 20 2d   NewSocketInfo -
4980: 2d 0a 20 20 2a 0a 20 20 2a 09 54 68 69 73 20 66  -.  *.  *.This f
4990: 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
49a0: 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
49b0: 73 20 61 20 6e 65 77 20 53 6f 63 6b 65 74 49 6e  s a new SocketIn
49c0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a        fo structure..