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..